,
* 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_BOLD)
fprintf (f, "");
if (c.chr < 32)
c.chr = 32;
if (c.chr > 126)
c.chr = 32;
html_entity (f, c.chr);
if (c.attr & CRT_ATTR_BOLD)
fprintf (f, "");
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;
}