Annotation of researchv8dc/cmd/wwb/punct.l, revision 1.1.1.1

1.1       root        1: %{
                      2: 
                      3: #include <ctype.h>
                      4: #undef YYLMAX
                      5: #define YYLMAX 500
                      6: #undef input
                      7: #undef unput
                      8: #define OFF 0
                      9: int ineqn = 0;
                     10: int low = 0;
                     11: %}
                     12:  int flag,c,n,i,bracket,slash,save;
                     13:  flag=0;
                     14:  bracket=0;
                     15:  slash=0;
                     16:  save=0;
                     17: %e 1500
                     18: %p 4000
                     19: %a 3000
                     20: %START ENDM
                     21: U       [A-Z]
                     22: A      [A-Za-z]
                     23: O      [^A-Za-z]
                     24: L       [a-z]
                     25: N       [0-9i]
                     26: B       [\ \n\t]
                     27: S      [\ \t]
                     28: D      [0-9.]
                     29: %%
                     30: (et{B}+al|a"."d|A"."M|a"."m|p"."m|b"."c|Ch|{B}ch|{B}ckts|Corp|dB|Dept|dept|Depts|depts)"."     |
                     31: etc"..."       |
                     32: (Dr|Drs|e"."g|Eq|eq|etc|Fig|Figs|fig|figs)"."   |
                     33: ({B}ft|i"."e|{B}in|Inc|Jr|jr|lb|lbs|{B}mi|Mr|Mrs|Ms|No|{B}no|Nos|nos)"."    |
                     34: (P"."{B}*M|Ph"."D|Ph"."d|PhD|Ref|ref|Refs|refs|sec|Sec|St|vs|v|yr)"." |
                     35: (Proc|Trans|Conf|Symp)"." |
                     36: (I|II|III|IV|V|VI|VII|VIII|IX|X)"."    |
                     37: (mm|\(pp|pp|cf|Cf|hrs|{B}+pl|{B}+al|conj|fem|masc)"."  ECHO;
                     38: 
                     39: 
                     40: \"\./{B}       {
                     41:                        /*---------------PERIODS------------------------*/
                     42:                        /* ONE: periods go inside quotes before a blank */
                     43:                printf(".\"");
                     44:                BEGIN ENDM;
                     45:                }
                     46: "''."/{B}      {printf(".''"); BEGIN ENDM;}
                     47: 
                     48: \".\"\.        {                       /*leave examples as is "a". */
                     49:        ECHO;
                     50:        BEGIN ENDM;
                     51:        }
                     52: "``"."''."     {
                     53:                ECHO;
                     54:                BEGIN ENDM;
                     55:                }
                     56: {D}+\" {                       /* leave 3". for 3 inches */
                     57:                ECHO;
                     58:                }
                     59: \""..."\"\.    ECHO;
                     60: "``...''."     ECHO;
                     61: \"{D}+\"\.     {               /* but fix "3.0". */
                     62:                yytext[yyleng-2] = '\0';
                     63:                printf("%s.\"",yytext);
                     64:                BEGIN ENDM;
                     65:                }
                     66: "``"{D}+"''."  {
                     67:                yytext[yyleng-3] = '\0';
                     68:                printf("%s.''",yytext);
                     69:                BEGIN ENDM;
                     70:                }
                     71: 
                     72: 
                     73: \.\.   {
                     74:                        /* TWO: two periods changed to one. */
                     75:                printf(".");
                     76:                BEGIN ENDM;
                     77:                        /* exceptions */
                     78:                }
                     79: \.\.[.]+       ECHO;
                     80: ". . ."        ECHO;
                     81: "..."\"\.      ECHO;
                     82: "...''."       ECHO;
                     83: 
                     84: ^\..*\n                {
                     85:                        /* THREE: to handle troff & preprocessors */
                     86:                if(yytext[1] == 'T' && yytext[2] == 'S'){
                     87:                        ECHO;
                     88:                        skip('T','E',0);
                     89:                }
                     90:                else if(yytext[1] == 'P' && yytext[2] == 'S'){
                     91:                        ECHO;
                     92:                        skip('P','E',0);
                     93:                }
                     94:                else if(yytext[1] == 'D' && yytext[2] == 'S'){
                     95:                        ECHO;
                     96:                        skip('D', 'E', 0);
                     97:                }
                     98:                else if(yytext[1] == 'E' && yytext[2] == 'Q'){
                     99:                        ECHO;
                    100:                        skip('E','N',1);
                    101:                }
                    102:                else {
                    103:                        for (i=0;i<yyleng-1;i++) output(yytext[i]);
                    104:                        yyless(yyleng-1);
                    105:                }
                    106:                BEGIN 0;
                    107:                }
                    108: 
                    109: 
                    110: {L}\.{B}+{L}[^).]      { /* FOUR: Capitalize first word of sentence,
                    111:                                but not a. or a). **/
                    112:                yytext[yyleng-2]=toupper(yytext[yyleng-2]);
                    113:                ECHO;
                    114:                }
                    115: 
                    116: 
                    117: {L}\.{B}*\n\.P.*\n{L}[^).]     {/* Cap after .P */
                    118:                        yytext[yyleng-2]=toupper(yytext[yyleng-2]);
                    119:                        ECHO;
                    120:                }
                    121: 
                    122: <ENDM>{B}+\"{L}        |
                    123: <ENDM>{B}+"``"{L}      |
                    124: <ENDM>{B}+{L}  {       /* other sent caps */
                    125:                yytext[yyleng-1] = toupper(yytext[yyleng-1]);
                    126:                ECHO;
                    127:                BEGIN 0;
                    128:                }
                    129: <ENDM>.                {
                    130:                unput(yytext[0]);
                    131:                BEGIN 0;
                    132:                }
                    133: 
                    134: 
                    135: {B}+{L}\.{B}+  { /* Exceptions:
                    136:                        abbreviations at top not counted as sentences
                    137:                        (deleted periods in references code)
                    138:                        don't understand this rule */
                    139:                ECHO;   /* a. many is the time...*/
                    140:                }
                    141: 
                    142: 
                    143: {L}\./{U}{L}   { /* FIVE: Put space after sentence end if omitted */
                    144:                ECHO; putchar(' ');}
                    145: 
                    146: \.{A}\.{B}+    { /* Exception: the first 2 rules handle i.d. & i.i.d. */
                    147:                ECHO;
                    148:                }
                    149: \.{A}\. {
                    150:        yyless(yyleng-1);
                    151:        ECHO;
                    152:        }
                    153: {L}\.{U}{U}    ECHO;     /*comm.SYS */
                    154: 
                    155: 
                    156: 
                    157: \.{S}*\)/{B}+{U} {     /* SIX: incomplete sentences in parens have . outside*/
                    158:                if(--flag < 0)flag = 0;
                    159:                if(flag == 0 && low == 1){
                    160:                        printf("\)\.");
                    161:                }
                    162:                else ECHO;
                    163:                low = 0;
                    164:        }
                    165: \){S}*\./{B}+{U}       {
                    166:                if(--flag < 0)flag = 0;
                    167:                if(flag == 0 && low == 2)
                    168:                        printf(".) ");
                    169:                else ECHO;
                    170:                low = 0;
                    171:                }
                    172: \.{S}*\)       {
                    173:                if(--flag < 0)flag = 0;
                    174:                if(flag == 0 && low != 2)
                    175:                        printf("). ");
                    176:                else ECHO;
                    177:                low = 0;
                    178:                }
                    179: 
                    180: et\.{B}*al     {       /* SEVEN: other */
                    181:                printf("et al.");
                    182:                if((c=input()) != '.')unput(c);
                    183:                }
                    184: \?\"\. {               /* ... transimission?". */
                    185:                ECHO;
                    186:                BEGIN ENDM;
                    187:        }
                    188: \?"''."                {
                    189:                ECHO;
                    190:                BEGIN ENDM;
                    191:                }
                    192: 
                    193: 
                    194: 
                    195: \"\,    {      /*------------------------------COMMAS----------------------*/
                    196:                /* ONE: commas go inside double quotes */
                    197:                /*  leave alone if inside (), may be code */
                    198:                if(flag == 0)printf(",\"");
                    199:                else ECHO;
                    200:        }
                    201: "'',"  {
                    202:        if(flag == 0)printf(",''");
                    203:        else ECHO;
                    204:        }
                    205: 
                    206: 
                    207: \".\"","       { /* Exception */
                    208:                ECHO;           /*leave examples as is "a", */ 
                    209:                }
                    210: "``"."'',"     ECHO;
                    211: 
                    212: 
                    213: \,{B}*\(       {/* TWO: no commas before ( */
                    214:                if(flag == 0){
                    215:                        printf(" ");
                    216:                        yyless(1);
                    217:                        save = 1;
                    218:                }
                    219:                else {
                    220:                        yyless(1);
                    221:                        ECHO;
                    222:                }
                    223:                }
                    224: 
                    225: 
                    226: \,{B}*\({N}+{A}*\)     { /* Exceptions */
                    227:                ECHO;  /* ,  (2) or ,  (34b) */
                    228:                }
                    229: \,{B}*\({A}\)  ECHO;  /* , (b) */
                    230: \)\,{B}*\(     ECHO;   /* (1), (2),..*/
                    231: i\.e\.\,       |
                    232: e\.g\.\,       ECHO;
                    233: 
                    234: 
                    235: 
                    236: \,\,   {               /* THREE: No ,, except inside (), [], // */
                    237:                if (flag!=0|bracket==1|slash==1) ECHO;
                    238:        else printf(",");
                    239:        }
                    240: 
                    241: 
                    242: 
                    243: {L}\,/{L}      {       /* FOUR: put blank after comma */
                    244:                        /* except in (), [], // (x,y,,a,3) */
                    245:                if(flag!=0|slash==1|bracket==1) ECHO;
                    246:                else {putchar(yytext[0]); printf(", ");}
                    247:        }
                    248: {L}\,/{U}{L}   {if(flag!=0|slash==1|bracket==1) ECHO;
                    249:        else {putchar(yytext[0]); printf(", ");}
                    250:        }
                    251: 
                    252: \,\.\.\.\,     {       /* Exception: math */
                    253:                ECHO;
                    254:                }
                    255: i\,j    |
                    256: x\,y    |
                    257: p\,q    ECHO;
                    258: 
                    259: 
                    260: 
                    261: ;\"    {       /*-----------------COLONS & SEMI-COLONS--------------------*/
                    262:                /* ONE: : and ; go outside of quotes */
                    263:        printf("\";");
                    264:        }
                    265: ;"''"  printf("'';");
                    266: :\"    {
                    267:        if(flag == 0)printf("\":");
                    268:        else ECHO;
                    269:        }
                    270: :"''"  printf("'':");
                    271: 
                    272: 
                    273: \"[;:]\"       { /* Exception: when : or ; is quoted, i.e. ";" */
                    274:                ECHO;
                    275:                }
                    276: "``"[;:]"''"   ECHO;
                    277: 
                    278: 
                    279: ;;     {       /* TWO: no double ;; */
                    280:        yyless(1);
                    281:        }
                    282: ::     {       /* no double :: */
                    283:        yyless(1);
                    284:        }
                    285: 
                    286: \(;;\) { /* Exception: C-code for(;;) */
                    287:        ECHO;
                    288:        }
                    289: 
                    290: ;{B}*\(        {       /* THREE: no semicolons before ( */
                    291:                if(flag == 0){
                    292:                        printf(" ");
                    293:                        yyless(1);
                    294:                        save = 2;
                    295:                }
                    296:                else {
                    297:                        yyless(1);
                    298:                        ECHO;
                    299:                }
                    300:                }
                    301: 
                    302: 
                    303: ;{B}*\({N}+\)   {      /* Exceptions */
                    304:                ECHO;  /* ;  (2) */
                    305:                }
                    306: ;{B}*\({A}\)    ECHO;  /* ; (b) */
                    307: \);{B}*\(       ECHO;   /* (1); (2);..*/
                    308: 
                    309: 
                    310: [;:]/{A}       {       /* FOUR: put space after ; & : */
                    311:                if(flag == 0){
                    312:                        putchar(yytext[0]); putchar(' ');
                    313:                }
                    314:                else ECHO;
                    315:                }
                    316: 
                    317: 
                    318: 
                    319: \?\,   {       /*----------------------QUESTION MARKS-----------------------*/
                    320:                /* ONE: ?, becomes ? */
                    321:        printf("?");
                    322:        }
                    323: \?\"\, printf("?\"");
                    324: \?"'',"        printf("?''");
                    325: 
                    326: 
                    327: \?\?   {       /* TWO: ?? becomes ? */
                    328:        yyless(1);
                    329:        }
                    330: 
                    331: 
                    332: {L}\?{B}+{L}   {       /* THREE: capitalize new sentence after ? */
                    333:                yytext[yyleng-1]=toupper(yytext[yyleng-1]);
                    334:                ECHO;
                    335:                }
                    336: 
                    337: 
                    338: {L}\?/{U}{L}    { /* FOUR: put space after ? between sentences */
                    339:                ECHO; putchar(' ');}
                    340: 
                    341: 
                    342: 
                    343: \({B}*/{L}     { /*----------------------PARENTHESES-----------------------*/
                    344:                /* NOTE: The value of flag tells if you are inside a pair
                    345:                of parentheses, low is set if first word started in lower case
                    346:                at the first level of parens
                    347:                  flag=1 and low = 1 if ([a-z]
                    348:                  flag = 1 and low = 0 if ([^a-z]
                    349:                  flag = 0 if )
                    350:                  bracket & slash toggle between 0 & 1 on \[\] \& \/
                    351:                ONE: for left parens */
                    352:                if(flag == 0) low = 1;
                    353:                flag++;
                    354:                ECHO;
                    355:                }
                    356: \({B}*/{U}     {
                    357:                if(flag == 0)low = 2;
                    358:                flag++;
                    359:                ECHO;
                    360:                }
                    361: \(             {
                    362:                if(flag == 0)low = 0;
                    363:                flag++;
                    364:                ECHO;
                    365:                }
                    366: \\\(.. ECHO;           /* troff characters */
                    367: \[     {bracket=1; ECHO;}
                    368: \\     {if(slash==0) slash=1;
                    369:         else slash=0;
                    370:         ECHO;
                    371:                                /* TWO: next for right parens */
                    372:        }
                    373: 
                    374: 
                    375: \?{B}*\)       |
                    376: {B}+{A}\.\)    |       /* ...Jones, A.)  */
                    377: \.{A}\.\)      |               /* (i.i.d.) */
                    378: \)     {
                    379:                if(--flag < 0)flag = 0;
                    380:                ECHO;
                    381:                if(save == 1)putchar(',');
                    382:                if(save==2) putchar(';');
                    383:                save=0;
                    384:        }
                    385: 
                    386: \)+[,;]        {
                    387:                if(--flag < 0)flag = 0;
                    388:                ECHO;
                    389:                save = 0;
                    390:                }
                    391: 
                    392: \]     {bracket=0; ECHO;}
                    393: 
                    394: \.     { /* all other .'s */
                    395:        ECHO;
                    396:        BEGIN ENDM;
                    397:        }
                    398: 
                    399: %%
                    400: int rdelim = 0;
                    401: int ldelim = 0;
                    402: char del[] = "elim";
                    403: skip(c1,c2,eqn)
                    404: char c1,c2;
                    405: {
                    406:        int c,first;
                    407:        char *s;
                    408:        first = 1;
                    409: cont:
                    410:        while((c=input()) != '.'){
                    411: ck:
                    412:                if(c == 0)return;
                    413:                if(c == '\n')first = 1;
                    414:                else first = 0;
                    415:                putchar(c);
                    416:                if(eqn && c == 'd'){
                    417:                        for(s=del;*s != '\0';s++){
                    418:                                if((c=input()) != *s)goto ck;
                    419:                                putchar(c);
                    420:                        }
                    421:                        while((c=input()) == ' ')putchar(c);
                    422:                        if(c == '\n' || c == 'o'){
                    423:                                ldelim = rdelim = OFF;
                    424:                                first = 1;
                    425:                                putchar(c);
                    426:                                if(c != '\n')
                    427:                                        while((c=input()) != '\n')putchar(c);
                    428:                                continue;
                    429:                        }
                    430:                        putchar(c);
                    431:                        ldelim = c;
                    432:                        rdelim = getchar();
                    433:                        putchar(c);
                    434:                        continue;
                    435:                }
                    436:        }
                    437:        if(first != 1){
                    438:                putchar('.');
                    439:                goto cont;
                    440:        }
                    441:        if((c=input()) != c1){
                    442:                if(c == 0)return;
                    443:                putchar('.'); putchar(c);
                    444:                if(c == '\n')first = 1;
                    445:                else first = 0;
                    446:                goto cont;
                    447:        }
                    448:        if((c=input()) != c2){
                    449:                if(c == 0)return;
                    450:                if(c == '\n')first = 1;
                    451:                else first = 0;
                    452:                printf(".%c%c",c1,c);
                    453:                goto cont;
                    454:        }
                    455:        printf(".%c%c",c1,c2);
                    456:        while((c=input()) != '\n'){
                    457:                if(c == 0)return;
                    458:                putchar(c);
                    459:        }
                    460:        unput('\n');
                    461: }
                    462: char buf[YYLMAX];
                    463: char *ptr = buf;
                    464: input(){
                    465:        int cc;
                    466:        if(ptr != buf){
                    467:                cc = *ptr--;
                    468:                if(ldelim == 0)return(cc);
                    469:                if(cc != ldelim && ineqn == 0)return(cc);
                    470:                if(ineqn == 0){
                    471:                        ineqn = 1;
                    472:                        return(ldelim);
                    473:                }
                    474:                putchar(cc);
                    475:                if(cc == rdelim)goto gotit;
                    476:                while(ptr != buf){
                    477:                        cc = *ptr--;
                    478:                        putchar(cc);
                    479:                        if(cc == rdelim){
                    480: gotit:
                    481:                                ineqn = 0;
                    482:                                if(ptr != buf)return(*ptr--);
                    483:                                else {
                    484:                                        cc=getchar();
                    485:                                        return(cc==EOF?0:cc);
                    486:                                }
                    487:                        }
                    488:                }
                    489:                goto more2;
                    490:        }
                    491:        if(ldelim == 0){
                    492:                cc=getchar();
                    493:                return(cc==EOF?0:cc);
                    494:        }
                    495: more:
                    496:        if((cc=getchar()) != ldelim && ineqn == 0){
                    497:                return(cc==EOF?0:cc);
                    498:        }
                    499:        if(ineqn == 0){
                    500:                ineqn = 1;
                    501:                return(ldelim);
                    502:        }
                    503:        putchar(cc);
                    504:        if(cc == rdelim){
                    505:                ineqn = 0;
                    506:                goto more;
                    507:        }
                    508: more2:
                    509:        while((cc=getchar()) != rdelim)
                    510:                if(cc == EOF){ineqn = 0; return(0);}
                    511:                else putchar(cc);
                    512:        putchar(cc);
                    513:        ineqn = 0;
                    514:        goto more;
                    515: }
                    516: unput(cc)
                    517: char cc;
                    518: {
                    519:        *(++ptr) = cc;
                    520:        if(ineqn && cc == ldelim)ineqn = 0;
                    521: }

unix.superglobalmegacorp.com

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