[BACK]Return to oxweave.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

Annotation of OpenXM/src/kxx/oxweave.c, Revision 1.5

1.5     ! takayama    1: /*&eg
        !             2: \documentclass{article}
        !             3: \title{On oxweave.c}
        !             4: \author{} \date{}
        !             5: \begin{document}
        !             6: \maketitle
        !             7: \section{Introduction}
        !             8: */
1.1       takayama    9: /*&jp
                     10: \documentclass{jarticle}
                     11: \title{oxweave $B$N%=!<%9%3!<%I$K$D$$$F$N2r@b(B}
                     12: \author{} \date{}
                     13: \begin{document}
                     14: \maketitle
                     15: \section{$BA0=q$-(B}
                     16: */
1.5     ! takayama   17: /* $OpenXM: OpenXM/src/kxx/oxweave.c,v 1.4 1999/12/13 14:47:41 takayama Exp $ */
1.1       takayama   18: #include <stdio.h>
1.3       takayama   19:
                     20: /* Modify here to change the begin tag and EndComment. Less than 9 characters.
                     21: */
                     22: char *BeginTag0="/*\x026";  /* 0x26 = & */
                     23: char *BeginTag1="//\x026";  /* 0x26 = & */
                     24: char *EndComment0="*/";
                     25: char *EndComment1="\n";
                     26:
1.2       takayama   27: #define BSIZE 256
                     28: #define VSIZE 256
1.1       takayama   29: static int Debug = 0;
1.4       takayama   30: static int Plain = 0;
1.1       takayama   31: /*&jp \noindent
1.5     ! takayama   32:   $B:F5"(B option $B$r(B on $B$K$7$?>l9g(B ({\tt Recursive = 1},
        !            33:   {\tt LevelState1} $B$G(B, $B0u:~$9$Y$-(B comment $B$N%M%9%H$N%l%Y%k$rI=$9(B.
        !            34:   {\tt LevelState2} $B$G(B, $B:o=|$9$Y$-(B comment $B$N%M%9%H$N%l%Y%k$rI=$9(B.
        !            35: */
        !            36: static int Recursive = 0;
        !            37: static int LevelState1 = 0;
        !            38: static int LevelState2 = 0;
        !            39: /*&jp \noindent
1.1       takayama   40:   {\tt Buf} $B$OI8=`=PNO$h$j$N%G!<%?$r0l;~3JG<$7$F$*$/NN0h(B.
                     41:   {\tt Head} $B$,:G=i$NJ8;z$r$5$7(B, {\tt Tail} $B$O:G8e$NJ8;z$r$5$9(B.
                     42:   {\tt Buf} $B$r%j%s%0>u$K;HMQ$9$k$N$G(B, $B%j%s%0%P%C%U%!$H$h$V(B
                     43: $B$3$H$K$9$k(B.
                     44:  */
                     45: int Buf[BSIZE];
                     46: int Head = 0;
                     47: int Tail = 0;
                     48: char *Tag = NULL;
                     49: /*&jp \noindent {\tt OutputNoTaggedSegment = 1}
1.4       takayama   50:   $B$J$i(B $B%3%a%s%H5-9f$N30$O(B verbatim $B$rMQ$$$F=PNO(B.
                     51:   {\tt --source} $B%*%W%7%g%s$G$3$NJQ?t$r(B1$B$K$G$-$k(B.
1.5     ! takayama   52:   {\tt --plain} $B$G$O(B,  verbatim $B$rMxMQ$;$:$K@8$G=PNO(B.
1.4       takayama   53:   */
1.1       takayama   54: int OutputNoTaggedSegment = 0;
                     55: /*&jp \noindent 1 $B$J$i%?%0$N$D$$$?>l=j$r=PNOCf(B. */
                     56: int OutputtingTaggedSegment = 0;
                     57: int BeginVerbatim = 0;
                     58:
