/* convert old (vt100) based attributes to new IBMPC based attributes */ #include #include void PSconv(CHTYPE *a,int n,CHTYPE mod) { static unsigned char pcmap[] = { 'h',0262,'a',0260,'f',0370,'g',0361,'j',0331,'k',0277,'l',0332,'m',0300, 'n',0305,'q',0304,'t',0303,'u',0264,'v',0301,'w',0302,'x',0263,'~',0371, '0',0333,047,0004,'b',0003,'c',0006,'d',0005 }; static CHTYPE attr_map[9] = { A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK, A_DIM, A_BOLD, A_INVIS, A_MODIFIED, A_ALTCHARSET }; unsigned char vtmap[128]; CHTYPE tbl[512]; /* map old to new */ int i; unsigned char *p; /* construct attribute map table */ for (i = 0; i < 512; ++i) { CHTYPE new = 0; int j; for (j = 0; j < 9; ++j) { if (i & (1 << j)) new |= attr_map[j]; } tbl[i] = new; } /* construct vt100 charset map */ memset(vtmap,'?',sizeof vtmap); for (p = pcmap; p[0] && p[1]; p += 2) vtmap[p[0]] = p[1]; /* map user data */ for (i = 0; i < n; ++i) { CHTYPE new = a[i]; new = tbl[new>>7] | new & A_CHARTEXT; /* map graphics characters from vt100 to IBMPC */ if (new & A_ALTCHARSET) new = new & 0xFF00 | vtmap[new & 127]; if (a[i] != new) a[i] = new | mod; } }