Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/teraterm/teraterm/vtterm.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6173 by doda, Mon Nov 30 09:30:33 2015 UTC revision 6174 by doda, Mon Nov 30 09:43:29 2015 UTC
# Line 1440  void EscapeSequence(BYTE b) Line 1440  void EscapeSequence(BYTE b)
1440          if (b<=US)          if (b<=US)
1441                  ParseControl(b);                  ParseControl(b);
1442          else if ((b>=0x20) && (b<=0x2F)) {          else if ((b>=0x20) && (b<=0x2F)) {
1443                    // TODO: ICount が IntCharMax に達した時、最後の IntChar を置き換えるのは妥当?
1444                  if (ICount<IntCharMax)                  if (ICount<IntCharMax)
1445                          ICount++;                          ICount++;
1446                  IntChar[ICount] = b;                  IntChar[ICount] = b;
# Line 1456  void EscapeSequence(BYTE b) Line 1457  void EscapeSequence(BYTE b)
1457          JustAfterESC = FALSE;          JustAfterESC = FALSE;
1458  }  }
1459    
1460    #define CheckParamVal(p,m) \
1461            if ((p) == 0) { \
1462                    (p) = 1; \
1463            } \
1464            else if ((p) > (m) || p < 0) { \
1465                    (p) = (m); \
1466            }
1467    
1468    #define CheckParamValMax(p,m) \
1469            if ((p) > (m) || p <= 0) { \
1470                    (p) = (m); \
1471            }
1472    
1473    #define RequiredParams(n) \
1474            if ((n) > 1) { \
1475                    while (NParam < n) { \
1476                            NParam++; \
1477                            Param[NParam] = 0; \
1478                            NSParam[NParam] = 0; \
1479                    } \
1480            }
1481    
1482  void CSInsertCharacter()                // ICH  void CSInsertCharacter()                // ICH
1483  {  {
1484          // Insert space characters at cursor          // Insert space characters at cursor
1485          int Count;          CheckParamVal(Param[1], NumOfColumns);
1486    
1487          BuffUpdateScroll();          BuffUpdateScroll();
1488          if (Param[1]<1) Param[1] = 1;          BuffInsertSpace(Param[1]);
         Count = Param[1];  
         BuffInsertSpace(Count);  
1489  }  }
1490    
1491  void CSCursorUp(BOOL AffectMargin)      // CUU / VPB  void CSCursorUp(BOOL AffectMargin)      // CUU / VPB
1492  {  {
1493          int topMargin, NewY;          int topMargin, NewY;
1494    
1495          if (Param[1]<1)          CheckParamVal(Param[1], CursorY);
                 Param[1] = 1;  
1496    
1497          if (AffectMargin && CursorY >= CursorTop)          if (AffectMargin && CursorY >= CursorTop)
1498                  topMargin = CursorTop;                  topMargin = CursorTop;
# Line 1496  void CSCursorDown(BOOL AffectMargin)   // Line 1516  void CSCursorDown(BOOL AffectMargin)   //
1516  {  {
1517          int bottomMargin, NewY;          int bottomMargin, NewY;
1518    
         if (Param[1]<1)  
                 Param[1] = 1;  
   
1519          if (AffectMargin && CursorY <= CursorBottom)          if (AffectMargin && CursorY <= CursorBottom)
1520                  bottomMargin = CursorBottom;                  bottomMargin = CursorBottom;
1521          else          else
1522                  bottomMargin = NumOfLines-StatusLine-1;                  bottomMargin = NumOfLines-StatusLine-1;
1523    
1524            CheckParamVal(Param[1], bottomMargin);
1525    
1526          NewY = CursorY + Param[1];          NewY = CursorY + Param[1];
1527          if (NewY > bottomMargin)          if (NewY > bottomMargin)
1528                  NewY = bottomMargin;                  NewY = bottomMargin;
# Line 1585  void CSInsertLine() Line 1604  void CSInsertLine()
1604          // Insert lines at current position          // Insert lines at current position
1605          int Count, YEnd;          int Count, YEnd;
1606    
1607          if (CursorY < CursorTop)          if (CursorY < CursorTop || CursorY > CursorBottom) {
                 return;  
         if (CursorY > CursorBottom)  
1608                  return;                  return;
1609          if (Param[1]<1)          }
1610                  Param[1] = 1;  
1611            CheckParamVal(Param[1], NumOfLines);
1612    
1613          Count = Param[1];          Count = Param[1];
1614    
1615          YEnd = CursorBottom;          YEnd = CursorBottom;
1616          if (CursorY > YEnd)          if (CursorY > YEnd)
1617                  YEnd = NumOfLines-1-StatusLine;                  YEnd = NumOfLines-1-StatusLine;
1618    
1619          if (Count > YEnd+1 - CursorY)          if (Count > YEnd+1 - CursorY)
1620                  Count = YEnd+1 - CursorY;                  Count = YEnd+1 - CursorY;
1621    
# Line 1644  void CSDeleteNLines() Line 1663  void CSDeleteNLines()
1663  {  {
1664          int Count, YEnd;          int Count, YEnd;
1665    
1666          if (CursorY < CursorTop)          if (CursorY < CursorTop || CursorY > CursorBottom) {
                 return;  
         if (CursorY > CursorBottom)  
1667                  return;                  return;
1668            }
1669    
1670            CheckParamVal(Param[1], NumOfLines);
1671          Count = Param[1];          Count = Param[1];
         if (Count<1) Count = 1;  
1672    
1673          YEnd = CursorBottom;          YEnd = CursorBottom;
1674          if (CursorY > YEnd)          if (CursorY > YEnd)
1675                  YEnd = NumOfLines-1-StatusLine;                  YEnd = NumOfLines-1-StatusLine;
1676    
1677          if (Count > YEnd+1-CursorY)          if (Count > YEnd+1-CursorY)
1678                  Count = YEnd+1-CursorY;                  Count = YEnd+1-CursorY;
1679    
1680          BuffDeleteLines(Count,YEnd);          BuffDeleteLines(Count,YEnd);
1681  }  }
1682    
1683  void CSDeleteCharacter()        // DCH  void CSDeleteCharacter()        // DCH
1684  {  {
1685  // Delete characters in current line from cursor  // Delete characters in current line from cursor
1686            CheckParamVal(Param[1], NumOfColumns);
1687    
         if (Param[1]<1) Param[1] = 1;  
1688          BuffUpdateScroll();          BuffUpdateScroll();
1689          BuffDeleteChars(Param[1]);          BuffDeleteChars(Param[1]);
1690  }  }
1691    
1692  void CSEraseCharacter()         // ECH  void CSEraseCharacter()         // ECH
1693  {  {
1694          if (Param[1]<1) Param[1] = 1;          CheckParamVal(Param[1], NumOfColumns);
1695    
1696          BuffUpdateScroll();          BuffUpdateScroll();
1697          BuffEraseChars(Param[1]);          BuffEraseChars(Param[1]);
1698  }  }
1699    
1700  void CSScrollUp()  void CSScrollUp()
1701  {  {
1702          if (Param[1]<1) Param[1] = 1;          // TODO: スクロールの最大値を端末行数に制限すべきか要検討
1703            CheckParamVal(Param[1], INT_MAX);
1704    
1705          BuffUpdateScroll();          BuffUpdateScroll();
1706          BuffRegionScrollUpNLines(Param[1]);          BuffRegionScrollUpNLines(Param[1]);
1707  }  }
1708    
1709  void CSScrollDown()  void CSScrollDown()
1710  {  {
1711          if (Param[1]<1) Param[1] = 1;          CheckParamVal(Param[1], NumOfLines);
1712    
1713          BuffUpdateScroll();          BuffUpdateScroll();
1714          BuffRegionScrollDownNLines(Param[1]);          BuffRegionScrollDownNLines(Param[1]);
1715  }  }
1716    
1717  void CSForwardTab()  void CSForwardTab()
1718  {  {
1719          if (Param[1]<1) Param[1] = 1;          CheckParamVal(Param[1], NumOfColumns);
1720          CursorForwardTab(Param[1], AutoWrapMode);          CursorForwardTab(Param[1], AutoWrapMode);
1721  }  }
1722    
1723  void CSBackwardTab()  void CSBackwardTab()
1724  {  {
1725          if (Param[1]<1) Param[1] = 1;          CheckParamVal(Param[1], NumOfColumns);
1726          CursorBackwardTab(Param[1]);          CursorBackwardTab(Param[1]);
1727  }  }
1728    
1729  void CSMoveToColumnN()          // CHA / HPA  void CSMoveToColumnN()          // CHA / HPA
1730  {  {
1731          if (Param[1]<1)          CheckParamVal(Param[1], NumOfColumns);
                 Param[1] = 1;  
         else if (Param[1] > NumOfColumns)  
                 Param[1] = NumOfColumns;  
1732    
1733          Param[1]--;          Param[1]--;
1734    
# Line 1725  void CSCursorRight(BOOL AffectMargin)  // Line 1747  void CSCursorRight(BOOL AffectMargin)  //
1747  {  {
1748          int NewX, rightMargin;          int NewX, rightMargin;
1749    
1750          if (Param[1] < 1)          CheckParamVal(Param[1], NumOfColumns);
                 Param[1] = 1;  
1751    
1752          if (AffectMargin && CursorX <= CursorRightM)          if (AffectMargin && CursorX <= CursorRightM) {
1753                  rightMargin = CursorRightM;                  rightMargin = CursorRightM;
1754          else          }
1755            else {
1756                  rightMargin = NumOfColumns-1;                  rightMargin = NumOfColumns-1;
1757            }
1758    
1759          NewX = CursorX + Param[1];          NewX = CursorX + Param[1];
1760          if (NewX > rightMargin)          if (NewX > rightMargin)
# Line 1744  void CSCursorLeft(BOOL AffectMargin)   // Line 1767  void CSCursorLeft(BOOL AffectMargin)   //
1767  {  {
1768          int NewX, leftMargin;          int NewX, leftMargin;
1769    
1770          if (Param[1] < 1)          CheckParamVal(Param[1], NumOfColumns);
                 Param[1] = 1;  
1771    
1772          if (AffectMargin && CursorX >= CursorLeftM)          if (AffectMargin && CursorX >= CursorLeftM) {
1773                  leftMargin = CursorLeftM;                  leftMargin = CursorLeftM;
1774          else          }
1775            else {
1776                  leftMargin = 0;                  leftMargin = 0;
1777            }
1778    
1779          NewX = CursorX  - Param[1];          NewX = CursorX  - Param[1];
1780          if (NewX < leftMargin)          if (NewX < leftMargin) {
1781                  NewX = leftMargin;                  NewX = leftMargin;
1782            }
1783    
1784          MoveCursor(NewX, CursorY);          MoveCursor(NewX, CursorY);
1785  }  }
1786    
1787  void CSMoveToLineN()                    // VPA  void CSMoveToLineN()            // VPA
1788  {  {
1789          if (Param[1]<1) Param[1] = 1;          CheckParamVal(Param[1], NumOfLines-StatusLine);
1790    
1791          if (RelativeOrgMode) {          if (RelativeOrgMode) {
1792                  if (CursorTop+Param[1]-1 > CursorBottom)                  if (CursorTop+Param[1]-1 > CursorBottom)
1793                          MoveCursor(CursorX,CursorBottom);                          MoveCursor(CursorX,CursorBottom);
# Line 1780  void CSMoveToXY()              // CUP / HVP Line 1806  void CSMoveToXY()              // CUP / HVP
1806  {  {
1807          int NewX, NewY;          int NewX, NewY;
1808    
1809          if (Param[1] < 1)          RequiredParams(2);
1810                  Param[1] = 1;          CheckParamVal(Param[1], NumOfLines-StatusLine);
1811          else if (Param[1] > NumOfLines-StatusLine)          CheckParamVal(Param[2], NumOfColumns);
                 Param[1] = NumOfLines-StatusLine;  
   
         if ((NParam < 2) || (Param[2]<1))  
                 Param[2] = 1;  
         else if (Param[2] > NumOfColumns)  
                 Param[2] = NumOfColumns;  
1812    
1813          NewY = Param[1] - 1;          NewY = Param[1] - 1;
1814          NewX = Param[2] - 1;          NewX = Param[2] - 1;
# Line 1805  void CSMoveToXY()              // CUP / HVP Line 1825  void CSMoveToXY()              // CUP / HVP
1825                          NewY = CursorBottom;                          NewY = CursorBottom;
1826          }          }
1827          else {          else {
                 NewY = Param[1] - 1;  
1828                  if (NewY > NumOfLines-1-StatusLine)                  if (NewY > NumOfLines-1-StatusLine)
1829                          NewY = NumOfLines-1-StatusLine;                          NewY = NumOfLines-1-StatusLine;
1830          }          }
# Line 2229  void CSSetScrollRegion()       // DECSTBM Line 2248  void CSSetScrollRegion()       // DECSTBM
2248                  MoveCursor(0,CursorY);                  MoveCursor(0,CursorY);
2249                  return;                  return;
2250          }          }
2251          if (Param[1]<1) Param[1] =1;  
2252          if ((NParam < 2) | (Param[2]<1))          RequiredParams(2);
2253                  Param[2] = NumOfLines-StatusLine;          CheckParamVal(Param[1], NumOfLines-StatusLine);
2254          Param[1]--;          CheckParamValMax(Param[2], NumOfLines-StatusLine);
2255          Param[2]--;  
2256          if (Param[1] > NumOfLines-1-StatusLine)          if (Param[1] >= Param[2])
2257                  Param[1] = NumOfLines-1-StatusLine;                  return;
2258          if (Param[2] > NumOfLines-1-StatusLine)  
2259                  Param[2] = NumOfLines-1-StatusLine;          CursorTop = Param[1] - 1;
2260          if (Param[1] >= Param[2]) return;          CursorBottom = Param[2] - 1;
2261          CursorTop = Param[1];  
2262          CursorBottom = Param[2];          if (RelativeOrgMode)
2263          if (RelativeOrgMode) MoveCursor(0,CursorTop);                  // TODO: 左マージンを無視してる。要実機確認。
2264                          else MoveCursor(0,0);                  MoveCursor(0, CursorTop);
2265            else
2266                    MoveCursor(0, 0);
2267  }  }
2268    
2269  void CSSetLRScrollRegion()      // DECSLRM  void CSSetLRScrollRegion()      // DECSLRM
2270  {  {
2271    //      TODO: ステータスライン上での挙動確認。
2272  //      if (isCursorOnStatusLine) {  //      if (isCursorOnStatusLine) {
2273  //              MoveCursor(0,CursorY);  //              MoveCursor(0,CursorY);
2274  //              return;  //              return;
2275  //      }  //      }
2276    
2277          if (Param[1] < 1)          RequiredParams(2);
2278                  Param[1] =1;          CheckParamVal(Param[1], NumOfColumns);
2279          else if (Param[1] > NumOfColumns)          CheckParamValMax(Param[2], NumOfColumns);
                 Param[1] = NumOfColumns;  
   
         if (NParam < 2 || Param[2] < 1 || Param[2] > NumOfColumns)  
                 Param[2] = NumOfColumns;  
2280    
2281          if (Param[1] >= Param[2])          if (Param[1] >= Param[2])
2282                  return;                  return;
2283    
2284          Param[1]--;          CursorLeftM = Param[1] - 1;
2285          Param[2]--;          CursorRightM = Param[2] - 1;
   
         CursorLeftM = Param[1];  
         CursorRightM = Param[2];  
2286    
2287          if (RelativeOrgMode)          if (RelativeOrgMode)
2288                  MoveCursor(CursorLeftM, CursorTop);                  MoveCursor(CursorLeftM, CursorTop);
# Line 2286  void CSSunSequence() /* Sun terminal pri Line 2301  void CSSunSequence() /* Sun terminal pri
2301                  if (ts.WindowFlag & WF_WINDOWCHANGE)                  if (ts.WindowFlag & WF_WINDOWCHANGE)
2302                          DispShowWindow(WINDOW_RESTORE);                          DispShowWindow(WINDOW_RESTORE);
2303                  break;                  break;
2304    
2305            case 2: // Iconify window            case 2: // Iconify window
2306                  if (ts.WindowFlag & WF_WINDOWCHANGE)                  if (ts.WindowFlag & WF_WINDOWCHANGE)
2307                          DispShowWindow(WINDOW_MINIMIZE);                          DispShowWindow(WINDOW_MINIMIZE);
2308                  break;                  break;
2309    
2310            case 3: // set window position            case 3: // set window position
2311                  if (ts.WindowFlag & WF_WINDOWCHANGE) {                  if (ts.WindowFlag & WF_WINDOWCHANGE) {
2312                          if (NParam < 2) Param[2] = 0;                          RequiredParams(3);
                         if (NParam < 3) Param[3] = 0;  
2313                          DispMoveWindow(Param[2], Param[3]);                          DispMoveWindow(Param[2], Param[3]);
2314                  }                  }
2315                  break;                  break;
2316    
2317            case 4: // set window size            case 4: // set window size
2318                  if (ts.WindowFlag & WF_WINDOWCHANGE) {                  if (ts.WindowFlag & WF_WINDOWCHANGE) {
2319                          if (NParam < 2) Param[2] = 0;                          RequiredParams(3);
                         if (NParam < 3) Param[3] = 0;  
2320                          DispResizeWin(Param[3], Param[2]);                          DispResizeWin(Param[3], Param[2]);
2321                  }                  }
2322                  break;                  break;
2323    
2324            case 5: // Raise window            case 5: // Raise window
2325                  if (ts.WindowFlag & WF_WINDOWCHANGE)                  if (ts.WindowFlag & WF_WINDOWCHANGE)
2326                          DispShowWindow(WINDOW_RAISE);                          DispShowWindow(WINDOW_RAISE);
2327                  break;                  break;
2328    
2329            case 6: // Lower window            case 6: // Lower window
2330                  if (ts.WindowFlag & WF_WINDOWCHANGE)                  if (ts.WindowFlag & WF_WINDOWCHANGE)
2331                          DispShowWindow(WINDOW_LOWER);                          DispShowWindow(WINDOW_LOWER);
2332                  break;                  break;
2333    
2334            case 7: // Refresh window            case 7: // Refresh window
2335                  if (ts.WindowFlag & WF_WINDOWCHANGE)                  if (ts.WindowFlag & WF_WINDOWCHANGE)
2336                          DispShowWindow(WINDOW_REFRESH);                          DispShowWindow(WINDOW_REFRESH);
2337                  break;                  break;
2338    
2339            case 8: /* set terminal size */            case 8: /* set terminal size */
2340                  if (ts.WindowFlag & WF_WINDOWCHANGE) {                  if (ts.WindowFlag & WF_WINDOWCHANGE) {
2341                          if ((Param[2]<=1) || (NParam<2)) Param[2] = 24;                          RequiredParams(3);
2342                          if ((Param[3]<=1) || (NParam<3)) Param[3] = 80;                          if (Param[2] <= 1) Param[2] = 24;
2343                          ChangeTerminalSize(Param[3],Param[2]);                          if (Param[3] <= 1) Param[3] = 80;
2344                            ChangeTerminalSize(Param[3], Param[2]);
2345                  }                  }
2346                  break;                  break;
2347    
2348            case 9: // Maximize/Restore window            case 9: // Maximize/Restore window
2349                  if (ts.WindowFlag & WF_WINDOWCHANGE) {                  if (ts.WindowFlag & WF_WINDOWCHANGE) {
2350                          if (NParam < 2 || Param[2] == 0) {                          RequiredParams(2);
2351                            if (Param[2] == 0) {
2352                                  DispShowWindow(WINDOW_RESTORE);                                  DispShowWindow(WINDOW_RESTORE);
2353                          }                          }
2354                          else if (Param[2] == 1) {                          else if (Param[2] == 1) {
# Line 2333  void CSSunSequence() /* Sun terminal pri Line 2356  void CSSunSequence() /* Sun terminal pri
2356                          }                          }
2357                  }                  }
2358                  break;                  break;
2359    
2360            case 11: // Report window state            case 11: // Report window state
2361                  if (ts.WindowFlag & WF_WINDOWREPORT) {                  if (ts.WindowFlag & WF_WINDOWREPORT) {
2362                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "%dt", CLocale, DispWindowIconified()?2:1);                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "%dt", CLocale, DispWindowIconified()?2:1);
2363                          SendCSIstr(Report, len);                          SendCSIstr(Report, len);
2364                  }                  }
2365                  break;                  break;
2366    
2367            case 13: // Report window position            case 13: // Report window position
2368                  if (ts.WindowFlag & WF_WINDOWREPORT) {                  if (ts.WindowFlag & WF_WINDOWREPORT) {
2369                          DispGetWindowPos(&x, &y);                          DispGetWindowPos(&x, &y);
# Line 2346  void CSSunSequence() /* Sun terminal pri Line 2371  void CSSunSequence() /* Sun terminal pri
2371                          SendCSIstr(Report, len);                          SendCSIstr(Report, len);
2372                  }                  }
2373                  break;                  break;
2374    
2375            case 14: /* get window size */            case 14: /* get window size */
2376                  if (ts.WindowFlag & WF_WINDOWREPORT) {                  if (ts.WindowFlag & WF_WINDOWREPORT) {
2377                          DispGetWindowSize(&x, &y);                          DispGetWindowSize(&x, &y);
# Line 2353  void CSSunSequence() /* Sun terminal pri Line 2379  void CSSunSequence() /* Sun terminal pri
2379                          SendCSIstr(Report, len);                          SendCSIstr(Report, len);
2380                  }                  }
2381                  break;                  break;
2382    
2383            case 18: /* get terminal size */            case 18: /* get terminal size */
2384                  if (ts.WindowFlag & WF_WINDOWREPORT) {                  if (ts.WindowFlag & WF_WINDOWREPORT) {
2385                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "8;%u;%ut", CLocale,                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "8;%u;%ut", CLocale,
# Line 2360  void CSSunSequence() /* Sun terminal pri Line 2387  void CSSunSequence() /* Sun terminal pri
2387                          SendCSIstr(Report, len);                          SendCSIstr(Report, len);
2388                  }                  }
2389                  break;                  break;
2390    
2391            case 19: // Report display size (character)            case 19: // Report display size (character)
2392                  if (ts.WindowFlag & WF_WINDOWREPORT) {                  if (ts.WindowFlag & WF_WINDOWREPORT) {
2393                          DispGetRootWinSize(&x, &y);                          DispGetRootWinSize(&x, &y);
# Line 2367  void CSSunSequence() /* Sun terminal pri Line 2395  void CSSunSequence() /* Sun terminal pri
2395                          SendCSIstr(Report, len);                          SendCSIstr(Report, len);
2396                  }                  }
2397                  break;                  break;
2398    
2399            case 20: // Report icon label            case 20: // Report icon label
2400                  switch (ts.WindowFlag & WF_TITLEREPORT) {                  switch (ts.WindowFlag & WF_TITLEREPORT) {
2401                    case IdTitleReportIgnore:                    case IdTitleReportIgnore:
2402                          // nothing to do                          // nothing to do
2403                          break;                          break;
2404    
2405                    case IdTitleReportAccept:                    case IdTitleReportAccept:
2406                          switch (ts.AcceptTitleChangeRequest) {                          switch (ts.AcceptTitleChangeRequest) {
2407                            case IdTitleChangeRequestOff:                            case IdTitleChangeRequestOff:
2408                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);
2409                                  break;                                  break;
2410    
2411                            case IdTitleChangeRequestAhead:                            case IdTitleChangeRequestAhead:
2412                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, cv.TitleRemote, ts.Title);                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, cv.TitleRemote, ts.Title);
2413                                  break;                                  break;
2414    
2415                            case IdTitleChangeRequestLast:                            case IdTitleChangeRequestLast:
2416                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, ts.Title, cv.TitleRemote);                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, ts.Title, cv.TitleRemote);
2417                                  break;                                  break;
2418    
2419                            default:                            default:
2420                                  if (cv.TitleRemote[0] == 0) {                                  if (cv.TitleRemote[0] == 0) {
2421                                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);                                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);
# Line 2393  void CSSunSequence() /* Sun terminal pri Line 2426  void CSSunSequence() /* Sun terminal pri
2426                          }                          }
2427                          SendOSCstr(Report, len, ST);                          SendOSCstr(Report, len, ST);
2428                          break;                          break;
2429    
2430                    default: // IdTitleReportEmpty:                    default: // IdTitleReportEmpty:
2431                          SendOSCstr("L", 0, ST);                          SendOSCstr("L", 0, ST);
2432                          break;                          break;
2433                  }                  }
2434                  break;                  break;
2435    
2436            case 21: // Report window title            case 21: // Report window title
2437                  switch (ts.WindowFlag & WF_TITLEREPORT) {                  switch (ts.WindowFlag & WF_TITLEREPORT) {
2438                    case IdTitleReportIgnore:                    case IdTitleReportIgnore:
2439                          // nothing to do                          // nothing to do
2440                          break;                          break;
2441    
2442                    case IdTitleReportAccept:                    case IdTitleReportAccept:
2443                          switch (ts.AcceptTitleChangeRequest) {                          switch (ts.AcceptTitleChangeRequest) {
2444                            case IdTitleChangeRequestOff:                            case IdTitleChangeRequestOff:
2445                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);
2446                                  break;                                  break;
2447    
2448                            case IdTitleChangeRequestAhead:                            case IdTitleChangeRequestAhead:
2449                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, cv.TitleRemote, ts.Title);                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, cv.TitleRemote, ts.Title);
2450                                  break;                                  break;
2451    
2452                            case IdTitleChangeRequestLast:                            case IdTitleChangeRequestLast:
2453                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, ts.Title, cv.TitleRemote);                                  len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, ts.Title, cv.TitleRemote);
2454                                  break;                                  break;
2455    
2456                            default:                            default:
2457                                  if (cv.TitleRemote[0] == 0) {                                  if (cv.TitleRemote[0] == 0) {
2458                                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);                                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);
# Line 2424  void CSSunSequence() /* Sun terminal pri Line 2463  void CSSunSequence() /* Sun terminal pri
2463                          }                          }
2464                          SendOSCstr(Report, len, ST);                          SendOSCstr(Report, len, ST);
2465                          break;                          break;
2466    
2467                    default: // IdTitleReportEmpty:                    default: // IdTitleReportEmpty:
2468                          SendOSCstr("l", 0, ST);                          SendOSCstr("l", 0, ST);
2469                          break;                          break;
2470                  }                  }
2471                  break;                  break;
2472    
2473            case 22: // Push Title            case 22: // Push Title
2474                  if (NParam < 2) {                  RequiredParams(2);
                         Param[2] = 0;  
                 }  