1.3       takayama   59:
1.1       takayama   60: /*&jp \section{$B%W%m%0%i%`K\BN(B} */
                     61: main(int argc,char *argv[]) {
1.3       takayama   62:   extern char *BeginTag;
                     63:   extern char *EndComment0;
                     64:   extern char *EndComment1;
1.4       takayama   65:   extern int Plain;
1.1       takayama   66:   int c;
                     67:   int tagc,i;
                     68:   char *tagv[VSIZE];
                     69:   int tagc2;
                     70:   char *tagv2[VSIZE];
1.3       takayama   71:   int pos;
1.1       takayama   72:   Head = Tail = 0; Buf[0] = ' ';  /* initialize */
                     73:
1.4       takayama   74:   /*&jp  {\tt tagv[]} $B$K%?%0$N$"$D$^$j$r$$$l$k(B.
1.5     ! takayama   75:     {\tt tagv2[]} $B$KBP1~$9$k%?%0$N$*$o$j$N5-9f$r$$$l$k(B.
        !            76:     */
1.3       takayama   77:   tagc = tagc2 = 0;
1.1       takayama   78:   if (argc <= 1 || argc >= VSIZE) {
                     79:     usage();
                     80:     exit();
                     81:   }else{
                     82:     for (i=1; i< argc ; i++) {
                     83:       if (strcmp(argv[i],"--source") == 0) {
1.5     ! takayama   84:        OutputNoTaggedSegment = 1;
        !            85:       }else if (strcmp(argv[i],"--plain") == 0) {
        !            86:        Plain = 1; OutputNoTaggedSegment = 1;
        !            87:       }else if (strcmp(argv[i],"--recursive") == 0) {
        !            88:        Recursive = 1;
1.3       takayama   89:       } else{
1.5     ! takayama   90:        if (strcmp(argv[i]," ") == 0) {
        !            91:          argv[i] = "";
        !            92:        }
        !            93:        tagv[tagc] = (char *) malloc(sizeof(char)*(strlen(argv[i])+10));
        !            94:        tagv2[tagc2] = (char *) malloc(sizeof(char)*10);
        !            95:        strcpy(tagv[tagc],BeginTag0);
        !            96:        strcat(tagv[tagc],argv[i]);
        !            97:        tagv2[tagc] = EndComment0;
        !            98:        /* $B%3%a%s%H$N$*$o$j$N5-9f(B.  */
        !            99:        tagc2++;
        !           100:        tagc++;
        !           101:
        !           102:        tagv[tagc] = (char *) malloc(sizeof(char)*(strlen(argv[i])+10));
        !           103:        tagv2[tagc2] = (char *) malloc(sizeof(char)*10);
        !           104:        strcpy(tagv[tagc],BeginTag1);
        !           105:        strcat(tagv[tagc],argv[i]);
        !           106:        tagv2[tagc] = EndComment1;
1.3       takayama  107:         tagc2++;
1.5     ! takayama  108:        tagc++;
1.1       takayama  109:       }
                    110:     }
                    111:   }
                    112:   /*&jp $B%W%m%0%i%`$O#3$D$N>uBV$r;}$D(B. $B>uBV(B 0 $B$O%?%0IU$-%3%a%s%H5-9f$N30(B.
1.5     ! takayama  113:     $B>uBV(B 1 $B$O;XDj$5$l$?%?%0$NIU$$$?%3%a%s%H$NCf(B.
        !           114:     $B>uBV(B 2 $B$O;XDj$5$l$F$$$J$$%?%0$NIU$$$?%3%a%s%H$NCf(B
        !           115:     ($B>uBV#2$K$"$k$H$-$O0u:~$5$l$J$$(B.) */
1.1       takayama  116:   /*
1.5     ! takayama  117:     state 0  -- / * & jp  --->  state 1
        !           118:     if ( BeginVerbatim & OutputNoTaggedSegment ) end-verbatim
        !           119:     <---  * /    ---   state 1
        !           120:     if ( OutputNoTaggedSegment ) begin-verbatim
        !           121:
        !           122:     state 0  -- / * & unknown  --->  state 2
        !           123:     <---  * /    ---   state 2
        !           124:
        !           125:     state 0  & OutputNoTaggedSegment  ==> putchar()
        !           126:     state 1                           ==> putchar()
        !           127:     state 2                           ==> skip
        !           128:     */
1.1       takayama  129:   while (notEOF()) {
1.3       takayama  130:     /* We are in the state 0. */
                    131:     pos = findNextTag(tagc,tagv,tagc2,tagv2);
1.5     ! takayama  132:     /* printf(" ===pos=%d=== ",pos); */
1.3       takayama  133:     /* We are in the state 1. */
                    134:     findEndTag(tagc2,tagv2,pos);
1.1       takayama  135:   }
                    136:   if (BeginVerbatim) {
1.4       takayama  137:     if (!Plain) printf("\n\\end{verbatim\x07d}\n");
1.1       takayama  138:   }
                    139:   exit(0);
                    140: }
                    141:
                    142: /*&jp \noindent $B<!$N4X?t$OMxMQK!$rI=<($9$k(B. */
                    143: usage() {
1.5     ! takayama  144: #include "oxweaveUsage.h"
1.1       takayama  145: }
                    146:
                    147: #define inc(a) ((a+1) % BSIZE)
                    148: /*&jp \noindent {\tt wread()} $B$O(B $BI8=`F~NO$h$j$N%G!<%?$rFI$a$k$@$1(B
1.5     ! takayama  149: $B%j%s%0%P%C%U%!(B {\tt Buf} $B$XFI$_9~$`(B.*/
1.1       takayama  150: wread() {
                    151:   int c,i;
                    152:   static int eof = 0;
                    153:   if (eof) return(-1);
                    154:   while (inc(Tail) != Head) {
                    155:     c = getchar();
                    156:     Tail = inc(Tail);
                    157:     Buf[Tail] = c;
                    158:     if (c == EOF) { eof = 1; return(-1); }
                    159:   }
                    160:   if (Debug == 1) {
                    161:     fprintf(stderr,"[Head=%d, Tail=%d, ",Head,Tail);
                    162:     for (i = Head; inc(i) != Tail; i = inc(i)) {
                    163:       fprintf(stderr,"%c",Buf[i]);
                    164:     }
                    165:     fprintf(stderr,"]\n");
                    166:   }
                    167:   return(0);
                    168: }
                    169:
                    170: /*&jp \noindent {\tt wgetc(p)} $B$O(B
                    171: {\tt p} $BJ8;zFI$_9~$s$G:G8e$N(B 1 $BJ8;z$N%"%9%-!<%3!<%I$rLa$9(B.
                    172:  */
                    173: int wgetc(int p) {
                    174:   int c;
                    175:   int i;
                    176:   wread();
                    177:   if (p < 1) p = 1;
                    178:   for (i=0; i<p; i++) {
                    179:     c = Buf[Head];
                    180:     if (c == EOF) return(c);
                    181:     Head = inc(Head);
                    182:     wread();
                    183:   }
                    184:   return(c);
                    185: }
                    186:
