ansiprsr.cpp
上传用户:kunlunxyl
上传日期:2007-01-07
资源大小:45k
文件大小:5k
源码类别:

Telnet客户端

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Module: ansiprsr.cpp
  4. //
  5. // Contents: ANSI parser base class
  6. //
  7. // Product: telnet
  8. //
  9. // Revisions: 13.Jul.1995 igor.milavec@uni-lj.si
  10. // Original code
  11. //
  12. ///////////////////////////////////////////////////////////////////////////////
  13. #include <ansiprsr.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>
  16. #include <string.h>
  17. char* TANSIParser::GetTerminalId()
  18. {
  19. return "33[?1;2c";
  20. }
  21. char* TANSIParser::ParseIAC(char* pszBuffer, char* pszBufferEnd)
  22. {
  23. if (pszBuffer + 2 < pszBufferEnd) {
  24. switch (pszBuffer[1]) {
  25.   case 251:
  26.   case 252:
  27.   case 253:
  28.   case 254:
  29. if (pszBuffer + 3 < pszBufferEnd)
  30. pszBuffer += 3;
  31. break;
  32.   default:
  33. pszBuffer += 2;
  34. break;
  35. }
  36. }
  37. return pszBuffer;
  38. }
  39. #pragma argsused
  40. char* TANSIParser::ParseEscapeANSI(char* pszBuffer, char* pszBufferEnd)
  41. {
  42. int bExtMode = 0;
  43. const int nParam = 10; // Maximum number of parameters
  44. int iParam[nParam] = {0, 0, 0, 0, 0};
  45. int iCurrentParam = 0;
  46. // Get parameters from escape sequence.
  47. while (!isalpha(*pszBuffer)) {
  48. // Check for parameter delimiter.
  49. if (*pszBuffer == ';') {
  50. pszBuffer++;
  51. continue;
  52. }
  53. if (*pszBuffer == '?') {
  54. bExtMode = 1;
  55. pszBuffer++;
  56. continue;
  57. }
  58. // pszHead should point to digit now. Otherwise we got bad escape
  59. // sequence, so we just get out of here!
  60. if (!isdigit(*pszBuffer))
  61. return pszBuffer;
  62. iParam[iCurrentParam] = strtoul(pszBuffer, &pszBuffer, 10);
  63. if (iCurrentParam < nParam)
  64. iCurrentParam++;
  65. }
  66. switch (*pszBuffer++) {
  67.   // Set cursor position.
  68.   case 'H':
  69.   case 'f':
  70. if (iCurrentParam < 2)
  71. iParam[1] = 1;
  72. if (iCurrentParam < 1)
  73. iParam[0] = 1;
  74. ConSetCursorPosition(iParam[1] - 1, iParam[0] - 1);
  75. break;
  76.   // Move cursor up.
  77.   case 'A':
  78. if (iCurrentParam < 1)
  79. iParam[0] = 1;
  80. ConMoveCursorPosition(0, -iParam[0]);
  81. break;
  82.   // Move cursor down.
  83.   case 'B':
  84. if (iCurrentParam < 1)
  85. iParam[0] = 1;
  86. ConMoveCursorPosition(0, iParam[0]);
  87. break;
  88.   // Move cursor right.
  89.   case 'C':
  90. if (iCurrentParam < 1)
  91. iParam[0] = 1;
  92. ConMoveCursorPosition(-iParam[0], 0);
  93. break;
  94.   // Move cursor left.
  95.   case 'D':
  96. if (iCurrentParam < 1)
  97. iParam[0] = 1;
  98. ConMoveCursorPosition(iParam[0], 0);
  99. break;
  100.   case 'J': { // Clear screen
  101. if (iCurrentParam < 1)
  102. iParam[0] = 2;
  103. switch (iParam[0]) {
  104.   case 0:
  105. ConClearEOScreen();
  106. break;
  107.   case 1:
  108. ConClearBOScreen();
  109. break;
  110.   case 2:
  111. ConClearScreen();
  112. break;
  113. }
  114. break;
  115.   }
  116.   case 'K': { // Clear line
  117. if (iCurrentParam < 1)
  118. iParam[0] = 2;
  119. switch (iParam[0]) {
  120.   case 0:
  121. ConClearEOLine();
  122. break;
  123.   case 1:
  124. ConClearBOLine();
  125. break;
  126.   case 2:
  127. ConClearLine();
  128. break;
  129. }
  130. break;
  131.   }
  132.   case 'c': {
  133. char* szTerminalId = GetTerminalId();
  134. NetWriteString(szTerminalId, strlen(szTerminalId));
  135. break;
  136.   }
  137.   case 'h': {
  138. if (bExtMode)
  139. for (int i = 0; i < iCurrentParam; i++)
  140. ConSetExtendedMode(iParam[i], 1);
  141. break;
  142.   }
  143.   case 'l': {
  144. if (bExtMode)
  145. for (int i = 0; i < iCurrentParam; i++)
  146. ConSetExtendedMode(iParam[i], 0);
  147. break;
  148.   }
  149. }
  150. return pszBuffer;
  151. }
  152. char* TANSIParser::ParseEscape(char* pszBuffer, char* pszBufferEnd)
  153. {
  154. /* ConWriteString("33", 1);
  155. return ++pszBuffer; //*/
  156. // Check if we have enough characters in buffer.
  157. if ((pszBufferEnd - pszBuffer) < 2)
  158. return pszBuffer;
  159. // Decode the command...
  160. pszBuffer++;
  161. switch (*pszBuffer++) {
  162.   case '[': {
  163. // Check if we have whole escape sequence in buffer.
  164. char* pszChar = pszBuffer + 1;
  165. while ((pszChar < pszBufferEnd) && (!isalpha(*pszChar)))
  166. pszChar++;
  167. if (pszChar == pszBufferEnd)
  168. pszBuffer -= 2;
  169. else
  170. pszBuffer = ParseEscapeANSI(pszBuffer, pszBufferEnd);
  171. break;
  172.   }
  173.   case ')':
  174. pszBuffer++;
  175. break;
  176.   case 'Z': {
  177. char* szTerminalId = GetTerminalId();
  178. NetWriteString(szTerminalId, strlen(szTerminalId));
  179. break;
  180.   }
  181. }
  182. return pszBuffer;
  183. }
  184. char* TANSIParser::ParseBuffer(char* pszBuffer, char* pszBufferEnd)
  185. {
  186. switch (*pszBuffer) {
  187.   case 0:
  188. pszBuffer++;
  189. break;
  190.   case 12:
  191. pszBuffer++;
  192. ConClearScreen();
  193. ConSetCursorPosition(0, 0);
  194. break;
  195.   case 27:
  196. pszBuffer = ParseEscape(pszBuffer, pszBufferEnd);
  197. break;
  198.   case 255:
  199. pszBuffer = ParseIAC(pszBuffer, pszBufferEnd);
  200. break;
  201.   default: {
  202. char* pszCurrent = pszBuffer + 1;
  203. while ((pszCurrent < pszBufferEnd) && !iscntrl(*pszCurrent) &&
  204. (*pszCurrent != (char)255))
  205. pszCurrent++;
  206. pszBuffer += ConWriteString(pszBuffer, pszCurrent - pszBuffer);
  207. break;
  208.   }
  209. }
  210. return pszBuffer;
  211. }