summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadrul Habib Chowdhury <sadrul@users.sourceforge.net>2009-01-23 20:53:36 -0500
committerSadrul Habib Chowdhury <sadrul@users.sourceforge.net>2009-01-23 20:53:36 -0500
commit940c63996183bd7d609d2bce50123d5a9f92686c (patch)
tree381283123caa29c33b8dd393c3c8f56af8a1d548
parent569bba131e5276339ba6678478a9774dde7e575c (diff)
parentbd51468c8f954f8c7a2c429b3147c196f8f6f3f1 (diff)
downloadscreen-940c63996183bd7d609d2bce50123d5a9f92686c.tar.gz
Merge branch 'master' into cmd-alias
-rw-r--r--src/ansi.c919
-rw-r--r--src/layer.c4
2 files changed, 467 insertions, 456 deletions
diff --git a/src/ansi.c b/src/ansi.c
index d6952ea..2ac0f60 100644
--- a/src/ansi.c
+++ b/src/ansi.c
@@ -320,578 +320,581 @@ register int len;
curr->w_monitor = MON_FOUND;
}
- do
+ if (cols && rows)
{
- c = (unsigned char)*buf++;
+ do
+ {
+ c = (unsigned char)*buf++;
#ifdef FONT
# ifdef DW_CHARS
- if (!curr->w_mbcs)
+ if (!curr->w_mbcs)
# endif
- curr->w_rend.font = curr->w_FontL; /* Default: GL */
+ curr->w_rend.font = curr->w_FontL; /* Default: GL */
#endif
- /* The next part is only for speedup */
- if (curr->w_state == LIT &&
+ /* The next part is only for speedup */
+ if (curr->w_state == LIT &&
#ifdef UTF8
- curr->w_encoding != UTF8 &&
+ curr->w_encoding != UTF8 &&
#endif
#ifdef DW_CHARS
- !is_dw_font(curr->w_rend.font) &&
+ !is_dw_font(curr->w_rend.font) &&
# ifdef ENCODINGS
- curr->w_rend.font != KANA && !curr->w_mbcs &&
+ curr->w_rend.font != KANA && !curr->w_mbcs &&
# endif
#endif
#ifdef FONT
- curr->w_rend.font != '<' &&
+ curr->w_rend.font != '<' &&
#endif
- c >= ' ' && c != 0x7f &&
- ((c & 0x80) == 0 || ((c >= 0xa0 || !curr->w_c1) && !curr->w_gr)) && !curr->w_ss &&
- !curr->w_insert && curr->w_x < cols - 1)
- {
- register int currx = curr->w_x;
- char *imp = buf - 1;
-
- while (currx < cols - 1)
+ c >= ' ' && c != 0x7f &&
+ ((c & 0x80) == 0 || ((c >= 0xa0 || !curr->w_c1) && !curr->w_gr)) && !curr->w_ss &&
+ !curr->w_insert && curr->w_x < cols - 1)
{
- currx++;
- if (--len == 0)
- break;
- c = (unsigned char)*buf++;
- if (c < ' ' || c == 0x7f || ((c & 0x80) && ((c < 0xa0 && curr->w_c1) || curr->w_gr)))
+ register int currx = curr->w_x;
+ char *imp = buf - 1;
+
+ while (currx < cols - 1)
+ {
+ currx++;
+ if (--len == 0)
+ break;
+ c = (unsigned char)*buf++;
+ if (c < ' ' || c == 0x7f || ((c & 0x80) && ((c < 0xa0 && curr->w_c1) || curr->w_gr)))
+ break;
+ }
+ currx -= curr->w_x;
+ if (currx > 0)
+ {
+ MPutStr(curr, imp, currx, &curr->w_rend, curr->w_x, curr->w_y);
+ LPutStr(&curr->w_layer, imp, currx, &curr->w_rend, curr->w_x, curr->w_y);
+ curr->w_x += currx;
+ }
+ if (len == 0)
break;
}
- currx -= curr->w_x;
- if (currx > 0)
- {
- MPutStr(curr, imp, currx, &curr->w_rend, curr->w_x, curr->w_y);
- LPutStr(&curr->w_layer, imp, currx, &curr->w_rend, curr->w_x, curr->w_y);
- curr->w_x += currx;
- }
- if (len == 0)
- break;
- }
- /* end of speedup code */
+ /* end of speedup code */
#ifdef UTF8
- if (curr->w_encoding == UTF8)
- {
- c = FromUtf8(c, &curr->w_decodestate);
- if (c == -1)
- continue;
- if (c == -2)
+ if (curr->w_encoding == UTF8)
{
- c = UCS_REPL;
- /* try char again */
- buf--;
- len++;
+ c = FromUtf8(c, &curr->w_decodestate);
+ if (c == -1)
+ continue;
+ if (c == -2)
+ {
+ c = UCS_REPL;
+ /* try char again */
+ buf--;
+ len++;
+ }
+ if (c > 0xff)
+ debug1("read UNICODE %04x\n", c);
}
- if (c > 0xff)
- debug1("read UNICODE %04x\n", c);
- }
#endif
- tryagain:
- switch (curr->w_state)
- {
- case PRIN:
- switch (c)
- {
- case '\033':
- curr->w_state = PRINESC;
- break;
- default:
- PrintChar(c);
- }
- break;
- case PRINESC:
- switch (c)
- {
- case '[':
- curr->w_state = PRINCSI;
- break;
- default:
- PrintChar('\033');
- PrintChar(c);
- curr->w_state = PRIN;
- }
- break;
- case PRINCSI:
- switch (c)
- {
- case '4':
- curr->w_state = PRIN4;
- break;
- default:
- PrintChar('\033');
- PrintChar('[');
- PrintChar(c);
- curr->w_state = PRIN;
- }
- break;
- case PRIN4:
- switch (c)
+ tryagain:
+ switch (curr->w_state)
{
- case 'i':
- curr->w_state = LIT;
- PrintFlush();
- if (curr->w_pdisplay && curr->w_pdisplay->d_printfd >= 0)
+ case PRIN:
+ switch (c)
{
- close(curr->w_pdisplay->d_printfd);
- curr->w_pdisplay->d_printfd = -1;
+ case '\033':
+ curr->w_state = PRINESC;
+ break;
+ default:
+ PrintChar(c);
}
- curr->w_pdisplay = 0;
- break;
- default:
- PrintChar('\033');
- PrintChar('[');
- PrintChar('4');
- PrintChar(c);
- curr->w_state = PRIN;
- }
- break;
- case ASTR:
- if (c == 0)
- break;
- if (c == '\033')
- {
- curr->w_state = STRESC;
break;
- }
- /* special xterm hack: accept SetStatus sequence. Yucc! */
- /* allow ^E for title escapes */
- if (!(curr->w_StringType == OSC && c < ' ' && c != '\005'))
- if (!curr->w_c1 || c != ('\\' ^ 0xc0))
- {
- StringChar(c);
- break;
- }
- c = '\\';
- /* FALLTHROUGH */
- case STRESC:
- switch (c)
- {
- case '\\':
- if (StringEnd() == 0 || len <= 1)
- break;
- /* check if somewhere a status is displayed */
- for (cv = curr->w_layer.l_cvlist; cv; cv = cv->c_lnext)
- {
- display = cv->c_display;
- if (D_status == STATUS_ON_WIN)
- break;
- }
- if (cv)
+ case PRINESC:
+ switch (c)
{
- if (len > IOSIZE + 1)
- len = IOSIZE + 1;
- curr->w_outlen = len - 1;
- bcopy(buf, curr->w_outbuf, len - 1);
- return; /* wait till status is gone */
+ case '[':
+ curr->w_state = PRINCSI;
+ break;
+ default:
+ PrintChar('\033');
+ PrintChar(c);
+ curr->w_state = PRIN;
}
break;
- case '\033':
- StringChar('\033');
- break;
- default:
- curr->w_state = ASTR;
- StringChar('\033');
- StringChar(c);
- break;
- }
- break;
- case ESC:
- switch (c)
- {
- case '[':
- curr->w_NumArgs = 0;
- curr->w_intermediate = 0;
- bzero((char *) curr->w_args, MAXARGS * sizeof(int));
- curr->w_state = CSI;
- break;
- case ']':
- StringStart(OSC);
- break;
- case '_':
- StringStart(APC);
- break;
- case 'P':
- StringStart(DCS);
- break;
- case '^':
- StringStart(PM);
- break;
- case '!':
- StringStart(GM);
- break;
- case '"':
- case 'k':
- StringStart(AKA);
- break;
- default:
- if (Special(c))
- {
- curr->w_state = LIT;
+ case PRINCSI:
+ switch (c)
+ {
+ case '4':
+ curr->w_state = PRIN4;
break;
+ default:
+ PrintChar('\033');
+ PrintChar('[');
+ PrintChar(c);
+ curr->w_state = PRIN;
}
- debug1("not special. c = %x\n", c);
- if (c >= ' ' && c <= '/')
+ break;
+ case PRIN4:
+ switch (c)
{
- if (curr->w_intermediate)
+ case 'i':
+ curr->w_state = LIT;
+ PrintFlush();
+ if (curr->w_pdisplay && curr->w_pdisplay->d_printfd >= 0)
{
-#ifdef DW_CHARS
- if (curr->w_intermediate == '$')
- c |= '$' << 8;
- else
-#endif
- c = -1;
+ close(curr->w_pdisplay->d_printfd);
+ curr->w_pdisplay->d_printfd = -1;
}
- curr->w_intermediate = c;
+ curr->w_pdisplay = 0;
+ break;
+ default:
+ PrintChar('\033');
+ PrintChar('[');
+ PrintChar('4');
+ PrintChar(c);
+ curr->w_state = PRIN;
}
- else if (c >= '0' && c <= '~')
+ break;
+ case ASTR:
+ if (c == 0)
+ break;
+ if (c == '\033')
{
- DoESC(c, curr->w_intermediate);
- curr->w_state = LIT;
+ curr->w_state = STRESC;
+ break;
}
- else
+ /* special xterm hack: accept SetStatus sequence. Yucc! */
+ /* allow ^E for title escapes */
+ if (!(curr->w_StringType == OSC && c < ' ' && c != '\005'))
+ if (!curr->w_c1 || c != ('\\' ^ 0xc0))
+ {
+ StringChar(c);
+ break;
+ }
+ c = '\\';
+ /* FALLTHROUGH */
+ case STRESC:
+ switch (c)
{
- curr->w_state = LIT;
- goto tryagain;
+ case '\\':
+ if (StringEnd() == 0 || len <= 1)
+ break;
+ /* check if somewhere a status is displayed */
+ for (cv = curr->w_layer.l_cvlist; cv; cv = cv->c_lnext)
+ {
+ display = cv->c_display;
+ if (D_status == STATUS_ON_WIN)
+ break;
+ }
+ if (cv)
+ {
+ if (len > IOSIZE + 1)
+ len = IOSIZE + 1;
+ curr->w_outlen = len - 1;
+ bcopy(buf, curr->w_outbuf, len - 1);
+ return; /* wait till status is gone */
+ }
+ break;
+ case '\033':
+ StringChar('\033');
+ break;
+ default:
+ curr->w_state = ASTR;
+ StringChar('\033');
+ StringChar(c);
+ break;
}
- }
- break;
- case CSI:
- switch (c)
- {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- if (curr->w_NumArgs < MAXARGS)
+ break;
+ case ESC:
+ switch (c)
{
- if (curr->w_args[curr->w_NumArgs] < 100000000)
- curr->w_args[curr->w_NumArgs] =
- 10 * curr->w_args[curr->w_NumArgs] + (c - '0');
+ case '[':
+ curr->w_NumArgs = 0;
+ curr->w_intermediate = 0;
+ bzero((char *) curr->w_args, MAXARGS * sizeof(int));
+ curr->w_state = CSI;
+ break;
+ case ']':
+ StringStart(OSC);
+ break;
+ case '_':
+ StringStart(APC);
+ break;
+ case 'P':
+ StringStart(DCS);
+ break;
+ case '^':
+ StringStart(PM);
+ break;
+ case '!':
+ StringStart(GM);
+ break;
+ case '"':
+ case 'k':
+ StringStart(AKA);
+ break;
+ default:
+ if (Special(c))
+ {
+ curr->w_state = LIT;
+ break;
+ }
+ debug1("not special. c = %x\n", c);
+ if (c >= ' ' && c <= '/')
+ {
+ if (curr->w_intermediate)
+ {
+#ifdef DW_CHARS
+ if (curr->w_intermediate == '$')
+ c |= '$' << 8;
+ else
+#endif
+ c = -1;
+ }
+ curr->w_intermediate = c;
+ }
+ else if (c >= '0' && c <= '~')
+ {
+ DoESC(c, curr->w_intermediate);
+ curr->w_state = LIT;
+ }
+ else
+ {
+ curr->w_state = LIT;
+ goto tryagain;
+ }
}
break;
- case ';':
- case ':':
- if (curr->w_NumArgs < MAXARGS)
- curr->w_NumArgs++;
- break;
- default:
- if (Special(c))
- break;
- if (c >= '@' && c <= '~')
+ case CSI:
+ switch (c)
{
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ if (curr->w_NumArgs < MAXARGS)
+ {
+ if (curr->w_args[curr->w_NumArgs] < 100000000)
+ curr->w_args[curr->w_NumArgs] =
+ 10 * curr->w_args[curr->w_NumArgs] + (c - '0');
+ }
+ break;
+ case ';':
+ case ':':
if (curr->w_NumArgs < MAXARGS)
curr->w_NumArgs++;
- DoCSI(c, curr->w_intermediate);
- if (curr->w_state != PRIN)
- curr->w_state = LIT;
- }
- else if ((c >= ' ' && c <= '/') || (c >= '<' && c <= '?'))
- curr->w_intermediate = curr->w_intermediate ? -1 : c;
- else
- {
- curr->w_state = LIT;
- goto tryagain;
+ break;
+ default:
+ if (Special(c))
+ break;
+ if (c >= '@' && c <= '~')
+ {
+ if (curr->w_NumArgs < MAXARGS)
+ curr->w_NumArgs++;
+ DoCSI(c, curr->w_intermediate);
+ if (curr->w_state != PRIN)
+ curr->w_state = LIT;
+ }
+ else if ((c >= ' ' && c <= '/') || (c >= '<' && c <= '?'))
+ curr->w_intermediate = curr->w_intermediate ? -1 : c;
+ else
+ {
+ curr->w_state = LIT;
+ goto tryagain;
+ }
}
- }
- break;
- case LIT:
- default:
+ break;
+ case LIT:
+ default:
#ifdef DW_CHARS
- if (curr->w_mbcs)
- if (c <= ' ' || c == 0x7f || (c >= 0x80 && c < 0xa0 && curr->w_c1))
- curr->w_mbcs = 0;
+ if (curr->w_mbcs)
+ if (c <= ' ' || c == 0x7f || (c >= 0x80 && c < 0xa0 && curr->w_c1))
+ curr->w_mbcs = 0;
#endif
- if (c < ' ')
- {
- if (c == '\033')
+ if (c < ' ')
{
- curr->w_intermediate = 0;
- curr->w_state = ESC;
- if (curr->w_autoaka < 0)
- curr->w_autoaka = 0;
+ if (c == '\033')
+ {
+ curr->w_intermediate = 0;
+ curr->w_state = ESC;
+ if (curr->w_autoaka < 0)
+ curr->w_autoaka = 0;
+ }
+ else
+ Special(c);
+ break;
}
- else
- Special(c);
- break;
- }
- if (c >= 0x80 && c < 0xa0 && curr->w_c1)
+ if (c >= 0x80 && c < 0xa0 && curr->w_c1)
#ifdef FONT
- if ((curr->w_FontR & 0xf0) != 0x20
+ if ((curr->w_FontR & 0xf0) != 0x20
# ifdef UTF8
- || curr->w_encoding == UTF8
+ || curr->w_encoding == UTF8
# endif
- )
+ )
#endif
- {
- switch (c)
{
- case 0xc0 ^ 'D':
- case 0xc0 ^ 'E':
- case 0xc0 ^ 'H':
- case 0xc0 ^ 'M':
- case 0xc0 ^ 'N': /* SS2 */
- case 0xc0 ^ 'O': /* SS3 */
- DoESC(c ^ 0xc0, 0);
- break;
- case 0xc0 ^ '[':
- if (curr->w_autoaka < 0)
- curr->w_autoaka = 0;
- curr->w_NumArgs = 0;
- curr->w_intermediate = 0;
- bzero((char *) curr->w_args, MAXARGS * sizeof(int));
- curr->w_state = CSI;
- break;
- case 0xc0 ^ 'P':
- StringStart(DCS);
- break;
- default:
+ switch (c)
+ {
+ case 0xc0 ^ 'D':
+ case 0xc0 ^ 'E':
+ case 0xc0 ^ 'H':
+ case 0xc0 ^ 'M':
+ case 0xc0 ^ 'N': /* SS2 */
+ case 0xc0 ^ 'O': /* SS3 */
+ DoESC(c ^ 0xc0, 0);
+ break;
+ case 0xc0 ^ '[':
+ if (curr->w_autoaka < 0)
+ curr->w_autoaka = 0;
+ curr->w_NumArgs = 0;
+ curr->w_intermediate = 0;
+ bzero((char *) curr->w_args, MAXARGS * sizeof(int));
+ curr->w_state = CSI;
+ break;
+ case 0xc0 ^ 'P':
+ StringStart(DCS);
+ break;
+ default:
+ break;
+ }
break;
}
- break;
- }
#ifdef FONT
# ifdef DW_CHARS
- if (!curr->w_mbcs)
- {
+ if (!curr->w_mbcs)
+ {
# endif
- if (c < 0x80 || curr->w_gr == 0)
- curr->w_rend.font = curr->w_FontL;
+ if (c < 0x80 || curr->w_gr == 0)
+ curr->w_rend.font = curr->w_FontL;
# ifdef ENCODINGS
- else if (curr->w_gr == 2 && !curr->w_ss)
- curr->w_rend.font = curr->w_FontE;
+ else if (curr->w_gr == 2 && !curr->w_ss)
+ curr->w_rend.font = curr->w_FontE;
# endif
- else
- curr->w_rend.font = curr->w_FontR;
+ else
+ curr->w_rend.font = curr->w_FontR;
# ifdef DW_CHARS
- }
+ }
# endif
# ifdef UTF8
- if (curr->w_encoding == UTF8)
- {
- if (curr->w_rend.font == '0')
+ if (curr->w_encoding == UTF8)
{
- struct mchar mc, *mcp;
-
- debug1("SPECIAL %x\n", c);
- mc.image = c;
- mc.mbcs = 0;
- mc.font = '0';
- mcp = recode_mchar(&mc, 0, UTF8);
- debug2("%02x %02x\n", mcp->image, mcp->font);
- c = mcp->image | mcp->font << 8;
+ if (curr->w_rend.font == '0')
+ {
+ struct mchar mc, *mcp;
+
+ debug1("SPECIAL %x\n", c);
+ mc.image = c;
+ mc.mbcs = 0;
+ mc.font = '0';
+ mcp = recode_mchar(&mc, 0, UTF8);
+ debug2("%02x %02x\n", mcp->image, mcp->font);
+ c = mcp->image | mcp->font << 8;
+ }
+ curr->w_rend.font = 0;
}
- curr->w_rend.font = 0;
- }
# ifdef DW_CHARS
- if (curr->w_encoding == UTF8 && utf8_isdouble(c))
- curr->w_mbcs = 0xff;
+ if (curr->w_encoding == UTF8 && utf8_isdouble(c))
+ curr->w_mbcs = 0xff;
# endif
- if (curr->w_encoding == UTF8 && c >= 0x0300 && utf8_iscomb(c))
- {
- int ox, oy;
- struct mchar omc;
-
- ox = curr->w_x - 1;
- oy = curr->w_y;
- if (ox < 0)
- {
- ox = curr->w_width - 1;
- oy--;
- }
- if (oy < 0)
- oy = 0;
- copy_mline2mchar(&omc, &curr->w_mlines[oy], ox);
- if (omc.image == 0xff && omc.font == 0xff)
+ if (curr->w_encoding == UTF8 && c >= 0x0300 && utf8_iscomb(c))
{
- ox--;
+ int ox, oy;
+ struct mchar omc;
+
+ ox = curr->w_x - 1;
+ oy = curr->w_y;
+ if (ox < 0)
+ {
+ ox = curr->w_width - 1;
+ oy--;
+ }
+ if (oy < 0)
+ oy = 0;
+ copy_mline2mchar(&omc, &curr->w_mlines[oy], ox);
+ if (omc.image == 0xff && omc.font == 0xff)
+ {
+ ox--;
+ if (ox >= 0)
+ {
+ copy_mline2mchar(&omc, &curr->w_mlines[oy], ox);
+ omc.mbcs = 0xff;
+ }
+ }
if (ox >= 0)
{
- copy_mline2mchar(&omc, &curr->w_mlines[oy], ox);
- omc.mbcs = 0xff;
+ utf8_handle_comb(c, &omc);
+ MFixLine(curr, oy, &omc);
+ copy_mchar2mline(&omc, &curr->w_mlines[oy], ox);
+ LPutChar(&curr->w_layer, &omc, ox, oy);
+ LGotoPos(&curr->w_layer, curr->w_x, curr->w_y);
}
+ break;
}
- if (ox >= 0)
- {
- utf8_handle_comb(c, &omc);
- MFixLine(curr, oy, &omc);
- copy_mchar2mline(&omc, &curr->w_mlines[oy], ox);
- LPutChar(&curr->w_layer, &omc, ox, oy);
- LGotoPos(&curr->w_layer, curr->w_x, curr->w_y);
- }
- break;
- }
- font = curr->w_rend.font;
+ font = curr->w_rend.font;
# endif
# ifdef DW_CHARS
# ifdef ENCODINGS
- if (font == KANA && curr->w_encoding == SJIS && curr->w_mbcs == 0)
- {
- /* Lets see if it is the first byte of a kanji */
- debug1("%x may be first of SJIS\n", c);
- if ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xef))
+ if (font == KANA && curr->w_encoding == SJIS && curr->w_mbcs == 0)
{
- debug("YES!\n");
- curr->w_mbcs = c;
- break;
+ /* Lets see if it is the first byte of a kanji */
+ debug1("%x may be first of SJIS\n", c);
+ if ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xef))
+ {
+ debug("YES!\n");
+ curr->w_mbcs = c;
+ break;
+ }
}
- }
# endif
- if (font == 031 && c == 0x80 && !curr->w_mbcs)
- font = curr->w_rend.font = 0;
- if (is_dw_font(font) && c == ' ')
- font = curr->w_rend.font = 0;
- if (is_dw_font(font) || curr->w_mbcs)
- {
- int t = c;
- if (curr->w_mbcs == 0)
- {
- curr->w_mbcs = c;
- break;
- }
- if (curr->w_x == cols - 1)
+ if (font == 031 && c == 0x80 && !curr->w_mbcs)
+ font = curr->w_rend.font = 0;
+ if (is_dw_font(font) && c == ' ')
+ font = curr->w_rend.font = 0;
+ if (is_dw_font(font) || curr->w_mbcs)
{
- curr->w_x += curr->w_wrap ? 1 : -1;
- debug1("Patched w_x to %d\n", curr->w_x);
- }
+ int t = c;
+ if (curr->w_mbcs == 0)
+ {
+ curr->w_mbcs = c;
+ break;
+ }
+ if (curr->w_x == cols - 1)
+ {
+ curr->w_x += curr->w_wrap ? 1 : -1;
+ debug1("Patched w_x to %d\n", curr->w_x);
+ }
# ifdef UTF8
- if (curr->w_encoding != UTF8)
+ if (curr->w_encoding != UTF8)
# endif
- {
- c = curr->w_mbcs;
-# ifdef ENCODINGS
- if (font == KANA && curr->w_encoding == SJIS)
{
- debug2("SJIS !! %x %x\n", c, t);
- /*
- * SJIS -> EUC mapping:
- * First byte:
- * 81,82...9f -> 21,23...5d
- * e0,e1...ef -> 5f,61...7d
- * Second byte:
- * 40-7e -> 21-5f
- * 80-9e -> 60-7e
- * 9f-fc -> 21-7e (increment first byte!)
- */
- if (0x40 <= t && t <= 0xfc && t != 0x7f)
+ c = curr->w_mbcs;
+# ifdef ENCODINGS
+ if (font == KANA && curr->w_encoding == SJIS)
{
- if (c <= 0x9f) c = (c - 0x81) * 2 + 0x21;
- else c = (c - 0xc1) * 2 + 0x21;
- if (t <= 0x7e) t -= 0x1f;
- else if (t <= 0x9e) t -= 0x20;
- else t -= 0x7e, c++;
- curr->w_rend.font = KANJI;
+ debug2("SJIS !! %x %x\n", c, t);
+ /*
+ * SJIS -> EUC mapping:
+ * First byte:
+ * 81,82...9f -> 21,23...5d
+ * e0,e1...ef -> 5f,61...7d
+ * Second byte:
+ * 40-7e -> 21-5f
+ * 80-9e -> 60-7e
+ * 9f-fc -> 21-7e (increment first byte!)
+ */
+ if (0x40 <= t && t <= 0xfc && t != 0x7f)
+ {
+ if (c <= 0x9f) c = (c - 0x81) * 2 + 0x21;
+ else c = (c - 0xc1) * 2 + 0x21;
+ if (t <= 0x7e) t -= 0x1f;
+ else if (t <= 0x9e) t -= 0x20;
+ else t -= 0x7e, c++;
+ curr->w_rend.font = KANJI;
+ }
+ else
+ {
+ /* Incomplete shift-jis - skip first byte */
+ c = t;
+ t = 0;
+ }
+ debug2("SJIS after %x %x\n", c, t);
}
- else
+# endif
+ if (t && curr->w_gr && font != 030 && font != 031)
{
- /* Incomplete shift-jis - skip first byte */
- c = t;
- t = 0;
+ t &= 0x7f;
+ if (t < ' ')
+ goto tryagain;
}
- debug2("SJIS after %x %x\n", c, t);
+ if (t == '\177')
+ break;
+ curr->w_mbcs = t;
}
-# endif
- if (t && curr->w_gr && font != 030 && font != 031)
- {
- t &= 0x7f;
- if (t < ' ')
- goto tryagain;
- }
- if (t == '\177')
- break;
- curr->w_mbcs = t;
}
- }
# endif /* DW_CHARS */
- if (font == '<' && c >= ' ')
- {
- font = curr->w_rend.font = 0;
- c |= 0x80;
- }
+ if (font == '<' && c >= ' ')
+ {
+ font = curr->w_rend.font = 0;
+ c |= 0x80;
+ }
# ifdef UTF8
- else if (curr->w_gr && curr->w_encoding != UTF8)
+ else if (curr->w_gr && curr->w_encoding != UTF8)
# else
- else if (curr->w_gr)
+ else if (curr->w_gr)
# endif
- {
+ {
#ifdef ENCODINGS
- if (c == 0x80 && font == 0 && curr->w_encoding == GBK)
- c = 0xa4;
- else
- c &= 0x7f;
- if (c < ' ' && font != 031)
- goto tryagain;
+ if (c == 0x80 && font == 0 && curr->w_encoding == GBK)
+ c = 0xa4;
+ else
+ c &= 0x7f;
+ if (c < ' ' && font != 031)
+ goto tryagain;
#else
- c &= 0x7f;
- if (c < ' ') /* this is ugly but kanji support */
- goto tryagain; /* prevents nicer programming */
+ c &= 0x7f;
+ if (c < ' ') /* this is ugly but kanji support */
+ goto tryagain; /* prevents nicer programming */
#endif
- }
+ }
#endif /* FONT */
- if (c == '\177')
- break;
- curr->w_rend.image = c;
+ if (c == '\177')
+ break;
+ curr->w_rend.image = c;
#ifdef UTF8
- if (curr->w_encoding == UTF8)
- curr->w_rend.font = c >> 8;
+ if (curr->w_encoding == UTF8)
+ curr->w_rend.font = c >> 8;
#endif
#ifdef DW_CHARS
- curr->w_rend.mbcs = curr->w_mbcs;
+ curr->w_rend.mbcs = curr->w_mbcs;
#endif
- if (curr->w_x < cols - 1)
- {
- if (curr->w_insert)
+ if (curr->w_x < cols - 1)
{
- save_mline(&curr->w_mlines[curr->w_y], cols);
- MInsChar(curr, &curr->w_rend, curr->w_x, curr->w_y);
- LInsChar(&curr->w_layer, &curr->w_rend, curr->w_x, curr->w_y, &mline_old);
- curr->w_x++;
+ if (curr->w_insert)
+ {
+ save_mline(&curr->w_mlines[curr->w_y], cols);
+ MInsChar(curr, &curr->w_rend, curr->w_x, curr->w_y);
+ LInsChar(&curr->w_layer, &curr->w_rend, curr->w_x, curr->w_y, &mline_old);
+ curr->w_x++;
+ }
+ else
+ {
+ MPutChar(curr, &curr->w_rend, curr->w_x, curr->w_y);
+ LPutChar(&curr->w_layer, &curr->w_rend, curr->w_x, curr->w_y);
+ curr->w_x++;
+ }
}
- else
+ else if (curr->w_x == cols - 1)
{
MPutChar(curr, &curr->w_rend, curr->w_x, curr->w_y);
LPutChar(&curr->w_layer, &curr->w_rend, curr->w_x, curr->w_y);
- curr->w_x++;
+ if (curr->w_wrap)
+ curr->w_x++;
+ }
+ else
+ {
+ MWrapChar(curr, &curr->w_rend, curr->w_y, curr->w_top, curr->w_bot, curr->w_insert);
+ LWrapChar(&curr->w_layer, &curr->w_rend, curr->w_y, curr->w_top, curr->w_bot, curr->w_insert);
+ if (curr->w_y != curr->w_bot && curr->w_y != curr->w_height - 1)
+ curr->w_y++;
+ curr->w_x = 1;
}
- }
- else if (curr->w_x == cols - 1)
- {
- MPutChar(curr, &curr->w_rend, curr->w_x, curr->w_y);
- LPutChar(&curr->w_layer, &curr->w_rend, curr->w_x, curr->w_y);
- if (curr->w_wrap)
- curr->w_x++;
- }
- else
- {
- MWrapChar(curr, &curr->w_rend, curr->w_y, curr->w_top, curr->w_bot, curr->w_insert);
- LWrapChar(&curr->w_layer, &curr->w_rend, curr->w_y, curr->w_top, curr->w_bot, curr->w_insert);
- if (curr->w_y != curr->w_bot && curr->w_y != curr->w_height - 1)
- curr->w_y++;
- curr->w_x = 1;
- }
#ifdef FONT
# ifdef DW_CHARS
- if (curr->w_mbcs)
- {
- curr->w_rend.mbcs = curr->w_mbcs = 0;
- curr->w_x++;
- }
+ if (curr->w_mbcs)
+ {
+ curr->w_rend.mbcs = curr->w_mbcs = 0;
+ curr->w_x++;
+ }
# endif
- if (curr->w_ss)
- {
- curr->w_FontL = curr->w_charsets[curr->w_Charset];
- curr->w_FontR = curr->w_charsets[curr->w_CharsetR];
- curr->w_rend.font = curr->w_FontL;
- LSetRendition(&curr->w_layer, &curr->w_rend);
- curr->w_ss = 0;
- }
+ if (curr->w_ss)
+ {
+ curr->w_FontL = curr->w_charsets[curr->w_Charset];
+ curr->w_FontR = curr->w_charsets[curr->w_CharsetR];
+ curr->w_rend.font = curr->w_FontL;
+ LSetRendition(&curr->w_layer, &curr->w_rend);
+ curr->w_ss = 0;
+ }
#endif /* FONT */
- break;
+ break;
+ }
}
+ while (--len);
}
- while (--len);
if (!printcmd && curr->w_state == PRIN)
PrintFlush();
}
@@ -2594,6 +2597,10 @@ int xs, ys, xe, ye, bce;
int xxe;
struct mline *ml;
+ /* Check for zero-height window */
+ if (ys < 0 || ye < ys)
+ return;
+
/* check for magic margin condition */
if (xs >= p->w_width)
xs = p->w_width - 1;
diff --git a/src/layer.c b/src/layer.c
index f240b52..a2fd74a 100644
--- a/src/layer.c
+++ b/src/layer.c
@@ -502,6 +502,10 @@ int uself;
if (bd.bd_refreshing)
return;
#endif
+ /* Check for zero-height window */
+ if (ys < 0 || ye < ys)
+ return;
+
/* check for magic margin condition */
if (xs >= l->l_width)
xs = l->l_width - 1;