Annotation of researchv10no/cmd/punct/npunct.l, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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