nam_stream.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
- /*
- * Copyright (c) 1998 University of Southern California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation, advertising
- * materials, and other materials related to such distribution and use
- * acknowledge that the software was developed by the University of
- * Southern California, Information Sciences Institute. The name of the
- * University may not be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
- #ifndef nam_stream_h
- #define nam_stream_h
- #include <stdio.h>
- #include <sys/types.h>
- #ifdef WIN32
- #include <windows.h>
- #include <io.h>
- #else
- #include <unistd.h>
- #endif
- #include "nam.h" // for die
- class NamStream : public TclObject {
- protected:
- int is_open_;
-
- public:
- NamStream() : is_open_(0) {};
- // NamStream(int fd) : is_open_(0) {};
- NamStream(const char *fn) : is_open_(0) {}
- virtual ~NamStream() { if (is_open_) close(); };
- int command(int argc, const char*const* argv);
- static NamStream *open(const char *fn);
- int is_ok() { return is_open_; }
- virtual int seekable() { return 1; }
- virtual char *gets(char *buf, int len) { return NULL; };
- virtual char get_char() { return EOF; }
- virtual char *rgets(char *buf, int len);
- virtual off_t seek(off_t offset, int whence) { return -1; };
- virtual off_t tell() { return -1; };
- virtual int close() { is_open_ = 0; return 0; }
- virtual int eof() { return 1; };
- virtual int read(char *buf, int size) { return 0; }
- };
- class NamStreamFile : public NamStream {
- FILE *file_;
- public:
- // NamStreamFile(int fd);
- NamStreamFile(const char *fn);
- virtual int seekable() { return 1; }
- virtual char *gets(char *buf, int len);
- virtual char get_char();
- virtual off_t seek(off_t offset, int whence);
- virtual off_t tell();
- virtual int close();
- virtual int eof();
- virtual int read(char *buf, int size);
- };
- #ifdef HAVE_ZLIB_H
- #include <zlib.h>
- class NamStreamCompressedFile : public NamStream {
- gzFile file_;
- public:
- NamStreamCompressedFile(const char *fn);
- virtual int seekable() { return 0; }
- virtual char *gets(char *buf, int len);
- virtual char get_char();
- virtual off_t seek(off_t offset, int whence);
- virtual off_t tell();
- virtual int close();
- virtual int eof();
- virtual int read(char *buf, int size);
- };
- #endif
- /*
- * Make front_ seem like a good, seekable file
- * when really it's a low-down pipe.
- * We do this by saving the output in back_.
- */
- class NamStreamPipe : public NamStream {
- protected:
- int front_; // file descriptor of the pipe
- FILE *back_; // temporary backup file
- off_t back_len_; // file size of the backup file
- char *pipename_; // the pipe name
- // double linked list of all NamStreamPipe instances
- NamStreamPipe *prev_;
- NamStreamPipe *next_;
- static NamStreamPipe *head_;
- static int instances_; // number of NamStreamPipe instances
- // timer to check pipe input periodically
- static Tcl_TimerToken timer_;
- static void timer_handler(ClientData data);
- static int read_pipe();
- void insure_backing(off_t lim);
- public:
- NamStreamPipe(const char *fn);
- ~NamStreamPipe();
- virtual int seekable() { return 0; }
- virtual char* gets(char *buf, int len);
- virtual char get_char();
- virtual off_t seek(off_t offset, int whence);
- virtual off_t tell();
- virtual int close();
- virtual int eof();
- virtual int read(char *buf, int size);
- /*
- * The Tcl command to open a pipe stream is:
- * set stream [new NamStream $tracefile]
- * that is, the instance construction command.
- * Since this command can be executed several times on the same
- * pipe, we need to make sure not to create duplicate instance.
- */
- static NamStreamPipe *open_pipe(const char *fn);
- };
- #endif /* nam_stream_h */