imp2html.c

    /*
         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, "&amp;");
    	} else if (c == '<') {
              fprintf(stdout, "&lt;");
    	} else if (c == '>') {
              fprintf(stdout, "&gt;");
    	} else if (c == '\\') {
              fprintf(stdout, "&not;"); /* 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, "&amp;");
    	} else if (c == '<') {
              fprintf(stdout, "&lt;");
    	} else if (c == '>') {
              fprintf(stdout, "&gt;");
    	} else if (c == '\\') {
              fprintf(stdout, "&not;"); /* 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, "&amp;");
    	    } else if (c == '<') {
                   fprintf(stdout, "&lt;");
    	     } else if (c == '>') {
                   fprintf(stdout, "&gt;");
    	     } else if (c == '\\') {
                   fprintf(stdout, "&not;"); /* 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, "&amp;");
    	    } else if (c == '<') {
                  fprintf(stdout, "&lt;");
    	    } else if (c == '>') {
                  fprintf(stdout, "&gt;");
    	    } else if (c == '\\') {
                  fprintf(stdout, "&not;"); /* 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, "&amp;");
    	    } else if (c == '<') {
                  fprintf(stdout, "&lt;");
    	    } else if (c == '>') {
                  fprintf(stdout, "&gt;");
    	    } else if (c == '\\') {
                  fprintf(stdout, "&not;"); /* 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);
    }