/* Heck, if I'm going to put old imp stuff on the web, I might as well do it properly and turn it into colour-highlighted html... %alpha for keywords ! at start of a statment for comment until end of line %c or a single - at end of line to continue to next line (no implicit continuation) ; between statements That's about it. May or may not bother with builtin %perm routine names. This is a first crude hack but it seems to work well enough. Addendum: addig code so that we do not generate the extra space after emboldened keywords which was necessary to align coments - instead we save them up until there is a comment on the line and then insert them. If no comment, lose them. */ #include #include static int spaceafter = (0!=0); #define QUOTE_COLOR "#ff0000" #define COMMENT_COLOR "#408080" void html_header(char *Title) { fprintf(stdout, "\n\n %s \n\n", Title); fprintf(stdout, "
\n");
}

void html_footer(void) {
  fprintf(stdout, "\n
\n"); } int main(int argc, char **argv) { int held_spaces = 0; int c; if (argc > 1 && strcmp(argv[1], "-s") == 0) { spaceafter = (0==0); argc -= 1; argv += 1; } html_header((argc == 2 ? argv[1] : "")); for (;;) { /* assume we're at the start of a new statement here. */ c = fgetc(stdin); if (c == EOF) break; if (c == '\r') continue; if (c == ' ' || c == '\t') { fputc(c, stdout); /* Don't touch leading indentation */ } else if (c == '!') { /* Comment holds until end of line */ if (held_spaces != 0) { for (;;) { if (!spaceafter) putchar(' '); held_spaces -= 1; if (held_spaces == 0) break; } } fprintf(stdout, "!", COMMENT_COLOR); for (;;) { c = fgetc(stdin); if (c == '\n') break; if (c == '\r') continue; if (c == EOF) break; if (c == '&') { fprintf(stdout, "&"); } else if (c == '<') { fprintf(stdout, "<"); } else if (c == '>') { fprintf(stdout, ">"); } else if (c == '\\') { fprintf(stdout, "¬"); /* Olde Style tty output */ } else { fputc(c, stdout); } } fprintf(stdout, "\n"); } else if (c == '\n') { fprintf(stdout, "\n"); held_spaces = 0; /* throw them away - no alignment necessary */ } else { /* rest of statement */ for (;;) { if (c == '%') { /* Handle keyword */ fprintf(stdout, ""); for (;;) { c = fgetc(stdin); if (c == EOF) break; if (c == '\r') continue; if (!isalpha(c)) break; fputc(c, stdout); } held_spaces += 1; fprintf(stdout, "") /* don't emit here any more */; if (spaceafter) putchar(' '); ungetc(c, stdin); } else if (c == '&') { fprintf(stdout, "&"); } else if (c == '<') { fprintf(stdout, "<"); } else if (c == '>') { fprintf(stdout, ">"); } else if (c == '\\') { fprintf(stdout, "¬"); /* Olde Style tty output */ } else if (c == '{') { fprintf(stdout, "{", COMMENT_COLOR); for (;;) { c = fgetc(stdin); if (c == EOF) break; if (c == '}') break; if (c == '\n') break; if (c == '\r') continue; if (c == '&') { fprintf(stdout, "&"); } else if (c == '<') { fprintf(stdout, "<"); } else if (c == '>') { fprintf(stdout, ">"); } else if (c == '\\') { fprintf(stdout, "¬"); /* Olde Style tty output */ } else { fputc(c, stdout); } } if (c != EOF) fprintf(stdout, "%c", c); if (c == '\n') break; /* new statement */ } else if (c == '"') { fprintf(stdout, "\"", QUOTE_COLOR); for (;;) { c = fgetc(stdin); if (c == EOF) break; if (c == '"') break; if (c == '\r') continue; if (c == '&') { fprintf(stdout, "&"); } else if (c == '<') { fprintf(stdout, "<"); } else if (c == '>') { fprintf(stdout, ">"); } else if (c == '\\') { fprintf(stdout, "¬"); /* Olde Style tty output */ } else { fputc(c, stdout); } } fprintf(stdout, "\""); } else if (c == '\'') { fprintf(stdout, "'", QUOTE_COLOR); for (;;) { c = fgetc(stdin); if (c == EOF) break; if (c == '\r') continue; if (c == '\'') break; if (c == '&') { fprintf(stdout, "&"); } else if (c == '<') { fprintf(stdout, "<"); } else if (c == '>') { fprintf(stdout, ">"); } else if (c == '\\') { fprintf(stdout, "¬"); /* Olde Style tty output */ } else { fputc(c, stdout); } } fprintf(stdout, "'"); } else if (c == ':') { fputc(c, stdout); /* Probably a label. Should fix this broken case: lab(n): ! comment with odd ' in it */ break; } else { fputc(c, stdout); } do {c = fgetc(stdin);} while (c == '\r'); if (c == EOF) break; if (c == '\n') { fprintf(stdout, "\n"); break; } if (c == ';') { fprintf(stdout, ";"); break; } } } } html_footer(); exit(0); }