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

Annotation of OpenXM/src/util/oxweave.c, Revision 1.1

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

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