|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.