/*
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<non-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 <stdio.h>
#include <stdlib.h>
static int spaceafter = (0!=0);
#define QUOTE_COLOR "#ff0000"
#define COMMENT_COLOR "#408080"
void html_header(char *Title) {
fprintf(stdout, "<HTML>\n<HEAD>\n<TITLE> %s </TITLE>\n</HEAD>\n", Title);
fprintf(stdout, "<BODY bgcolor=ffffff><pre>\n");
}
void html_footer(void) {
fprintf(stdout, "\n</pre></BODY></HTML>\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, "<font color=%s>!", 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, "</font>\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, "<B>");
for (;;) {
c = fgetc(stdin);
if (c == EOF) break;
if (c == '\r') continue;
if (!isalpha(c)) break;
fputc(c, stdout);
}
held_spaces += 1;
fprintf(stdout, "</B>") /* 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, "<font color=%s>{", 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</font>", c);
if (c == '\n') break; /* new statement */
} else if (c == '"') {
fprintf(stdout, "<font color=%s>\"", 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, "\"</font>");
} else if (c == '\'') {
fprintf(stdout, "<font color=%s>'", 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, "'</font>");
} 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);
}