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>