93 lines
2.6 KiB
C++
Executable File
93 lines
2.6 KiB
C++
Executable File
/*
|
|
* Pipe.h - NT TCHAR Pipe wrapper for MAXScript
|
|
*
|
|
* Copyright © John Wainwright 1996
|
|
*
|
|
*/
|
|
|
|
#ifndef _H_PIPE
|
|
#define _H_PIPE
|
|
|
|
#include "Strings.h"
|
|
class FileStream;
|
|
|
|
#define PIPE_BUF_SIZE 512
|
|
|
|
// The undelivered data in the pipe is held in a linked list of
|
|
// buffers, pointed into by read and write cursors.
|
|
// A side list is kept if writers supply info about sourcing files.
|
|
// This is provided to readers like the compiler to add source
|
|
// tags to generated code.
|
|
|
|
typedef struct src_info src_info;
|
|
struct src_info
|
|
{
|
|
src_info* next; // next marker
|
|
TCHAR* start; // source start character in buffer chain
|
|
Value* file; // sourcing file name if any
|
|
int offset; // starting offset into source
|
|
};
|
|
|
|
class Pipe : public CharStream
|
|
{
|
|
public:
|
|
TCHAR* write_buffer; // pipe buffers & cursors
|
|
TCHAR* write_cursor;
|
|
TCHAR* read_buffer;
|
|
TCHAR* read_cursor;
|
|
int ungetch_count;
|
|
|
|
CRITICAL_SECTION pipe_update; // for syncing pipe updates
|
|
HANDLE pipe_event; // for signalling data ready
|
|
HANDLE restart_event; // used to restart a stopped pipe
|
|
BOOL waiting; // reader is waiting for data
|
|
BOOL stopped; // pipe reading is blocked
|
|
|
|
FileStream* log; // log stream if non-NULL
|
|
|
|
Value* read_source_file; // sourcing file for reading if supplied by writer
|
|
int read_source_offset; // running reader offset in source
|
|
src_info* markers; // marker list...
|
|
src_info* marker_tail;
|
|
TCHAR* next_source_start; // upcoming marker starting character
|
|
Value* write_source_file; // current write source file, used to determine source change
|
|
int write_source_offset;// running writer offset
|
|
|
|
Pipe();
|
|
~Pipe();
|
|
|
|
# define is_pipe(o) ((o)->tag == INTERNAL_PIPE_TAG)
|
|
void collect() { delete this; }
|
|
void gc_trace();
|
|
|
|
TCHAR get_char();
|
|
void unget_char(TCHAR c);
|
|
TCHAR peek_char();
|
|
int at_eos();
|
|
int pos() { return read_source_offset; }
|
|
void rewind();
|
|
void flush_to_eol();
|
|
void flush_to_eobuf();
|
|
|
|
void put_char(TCHAR c, Value* source_file = NULL, int offset = 0);
|
|
void put_str(TCHAR* str, Value* source_file = NULL, int offset = 0);
|
|
void put_buf(TCHAR* str, size_t count, Value* source_file = NULL, int offset = 0);
|
|
void new_write_buffer();
|
|
void check_write_source_change(Value* file, int offset, int new_len);
|
|
void read_source_change();
|
|
void clear_source();
|
|
void stop();
|
|
void go();
|
|
|
|
TCHAR* puts(TCHAR* str);
|
|
int printf(const TCHAR *format, ...);
|
|
|
|
void log_to(FileStream* log);
|
|
void close_log();
|
|
CharStream* get_log() { return log; }
|
|
|
|
Value* get_file_name();
|
|
};
|
|
|
|
#endif
|