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