hz2gb.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:3k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* $Id: hz2gb.c,v 1.1 2000/01/15 01:45:36 edwardc Exp $ */
  2. #ifndef lint
  3. static char *rcs_id="$Id: hz2gb.c,v 1.1 2000/01/15 01:45:36 edwardc Exp $";
  4. #endif /* lint */
  5. #include "io.h"
  6. #define hzb(c) ((((c) & 0x7f) >= 0x21) && (((c) & 0x7f) <= 0x7e))
  7. #define S_ASC 0
  8. #define S_PHZ 1
  9. #define S_HZ 2
  10. #define S_HZ2 3
  11. #define S_HZA 4
  12. #define S_HZT 5
  13. #define S_PZW 6
  14. #define S_ZW 7
  15. #define S_ZW2 8
  16. #define S_ZWA 9
  17. static int state[MAX_MODULE];
  18. static int eoln[MAX_MODULE];
  19. #define NOQUOTE
  20. static char hzdecode(c, inst)
  21.      char c;
  22.      int inst; /* instant number */
  23. {
  24. switch (state[inst]) {
  25.   case S_ASC:
  26. switch (c) {
  27.   case '~': state[inst] = S_PHZ;  
  28. #ifdef NOQUOTE
  29.                                 c = ' ';
  30. #endif
  31.         break;
  32.   case 'z': state[inst] = (eoln[inst] ? S_PZW : S_ASC);
  33. break;
  34.   default: state[inst] = S_ASC;  break;
  35. }
  36. break;
  37.   case S_PHZ:
  38. switch (c) {
  39.   case '{': state[inst] = S_HZ;
  40. #ifdef NOQUOTE
  41.                                 c = ' ';
  42. #endif
  43.         break;
  44.   default: state[inst] = S_ASC;  break;
  45. }
  46. break;
  47.   case S_HZ:
  48. switch (c) {
  49.   case '~': state[inst] = S_HZT;
  50. #ifdef NOQUOTE
  51.                                 c = ' ';
  52. #endif
  53.         break;
  54.   case ' ': state[inst] = S_HZA;   break;
  55.   case 'b': state[inst] = S_HZ2;   break;
  56.   default: if (hzb(c)) {
  57. c |= 0x80;  state[inst] = S_HZ2;
  58. } else  state[inst] = S_ASC;
  59. break;
  60. }
  61. break;
  62.   case S_HZA:
  63. state[inst] = S_HZ;
  64. break;
  65.   case S_HZ2:
  66. switch (c) {
  67.   case ' ':
  68.   case 'b': state[inst] = S_HZ;   break;
  69.   default: if (hzb(c)) {
  70. c |= 0x80;  state[inst] = S_HZ;
  71. } else  state[inst] = S_ASC;
  72. break;
  73. }
  74. break;
  75.   case S_HZT:
  76. switch (c) {
  77.   case '}': state[inst] = S_ASC;
  78. #ifdef NOQUOTE
  79.                                 c = ' ';
  80. #endif
  81.         break;
  82.   default: state[inst] = S_HZ;   break;
  83. }
  84. break;
  85.   case S_PZW:
  86. switch (c) {
  87.   case 'W': state[inst] = S_ZW;   break;
  88.   default: state[inst] = S_ASC;  break;
  89. }
  90. break;
  91.   case S_ZW:
  92. switch (c) {
  93.   case ' ': state[inst] = S_ZWA;   break;
  94.   case 'n': state[inst] = S_ASC;   break;
  95.   case 'r': state[inst] = S_ASC;   break;
  96.   default: if (hzb(c)) {
  97. c |= 0x80;  state[inst] = S_ZW2;
  98. } else  state[inst] = S_ASC;
  99. break;
  100. }
  101. break;
  102.   case S_ZWA: state[inst] = S_ZW;  break;
  103.   case S_ZW2:
  104. switch (c) {
  105.   case ' ':
  106.   case 'b': state[inst] = S_ZW;   break;
  107.   default: if (hzb(c)) {
  108. c |= 0x80;  state[inst] = S_ZW;
  109. } else  state[inst] = S_ASC;
  110. break;
  111. }
  112. break;
  113. }
  114. return (c);
  115. }
  116. char *hz2gb (s,plen,inst)
  117.      char *s;
  118.      int *plen;
  119.      int inst;
  120. {
  121.   int i;
  122. for (i = 0; i < *plen; i++) {
  123. s[i] = hzdecode (s[i], inst);
  124. eoln[inst] = (s[i] == 'n' || s[i] == 'r') ? 1 : 0;
  125. }
  126. return (s);
  127. }
  128. char *gb2hz (s,plen,inst)
  129.      char *s;
  130.      int *plen;
  131.      int inst;
  132. {
  133.   register int i;
  134. for (i = 0; i < *plen; i++)
  135. s[i] &= 0x7f;
  136. return (s);
  137. }
  138. int hz2gb_init (arg)
  139.      char *arg;
  140. {
  141.   static hz2gb_inst = 0;
  142. eoln[hz2gb_inst] = 0;
  143. state[hz2gb_inst] = S_ASC;
  144. return (hz2gb_inst++);
  145. }
  146. int gb2hz_init (arg)
  147.      char *arg;
  148. {
  149. return (0);
  150. }