This is mkdoc.c in view mode; [Download] [Up]
#include <config.h> #include <stdio.h> FILE *Fpin = stdin; FILE *Fpout = stdout; #define SKIP_TO(x) while (c = getc(Fpin), (c != EOF) && (c != (x))) #define SKIP_WHITE while (c = getc(Fpin), (c == ' ') || (c == '\t')) void do_sl_file() { int c = '\n'; int type, n; /* looking for this format: ) function ;%% doc... */ while (c != EOF) { while ((c != '\n') && (c != EOF)) c = getc(Fpin); n = 0; while (1) { SKIP_WHITE; if (c != ';') break; if (getc(Fpin) != '%') break; if (getc(Fpin) != '%') break; SKIP_WHITE; n = 1; if (c == EOF) break; do { putc(c, Fpout); } SKIP_TO('\n'); putc(1, Fpout); } if (n) putc('\n', Fpout); } } void do_c_file() { int c = '\n'; int type; while (c != EOF) { while ((c != '\n') && (c != EOF)) c = getc(Fpin); SKIP_WHITE; if (c != 'a') continue; c = getc(Fpin); if (c != 'd') continue; c = getc(Fpin); if (c != 'd') continue; c = getc(Fpin); if (c != '_') continue; c = getc(Fpin); if (c == 'i') { c = getc(Fpin); if (c != 'n') continue; c = getc(Fpin); if (c != 't') continue; c = getc(Fpin); if (c != 'r') continue; c = getc(Fpin); if (c != 'i') continue; c = getc(Fpin); if (c != 'n') continue; c = getc(Fpin); if (c != 's') continue; c = getc(Fpin); if (c != 'i') continue; c = getc(Fpin); if (c != 'c') continue; type = 'f'; putc('F', Fpout); } else if (c != 'v') continue; else { c = getc(Fpin); if (c != 'a') continue; c = getc(Fpin); if (c != 'r') continue; c = getc(Fpin); if (c != 'i') continue; c = getc(Fpin); if (c != 'a') continue; c = getc(Fpin); if (c != 'b') continue; c = getc(Fpin); if (c != 'l') continue; c = getc(Fpin); if (c != 'e') continue; type = 'v'; putc('V', Fpout); } SKIP_WHITE; if (c != '(') continue; SKIP_WHITE; if (c != '"') continue; SKIP_TO('"') { if (c == '\\') { c = getc(Fpin); if ((c != '"') && (c != '\\')) putc('\\', Fpout); } putc(c, Fpout); } fflush(Fpout); if (type == 'f') /* get function, parameter number and return type */ { /* example: add_intrinsic("coreleft", (long) show_memory,VOID_TYPE, 0); */ SKIP_TO(')'); /* (long) */ SKIP_WHITE; putc(':', Fpout); putc(c, Fpout); SKIP_TO(',') { putc(c, Fpout); } putc(':', Fpout); SKIP_WHITE; putc(c, Fpout); /* type: V,S,I (void, string , integer ) */ SKIP_TO(','); putc(':', Fpout); SKIP_WHITE; if (c != EOF) putc(c, Fpout); /* number of parameters */ } putc(1, Fpout); /* get doc string */ SKIP_TO('\n'); SKIP_WHITE; /* doc follows / * ;; syntax */ if (c != '/') { ungetc(c, Fpin); c = '\n'; putc('\n', Fpout); continue; } c = getc(Fpin); if (c != '*') { putc('\n', Fpout); continue; } while (1) { SKIP_WHITE; if (c != ';') break; c = getc(Fpin); if (c != ';') break; SKIP_TO('\n') putc(c, Fpout); putc(1, Fpout); /* literal ^A to separate lines */ } ungetc(c, Fpin); c = '\n'; putc('\n', Fpout); } } int process_file(char *file) { if ((Fpin = fopen(file,"r")) == NULL) return(0); /* do_sl_file(); */ do_c_file(); fclose(Fpin); } void do_filelist(char *file) { char line[512], *chp, *linep; FILE *fp; if (NULL == (fp = fopen(file, "r"))) { fprintf(stderr, "unable to open input file: %s\n", file); exit(1); } while(NULL != fgets(line, 511, fp)) { if (*line == '#') continue; linep = line; while(*linep && (*linep <= ' ')) linep++; chp = linep; while (*chp > ' ') chp++; *chp = 0; if (! *linep) continue; if (!process_file(linep)) { fprintf(stderr, "Unable to open %s\n", linep); } } fclose(fp); } void usage(void) { fprintf(stderr, "mkdoc [-o docfile] [-i filelist] [file1 ...]\n"); exit(1); } int main(int argc, char **argv) { int i; char *arg; if (argc < 2) usage(); for (i = 1; i < argc; ) { arg = argv[i++]; if ((i != argc) && !strcmp(arg, "-i")) { do_filelist(argv[i++]); } else if ((i != argc) && !strcmp(arg, "-o")) { if ((Fpout != NULL) && (Fpout != stdout)) fclose(Fpout); if ((Fpout = fopen(argv[i++], "w")) == NULL) { fprintf(stderr, "Unable to open output file %s\n", argv[i - 1]); exit(1); } } else process_file(arg); } exit(0); return(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.