1.5     ! takayama  187: /*&jp  \noindent {\tt findNextTag()} $B$O<!$N(B {\tt / *\&} $B$J$k%?%0$r$5$,$9(B.
        !           188:    ( $B$3$l$O(B, {\tt BeginTag0} $B$NCM$rJQ$($k$HJQ99$G$-$k(B.)
1.1       takayama  189:   {\tt OutputNoTaggedSegment} $B$,(B 1 $B$J$i%G!<%?$r$=$N$^$^$J$,$9(B.
                    190:   $BL5;k$9$Y$-%?%0$N$H$-$O(B, $B%?%0FbIt$r%9%-%C%W$7$?$N$A(B
                    191:   {\tt findNextTag} $B$r:F5"E*$K8F$V(B.
                    192:   */
                    193: findNextTag(int tagc, char *tagv[],int tagc2,char *tagv2[]) {
                    194:   int i;
                    195:   int c,d;
1.3       takayama  196:   extern char *BeginTag0;
                    197:   extern char *BeginTag1;
1.1       takayama  198:   do {
                    199:     for (i=0; i<tagc; i++) {
1.3       takayama  200:       /* fprintf(stderr,"\nChecking %s : ",tagv[i]); */
1.1       takayama  201:       if (wcmp(tagv[i]) == 0) {
1.5     ! takayama  202:        LevelState1++;
        !           203:        /* fprintf(stderr," : matched."); */
        !           204:        wgetc(strlen(tagv[i])+1);
        !           205:        if (OutputNoTaggedSegment == 1 && BeginVerbatim == 1) {
        !           206:          BeginVerbatim = 0;
        !           207:          if (!Plain) printf("\\end{verbatim\x07d}\n");
        !           208:        }
        !           209:        OutputtingTaggedSegment = 1;
        !           210:        return(i);  /* Now, state is 1. */
1.1       takayama  211:       }
                    212:     }
1.5     ! takayama  213:     /*&jp {\tt / *\&} $B$@$1$I$I$N%?%0$K$b0lCW$7$J$$(B */
1.3       takayama  214:     if (wcmp(BeginTag0) == 1) {
1.5     ! takayama  215:       LevelState2++;
1.3       takayama  216:       wgetc(strlen(BeginTag0));
1.1       takayama  217:       while ((d=wgetc(1)) > ' ') ;
                    218:       /* We are in the state 2. */
1.3       takayama  219:       skipToEndTag(tagc2,tagv2,0);
1.1       takayama  220:       /* We are in the state 0. */
1.3       takayama  221:       return(findNextTag(tagc,tagv,tagc2,tagv2));
                    222:     }else if (wcmp(BeginTag1) == 1) {
1.5     ! takayama  223:       LevelState2++;
1.3       takayama  224:       wgetc(strlen(BeginTag1));
                    225:       while ((d=wgetc(1)) > ' ') ;
                    226:       /* We are in the state 2. */
                    227:       skipToEndTag(tagc2,tagv2,1);
                    228:       /* We are in the state 0. */
                    229:       return(findNextTag(tagc,tagv,tagc2,tagv2));
1.1       takayama  230:     }
                    231:     /* We are in the state 0 */
                    232:     c = wgetc(1);
                    233:     if (OutputNoTaggedSegment) {
1.4       takayama  234:       if (c != EOF) putchar(c);
1.1       takayama  235:     }
                    236:   }while( c!= EOF);
                    237:   if (BeginVerbatim == 1) {
1.4       takayama  238:     if (!Plain) printf("\n\\quad\n\\end{verbatim\x07d}\n");
1.1       takayama  239:   }
                    240:   exit(0);
                    241: }
                    242:
