nam_stream.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1998 University of Southern California.
  3.  * All rights reserved.                                            
  4.  *                                                                
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation, advertising
  8.  * materials, and other materials related to such distribution and use
  9.  * acknowledge that the software was developed by the University of
  10.  * Southern California, Information Sciences Institute.  The name of the
  11.  * University may not be used to endorse or promote products derived from
  12.  * this software without specific prior written permission.
  13.  * 
  14.  * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  15.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  16.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  17.  *
  18.  */
  19. #ifndef nam_stream_h
  20. #define nam_stream_h
  21. #include <stdio.h>
  22. #include <sys/types.h>
  23. #ifdef WIN32
  24. #include <windows.h>
  25. #include <io.h>
  26. #else
  27. #include <unistd.h>
  28. #endif
  29. #include "nam.h"  // for die
  30. class NamStream : public TclObject {
  31.  protected:
  32. int is_open_;
  33.  public:
  34. NamStream() : is_open_(0) {};
  35. // NamStream(int fd) : is_open_(0) {};
  36. NamStream(const char *fn) : is_open_(0) {}
  37. virtual ~NamStream() { if (is_open_) close(); };
  38. int command(int argc, const char*const* argv);
  39. static NamStream *open(const char *fn);
  40. int is_ok() { return is_open_; }
  41. virtual int seekable() { return 1; }
  42. virtual char *gets(char *buf, int len) { return NULL; };
  43. virtual char get_char() { return EOF; }
  44. virtual char *rgets(char *buf, int len);
  45. virtual off_t seek(off_t offset, int whence) { return -1; };
  46. virtual off_t tell() { return -1; };
  47. virtual int close() { is_open_ = 0; return 0; }
  48. virtual int eof() { return 1; };
  49. virtual int read(char *buf, int size) { return 0; }
  50. };
  51. class NamStreamFile : public NamStream {
  52. FILE *file_;
  53.  public:
  54. // NamStreamFile(int fd);
  55. NamStreamFile(const char *fn);
  56. virtual int seekable() { return 1; }
  57. virtual char *gets(char *buf, int len);
  58. virtual char get_char();
  59. virtual off_t seek(off_t offset, int whence);
  60. virtual off_t tell();
  61. virtual int close();
  62. virtual int eof();
  63. virtual int read(char *buf, int size);
  64. };
  65. #ifdef HAVE_ZLIB_H
  66. #include <zlib.h>
  67. class NamStreamCompressedFile : public NamStream {
  68. gzFile file_;
  69.  public:
  70. NamStreamCompressedFile(const char *fn);
  71. virtual int seekable() { return 0; }
  72. virtual char *gets(char *buf, int len);
  73. virtual char get_char();
  74. virtual off_t seek(off_t offset, int whence);
  75. virtual off_t tell();
  76. virtual int close();
  77. virtual int eof();
  78. virtual int read(char *buf, int size);
  79. };
  80. #endif
  81. /*
  82.  * Make front_ seem like a good, seekable file
  83.  * when really it's a low-down pipe.
  84.  * We do this by saving the output in back_.
  85.  */
  86. class NamStreamPipe : public NamStream {
  87.  protected:
  88. int    front_; // file descriptor of the pipe
  89. FILE  *back_; // temporary backup file
  90. off_t  back_len_; // file size of the backup file
  91. char  *pipename_; // the pipe name
  92. // double linked list of all NamStreamPipe instances
  93. NamStreamPipe *prev_;
  94. NamStreamPipe *next_;
  95. static NamStreamPipe *head_;
  96. static int instances_; // number of NamStreamPipe instances
  97. // timer to check pipe input periodically
  98. static Tcl_TimerToken timer_;
  99. static void timer_handler(ClientData data);
  100. static int  read_pipe();
  101. void insure_backing(off_t lim);
  102.  public:
  103. NamStreamPipe(const char *fn);
  104. ~NamStreamPipe();
  105. virtual int seekable() { return 0; }
  106. virtual char* gets(char *buf, int len);
  107. virtual char  get_char();
  108. virtual off_t seek(off_t offset, int whence);
  109. virtual off_t tell();
  110. virtual int   close();
  111. virtual int   eof();
  112. virtual int   read(char *buf, int size);
  113. /*
  114.  * The Tcl command to open a pipe stream is:
  115.  *     set stream [new NamStream $tracefile]
  116.  * that is, the instance construction command.
  117.  * Since this command can be executed several times on the same
  118.  * pipe, we need to make sure not to create duplicate instance.
  119.  */
  120.  static NamStreamPipe *open_pipe(const char *fn);
  121. };
  122. #endif /* nam_stream_h */