|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 6199 (0x1837) Types: TextFile Names: »fixwrites.c«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89 └─⟦this⟧ »./tex82/web2cdir/fixwrites.c«
/* * This program converts the pascal-type write/writeln's into fprintf's * or putc's. * * Tim Morgan October 10, 1987 */ #include <stdio.h> #include "site.h" #ifdef SYSV #define index strchr #endif #define TRUE 1 #define FALSE 0 char buf[BUFSIZ], filename[100], *file, *argp, args[100], *as, *cmd; int tex = FALSE; extern char *index(), *strcpy(); char *insert_long(cp) char *cp; { char tbuf[BUFSIZ]; register int i; for (i=0; &buf[i] < cp; ++i) tbuf[i] = buf[i]; (void) strcpy(&tbuf[i], "(long)"); (void) strcpy(&tbuf[i+6], cp); (void) strcpy(buf, tbuf); return(cp+6); } void join(cp) char *cp; { char temp[BUFSIZ], *tp; if (!gets(temp)) return; *cp++ = ' '; for (tp=temp; *tp == ' '; ++tp); (void) strcpy(cp, tp); } void do_blanks(indent) int indent; { register int i; for (i=0; i<indent/8; i++) (void) putchar('\t'); indent %= 8; for (i=0; i<indent; i++) (void) putchar(' '); } /* * Return true if we have a whole write/writeln statement. We determine * this by matching parens, ignoring those within strings. */ whole(buf) char *buf; { register char *cp; register int depth=0; cp = buf; while (cp && *cp) { switch (*cp) { case '(': ++depth; break; case ')': --depth; break; case '"': for (++cp; cp && *cp && *cp != '"'; ++cp) if (*cp == '\\') ++cp; break; case '\'': ++cp; if (*cp == '\\') ++cp; ++cp; break; } ++cp; } return(depth <= 0); } /* Skips to the next , or ), skipping over balanced paren pairs */ char *skip_balanced(cp) char *cp; { register int depth = 0; while (depth > 0 || (*cp != ',' && *cp != ')')) { switch (*cp) { case '(': ++depth; break; case ')': --depth; break; } ++cp; } return(cp); } /* Return true if c appears, except inside a quoted string */ bare(cp, c) char *cp, c; { for (; *cp && *cp != c; ++cp) { if (*cp == '"') { ++cp; /* Skip over initial quotation mark */ while (*cp && *cp != '"') { /* skip to closing double quote */ if (*cp == '\\') ++cp; ++cp; } } else if (*cp == '\'') { ++cp; /* Skip to contained char */ if (*cp == '\'') ++cp; /* if backslashed, it's double */ ++cp; /* Skip to closing single-quote mark */ } } return(*cp); } main(argc, argv) char *argv[]; { register char *cp; int blanks_done, indent, i; for (i=1; i<argc; i++) switch (argv[i][1]) { case 't': tex = TRUE; break; default: (void) fprintf(stderr, "Unknown flag %s\n", argv[i]); exit(1); } while (gets(buf)) { blanks_done = FALSE; for (cp=buf; *cp; ++cp); while (*--cp == ' '); while (*cp == '.') { join(cp+1); while (*cp) ++cp; while (*--cp == ' '); } for (cp=buf, indent=0; *cp == ' ' || *cp == '\t'; ++cp) { if (*cp == ' ') indent++; else indent += 8; } if (!*cp) { /* All blanks, possibly with "{" */ (void) puts(buf); continue; } if (*cp == '{') { do_blanks(indent); (void) putchar('{'); ++cp; while (*cp == ' ' || *cp == '\t') ++cp; blanks_done = TRUE; if (!*cp) { (void) putchar('\n'); continue; } } if (!blanks_done) do_blanks(indent); if (strncmp(cp, "read ( input", 12) == 0) { char variable_name[20]; if (sscanf(cp, "read ( input , %s )", variable_name) != 1) (void) fprintf(stderr, "sscanf failed\n"), exit(1); (void) printf("%s = getint();\n", variable_name); continue; } if (strncmp(cp, "lab", 3) == 0 && index(cp, ':')) { do { (void) putchar(*cp); } while (*cp++ != ':'); while (*cp == ' ') ++cp; (void) putchar(' '); } if (strncmp(cp, "else write", 10) == 0) { (void) puts("else"); do_blanks(indent); cp += 5; while (*cp == ' ') ++cp; } if (bare(cp, '{')) { while (*cp != '{') { (void) putchar(*cp); ++cp; } ++cp; (void) puts("{"); indent += 4; do_blanks(indent); while (*cp == ' ') ++cp; } if (strncmp(cp, "write (", 7) && strncmp(cp, "writeln (", 9)) { /* if not a write/writeln, just copy it to stdout and continue */ (void) puts(cp); continue; } cmd = cp; while (!whole(buf)) /* Make sure we have whole stmt */ (void) gets(&buf[strlen(buf)]); while (*cp != '(') ++cp; ++cp; while (*(cp+1) == ' ') ++cp; if (*(cp+1) == '"' || *(cp+1) == '\'' || strncmp(cp+1, "buffer", 6) == 0 || strncmp(cp+1, "dig", 3) == 0 || strncmp(cp+1, "xchr", 4) == 0 || strncmp(cp+1, "k ,", 3) == 0 || strncmp(cp+1, "s ,", 3) == 0) (void) strcpy(filename, "stdout"); else { file = filename; while (*cp != ',' && *cp != ')') *file++ = *cp++; *file = '\0'; } if (*cp == ')') { (void) printf("(void) putc('\\n', %s);\n", filename); continue; } argp = ++cp; as = args; while (*cp==' ') ++cp; while (*cp != ')') { if (*cp == '\'' || strncmp(cp, "xchr", 4) == 0 || strncmp(cp, "ASCII04", 7) == 0 || strncmp(cp, "ASCII1", 6) == 0 || strncmp(cp, "nameoffile", 10) == 0 || strncmp(cp, "months", 6) == 0) { *as++ = '%'; *as++ = 'c'; if (tex && strncmp(cp, "xchr", 4) == 0) { *cp = 'X'; cp = index(cp, '['); *cp = '('; cp = index(cp, ']'); *cp++ = ')'; } else if (*cp == '\'') cp += 2; } else if (*cp == '"') { *as++ = '%'; *as++ = 's'; while (*++cp != '"') /* skip to end of string */ if (*cp == '\\') ++cp; /* allow \" in string */ } else { *as++ = '%'; *as++ = 'l'; *as++ = 'd'; cp = insert_long(cp); cp = skip_balanced(cp);/* It's a numeric expression */ } while (*cp != ',' && *cp != ')') ++cp; while (*cp == ',' || *cp == ' ') ++cp; } if (strncmp(cmd, "writeln", 7) == 0) { *as++ = '\\'; *as++ = 'n'; } *as = '\0'; if (strcmp(args, "%c") == 0) { for (as = argp; *as; ++as); while (*--as != ')'); *as = '\0'; (void) printf("(void) putc(%s, %s);\n", argp, filename); } else if (strcmp(args, "%s") == 0) { (void) printf("(void) Fputs(%s, %s\n", filename, argp); } else { (void) printf("(void) fprintf(%s, \"%s\", %s\n", filename, args, argp); } } exit(0); }