Do not crash when terminal height is zero.
authorSadrul Habib Chowdhury <sadrul@users.sourceforge.net>
Wed, 21 Jan 2009 18:56:09 +0000 (21 13:56 -0500)
committerSadrul Habib Chowdhury <sadrul@users.sourceforge.net>
Wed, 21 Jan 2009 18:56:09 +0000 (21 13:56 -0500)
Fixes savannah bug #25338, ubuntu launchpad bug #315237.

src/ansi.c
src/layer.c

index d6952ea..2ac0f60 100644 (file)
@@ -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;
index f240b52..a2fd74a 100644 (file)
@@ -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;