Annotation of OpenXM/src/util/oxgentexi.c, Revision 1.1
1.1 ! takayama 1: /* $OpenXM$ */
! 2:
! 3: #include <stdio.h>
! 4: int Debug = 0;
! 5: #define VMAX 20
! 6: #define LIMIT 1024
! 7: #define ITEMMAX 1024
! 8: struct item {
! 9: char *category; /* base */
! 10: char *category2; /* taka_base */
! 11: char *name; /* base_replace */
! 12: int argc;
! 13: char *argv[VMAX]; /* A and Rule of base_replace(A,Rule) */
! 14: int optc;
! 15: char *optv[VMAX];
! 16: char *shortDescription;
! 17: char *description;
! 18: char *algorithm;
! 19: char *examplev[VMAX];
! 20: char *exampleDescv[VMAX];
! 21: int examplec;
! 22: int refc;
! 23: char *refv[VMAX];
! 24: char *author;
! 25: };
! 26: struct item *getItem(void);
! 27: char *str(char *key);
! 28: char *str2(char *key,int size);
! 29: int cmpItem(struct item *it,struct item *it2);
! 30:
! 31: char *S;
! 32: int Ssize = 256;
! 33: int Sp = 0;
! 34: char *Upnode;
! 35: char *Category=NULL;
! 36: char *Lang="en";
! 37: int Include = 0;
! 38: int GenExample = 0;
! 39:
! 40: main(int argc,char *argv[]) {
! 41: char *t;
! 42: int p,c,n,i;
! 43: struct item *tt;
! 44: struct item *items[ITEMMAX];
! 45:
! 46: Upnode = str("UNKNOWN");
! 47: for (i=1; i<argc; i++) {
! 48: if (strcmp(argv[i],"--upnode") == 0) {
! 49: i++; if (i >= argc) { fprintf(stderr,"--upnode node-name\n"); exit(1);}
! 50: Upnode = str(argv[i]);
! 51: }else if (strcmp(argv[i],"--category") == 0) {
! 52: i++; if (i >= argc) { fprintf(stderr,"--category category-name\n"); exit(1);}
! 53: Category = str(argv[i]);
! 54: }else if (strcmp(argv[i],"--en") == 0) {
! 55: Lang = "en";
! 56: }else if (strcmp(argv[i],"--ja") == 0) {
! 57: Lang = "ja";
! 58: }else if (strcmp(argv[i],"--include") == 0) {
! 59: Include = 1;
! 60: }else if (strcmp(argv[i],"--example") == 0) {
! 61: GenExample = 1;
! 62: }else if (strcmp(argv[i],"--debug") == 0) {
! 63: Debug = 1;
! 64: }else {
! 65: fprintf(stderr,"Unknown option\n"); exit(1);
! 66: }
! 67: }
! 68: S = (char *)malloc(Ssize);
! 69: /* Read data from stdin to the string buffer S */
! 70: while ((c=getchar()) != EOF) {
! 71: S[Sp++] = c; S[Sp] = 0;
! 72: if (Sp >= Ssize-3) {
! 73: Ssize = 2*Ssize;
! 74: t = S;
! 75: S = (char *)malloc(Ssize);
! 76: if (S == NULL) {
! 77: fprintf(stderr,"No more memory to allocate S.\n");
! 78: exit(20);
! 79: }
! 80: strcpy(S,t);
! 81: }
! 82: }
! 83:
! 84: /* Read items */
! 85: n = 0;
! 86: while ((tt = getItem()) != NULL) {
! 87: if (Debug) printItem(tt);
! 88: if (n >= ITEMMAX) {
! 89: fprintf(stderr,"Too many entries.\n"); exit(1);
! 90: }
! 91: if (Category != NULL) {
! 92: if (strcmp(Category,tt->category) == 0 ||
! 93: strcmp(Category,tt->category2) == 0) {
! 94: items[n++] = tt;
! 95: }
! 96: }else{
! 97: items[n++] = tt;
! 98: }
! 99: }
! 100: if (Debug) fprintf(stderr,"Sorting...\n");
! 101: shell(items,n);
! 102: if (Debug) fprintf(stderr,"Done.\n");
! 103:
! 104: printMenu(stdout,items,n);
! 105:
! 106: for (i=0; i<n; i++) {
! 107: printTexi(stdout,items[i]);
! 108: }
! 109: exit(0);
! 110: }
! 111:
! 112: genInclude(char *name) {
! 113: char fname[4098];
! 114: FILE *fp;
! 115: int c;
! 116:
! 117: sprintf(fname,"tmp/%s-auto-%s.texi",name,Lang);
! 118: fp = fopen(fname,"r");
! 119: if (fp == NULL) {
! 120: /* fprintf(stderr,"No file %s\n",fname); */
! 121: return 0;
! 122: }
! 123: while ((c=fgetc(fp)) != EOF) {
! 124: putchar(c);
! 125: }
! 126: putchar('\n');
! 127: fclose(fp);
! 128: return 0;
! 129: }
! 130:
! 131: cmpItem(struct item *it,struct item *it2) {
! 132: return strcmp(it->name,it2->name);
! 133: }
! 134: struct item * newItem(){
! 135: struct item *a;
! 136: a = (struct item *)malloc(sizeof(struct item));
! 137: if (a == NULL) {
! 138: fprintf(stderr,"newItem: No more memory.\n");
! 139: exit(20);
! 140: }
! 141: a->argc = 0; a->optc = 0; a->refc=0; a->examplec = 0;
! 142: a->category = a->category2 = a->name = a->shortDescription
! 143: = a->description = a->author = a->algorithm = NULL;
! 144: return a;
! 145: }
! 146:
! 147: nextToken(char *key,int n) {
! 148: static int pos = 0;
! 149: int i = 0;
! 150: if (pos >= Ssize) return -1;
! 151: while (S[pos] <= ' ') {
! 152: pos++;
! 153: if (pos >= Ssize) return -1;
! 154: }
! 155: while (S[pos] > ' ') {
! 156: key[i++] = S[pos++]; key[i] = 0;
! 157: if (i >= n-1) {
! 158: fprintf(stderr,"Too big key word.\n");
! 159: fprintf(stderr,"key=%s\n",key);
! 160: exit(10);
! 161: }
! 162: if (S[pos-1] == '(' ||
! 163: S[pos-1] == ')' ||
! 164: S[pos-1] == ',' ||
! 165: S[pos-1] == '{' ||
! 166: S[pos-1] == '}' ||
! 167: S[pos-1] == '|' ) {
! 168: return pos;
! 169: }
! 170: if (S[pos] == '(' ||
! 171: S[pos] == ')' ||
! 172: S[pos] == ',' ||
! 173: S[pos] == '{' ||
! 174: S[pos] == '}' ||
! 175: S[pos] == '|' ) {
! 176: return pos;
! 177: }
! 178:
! 179: }
! 180: if (Debug) fprintf(stderr,"token=%s\n",key);
! 181: return pos;
! 182: }
! 183:
! 184: printItem(struct item *it) {
! 185: int i;
! 186: if (it == NULL) return;
! 187: if (it->category != NULL)
! 188: printf("category=%s\n",it->category);
! 189: if (it->category2 != NULL)
! 190: printf("category2=%s\n",it->category2);
! 191: if (it->name != NULL)
! 192: printf("name=%s\n",it->name);
! 193: for (i=0; i<it->argc; i++)
! 194: printf(" argv[%d]=%s\n",i,it->argv[i]);
! 195: for (i=0; i<it->optc; i++)
! 196: printf(" optv[%d]=%s\n",i,it->optv[i]);
! 197: if (it->shortDescription != NULL)
! 198: printf("shortDescription=%s\n",it->shortDescription);
! 199: if (it->description != NULL)
! 200: printf("description=%s\n",it->description);
! 201: if (it->algorithm != NULL)
! 202: printf("algorithm=%s\n",it->algorithm);
! 203: for (i=0; i <it->examplec; i++)
! 204: printf("examplev[%d]=%s\n",i,it->examplev[i]);
! 205: for (i=0; i <it->examplec; i++)
! 206: printf("exampleDescv[%d]=%s\n",i,it->exampleDescv[i]);
! 207: for (i=0; i<it->refc; i++)
! 208: printf(" refv[%d]=%s\n",i,it->refv[i]);
! 209: if (it->author != NULL)
! 210: printf("author=%s\n",it->author);
! 211: printf("\n");
! 212: }
! 213:
! 214: char *str(char *key) {
! 215: char *s;
! 216: s = (char *)malloc(strlen(key)+1);
! 217: if (s == NULL) {
! 218: fprintf(stderr,"str: No more memory.\n");
! 219: exit(20);
! 220: }
! 221: strcpy(s,key);
! 222: return s;
! 223: }
! 224: char *str2(char *key,int size) {
! 225: char *s;
! 226: int i;
! 227: s = (char *)malloc(size+1);
! 228: if (s == NULL) {
! 229: fprintf(stderr,"str2: No more memory.\n");
! 230: exit(20);
! 231: }
! 232: for (i=0; i<size; i++) {
! 233: s[i] = key[i]; s[i+1] = 0;
! 234: }
! 235: return s;
! 236: }
! 237: char *getCategory(char *key) {
! 238: int i,n;
! 239: char *s;
! 240: s = str(key);
! 241: for (i=0; i<strlen(s); i++) {
! 242: if ((s[i] == '_') || s[i] == '.') {
! 243: s[i] = 0;
! 244: return s;
! 245: }
! 246: }
! 247: return s;
! 248: }
! 249: char *getCategory2(char *key) {
! 250: int i,n;
! 251: char *s;
! 252: int count;
! 253: s = str(key);
! 254: for (i=0; i<strlen(s); i++) {
! 255: if ((s[i] == '_') || (s[i] == '.')) count++;
! 256: if (count == 2) {
! 257: s[i] = 0; return s;
! 258: }
! 259: }
! 260: return s;
! 261: }
! 262:
! 263:
! 264: struct item *getItem() {
! 265: char key[LIMIT];
! 266: char key2[LIMIT];
! 267: struct item *it;
! 268: int p;
! 269: int pp,pOld;
! 270: int argc;
! 271: int examplec = 0;
! 272: it = newItem();
! 273: do {
! 274: p = nextToken(key,LIMIT);
! 275: /* printf("%s\n",key); */
! 276: if (strcmp(key,"begin:") == 0) break;
! 277: }while (p >= 0);
! 278: if (p < 0) {
! 279: /* fprintf(stderr,"gentexi: End of input file.\n"); */
! 280: return NULL;
! 281: }
! 282: p = nextToken(key,LIMIT);
! 283: it->name = str(key);
! 284: it->category = getCategory(key);
! 285: it->category2 = getCategory2(key);
! 286: nextToken(key,LIMIT);
! 287: if (strcmp(key,"(") != 0) {
! 288: fprintf(stderr," ( is expected at %s\n",it->name);
! 289: exit(10);
! 290: }
! 291: argc = 0;
! 292: while ((pp=nextToken(key,LIMIT)) >= 0) {
! 293: if (strcmp(key,"|") == 0) {
! 294: /* options */
! 295: argc = 0;
! 296: while ((pp=nextToken(key,LIMIT)) >= 0) {
! 297: if (strcmp(key,")") == 0) {
! 298: break;
! 299: }
! 300: if (strcmp(key,",") != 0) {
! 301: it->optv[argc] = str(key);
! 302: argc++; it->optc = argc;
! 303: }
! 304: if (argc >+ VMAX -1) {
! 305: fprintf(stderr,"Too many opt args at %s\n",it->name);
! 306: exit(10);
! 307: }
! 308: }
! 309: }
! 310: if (strcmp(key,")") == 0) {
! 311: break;
! 312: }else if (strcmp(key,",") != 0) {
! 313: it->argv[argc] = str(key);
! 314: argc++; it->argc=argc;
! 315: }
! 316: if (argc >= VMAX-1) {
! 317: fprintf(stderr,"Too many args at %s\n",it->name);
! 318: exit(10);
! 319: }
! 320: }
! 321:
! 322: /* Getting the short Description */
! 323: p = pp;
! 324: do {
! 325: pOld = p;
! 326: p = nextToken(key,LIMIT);
! 327: /* printf("%s\n",key); */
! 328: if (key[strlen(key)-1] == ':') break; /* Next keyword. */
! 329: }while (p >= 0);
! 330: it->shortDescription = str2(&(S[pp]),pOld-pp);
! 331:
! 332:
! 333: do {
! 334: /* Get Description or Examples */
! 335: if (strcmp(key,"end:") == 0) break;
! 336: if (strcmp(key,"description:") == 0 ||
! 337: strcmp(key,"algorithm:") == 0 ||
! 338: strcmp(key,"author:") == 0 ||
! 339: strcmp(key,"example:") == 0 ||
! 340: strcmp(key,"example_description:") ==0 ) {
! 341: pp = p;
! 342: strcpy(key2,key);
! 343: do {
! 344: pOld = p;
! 345: p = nextToken(key,LIMIT);
! 346: /* printf("%s\n",key); */
! 347: if (key[strlen(key)-1] == ':') break; /* Next keyword. */
! 348: }while (p >= 0);
! 349: if (strcmp(key2,"description:") == 0) {
! 350: it->description = str2(&(S[pp]),pOld-pp);
! 351: }
! 352: if (strcmp(key2,"example:") == 0) {
! 353: it->examplev[examplec++] = str2(&(S[pp]),pOld-pp);
! 354: it->exampleDescv[examplec-1] = "";
! 355: it->examplec = examplec;
! 356: if (examplec > VMAX-1) {
! 357: fprintf(stderr,"Too many examples. \n");
! 358: exit(20);
! 359: }
! 360: }
! 361: if (strcmp(key2,"example_description:") == 0) {
! 362: it->exampleDescv[examplec-1] = str2(&(S[pp]),pOld-pp);
! 363: }
! 364: if (strcmp(key2,"author:") == 0) {
! 365: it->author = str2(&(S[pp]),pOld-pp);
! 366: }
! 367: if (strcmp(key2,"algorithm:") == 0) {
! 368: it->algorithm = str2(&(S[pp]),pOld-pp);
! 369: }
! 370: }else if (strcmp(key,"ref:") == 0) {
! 371: argc = 0;
! 372: while ((pp=nextToken(key,LIMIT)) >= 0) {
! 373: p = pp;
! 374: if (key[strlen(key)-1] == ':') break;
! 375: if (strcmp(key,",") != 0) {
! 376: it->refv[argc] = str(key);
! 377: argc++; it->refc = argc;
! 378: }
! 379: if (argc >= VMAX-1) {
! 380: fprintf(stderr,"Too many args for Ref at %s\n",it->name);
! 381: exit(10);
! 382: }
! 383: }
! 384: }else{
! 385: fprintf(stderr,"Warning: unknown keyword << %s >> at %s. Ignored.\n",key, it->name);
! 386: p = nextToken(key,LIMIT);
! 387: }
! 388: }while (p >= 0);
! 389:
! 390: return it;
! 391: }
! 392:
! 393: shell(struct item *v[],int n) {
! 394: int gap,i,j;
! 395: struct item *temp;
! 396:
! 397: for (gap = n/2; gap > 0; gap /= 2) {
! 398: for (i = gap; i<n; i++) {
! 399: for (j=i-gap ; j>=0 && cmpItem(v[j],v[j+gap])>0 ; j -= gap) {
! 400: temp = v[j];
! 401: v[j] = v[j+gap];
! 402: v[j+gap] = temp;
! 403: }
! 404: }
! 405: }
! 406: }
! 407:
! 408: printMenu(FILE *fp, struct item **it, int n) {
! 409: int i;
! 410:
! 411: fprintf(fp,"@menu\n");
! 412: for ( i = 0; i < n; i++ )
! 413: fprintf(fp,"* %s::\n",it[i]->name);
! 414: fprintf(fp,"@end menu\n");
! 415: }
! 416:
! 417: printTexi(FILE *fp, struct item *it) {
! 418: int i;
! 419: fprintf(fp,"@c DO NOT EDIT THIS FILE. Generated by gentexi.\n");
! 420: if (it == NULL) {
! 421: fprintf(fp,"@c item is NULL.\n");
! 422: return ;
! 423: }
! 424: if (it->name == NULL) {
! 425: fprintf(fp,"@c item name is missing.\n");
! 426: return ;
! 427: }
! 428:
! 429: #if 0
! 430: fprintf(fp,"@menu\n");
! 431: fprintf(fp,"* %s::\n",it->name);
! 432: fprintf(fp,"@end menu\n");
! 433: #endif
! 434: fprintf(fp,"@node %s,,, %s\n",it->name,Upnode);
! 435: fprintf(fp,"@subsection @code{%s}\n",it->name);
! 436: fprintf(fp,"@findex %s\n",it->name);
! 437: fprintf(fp,"@table @t\n");
! 438: fprintf(fp,"@item %s(",it->name);
! 439: for (i=0; i<it->argc; i++) {
! 440: fprintf(fp,"@var{%s}",it->argv[i]);
! 441: if (i != it->argc-1) fprintf(fp,",");
! 442: }
! 443: fprintf(fp,")\n");
! 444: if (it->shortDescription != NULL) {
! 445: fprintf(fp,": ");
! 446: for (i=0; i<strlen(it->shortDescription); i++) {
! 447: if (it->shortDescription[i] == '{') {
! 448: fprintf(fp,"@var{");
! 449: }else {
! 450: fprintf(fp,"%c",it->shortDescription[i]);
! 451: }
! 452: }
! 453: fprintf(fp," \n");
! 454: }
! 455: if (it->optc > 0) {
! 456: fprintf(fp,"@item %s(",it->name);
! 457: for (i=0; i<it->argc; i++) {
! 458: fprintf(fp,"@var{%s}",it->argv[i]);
! 459: if (i != it->argc-1) fprintf(fp,",");
! 460: }
! 461: fprintf(fp," | ");
! 462: for (i=0; i<it->optc; i++) {
! 463: fprintf(fp,"@var{%s}=key%d",it->optv[i],i);
! 464: if (i != it->optc-1) fprintf(fp,",");
! 465: }
! 466: fprintf(fp,")\n");
! 467: fprintf(fp,": This function allows optional variables \n ");
! 468: for (i=0; i<it->optc; i++) {
! 469: fprintf(fp,"@var{%s}",it->optv[i]);
! 470: if (i != it->optc-1) fprintf(fp,", ");
! 471: }
! 472: fprintf(fp,"\n");
! 473: }
! 474: fprintf(fp,"@end table\n");
! 475:
! 476: /* include file */
! 477: if (Include) {
! 478: if (genInclude(it->name))
! 479: fprintf(fp,"@c @include tmp/%s-auto-en.texi\n",it->name);
! 480: }
! 481: fprintf(fp,"@c @itemize @bullet \n");
! 482: fprintf(fp,"@c @item \n");
! 483: fprintf(fp,"@c @end itemize\n");
! 484:
! 485: if (it->description != NULL) {
! 486: fprintf(fp,"%s\n\n",it->description);
! 487: }
! 488:
! 489: if (it->algorithm != NULL) {
! 490: fprintf(fp,"\n\n@noindent\nAlgorithm: \n");
! 491: fprintf(fp,"%s\n\n",it->algorithm);
! 492: }
! 493:
! 494: if (it->examplec > 0) {
! 495: for (i=0; i<it->examplec; i++) {
! 496: if (it->examplec == 1) {
! 497: fprintf(fp,"Example:\n");
! 498: }else{
! 499: fprintf(fp,"Example %d:\n",i);
! 500: }
! 501: fprintf(fp,"@example\n");
! 502: fprintf(fp,"%s\n",it->examplev[i]);
! 503: if (GenExample) {
! 504: outputOfExample(it->examplev[i]);
! 505: }
! 506: fprintf(fp,"@end example\n");
! 507: if (it->exampleDescv[i] != NULL && strlen(it->exampleDescv[i]) > 0) {
! 508: fprintf(fp,"%s\n\n",it->exampleDescv[i]);
! 509: }
! 510: }
! 511: }
! 512: if (it->author != NULL) {
! 513: fprintf(fp,"Author : %s\n\n",it->author);
! 514: }
! 515: if (it->refc > 0) {
! 516: fprintf(fp,"@table @t\n");
! 517: fprintf(fp,"@item References\n");
! 518: for (i=0; i <it->refc; i++) {
! 519: fprintf(fp,"@code{%s} ",it->refv[i]);
! 520: if (i != it->refc-1) fprintf(fp,", ");
! 521: }
! 522: fprintf(fp,"\n@end table\n");
! 523: }
! 524: fprintf(fp,"\n");
! 525: }
! 526:
! 527: outputOfExample(char *com) {
! 528: FILE *fp2;
! 529: int c;
! 530: fp2 = fopen("gentexi-in.tmp","w");
! 531: if (fp2 == NULL) {
! 532: fprintf(stderr,"Cannot open tentexi-in.tmp\n");
! 533: exit(10);
! 534: }
! 535: system("rm -f gentexi-out.tmp");
! 536: fprintf(fp2,"output(\"gentexi-out.tmp\")$\n");
! 537: fprintf(fp2,"%s\n",com);
! 538: fprintf(fp2,"output()$\n");
! 539: fprintf(fp2,"quit;");
! 540: fclose(fp2);
! 541: system("asir <gentexi-in.tmp >/dev/null");
! 542:
! 543: fp2 = fopen("gentexi-out.tmp","r");
! 544: if (fp2 == NULL) {
! 545: fprintf(stderr,"Cannot open tentexi-in.tmp\n");
! 546: exit(10);
! 547: }
! 548: while ((c=fgetc(fp2)) != EOF) {
! 549: putchar(c);
! 550: }
! 551: putchar('\n');
! 552: }
! 553:
! 554: /* Old file was OpenXM/src/asir-contrib/packages/doc/gentexi.c */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>