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

Telnet服务器

开发平台:

Unix_Linux

  1. /* $Id: io.c,v 1.1 2000/01/15 01:45:37 edwardc Exp $ */
  2. /* Copyright 1992 Yongguang Zhang */
  3. #ifndef lint
  4. static char *rcs_id="$Id: io.c,v 1.1 2000/01/15 01:45:37 edwardc Exp $";
  5. #endif /* lint */
  6. #include "config.h"
  7. #include "io.h"
  8. static char *dummy(s) char *s; { return (s); }
  9. static int dummy_init() { return (0); }
  10. /* all implemented modules for io streams are listed here */
  11. struct mod_def {
  12. char *name;
  13. char *(*func)(); /* conversion function */
  14. int (*f_init)(); /* initialization function */
  15. int needarg; /* need arguments? */
  16. } moduleTable[] = {
  17.   { "gb2hz", gb2hz, gb2hz_init, 0, },
  18.   { "hz2gb", hz2gb, hz2gb_init, 0, },
  19.   { "gb2big", gb2big, gb2big_init, 0, },
  20.   { "big2gb", big2gb, big2gb_init, 0, },
  21.   { "log", io_log, log_init, 1, },
  22.   { "dummy", dummy, dummy_init, 0, },
  23.   { "", dummy, dummy_init, 0, },
  24.   { NULL, dummy, dummy_init, 0, }
  25. };
  26. /* input/output stream */
  27. struct io_stream {
  28. struct io_module {
  29. char *(*func)(); /* the conversion function */
  30. int inst; /* instant number for the function */
  31. } st[MAX_MODULE];
  32. int len; /* number of modules in the stream */
  33. } in_stream, out_stream;
  34. static int stream_init (str, pstream)
  35.      char *str;
  36.      struct io_stream *pstream;
  37. {
  38.   char *pstr = str;
  39.   char *name, *arg;
  40.   int more_module, has_arg;
  41.   struct mod_def *pmod;
  42.   int inst;
  43. pstream->len = 0;
  44. if ( (!pstr) || (! *pstr) || ((*pstr == '-') && (*(pstr+1) == '')) )
  45. return (0);
  46. do {
  47. /*
  48.  * A stream definition string looks like:
  49.  *    <stream>  ::=  <module> { ':' <module> }
  50.  *    <module>  ::=  <module_name> [ '(' <arguments> ')' ]
  51.  */
  52. name = pstr;
  53. for (; (*pstr && (*pstr != ':')); pstr++)
  54. /* empty */ ;
  55. more_module = (*pstr == ':') ? 1 : 0; /* more modules? */
  56. *pstr++ = ''; /* null-terminate the module */
  57. for (arg = name; (*arg) && (*arg != '('); arg++)
  58. /* empty */ ;
  59. has_arg = ((*arg == '(') ? 1 : 0); /* has arguments? */
  60. *arg++ = ''; /* null-terminate the module_name */
  61. /* search for the name in the module table */
  62. for (pmod = moduleTable; pmod->name; pmod++)
  63. if (strcmp (name, pmod->name) == 0)
  64. break;
  65. if (! pmod->name) { /* not found */
  66. fprintf (stderr, "no such module "%s"n", name);
  67. return (-1);
  68. }
  69. if (pmod->needarg != has_arg) {
  70. fprintf (stderr, ""%s:%s" argument mismatchn",
  71.  name, arg);
  72. return (-1);
  73. }
  74. pstream->st[pstream->len].func = pmod->func;
  75. if (pmod->needarg) {
  76. /* remember that arg end with a ')' */
  77. arg[strlen(arg) - 1] = '';
  78. inst = (*pmod->f_init)(arg);
  79. } else
  80. inst = (*pmod->f_init)(NULL);
  81. if (inst < 0) {
  82. fprintf (stderr, "fail to initialize "%s"n", name);
  83. return (-1);
  84. }
  85. pstream->st[pstream->len].inst = inst;
  86. pstream->len++;
  87. } while (more_module);
  88. return (0);
  89. }
  90. int in_stream_setup (idef)
  91.      char *idef;
  92. {
  93.   char defstr[256];
  94. strcpy (defstr, (idef ? idef : ""));
  95. return (stream_init (defstr, &in_stream));
  96. }
  97. int out_stream_setup (odef)
  98.      char *odef;
  99. {
  100.   char defstr[256];
  101. strcpy (defstr, (odef ? odef : ""));
  102. return (stream_init (defstr, &out_stream));
  103. /*
  104.  * Conversion buffer.  One for both directions.  They are in different
  105.  * address space anyway.  Set the area to be at the middle of the buffer.
  106.  * Just play safe
  107.  */
  108. static char conv_buf[BUFSIZ*3];
  109. static char *buf = conv_buf + BUFSIZ;
  110. /* pty --> stdout, do out_stream */
  111. int stream_write (fd,s,len)
  112.      int fd;
  113.      char *s;
  114.      int len;
  115. {
  116.   int i;
  117.   char *p = buf; /* point to the buffer for conversion */
  118. bcopy (s, p, len); /* copy in */
  119. for (i = 0; i < out_stream.len; i++)
  120. p = (* out_stream.st[i].func)(p, &len, out_stream.st[i].inst);
  121. return ((len != 0) ? write (fd, p, len) : 0);
  122. }
  123. /* stdin --> pty, do in_stream */
  124. int stream_read (fd,s,len)
  125.      int fd;
  126.      char *s;
  127.      int len;
  128. {
  129.   int i, cc;
  130.   char *p = buf; /* point to the buffer for conversion */
  131. cc = read (fd, p, len);
  132. if (cc <= 0)
  133. return (-1);
  134. for (i = 0; i < in_stream.len; i++)
  135. p = (* in_stream.st[i].func)(p, &cc, in_stream.st[i].inst);
  136. if (cc != 0)
  137. bcopy (p, s, cc); /* copy out */
  138. return (cc);
  139. }
  140. char *hzconvert (s, plen, psaved, dbcvrt)
  141.      char *s;
  142.      int *plen;
  143.      char *psaved; /* unprocessed char buffer pointer */
  144.      void (*dbcvrt)(); /* 2-byte conversion func for a hanzi */
  145. {
  146.   char *p, *pend;
  147. if (*plen == 0)
  148. return (s);
  149.         if (*psaved) { /* previous buffered char */
  150.                 *(--s) = *psaved; /* put the unprocessed char down */
  151. (*plen) ++;
  152. *psaved = 0; /* clean this char buffer */
  153.         }
  154. p = s;  pend = s + (*plen); /* begin/end of the buffer string */
  155. while (p < pend) {
  156. if ((*p) & 0x80) /* hi-bit on: hanzi */
  157. if (p < pend-1)  /* not the last one */
  158. dbcvrt (p++);
  159. else { /* the end of string */
  160. *psaved = *p; /* save the unprocessed char */
  161. (*plen) --;
  162. break;
  163. }
  164. p++;
  165.         }
  166.         return (s);
  167. }