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

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

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

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