1.5     ! takayama  243: /*&jp  \noindent {\tt findEndTag()} $B$O<!$N(B {\tt * /} $B$J$k%?%0$r$5$,$9(B.
        !           244:        ( $B$3$l$O(B, EndComment0 $B$NCM$rJQ$($k$HJQ992DG=(B. )
        !           245:       {\tt / /} $B$G;O$^$k>l9g$O(B, 0xa $B$,$*$o$j(B.
1.1       takayama  246: */
1.3       takayama  247: findEndTag(int tagc,char *tagv[],int rule) {
1.1       takayama  248:   int i;
                    249:   int c;
                    250:   /* We are in the state 1. */
                    251:   do {
1.3       takayama  252:     i = rule;
                    253:     if (wcmp(tagv[i]) == 0) {
1.5     ! takayama  254:       LevelState1--;
        !           255:       /* printf("LevelState1=%d\n",LevelState1);*/
        !           256:       if (LevelState1 > 0 && Recursive) {
        !           257:        wgetc(strlen(tagv[i]));
        !           258:        printf("%s",tagv[i]);
        !           259:        return(findEndTag(tagc,tagv,rule));
        !           260:       }else{
        !           261:        wgetc(strlen(tagv[i]));
        !           262:        if (strcmp(tagv[i],"\n")==0) putchar('\n');
        !           263:        OutputtingTaggedSegment = 0;
        !           264:        if (OutputNoTaggedSegment) {
        !           265:          if (!Plain) printf("\n{\\footnotesize \\begin{verbatim}\n");
        !           266:          BeginVerbatim = 1;
        !           267:        }
        !           268:        return;                 /* Our state is 0. */
1.1       takayama  269:       }
                    270:     }
                    271:     /* Our state is 1. */
1.5     ! takayama  272:     if (wcmp("/*") >= 0 ) {
        !           273:       LevelState1++;
        !           274:       /* printf("LevelState1++=%d\n",LevelState1); */
        !           275:     }
1.1       takayama  276:     c = wgetc(1);
                    277:     putchar(c);
                    278:   }while( c!= EOF);
                    279:   fprintf(stderr,"findEndTag: unexpected EOF.\n");
                    280:   irregularExit();
                    281: }
                    282:
