2017-04-17 06:17:10 -06:00

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