/* * html.c: * * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ static char rcsid[] = "$Id$"; /* * $Log$ * Revision 1.3 2008/02/20 20:16:07 james * *** empty log message *** * * Revision 1.2 2008/02/04 02:05:06 james * *** empty log message *** * * Revision 1.1 2008/02/03 23:31:25 james * *** empty log message *** * */ #include "project.h" #define V(i) (((i)==0)?0x80:(((i)==1)?0xc0:0xff)) #define COLOR(r,g,b,i) ((((r)?(V(i)):0) << 0)| (((g)?(V(i)):0) << 8)| (((b)?(V(i)):0) << 16)) static int colormap[]= { [CRT_COLOR_BLACK]=COLOR(0,0,0,0), [CRT_COLOR_RED]=COLOR(0,0,1,0), [CRT_COLOR_GREEN]=COLOR(0,1,0,0), [CRT_COLOR_YELLOW]=COLOR(0,1,1,0), [CRT_COLOR_BLUE]=COLOR(1,0,0,0), [CRT_COLOR_MAGENTA]=COLOR(1,0,1,0), [CRT_COLOR_CYAN]=COLOR(1,1,0,0), [CRT_COLOR_WHITE]=COLOR(1,1,1,1), [CRT_COLOR_BLACK|CRT_COLOR_INTENSITY]=COLOR(1,1,1,0), [CRT_COLOR_RED|CRT_COLOR_INTENSITY]=COLOR(0,0,1,2), [CRT_COLOR_GREEN|CRT_COLOR_INTENSITY]=COLOR(0,1,0,2), [CRT_COLOR_YELLOW|CRT_COLOR_INTENSITY]=COLOR(0,1,1,2), [CRT_COLOR_BLUE|CRT_COLOR_INTENSITY]=COLOR(1,0,0,2), [CRT_COLOR_MAGENTA|CRT_COLOR_INTENSITY]=COLOR(1,0,1,2), [CRT_COLOR_CYAN|CRT_COLOR_INTENSITY]=COLOR(1,1,0,2), [CRT_COLOR_WHITE|CRT_COLOR_INTENSITY]=COLOR(1,1,1,2), }; static void html_entity (FILE * f, int c) { switch (c) { case 32: fprintf (f, " "); break; case 38: fprintf (f, "&"); break; case 60: fprintf (f, "<"); break; case 62: fprintf (f, ">"); break; default: fputc (c, f); } } static void html_render (FILE * f, CRT_CA c) { int fg,bg; if (c.attr & CRT_ATTR_REVERSE) { fg=CRT_COLOR_BG(c.color); bg=CRT_COLOR_FG(c.color); } else { fg=CRT_COLOR_FG(c.color); bg=CRT_COLOR_BG(c.color); if (c.attr & CRT_ATTR_BOLD) fg|=CRT_COLOR_INTENSITY; } fprintf (f, "",colormap[bg],colormap[fg]); if (c.attr & CRT_ATTR_UNDERLINE) fprintf (f, ""); if (c.attr & CRT_ATTR_REVERSE) { fprintf (f, ""); } fprintf (f, ""); } static void html_draw (FILE * f, CRT * c) { CRT_Pos p; int o; fprintf (f, "\n"); for (p.y = 0; p.y < CRT_ROWS; ++p.y) { o = CRT_ADDR (p.y, 0); fprintf (f, ""); for (p.x = 0; p.x < CRT_COLS; ++p.x, ++o) { html_render (f, c->screen[o]); } fprintf (f, "\n"); } fprintf (f, "
\n"); } static void html_one_shot(ANSI *a,CRT *c) { html_draw(a->file,c); } static void ansi_free(ANSI *a) { free(a); } ANSI *ansi_new_html(FILE *f) { ANSI *ret; ret=malloc(sizeof(ANSI)); memset(ret,0,sizeof(ANSI)); ret->file=f; ret->close=ansi_free; ret->one_shot=html_one_shot; return ret; }