Annotation of 42BSD/ucb/pascal/utilities/pc2.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)pc2.c 1.13 6/1/83";
                      4: 
                      5: #include <stdio.h>
                      6: #include <ctype.h>
                      7: /*
                      8:  * The hash table must be at least twice as big as the number
                      9:  * of patterns, preferably bigger. It must also be a prime number
                     10:  */
                     11: #define HSHSIZ 101
                     12: 
                     13: #ifdef vax
                     14: #define CALLTEMPLATE   "calls\t$"
                     15: #define TEMPLATESIZE   7
                     16: #endif vax
                     17: 
                     18: #ifdef mc68000
                     19: #define CALLTEMPLATE   "jbsr\t"
                     20: #define TEMPLATESIZE   5
                     21: #endif mc68000
                     22: 
                     23: struct pats {
                     24:        char    *name;
                     25:        char    *replace;
                     26: } ptab[] = {
                     27: 
                     28: #ifdef vax
                     29: /*
                     30:  * C library routines
                     31:  */
                     32:        { "1,_fgetc\n",
                     33: "      sobgeq  *(sp),1f\n\
                     34:        calls   $1,__filbuf\n\
                     35:        jbr     2f\n\
                     36: 1:\n\
                     37:        addl3   $4,(sp)+,r1\n\
                     38:        movzbl  *(r1),r0\n\
                     39:        incl    (r1)\n\
                     40: 2:\n" },
                     41: 
                     42:        { "2,_fputc\n",
                     43: "      sobgeq  *4(sp),1f\n\
                     44:        calls   $2,__flsbuf\n\
                     45:        jbr     2f\n\
                     46: 1:\n\
                     47:        popr    $0x3\n\
                     48:        movb    r0,*4(r1)\n\
                     49:        incl    4(r1)\n\
                     50: 2:\n" },
                     51: 
                     52: /*
                     53:  * VAX special instructions
                     54:  */
                     55:        { "3,_blkcpy\n",
                     56: "      popr    $0xa\n\
                     57:        jbr     2f\n\
                     58: 1:\n\
                     59:        subl2   r0,(sp)\n\
                     60:        movc3   r0,(r1),(r3)\n\
                     61: 2:\n\
                     62:        movzwl  $65535,r0\n\
                     63:        cmpl    (sp),r0\n\
                     64:        jgtr    1b\n\
                     65:        movl    (sp)+,r0\n\
                     66:        movc3   r0,(r1),(r3)\n" },
                     67: 
                     68:        { "2,_blkclr\n",
                     69: "      movl    (sp)+,r3\n\
                     70:        jbr     2f\n\
                     71: 1:\n\
                     72:        subl2   r0,(sp)\n\
                     73:        movc5   $0,(r3),$0,r0,(r3)\n\
                     74: 2:\n\
                     75:        movzwl  $65535,r0\n\
                     76:        cmpl    (sp),r0\n\
                     77:        jgtr    1b\n\
                     78:        movl    (sp)+,r0\n\
                     79:        movc5   $0,(r3),$0,r0,(r3)\n" },
                     80: 
                     81:        { "3,_LOCC\n",
                     82: "      popr    $0x30\n\
                     83:        movl    (sp)+,r1\n\
                     84: 1:\n\
                     85:        movzwl  $65535,r0\n\
                     86:        cmpl    r5,r0\n\
                     87:        jleq    1f\n\
                     88:        subl2   r0,r5\n\
                     89:        locc    r4,r0,(r1)\n\
                     90:        jeql    1b\n\
                     91:        addl2   r5,r0\n\
                     92:        jbr     2f\n\
                     93: 1:\n\
                     94:        locc    r4,r5,(r1)\n\
                     95: 2:\n" },
                     96: 
                     97:        { "2,_ROUND\n",
                     98: "      cvtrdl  (sp)+,r0\n" },
                     99: 
                    100:        { "2,_TRUNC\n",
                    101: "      cvtdl   (sp)+,r0\n" },
                    102: 
                    103: /*
                    104:  * General Pascal library routines
                    105:  */
                    106:        { "1,_ACTFILE\n",
                    107: "      movl    (sp)+,r1\n\
                    108:        movl    12(r1),r0\n" },
                    109: 
                    110:        { "2,_FCALL\n",
                    111: "      movl    4(sp),r0\n\
                    112:        movc3   4(r0),__disply+8,*(sp)+\n\
                    113:        movl    (sp)+,r0\n\
                    114:        movc3   4(r0),8(r0),__disply+8\n" },
                    115: 
                    116:        { "2,_FRTN\n",
                    117: "      movl    (sp)+,r0\n\
                    118:        movc3   4(r0),*(sp)+,__disply+8\n" },
                    119: 
                    120:        { "3,_FSAV\n",
                    121: "      movl    8(sp),r0\n\
                    122:        movl    (sp)+,(r0)\n\
                    123:        ashl    $3,(sp)+,4(r0)\n\
                    124:        movc3   4(r0),__disply+8,8(r0)\n\
                    125:        movl    (sp)+,r0\n" },
                    126: 
                    127: /*
                    128:  * Pascal relational comparisons
                    129:  */
                    130:        { "3,_RELEQ\n",
                    131: "      popr    $0xb\n\
                    132:        movl    r0,r4\n\
                    133: 1:\n\
                    134:        movzwl  $65535,r0\n\
                    135:        cmpl    r4,r0\n\
                    136:        jleq    3f\n\
                    137:        subl2   r0,r4\n\
                    138:        cmpc3   r0,(r1),(r3)\n\
                    139:        jeql    1b\n\
                    140: 2:\n\
                    141:        clrl    r0\n\
                    142:        jbr     4f\n\
                    143: 3:\n\
                    144:        cmpc3   r4,(r1),(r3)\n\
                    145:        jneq    2b\n\
                    146:        incl    r0\n\
                    147: 4:\n" },
                    148: 
                    149:        { "3,_RELNE\n",
                    150: "      popr    $0xb\n\
                    151:        movl    r0,r4\n\
                    152: 1:\n\
                    153:        movzwl  $65535,r0\n\
                    154:        cmpl    r4,r0\n\
                    155:        jleq    3f\n\
                    156:        subl2   r0,r4\n\
                    157:        cmpc3   r0,(r1),(r3)\n\
                    158:        jeql    1b\n\
                    159: 2:\n\
                    160:        movl    $1,r0\n\
                    161:        jbr     4f\n\
                    162: 3:\n\
                    163:        cmpc3   r4,(r1),(r3)\n\
                    164:        jneq    2b\n\
                    165: 4:\n" },
                    166: 
                    167:        { "3,_RELSLT\n",
                    168: "      popr    $0xb\n\
                    169:        movl    r0,r4\n\
                    170:        jbr     2f\n\
                    171: 1:\n\
                    172:        subl2   r0,r4\n\
                    173:        cmpc3   r0,(r1),(r3)\n\
                    174:        jneq    3f\n\
                    175: 2:\n\
                    176:        movzwl  $65535,r0\n\
                    177:        cmpl    r4,r0\n\
                    178:        jgtr    1b\n\
                    179:        cmpc3   r4,(r1),(r3)\n\
                    180: 3:\n\
                    181:        jlss    4f\n\
                    182:        clrl    r0\n\
                    183:        jbr     5f\n\
                    184: 4:\n\
                    185:        movl    $1,r0\n\
                    186: 5:\n" },
                    187: 
                    188:        { "3,_RELSLE\n",
                    189: "      popr    $0xb\n\
                    190:        movl    r0,r4\n\
                    191:        jbr     2f\n\
                    192: 1:\n\
                    193:        subl2   r0,r4\n\
                    194:        cmpc3   r0,(r1),(r3)\n\
                    195:        jneq    3f\n\
                    196: 2:\n\
                    197:        movzwl  $65535,r0\n\
                    198:        cmpl    r4,r0\n\
                    199:        jgtr    1b\n\
                    200:        cmpc3   r4,(r1),(r3)\n\
                    201: 3:\n\
                    202:        jleq    4f\n\
                    203:        clrl    r0\n\
                    204:        jbr     5f\n\
                    205: 4:\n\
                    206:        movl    $1,r0\n\
                    207: 5:\n" },
                    208: 
                    209:        { "3,_RELSGT\n",
                    210: "      popr    $0xb\n\
                    211:        movl    r0,r4\n\
                    212:        jbr     2f\n\
                    213: 1:\n\
                    214:        subl2   r0,r4\n\
                    215:        cmpc3   r0,(r1),(r3)\n\
                    216:        jneq    3f\n\
                    217: 2:\n\
                    218:        movzwl  $65535,r0\n\
                    219:        cmpl    r4,r0\n\
                    220:        jgtr    1b\n\
                    221:        cmpc3   r4,(r1),(r3)\n\
                    222: 3:\n\
                    223:        jgtr    4f\n\
                    224:        clrl    r0\n\
                    225:        jbr     5f\n\
                    226: 4:\n\
                    227:        movl    $1,r0\n\
                    228: 5:\n" },
                    229: 
                    230:        { "3,_RELSGE\n",
                    231: "      popr    $0xb\n\
                    232:        movl    r0,r4\n\
                    233:        jbr     2f\n\
                    234: 1:\n\
                    235:        subl2   r0,r4\n\
                    236:        cmpc3   r0,(r1),(r3)\n\
                    237:        jneq    3f\n\
                    238: 2:\n\
                    239:        movzwl  $65535,r0\n\
                    240:        cmpl    r4,r0\n\
                    241:        jgtr    1b\n\
                    242:        cmpc3   r4,(r1),(r3)\n\
                    243: 3:\n\
                    244:        jgeq    4f\n\
                    245:        clrl    r0\n\
                    246:        jbr     5f\n\
                    247: 4:\n\
                    248:        movl    $1,r0\n\
                    249: 5:\n" },
                    250: 
                    251: /*
                    252:  * Pascal set operations.
                    253:  */
                    254:        { "4,_ADDT\n",
                    255: "      popr    $0x17\n\
                    256:        movl    r0,r3\n\
                    257: 1:\n\
                    258:        bisl3   (r1)+,(r2)+,(r3)+\n\
                    259:        sobgtr  r4,1b\n" },
                    260: 
                    261:        { "4,_SUBT\n",
                    262: "      popr    $0x17\n\
                    263:        movl    r0,r3\n\
                    264: 1:\n\
                    265:        bicl3   (r2)+,(r1)+,(r3)+\n\
                    266:        sobgtr  r4,1b\n" },
                    267: 
                    268:        { "4,_MULT\n",
                    269: "      popr    $0x17\n\
                    270:        movl    r0,r3\n\
                    271: 1:\n\
                    272:        mcoml   (r1)+,r5\n\
                    273:        bicl3   r5,(r2)+,(r3)+\n\
                    274:        sobgtr  r4,1b\n" },
                    275: 
                    276:        { "4,_IN\n",
                    277: "      popr    $0x1e\n\
                    278:        clrl    r0\n\
                    279:        subl2   r2,r1\n\
                    280:        cmpl    r1,r3\n\
                    281:        jgtru   1f\n\
                    282:        jbc     r1,(r4),1f\n\
                    283:        incl    r0\n\
                    284: 1:\n" },
                    285: 
                    286: /*
                    287:  * Pascal runtime checks
                    288:  */
                    289:        { "1,_ASRT\n",
                    290: "      tstl    (sp)+\n\
                    291:        jneq    1f\n\
                    292:        pushl   $0\n\
                    293:        pushl   $_EASRT\n\
                    294:        calls   $2,_ERROR\n\
                    295: 1:\n" },
                    296: 
                    297:        { "2,_ASRTS\n",
                    298: "      popr    $0x03\n\
                    299:        tstl    r0\n\
                    300:        jneq    1f\n\
                    301:        pushl   r1\n\
                    302:        pushl   $_EASRTS\n\
                    303:        calls   $2,_ERROR\n\
                    304: 1:\n" },
                    305: 
                    306:        { "1,_CHR\n",
                    307: "      movl    (sp)+,r0\n\
                    308:        cmpl    r0,$127\n\
                    309:        jlequ   1f\n\
                    310:        pushl   r0\n\
                    311:        pushl   $_ECHR\n\
                    312:        calls   $2,_ERROR\n\
                    313: 1:\n" },
                    314: 
                    315:        { "0,_LINO\n",
                    316: "      incl    __stcnt\n\
                    317:        cmpl    __stcnt,__stlim\n\
                    318:        jlss    1f\n\
                    319:        pushl   __stcnt\n\
                    320:        pushl   $_ELINO\n\
                    321:        calls   $2,_ERROR\n\
                    322: 1:\n" },
                    323: 
                    324:        { "1,_NIL\n",
                    325: "      movl    (sp)+,r0\n\
                    326:        cmpl    r0,__maxptr\n\
                    327:        jgtr    1f\n\
                    328:        cmpl    r0,__minptr\n\
                    329:        jgeq    2f\n\
                    330: 1:\n\
                    331:        pushl   $0\n\
                    332:        pushl   $_ENIL\n\
                    333:        calls   $2,_ERROR\n\
                    334: 2:\n" },
                    335: 
                    336:        { "2,_RANDOM\n",
                    337: "      addl2   $8,sp\n\
                    338:        emul    __seed,$1103515245,$0,r0\n\
                    339:        ediv    $0x7fffffff,r0,r1,r0\n\
                    340:        movl    r0,__seed\n\
                    341:        cvtld   r0,r0\n\
                    342:        divd2   $0d2.147483647e+09,r0\n" },
                    343: 
                    344:        { "3,_RANG4\n",
                    345: "      popr    $0x07\n\
                    346:        cmpl    r0,r1\n\
                    347:        jlss    1f\n\
                    348:        cmpl    r0,r2\n\
                    349:        jleq    2f\n\
                    350: 1:\n\
                    351:        pushl   r0\n\
                    352:        pushl   $_ERANG\n\
                    353:        calls   $2,_ERROR\n\
                    354: 2:\n" },
                    355: 
                    356:        { "2,_RSNG4\n",
                    357: "      popr    $0x03\n\
                    358:        cmpl    r0,r1\n\
                    359:        jlequ   1f\n\
                    360:        pushl   r0\n\
                    361:        pushl   $_ERANG\n\
                    362:        calls   $2,_ERROR\n\
                    363: 1:\n" },
                    364: 
                    365:        { "1,_SEED\n",
                    366: "      movl    __seed,r0\n\
                    367:        movl    (sp)+,__seed\n" },
                    368: 
                    369:        { "3,_SUBSC\n",
                    370: "      popr    $0x07\n\
                    371:        cmpl    r0,r1\n\
                    372:        jlss    1f\n\
                    373:        cmpl    r0,r2\n\
                    374:        jleq    2f\n\
                    375: 1:\n\
                    376:        pushl   r0\n\
                    377:        pushl   $_ESUBSC\n\
                    378:        calls   $2,_ERROR\n\
                    379: 2:\n" },
                    380: 
                    381:        { "2,_SUBSCZ\n",
                    382: "      popr    $0x03\n\
                    383:        cmpl    r0,r1\n\
                    384:        jlequ   1f\n\
                    385:        pushl   r0\n\
                    386:        pushl   $_ESUBSC\n\
                    387:        calls   $2,_ERROR\n\
                    388: 1:\n" },
                    389: #endif vax
                    390: 
                    391: #ifdef mc68000
                    392: 
                    393: /*
                    394:  * General Pascal library routines
                    395:  */
                    396:        { "_ACTFILE\n",
                    397: "      movl    sp@,a0\n\
                    398:        movl    a0@(12),d0\n" },
                    399: 
                    400:        { "_ADDT\n",
                    401: "      movl    a2,sp@-\n\
                    402:        movl    sp@(8),a2\n\
                    403:        movl    sp@(12),a1\n\
                    404:        movl    sp@(4),a0\n\
                    405:        movl    sp@(16),d1\n\
                    406:        subql   #1,d1\n\
                    407: 1:\n\
                    408:        movl    a2@+,d0\n\
                    409:        orl     a1@+,d0\n\
                    410:        movl    d0,a0@+\n\
                    411:        dbra    d1,1b\n\
                    412:        movl    sp@+,a2\n\
                    413:        movl    sp@,d0\n" },
                    414: 
                    415:        { "_SUBT\n",
                    416: "      movl    a2,sp@-\n\
                    417:        movl    sp@(8),a2\n\
                    418:        movl    sp@(12),a1\n\
                    419:        movl    sp@(4),a0\n\
                    420:        movl    sp@(16),d1\n\
                    421:        subql   #1,d1\n\
                    422: 1:\n\
                    423:        movl    a1@+,d0\n\
                    424:        notl    d0\n\
                    425:        andl    a2@+,d0\n\
                    426:        movl    d0,a0@+\n\
                    427:        dbra    d1,1b\n\
                    428:        movl    sp@+,a2\n\
                    429:        movl    sp@,d0\n" },
                    430: 
                    431:        { "_MULT\n",
                    432: "      movl    a2,sp@-\n\
                    433:        movl    sp@(8),a2\n\
                    434:        movl    sp@(12),a1\n\
                    435:        movl    sp@(4),a0\n\
                    436:        movl    sp@(16),d1\n\
                    437:        subql   #1,d1\n\
                    438: 1:\n\
                    439:        movl    a2@+,d0\n\
                    440:        andl    a1@+,d0\n\
                    441:        movl    d0,a0@+\n\
                    442:        dbra    d1,1b\n\
                    443:        movl    sp@+,a2\n\
                    444:        movl    sp@,d0\n" },
                    445: 
                    446:        { "_IN\n",
                    447: "      movl    sp@,d1\n\
                    448:        subl    sp@(4),d1\n\
                    449:        cmpl    sp@(8),d1\n\
                    450:        jbhi    1f\n\
                    451:        movl    sp@(12),a0\n\
                    452:        movl    d1,d0\n\
                    453:        lsrl    #3,d0\n\
                    454:        btst    d1,a0@(0,d0:l)\n\
                    455:        jbne    1f\n\
                    456:        moveq   #1,d0\n\
                    457:        jbra    2f\n\
                    458: 1:\n\
                    459:        moveq   #0,d0\n\
                    460: 2:\n" },
                    461: #endif mc68000
                    462: 
                    463: };
                    464: 
                    465: struct pats            *htbl[HSHSIZ];
                    466: 
                    467: 
                    468: #define HASH(cp, hp) {\
                    469:        hash = 0; rehash = 1; ccp = cp; \
                    470:        do      { \
                    471:                hash *= (int)*ccp++; \
                    472:        } while (*ccp && *ccp != '\n'); \
                    473:        hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \
                    474:        }
                    475: 
                    476: #define REHASH(hp) {\
                    477:        hp += rehash; rehash += 2; \
                    478:        if (hp >= &htbl[HSHSIZ]) \
                    479:                hp -= HSHSIZ; \
                    480:        }
                    481: 
                    482: 
                    483: main(argc, argv)
                    484: 
                    485:        int     argc;
                    486:        char    **argv;
                    487: {
                    488:        register struct pats    *pp;
                    489:        register struct pats    **hp;
                    490:        register char           *cp, *ccp, *lp;
                    491:        register int            hash, rehash, size;
                    492:        char                    line[BUFSIZ];
                    493:        extern char             *index();
                    494: 
                    495:        if (argc > 1)
                    496:                freopen(argv[1], "r", stdin);
                    497:        if (argc > 2)
                    498:                freopen(argv[2], "w", stdout);
                    499:        /*
                    500:         * set up the hash table
                    501:         */
                    502:        for(pp = ptab; pp < &ptab[sizeof ptab/sizeof ptab[0]]; pp++) {
                    503:                HASH(pp->name, hp);
                    504:                while (*hp)
                    505:                        REHASH(hp);
                    506:                *hp = pp;
                    507:        }
                    508:        /*
                    509:         * check each line and replace as appropriate
                    510:         */
                    511:        while (fgets(line, BUFSIZ, stdin)) {
                    512:                lp = index(line, ':');
                    513:                for (cp = (lp != NULL) ? ++lp : line; *cp == '\t'; )
                    514:                        cp++;
                    515:                if (strcmpn(cp, CALLTEMPLATE, TEMPLATESIZE) != 0) {
                    516:                        fputs(line, stdout);
                    517:                        continue;
                    518:                }
                    519:                cp += TEMPLATESIZE;
                    520:                HASH(cp, hp);
                    521:                while (*hp) {
                    522:                        if (strcmpn((*hp)->name, cp, size)==NULL) {
                    523:                                if (lp != NULL) {
                    524:                                        *lp++ = '\n';
                    525:                                        *lp = '\0';
                    526:                                        fputs(line, stdout);
                    527:                                }
                    528:                                fputs((*hp)->replace, stdout);
                    529:                                goto nextline;
                    530:                        }
                    531:                        REHASH(hp);
                    532:                }
                    533:                fputs(line, stdout);
                    534: nextline:;
                    535:        }
                    536:        exit(0);
                    537: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.