00001 #include <string.h>
00002 #include "vt.h"
00003 #include "lang.h"
00004
00005 int latin1 = -1;
00006
00007 static unsigned char lang_char[256];
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 static struct mark { const char *g0, *latin1, *latin2; } marks[16] =
00021 {
00022 { "#",
00023 "¤",
00024 "$" },
00025 { " aeiouAEIOU",
00026 "`àèìòùÀÈÌÒÙ",
00027 "`aeiouAEIOU" },
00028 { " aceilnorsuyzACEILNORSUYZ",
00029 "'ácéílnórsúýzÁCÉÍLNÓRSÚÝZ",
00030 "'áæéíåñóà¶úý¼ÁÆÉÍÅÑÓÀ¦Úݬ" },
00031 { " aeiouAEIOU",
00032 "^âêîôûÂÊÎÔÛ",
00033 "^âeîôuÂEÎÔU" },
00034 { " anoANO",
00035 "~ãñõÃÑÕ",
00036 "~anoANO" },
00037 { "",
00038 "",
00039 "" },
00040 { "aA",
00041 "aA",
00042 "ãÃ" },
00043 { "zZ",
00044 "zZ",
00045 "¿¯" },
00046 { "aeiouAEIOU",
00047 "äëïöüÄËÏÖÜ",
00048 "äëiöüÄËIÖÜ" },
00049 { "",
00050 "",
00051 "" },
00052 { " auAU",
00053 "°åuÅU",
00054 "°aùAÙ" },
00055 { "cstCST",
00056 "çstÇST",
00057 "çºþǪÞ" },
00058 { " ",
00059 "_",
00060 "_" },
00061 { " ouOU",
00062 "\"ouOU",
00063 "\"õûÕÛ" },
00064 { "aeAE",
00065 "aeAE",
00066 "±ê¡Ê" },
00067 { "cdelnrstzCDELNRSTZ",
00068 "cdelnrstzCDELNRSTZ",
00069 "èïìµòø¹»¾ÈÏÌ¥ÒØ©«®" },
00070 };
00071
00072 static unsigned char g2map_latin1[] =
00073
00074 " ¡¢£$¥#§¤'\"« "
00075 "°±²³×µ¶·÷'\"»¼½¾¿"
00076 " `´^~ ¨.°¸_\" "
00077 "_¹®© "
00078 " ÆÐªH ILLØ ºÞTNn"
00079 "Kædðhiillø ßþtn\x7f";
00080
00081 static unsigned char g2map_latin2[] =
00082
00083 " icL$Y#§¤'\"< "
00084 "° ×u ÷'\"> "
00085 " `´^~ ¢ÿ¨.°¸_½²·"
00086 "- RC "
00087 " ÐaH iL£O opTNn"
00088 "K ðdhiil³o ßptn\x7f";
00089
00090
00091
00092 void
00093 lang_init(void)
00094 {
00095 int i;
00096
00097 memset(lang_char, 0, sizeof(lang_char));
00098 for (i = 1; i <= 13; i++)
00099 lang_char[lang_chars[0][i]] = i;
00100 }
00101
00102
00103 void
00104 conv2latin(unsigned char *p, int n, int lang)
00105 {
00106 int c, gfx = 0;
00107
00108 while (n--)
00109 {
00110 if (lang_char[c = *p])
00111 {
00112 if (! gfx || (c & 0xa0) != 0x20)
00113 *p = lang_chars[lang + 1][lang_char[c]];
00114 }
00115 else if ((c & 0xe8) == 0)
00116 gfx = c & 0x10;
00117 p++;
00118 }
00119 }
00120
00121
00122
00123 void
00124 init_enhance(struct enhance *eh)
00125 {
00126 eh->next_des = 0;
00127 }
00128
00129 void
00130 add_enhance(struct enhance *eh, int dcode, unsigned int *t)
00131 {
00132 if (dcode == eh->next_des)
00133 {
00134 memcpy(eh->trip + dcode * 13, t, 13 * sizeof(*t));
00135 eh->next_des++;
00136 }
00137 else
00138 eh->next_des = -1;
00139 }
00140
00141 void
00142 enhance(struct enhance *eh, struct vt_page *vtp)
00143 {
00144 int row = 0;
00145 unsigned int *p, *e;
00146
00147 if (eh->next_des < 1)
00148 return;
00149
00150 for (p = eh->trip, e = p + eh->next_des * 13; p < e; p++)
00151 if (*p % 2048 != 2047)
00152 {
00153 int adr = *p % 64;
00154 int mode = *p / 64 % 32;
00155 int data = *p / 2048 % 128;
00156
00157
00158 if (adr < 40)
00159 {
00160
00161 switch (mode)
00162 {
00163 case 15:
00164 if (adr < VT_WIDTH && row < VT_HEIGHT)
00165 {
00166 if (latin1)
00167 vtp->data[row][adr] = g2map_latin1[data-32];
00168 else
00169 vtp->data[row][adr] = g2map_latin2[data-32];
00170 }
00171 break;
00172 case 16 ... 31:
00173 if (adr < VT_WIDTH && row < VT_HEIGHT)
00174 {
00175 struct mark *mark = marks + (mode - 16);
00176 char *x;
00177
00178 if ((x = strchr(mark->g0, data)))
00179 {
00180 if (latin1)
00181 data = mark->latin1[x - mark->g0];
00182 else
00183 data = mark->latin2[x - mark->g0];
00184 }
00185 vtp->data[row][adr] = data;
00186 }
00187 break;
00188 }
00189 }
00190 else
00191 {
00192
00193 if ((adr -= 40) == 0)
00194 adr = 24;
00195
00196 switch (mode)
00197 {
00198 case 1:
00199 row = adr;
00200 break;
00201 case 4:
00202 row = adr;
00203 break;
00204 case 7:
00205 if (adr == 23)
00206 row = 0;
00207 break;
00208 }
00209 }
00210 }
00211
00212 }
00213