1.3       takayama  283: skipToEndTag(int tagc,char *tagv[],int rule) {
                    284:   int i;
                    285:   int c;
                    286:   extern char *EndComment0;
                    287:   extern char *EndComment1;
                    288:   /* our state is 2. */
                    289:   do {
                    290:     if (rule == 0) {
                    291:       if (wcmp(EndComment0) == 0) {
1.5     ! takayama  292:        LevelState2--;
        !           293:        if (LevelState2 > 0 && Recursive) {
        !           294:          wgetc(strlen(EndComment0));
        !           295:          return(skipToEndTag(tagc,tagv,rule));
        !           296:        }else{
        !           297:          wgetc(strlen(EndComment0));
        !           298:          return;  /* our state is 0. */
        !           299:        }
1.3       takayama  300:       }
                    301:     }else if (rule == 1) {
                    302:       if (wcmp(EndComment1) == 0) {
1.5     ! takayama  303:        LevelState2--;
        !           304:        if (LevelState2 > 0 && Recursive) {
        !           305:          wgetc(strlen(EndComment0));
        !           306:          return(skipToEndTag(tagc,tagv,rule));
        !           307:        }else{
        !           308:          wgetc(strlen(EndComment1));
        !           309:          return;  /* our state is 0. */
        !           310:        }
1.3       takayama  311:       }
                    312:     }else{
                    313:       for (i=0; i<tagc; i++) {
1.5     ! takayama  314:        if (wcmp(tagv[i]) == 0) {
        !           315:          LevelState2--;
        !           316:          if (LevelState2 > 0 && Recursive) {
        !           317:            wgetc(strlen(EndComment0));
        !           318:            return(skipToEndTag(tagc,tagv,rule));
        !           319:          }else{
        !           320:            wgetc(strlen(tagv[i]));
        !           321:            return;  /* our state is 0. */
        !           322:          }
        !           323:        }
1.3       takayama  324:       }
                    325:
                    326:     }
                    327:     /* our state is 2. */
1.5     ! takayama  328:     if (wcmp("/*") >= 0) LevelState2++;
1.1       takayama  329:     c = wgetc(1);
                    330:   }while( c!= EOF);
                    331:   fprintf(stderr,"findEndTag: unexpected EOF.\n");
                    332:   irregularExit();
                    333: }
                    334:
                    335: /*&jp \noindent {\tt wcmp(s)} $B$OJ8;zNs(B {\tt s} $B$H(B {\tt Buf[Head]} $B$+$i(B
                    336: $B$O$8$^$kJ8;zNs$rHf3S$9$k(B.
                    337: {\tt Buf[Head+strlen(s) % BSIZE]} $B$,(B 0x20 $B0J2<$G$"$j(B, $B$"$H$N%P%$%H$,(B
                    338: $B0lCW$9$l$P(B 0 $B$rLa$9(B.
                    339: $B$"$H$N%P%$%H$,(B 0x20 $B0J2<$G$J$$$,(B, $B$=$NB>$N%P%$%H$,0lCW$9$k$H$-$O(B
                    340: 1 $B$rLa$9(B.
                    341: $B0J>eFs$D$N>l9g$K9gCW$7$J$$>l9g$O(B -1 $B$rLa$9(B.
1.4       takayama  342: {\tt s} $B$,(B 0xa,0 $B$N$H$-$O(B, Buf[Head] $B$,(B 0xa $B$J$i(B, 0 $B$rLa$9(B.
                    343: $B$=$&$G$J$$$J$i(B, -1 $B$rLa$9(B.
1.1       takayama  344: */
                    345: wcmp(char *s) {
                    346:   int n;
                    347:   int i,j;
                    348:   wread();
                    349:   if (Debug == 2) fprintf(stderr,"[Checking %s]\n",s);
1.4       takayama  350:   if (strcmp(s,"\n") == 0) {
1.5     ! takayama  351:     if (s[0] == Buf[Head]) return(0);
        !           352:     else return(-1);
1.4       takayama  353:   }
1.1       takayama  354:   n = strlen(s);
                    355:   j = Head;
                    356:   for (i=0; i<n; i++) {
                    357:     if (s[i] != Buf[j]) return(-1);
                    358:     j = inc(j);
                    359:   }
                    360:   if (Buf[j] <= ' ') {
                    361:     if (Debug == 2) fprintf(stderr,"[Matched %s]\n",s);
                    362:     return(0);
                    363:   } else return(1);
                    364: }
                    365:
                    366: notEOF() {
                    367:   wread();
                    368:   if (Buf[Head] != -1) return(1);
                    369:   else return(0);
                    370: }
                    371:
                    372: irregularExit() {
                    373:   if (BeginVerbatim == 1) {
1.4       takayama  374:     if (!Plain) printf("\\end{verbatim\x07d}\n");
1.1       takayama  375:   }
                    376:   exit(-1);
                    377: }
                    378:
1.5     ! takayama  379:
1.1       takayama  380: /*&jp
1.5     ! takayama  381: \end{document}
        !           382: */
        !           383: /*&eg
1.1       takayama  384: \end{document}
                    385: */
                    386:
                    387:
                    388:
                    389:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>