2475                  switch (Param[2]) {                  switch (Param[2]) {
2476                    case 0:                    case 0:
2477                    case 1:                    case 1:
# Line 2449  void CSSunSequence() /* Sun terminal pri Line 2488  void CSSunSequence() /* Sun terminal pri
2488                          break;                          break;
2489                  }                  }
2490                  break;                  break;
2491    
2492            case 23: // Pop Title            case 23: // Pop Title
2493                  if (NParam < 2) {                  RequiredParams(2);
                         Param[2] = 0;  
                 }  
2494                  switch (Param[2]) {                  switch (Param[2]) {
2495                    case 0:                    case 0:
2496                    case 1:                    case 1:
# Line 2500  void CSEQ(BYTE b) Line 2538  void CSEQ(BYTE b)
2538    
2539          switch (b) {          switch (b) {
2540            case 'c': /* Tertiary terminal report (Tertiary DA) */            case 'c': /* Tertiary terminal report (Tertiary DA) */
2541                  if (Param[1] < 1) {                  if (Param[1] == 0) {
2542                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "!|%8s", CLocale, ts.TerminalUID);                          len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "!|%8s", CLocale, ts.TerminalUID);
2543                          SendDCSstr(Report, len);                          SendDCSstr(Report, len);
2544                  }                  }
# Line 2512  void CSGT(BYTE b) Line 2550  void CSGT(BYTE b)
2550  {  {
2551          switch (b) {          switch (b) {
2552            case 'c': /* second terminal report (Secondary DA) */            case 'c': /* second terminal report (Secondary DA) */
2553                  if (Param[1] < 1) {                  if (Param[1] == 0) {
2554                          SendCSIstr(">32;278;0c", 0); /* VT382(>32) + xterm rev 278 */                          SendCSIstr(">32;278;0c", 0); /* VT382(>32) + xterm rev 278 */
2555                  }                  }
2556                  break;                  break;
2557    
2558            case 'J': // IO-8256 terminal            case 'J': // IO-8256 terminal
2559                  if (Param[1]==3) {                  if (Param[1]==3) {
2560                          if (Param[2] < 1 || NParam < 2) Param[2] = 1;                          RequiredParams(5);
2561                          if (Param[3] < 1 || NParam < 3) Param[3] = 1;                          CheckParamVal(Param[2], NumOfLines-StatusLine);
2562                          if (Param[4] < 1 || NParam < 4) Param[4] = NumOfLines-StatusLine;                          CheckParamVal(Param[3], NumOfColumns);
2563                          if (Param[5] < 1 || NParam < 5) Param[5] = NumOfColumns;                          CheckParamValMax(Param[4], NumOfLines-StatusLine);
2564                            CheckParamValMax(Param[5], NumOfColumns);
2565    
2566                            if (Param[2] > Param[4] || Param[3] > Param[5]) {
2567                                    return;
2568                            }
2569    
2570                          BuffEraseBox(Param[3]-1, Param[2]-1, Param[5]-1, Param[4]-1);                          BuffEraseBox(Param[3]-1, Param[2]-1, Param[5]-1, Param[4]-1);
2571                  }                  }
2572                  break;                  break;
2573    
2574            case 'K': // IO-8256 terminal            case 'K': // IO-8256 terminal
2575                  switch (Param[1]) {                  switch (Param[1]) {
2576                    case 3:                    case 3:
2577                          if (Param[2] < 1 || NParam < 2) Param[2] = 1;                          RequiredParams(3);
2578                          if (Param[3] < 1 || NParam < 3) Param[3] = 1;                          CheckParamVal(Param[2], NumOfColumns);
2579                            CheckParamVal(Param[3], NumOfColumns);
2580    
2581                            if (Param[2] > Param[3]) {
2582                                    return;
2583                            }
2584    
2585                          BuffEraseCharsInLine(Param[2]-1, Param[3]-Param[2]+1);                          BuffEraseCharsInLine(Param[2]-1, Param[3]-Param[2]+1);
2586                          break;                          break;
2587    
2588                    case 5:                    case 5:
2589                          if (NParam < 2) Param[2] = 0;                          RequiredParams(3);
                         if (NParam < 3) Param[3] = 0;  
2590                          switch (Param[2]) {                          switch (Param[2]) {
2591                            case 3:                            case 3:
2592                            case 4:                            case 4:
# Line 2971  void CSDouble(BYTE b) Line 3023  void CSDouble(BYTE b)
3023          switch (b) {          switch (b) {
3024            case 'p': // DECSCL            case 'p': // DECSCL
3025                  /* Select terminal mode (software reset) */                  /* Select terminal mode (software reset) */
3026                    RequiredParams(2);
3027    
3028                  SoftReset();                  SoftReset();
3029                  if (NParam > 0) {                  ChangeTerminalID();
3030                          ChangeTerminalID();                  if (Param[1] >= 61 && Param[1] <= 65) {
3031                          if (Param[1] >= 61 && Param[1] <= 65) {                          if (VTlevel > Param[1] - 60) {
3032                                  if (VTlevel > Param[1] - 60) {                                  VTlevel = Param[1] - 60;
                                         VTlevel = Param[1] - 60;  
                                 }  
                         }  
                         else {  
                                 VTlevel = 1;  
3033                          }                          }
   
                         if (VTlevel < 2 || (NParam > 1 && Param[2] == 1))  
                                 Send8BitMode = FALSE;  
                         else  
                                 Send8BitMode = TRUE;  
3034                  }                  }
3035                    else {
3036                            VTlevel = 1;
3037                    }
3038    
3039                    if (VTlevel < 2 || Param[2] == 1)
3040                            Send8BitMode = FALSE;
3041                    else
3042                            Send8BitMode = TRUE;
3043                  break;                  break;
3044    
3045            case 'q': // DECSCA            case 'q': // DECSCA
# Line 3015  void CSDolRequestMode() Line 3067  void CSDolRequestMode()
3067          char *pp;          char *pp;
3068          int len, resp = 0;          int len, resp = 0;
3069    
         if (NParam == 0)  
                 Param[1] = 0;  
   
3070          switch (Prv) {          switch (Prv) {
3071            case 0: /* ANSI Mode */            case 0: /* ANSI Mode */
3072                  resp = 4;                  resp = 4;
# Line 3314  void CSDol(BYTE b) Line 3363  void CSDol(BYTE b)
3363            case 'p': // DECRQM            case 'p': // DECRQM
3364                  CSDolRequestMode();                  CSDolRequestMode();
3365                  break;                  break;
3366    
3367            case 'r': // DECCARA            case 'r': // DECCARA
3368            case 't': // DECRARA            case 't': // DECRARA
3369                  if (Param[1] < 1 || NParam < 1) Param[1] = 1;                  RequiredParams(4);
3370                  if (Param[2] < 1 || NParam < 2) Param[2] = 1;                  CheckParamVal(Param[1], NumOfLines-StatusLine);
3371                  if (Param[3] < 1 || NParam < 3) Param[3] = NumOfLines-StatusLine;                  CheckParamVal(Param[2], NumOfColumns);
3372                  if (Param[4] < 1 || NParam < 4) Param[4] = NumOfColumns;                  CheckParamValMax(Param[3], NumOfLines-StatusLine);
3373                  if (Param[1] <= Param[3] && Param[2] <= Param[4]) {                  CheckParamValMax(Param[4], NumOfColumns);
3374                          if (RelativeOrgMode) {  
3375                                  Param[1] += CursorTop;                  if (Param[1] > Param[3] || Param[2] > Param[4]) {
3376                                  if (Param[1] > CursorBottom) {                          return;
3377                                          Param[1] = CursorBottom + 1;                  }
3378                                  }  
3379                                  Param[3] += CursorTop;                  if (RelativeOrgMode) {
3380                                  if (Param[3] > CursorBottom) {                          Param[1] += CursorTop;
3381                                          Param[3] = CursorBottom + 1;                          if (Param[1] > CursorBottom) {
3382                                  }                                  Param[1] = CursorBottom + 1;
3383                          }                          }
3384                            Param[3] += CursorTop;
3385                            if (Param[3] > CursorBottom) {
3386                                    Param[3] = CursorBottom + 1;
3387                            }
3388    
3389                            // TODO: 左右マージンのチェックを行う。
3390                  }                  }
3391    
3392                  ParseSGRParams(&attr, &mask, 5);                  ParseSGRParams(&attr, &mask, 5);
3393                  if (b == 'r') { // DECCARA                  if (b == 'r') { // DECCARA
3394                          attr.Attr &= AttrSgrMask;                          attr.Attr &= AttrSgrMask;
# Line 3345  void CSDol(BYTE b) Line 3402  void CSDol(BYTE b)
3402                          BuffChangeAttrBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1, &attr, NULL);                          BuffChangeAttrBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1, &attr, NULL);
3403                  }                  }
3404                  break;                  break;
3405    
3406            case 'v': // DECCRA            case 'v': // DECCRA
3407                  if (Param[1] < 1 || NParam < 1) Param[1] = 1;                  RequiredParams(8);
3408                  if (Param[2] < 1 || NParam < 2) Param[2] = 1;                  CheckParamVal(Param[1], NumOfLines-StatusLine);         // Src Y-start
3409                  if (Param[3] < 1 || NParam < 3) Param[3] = NumOfLines-StatusLine;                  CheckParamVal(Param[2], NumOfColumns);                  // Src X-start
3410                  if (Param[4] < 1 || NParam < 4) Param[4] = NumOfColumns;                  CheckParamValMax(Param[3], NumOfLines-StatusLine);      // Src Y-end
3411                  if (Param[5] < 1 || NParam < 5) Param[5] = 1;                  CheckParamValMax(Param[4], NumOfColumns);               // Src X-end
3412                  if (Param[6] < 1 || NParam < 6) Param[6] = 1;                  CheckParamVal(Param[5], 1);                             // Src Page
3413                  if (Param[7] < 1 || NParam < 7) Param[7] = 1;                  CheckParamVal(Param[6], NumOfLines-StatusLine);         // Dest Y
3414                  if (Param[8] < 1 || NParam < 8) Param[8] = 1;                  CheckParamVal(Param[7], NumOfColumns);                  // Dest X
3415                  if (Param[1] <= Param[3] && Param[2] <= Param[4]) {                  CheckParamVal(Param[8], 1);                             // Dest Page
3416                          if (RelativeOrgMode) {  
3417                                  Param[1] += CursorTop;                  if (Param[1] > Param[3] || Param[2] > Param[4]) {
3418                                  if (Param[1] > CursorBottom) {                          return;
3419                                          Param[1] = CursorBottom + 1;                  }
3420                                  }  
3421                                  Param[3] += CursorTop;                  if (RelativeOrgMode) {
3422                                  if (Param[3] > CursorBottom) {                          Param[1] += CursorTop;
3423                                          Param[3] = CursorBottom + 1;                          if (Param[1] > CursorBottom) {
3424                                  }                                  Param[1] = CursorBottom + 1;
                                 Param[6] += CursorTop;  
                                 if (Param[6] > CursorBottom) {  
                                         Param[6] = CursorBottom + 1;  
                                 }  
                                 if (Param[6] + Param[3] - Param[1] > CursorBottom) {  
                                         Param[3] = Param[1] + CursorBottom - Param[6] + 1;  
                                 }  
3425                          }                          }
3426                          BuffCopyBox(Param[2], Param[1], Param[4], Param[3], Param[5], Param[7], Param[6], Param[8]);                          Param[3] += CursorTop;
3427                            if (Param[3] > CursorBottom) {
3428                                    Param[3] = CursorBottom + 1;
3429                            }
3430                            Param[6] += CursorTop;
3431                            if (Param[6] > CursorBottom) {
3432                                    Param[6] = CursorBottom + 1;
3433                            }
3434                            if (Param[6] + Param[3] - Param[1] > CursorBottom) {
3435                                    Param[3] = Param[1] + CursorBottom - Param[6] + 1;
3436                            }
3437    
3438                            // TODO: 左右マージンのチェックを行う。
3439                  }                  }
3440    
3441                    // TODO: 1 origin になっている。0 origin に直す。
3442                    BuffCopyBox(Param[2], Param[1], Param[4], Param[3], Param[5], Param[7], Param[6], Param[8]);
3443                  break;                  break;
3444    
3445            case 'x': // DECFRA            case 'x': // DECFRA
3446                  if (NParam < 1 || Param[1] < 32 || (Param[1] > 127 && Param[1] < 160) || Param[1] > 255) {                  RequiredParams(5);
3447                    if (Param[1] < 32 || (Param[1] > 127 && Param[1] < 160) || Param[1] > 255) {
3448                          return;                          return;
3449                  }                  }
3450                  if (Param[2] < 1 || NParam < 2) Param[2] = 1;                  CheckParamVal(Param[2], NumOfLines-StatusLine);
3451                  if (Param[3] < 1 || NParam < 3) Param[3] = 1;                  CheckParamVal(Param[3], NumOfColumns);
3452                  if (Param[4] < 1 || NParam < 4) Param[4] = NumOfLines-StatusLine;                  CheckParamValMax(Param[4], NumOfLines-StatusLine);
3453                  if (Param[5] < 1 || NParam < 5) Param[5] = NumOfColumns;                  CheckParamValMax(Param[5], NumOfColumns);
3454    
3455                  if (Param[2] > Param[4] || Param[3] > Param[5]) {                  if (Param[2] > Param[4] || Param[3] > Param[5]) {
3456                          return;                          return;
3457                  }                  }
3458    
3459                  if (RelativeOrgMode) {                  if (RelativeOrgMode) {
3460                          Param[2] += CursorTop;                          Param[2] += CursorTop;
3461                          if (Param[2] > CursorBottom) {                          if (Param[2] > CursorBottom) {
# Line 3395  void CSDol(BYTE b) Line 3465  void CSDol(BYTE b)
3465                          if (Param[4] > CursorBottom) {                          if (Param[4] > CursorBottom) {
3466                                  Param[4] = CursorBottom + 1;                                  Param[4] = CursorBottom + 1;
3467                          }                          }
3468    
3469                            // TODO: 左右マージンのチェックを行う。
3470                  }                  }
3471    
3472                  BuffFillBox(Param[1], Param[3]-1, Param[2]-1, Param[5]-1, Param[4]-1);                  BuffFillBox(Param[1], Param[3]-1, Param[2]-1, Param[5]-1, Param[4]-1);
3473                  break;                  break;
3474    
3475            case 'z': // DECERA            case 'z': // DECERA
3476            case '{': // DECSERA            case '{': // DECSERA
3477                  if (Param[1] < 1 || NParam < 1) Param[1]=1;                  RequiredParams(4);
3478                  if (Param[2] < 1 || NParam < 2) Param[2]=1;                  CheckParamVal(Param[1], NumOfLines-StatusLine);
3479                  if (Param[3] < 1 || NParam < 3) Param[3]=NumOfLines-StatusLine;                  CheckParamVal(Param[2], NumOfColumns);
3480                  if (Param[4] < 1 || NParam < 4) Param[4]=NumOfColumns;                  CheckParamValMax(Param[3], NumOfLines-StatusLine);
3481                    CheckParamValMax(Param[4], NumOfColumns);
3482    
3483                    if (Param[1] > Param[3] || Param[2] > Param[4]) {
3484                            return;
3485                    }
3486    
3487                  if (RelativeOrgMode) {                  if (RelativeOrgMode) {
3488                          Param[1] += CursorTop;                          Param[1] += CursorTop;
3489                          if (Param[1] > CursorBottom) {                          if (Param[1] > CursorBottom) {
# Line 3414  void CSDol(BYTE b) Line 3493  void CSDol(BYTE b)
3493                          if (Param[3] > CursorBottom) {                          if (Param[3] > CursorBottom) {
3494                                  Param[3] = CursorBottom + 1;                                  Param[3] = CursorBottom + 1;
3495                          }                          }
3496    
3497                            // TODO: 左右マージンのチェックを行う。
3498                  }                  }
3499    
3500                  if (b == 'z') {                  if (b == 'z') {
3501                          BuffEraseBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1);                          BuffEraseBox(Param[2]-1, Param[1]-1, Param[4]-1, Param[3]-1);
3502                  }                  }
# Line 3424  void CSDol(BYTE b) Line 3506  void CSDol(BYTE b)
3506                  break;                  break;
3507    
3508            case '}': // DECSASD            case '}': // DECSASD
3509                  if ((ts.TermFlag & TF_ENABLESLINE)==0)                  if ((ts.TermFlag & TF_ENABLESLINE) == 0 || !StatusLine) {
3510                          return;                          return;
3511                  if (StatusLine==0)                  }
3512                          return;  
3513                  if ((Param[1]<1) && (CursorY==NumOfLines-1))                  switch (Param[1]) {
3514                          MoveToMainScreen();                    case 0:
3515                  else if ((Param[1]==1) && (CursorY<NumOfLines-1))                          if (isCursorOnStatusLine) {
3516                          MoveToStatusLine();                                  MoveToMainScreen();
3517                            }
3518                            break;
3519    
3520                      case 1:
3521                            if (!isCursorOnStatusLine) {
3522                                    MoveToStatusLine();
3523                            }
3524                            break;
3525                    }
3526                  break;                  break;
3527    
3528            case '~': // DECSSDT            case '~': // DECSSDT
3529                  if ((ts.TermFlag & TF_ENABLESLINE)==0)                  if ((ts.TermFlag & TF_ENABLESLINE)==0) {
3530                          return;                          return;
3531                  if (Param[1]<=1)                  }
3532    
3533                    switch (Param[1]) {
3534                      case 0:
3535                      case 1:
3536                          HideStatusLine();                          HideStatusLine();
3537                  else if ((StatusLine==0) && (Param[1]==2))                          break;
3538                          ShowStatusLine(1); // show                    case 2:
3539                            if (!StatusLine) {
3540                                    ShowStatusLine(1); // show
3541                            }
3542                            break;
3543                    }
3544                  break;                  break;
3545          }          }
3546  }  }
# Line 3459  void CSQuote(BYTE b) Line 3560  void CSQuote(BYTE b)
3560          switch (b) {          switch (b) {
3561            case 'w': // Enable Filter Rectangle (DECEFR)            case 'w': // Enable Filter Rectangle (DECEFR)
3562                  if (MouseReportMode == IdMouseTrackDECELR) {                  if (MouseReportMode == IdMouseTrackDECELR) {
3563                            RequiredParams(4);
3564                          if (DecLocatorFlag & DecLocatorPixel) {                          if (DecLocatorFlag & DecLocatorPixel) {
3565                                  x = LastX + 1;                                  x = LastX + 1;
3566                                  y = LastY + 1;                                  y = LastY + 1;
# Line 3468  void CSQuote(BYTE b) Line 3570  void CSQuote(BYTE b)
3570                                  x++;                                  x++;
3571                                  y++;                                  y++;
3572                          }                          }
3573                          FilterTop    = (NParam<1 || Param[1]<1)? y : Param[1];                          FilterTop    = (Param[1]==0)? y : Param[1];
3574                          FilterLeft   = (NParam<2 || Param[2]<1)? x : Param[2];                          FilterLeft   = (Param[2]==0)? x : Param[2];
3575                          FilterBottom = (NParam<3 || Param[3]<1)? y : Param[3];                          FilterBottom = (Param[3]==0)? y : Param[3];
3576                          FilterRight  = (NParam<4 || Param[4]<1)? x : Param[4];                          FilterRight  = (Param[4]==0)? x : Param[4];
3577                          if (FilterTop > FilterBottom) {                          if (FilterTop > FilterBottom) {
3578                                  i = FilterTop; FilterTop = FilterBottom; FilterBottom = i;                                  i = FilterTop; FilterTop = FilterBottom; FilterBottom = i;
3579                          }                          }
# Line 3543  void CSSpace(BYTE b) { Line 3645  void CSSpace(BYTE b) {
3645          switch (b) {          switch (b) {
3646            case 'q': // DECSCUSR            case 'q': // DECSCUSR
3647                  if (ts.WindowFlag & WF_CURSORCHANGE) {                  if (ts.WindowFlag & WF_CURSORCHANGE) {
3648                          if (NParam > 0) {                          switch (Param[1]) {
3649                                  switch (Param[1]) {                            case 0:
3650                                    case 0:                            case 1:
3651                                    case 1:                                  ts.CursorShape = IdBlkCur;
3652                                          ts.CursorShape = IdBlkCur;                                  ts.NonblinkingCursor = FALSE;
3653                                          ts.NonblinkingCursor = FALSE;                                  break;
3654                                          break;                            case 2:
3655                                    case 2:                                  ts.CursorShape = IdBlkCur;
3656                                          ts.CursorShape = IdBlkCur;                                  ts.NonblinkingCursor = TRUE;
3657                                          ts.NonblinkingCursor = TRUE;                                  break;
3658                                          break;                            case 3:
3659                                    case 3:                                  ts.CursorShape = IdHCur;
3660                                          ts.CursorShape = IdHCur;                                  ts.NonblinkingCursor = FALSE;
3661                                          ts.NonblinkingCursor = FALSE;                                  break;
3662                                          break;                            case 4:
3663                                    case 4:                                  ts.CursorShape = IdHCur;
3664                                          ts.CursorShape = IdHCur;                                  ts.NonblinkingCursor = TRUE;
3665                                          ts.NonblinkingCursor = TRUE;                                  break;
3666                                          break;                            case 5:
3667                                    case 5:                                  ts.CursorShape = IdVCur;
3668                                          ts.CursorShape = IdVCur;                                  ts.NonblinkingCursor = FALSE;
3669                                          ts.NonblinkingCursor = FALSE;                                  break;
3670                                          break;                            case 6:
3671                                    case 6:                                  ts.CursorShape = IdVCur;
3672                                          ts.CursorShape = IdVCur;                                  ts.NonblinkingCursor = TRUE;
3673                                          ts.NonblinkingCursor = TRUE;                                  break;
3674                                          break;                            default:
3675                                    default:                                  return;
                                         return;  
                                 }  
                                 ChangeCaret();  
3676                          }                          }
3677                            ChangeCaret();
3678                  }                  }
3679                  break;                  break;
3680          }          }
# Line 3728  void ControlSequence(BYTE b) Line 3828  void ControlSequence(BYTE b)
3828                          IntChar[ICount] = b;                          IntChar[ICount] = b;
3829                  }                  }
3830                  else if ((b>=0x30) && (b<=0x39)) { /* parameter value */                  else if ((b>=0x30) && (b<=0x39)) { /* parameter value */
3831    #define ParamIncr(p, b) \
3832            do { \
3833                    unsigned int ptmp; \
3834                    if ((p) != (int)UINT_MAX) { \
3835                            ptmp = (unsigned int)(p); \
3836                            if (ptmp > UINT_MAX / 10 || ptmp * 10 > UINT_MAX - (b - 0x30)) { \
3837                                    (p) = (int)UINT_MAX; \
3838                            } \
3839                            else { \
3840                                    (p) = (int)(ptmp * 10 + b - 0x30); \
3841                            } \
3842                    } \
3843            } while (0);
3844                          if (NSParam[NParam] > 0) {                          if (NSParam[NParam] > 0) {
3845                                  SubParam[NParam][NSParam[NParam]] = SubParam[NParam][NSParam[NParam]]*10 + b - 0x30;                                  ParamIncr(SubParam[NParam][NSParam[NParam]], b);
3846                          }                          }
3847                          else {                          else {
3848                                  Param[NParam] = Param[NParam]*10 + b - 0x30;                                  ParamIncr(Param[NParam], b);
3849                          }                          }
3850                  }                  }
3851                  else if (b==0x3A) { /* ':' Subparameter delimiter */                  else if (b==0x3A) { /* ':' Subparameter delimiter */

Legend:
Removed from v.6173  
changed lines
  Added in v.6174

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26