redefined runtime io handlers
This commit is contained in:
@ -58,15 +58,16 @@ public:
|
||||
|
||||
/** Represents an internal awk value */
|
||||
typedef qse_awk_val_t val_t;
|
||||
/** Represents the external I/O context */
|
||||
typedef qse_awk_eio_t eio_t;
|
||||
/** Represents the run-time context */
|
||||
typedef qse_awk_rtx_t run_t;
|
||||
/** Represents the underlying interpreter */
|
||||
|
||||
/** Represents a underlying interpreter */
|
||||
typedef qse_awk_t awk_t;
|
||||
/** Represents the underlying runtime context */
|
||||
|
||||
/** Represents a runtime context */
|
||||
typedef qse_awk_rtx_t rtx_t;
|
||||
|
||||
/** Represents an runtime I/O data */
|
||||
typedef qse_awk_riod_t riod_t;
|
||||
|
||||
enum ccls_type_t
|
||||
{
|
||||
CCLS_UPPER = QSE_CCLS_UPPER,
|
||||
@ -216,12 +217,12 @@ public:
|
||||
};
|
||||
|
||||
/**
|
||||
* EIO class
|
||||
* RIO class
|
||||
*/
|
||||
class EIO
|
||||
class RIO
|
||||
{
|
||||
protected:
|
||||
EIO (eio_t* eio);
|
||||
RIO (rtx_t* rtx, riod_t* riod);
|
||||
|
||||
public:
|
||||
const char_t* getName() const;
|
||||
@ -230,30 +231,31 @@ public:
|
||||
|
||||
operator Awk* () const;
|
||||
operator awk_t* () const;
|
||||
operator eio_t* () const;
|
||||
operator run_t* () const;
|
||||
operator riod_t* () const;
|
||||
operator rtx_t* () const;
|
||||
|
||||
protected:
|
||||
eio_t* eio;
|
||||
rtx_t* rtx;
|
||||
riod_t* riod;
|
||||
};
|
||||
|
||||
/**
|
||||
* Pipe
|
||||
*/
|
||||
class Pipe: public EIO
|
||||
class Pipe: public RIO
|
||||
{
|
||||
public:
|
||||
friend class Awk;
|
||||
|
||||
enum Mode
|
||||
{
|
||||
READ = QSE_AWK_EIO_PIPE_READ,
|
||||
WRITE = QSE_AWK_EIO_PIPE_WRITE,
|
||||
RW = QSE_AWK_EIO_PIPE_RW
|
||||
READ = QSE_AWK_RIO_PIPE_READ,
|
||||
WRITE = QSE_AWK_RIO_PIPE_WRITE,
|
||||
RW = QSE_AWK_RIO_PIPE_RW
|
||||
};
|
||||
|
||||
protected:
|
||||
Pipe (eio_t* eio);
|
||||
Pipe (rtx_t* rtx, riod_t* riod);
|
||||
|
||||
public:
|
||||
Mode getMode () const;
|
||||
@ -262,20 +264,20 @@ public:
|
||||
/**
|
||||
* File
|
||||
*/
|
||||
class File: public EIO
|
||||
class File: public RIO
|
||||
{
|
||||
public:
|
||||
friend class Awk;
|
||||
|
||||
enum Mode
|
||||
{
|
||||
READ = QSE_AWK_EIO_FILE_READ,
|
||||
WRITE = QSE_AWK_EIO_FILE_WRITE,
|
||||
APPEND = QSE_AWK_EIO_FILE_APPEND
|
||||
READ = QSE_AWK_RIO_FILE_READ,
|
||||
WRITE = QSE_AWK_RIO_FILE_WRITE,
|
||||
APPEND = QSE_AWK_RIO_FILE_APPEND
|
||||
};
|
||||
|
||||
protected:
|
||||
File (eio_t* eio);
|
||||
File (rtx_t* rtx, riod_t* riod);
|
||||
|
||||
public:
|
||||
Mode getMode () const;
|
||||
@ -284,19 +286,19 @@ public:
|
||||
/**
|
||||
* Console
|
||||
*/
|
||||
class Console: public EIO
|
||||
class Console: public RIO
|
||||
{
|
||||
public:
|
||||
friend class Awk;
|
||||
|
||||
enum Mode
|
||||
{
|
||||
READ = QSE_AWK_EIO_CONSOLE_READ,
|
||||
WRITE = QSE_AWK_EIO_CONSOLE_WRITE
|
||||
READ = QSE_AWK_RIO_CONSOLE_READ,
|
||||
WRITE = QSE_AWK_RIO_CONSOLE_WRITE
|
||||
};
|
||||
|
||||
protected:
|
||||
Console (eio_t* eio);
|
||||
Console (rtx_t* rtx, riod_t* riod);
|
||||
~Console ();
|
||||
|
||||
public:
|
||||
@ -441,7 +443,7 @@ public:
|
||||
ERR_FTBIG = QSE_AWK_EFTBIG,
|
||||
ERR_TBUSY = QSE_AWK_ETBUSY,
|
||||
ERR_ISDIR = QSE_AWK_EISDIR,
|
||||
ERR_IOERR = QSE_AWK_EIOERR,
|
||||
ERR_IOERR = QSE_AWK_RIOERR,
|
||||
ERR_OPEN = QSE_AWK_EOPEN,
|
||||
ERR_READ = QSE_AWK_EREAD,
|
||||
ERR_WRITE = QSE_AWK_EWRITE,
|
||||
@ -566,7 +568,7 @@ public:
|
||||
OPT_BXOR = QSE_AWK_BXOR,
|
||||
OPT_SHIFT = QSE_AWK_SHIFT,
|
||||
OPT_IDIV = QSE_AWK_IDIV,
|
||||
OPT_EIO = QSE_AWK_EIO,
|
||||
OPT_RIO = QSE_AWK_RIO,
|
||||
OPT_RWPIPE = QSE_AWK_RWPIPE,
|
||||
|
||||
/** Can terminate a statement with a new line */
|
||||
@ -618,12 +620,12 @@ public:
|
||||
friend class Return;
|
||||
|
||||
Run (Awk* awk);
|
||||
Run (Awk* awk, run_t* run);
|
||||
Run (Awk* awk, rtx_t* run);
|
||||
~Run ();
|
||||
|
||||
public:
|
||||
operator Awk* () const;
|
||||
operator run_t* () const;
|
||||
operator rtx_t* () const;
|
||||
|
||||
void stop () const;
|
||||
bool isStop () const;
|
||||
@ -742,7 +744,7 @@ public:
|
||||
|
||||
protected:
|
||||
Awk* awk;
|
||||
run_t* run;
|
||||
rtx_t* run;
|
||||
bool callbackFailed;
|
||||
void* data;
|
||||
};
|
||||
@ -1063,26 +1065,26 @@ protected:
|
||||
|
||||
// static glue members for various handlers
|
||||
static ssize_t sourceReader (
|
||||
int cmd, void* arg, char_t* data, size_t count);
|
||||
awk_t* awk, int cmd, char_t* data, size_t count);
|
||||
static ssize_t sourceWriter (
|
||||
int cmd, void* arg, char_t* data, size_t count);
|
||||
awk_t* awk, int cmd, char_t* data, size_t count);
|
||||
|
||||
static ssize_t pipeHandler (
|
||||
int cmd, void* arg, char_t* data, size_t count);
|
||||
rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count);
|
||||
static ssize_t fileHandler (
|
||||
int cmd, void* arg, char_t* data, size_t count);
|
||||
rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count);
|
||||
static ssize_t consoleHandler (
|
||||
int cmd, void* arg, char_t* data, size_t count);
|
||||
rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count);
|
||||
|
||||
static int functionHandler (
|
||||
run_t* run, const char_t* name, size_t len);
|
||||
rtx_t* rtx, const char_t* name, size_t len);
|
||||
static void freeFunctionMapValue (map_t* map, void* dptr, size_t dlen);
|
||||
|
||||
static int onRunStart (run_t* run, void* data);
|
||||
static void onRunEnd (run_t* run, int errnum, void* data);
|
||||
static int onRunEnter (run_t* run, void* data);
|
||||
static void onRunExit (run_t* run, val_t* ret, void* data);
|
||||
static void onRunStatement (run_t* run, size_t line, void* data);
|
||||
static int onRunStart (rtx_t* run, void* data);
|
||||
static void onRunEnd (rtx_t* run, int errnum, void* data);
|
||||
static int onRunEnter (rtx_t* run, void* data);
|
||||
static void onRunExit (rtx_t* run, val_t* ret, void* data);
|
||||
static void onRunStatement (rtx_t* run, size_t line, void* data);
|
||||
|
||||
static void* allocMem (void* data, size_t n);
|
||||
static void* reallocMem (void* data, void* ptr, size_t n);
|
||||
|
@ -50,11 +50,13 @@ typedef struct qse_awk_rtx_t qse_awk_rtx_t; /* (R)untime con(T)e(X)t */
|
||||
/******/
|
||||
|
||||
typedef struct qse_awk_val_t qse_awk_val_t;
|
||||
typedef struct qse_awk_eio_t qse_awk_eio_t; /* (E)xternal (IO) */
|
||||
|
||||
typedef struct qse_awk_prm_t qse_awk_prm_t;
|
||||
typedef struct qse_awk_sio_t qse_awk_sio_t;
|
||||
|
||||
typedef struct qse_awk_rio_t qse_awk_rio_t;
|
||||
typedef struct qse_awk_riod_t qse_awk_riod_t;
|
||||
|
||||
typedef struct qse_awk_rcb_t qse_awk_rcb_t;
|
||||
typedef struct qse_awk_rexfns_t qse_awk_rexfns_t;
|
||||
|
||||
@ -72,20 +74,43 @@ typedef int (*qse_awk_sprintf_t) (
|
||||
...
|
||||
);
|
||||
|
||||
typedef qse_ssize_t (*qse_awk_io_t) (
|
||||
int cmd,
|
||||
void* arg,
|
||||
qse_char_t* data,
|
||||
qse_size_t count
|
||||
/****t* AWK/qse_awk_siof_t
|
||||
* NAME
|
||||
* qse_awk_siof_t - define a source IO function
|
||||
* SYNOPSIS
|
||||
*/
|
||||
typedef qse_ssize_t (*qse_awk_siof_t) (
|
||||
qse_awk_t* awk,
|
||||
int cmd,
|
||||
qse_char_t* data,
|
||||
qse_size_t count
|
||||
);
|
||||
/*****/
|
||||
|
||||
struct qse_awk_eio_t
|
||||
/****f* AWK/qse_awk_riof_t
|
||||
* NAME
|
||||
* qse_awk_riof_t - define a runtime IO function
|
||||
* SYNOPSIS
|
||||
*/
|
||||
typedef qse_ssize_t (*qse_awk_riof_t) (
|
||||
qse_awk_rtx_t* rtx,
|
||||
int cmd,
|
||||
qse_awk_riod_t* riod,
|
||||
qse_char_t* data,
|
||||
qse_size_t count
|
||||
);
|
||||
/******/
|
||||
|
||||
/****f* AWK/qse_awk_riod_t
|
||||
* NAME
|
||||
* qse_awk_riod_f - define a data passed to a rio function
|
||||
* SYNOPSIS
|
||||
*/
|
||||
struct qse_awk_riod_t
|
||||
{
|
||||
qse_awk_rtx_t* rtx; /* [IN] */
|
||||
int type; /* [IN] console, file, pipe */
|
||||
int mode; /* [IN] read, write, etc */
|
||||
qse_char_t* name; /* [IN] */
|
||||
void* data; /* [IN] */
|
||||
void* handle; /* [OUT] */
|
||||
|
||||
/* input */
|
||||
@ -105,7 +130,7 @@ struct qse_awk_eio_t
|
||||
qse_bool_t eos;
|
||||
} out;
|
||||
|
||||
qse_awk_eio_t* next;
|
||||
qse_awk_riod_t* next;
|
||||
};
|
||||
|
||||
struct qse_awk_prm_t
|
||||
@ -116,17 +141,15 @@ struct qse_awk_prm_t
|
||||
|
||||
struct qse_awk_sio_t
|
||||
{
|
||||
qse_awk_io_t in;
|
||||
qse_awk_io_t out;
|
||||
void* data;
|
||||
qse_awk_siof_t in;
|
||||
qse_awk_siof_t out;
|
||||
};
|
||||
|
||||
struct qse_awk_rio_t
|
||||
{
|
||||
qse_awk_io_t pipe;
|
||||
qse_awk_io_t file;
|
||||
qse_awk_io_t console;
|
||||
void* data;
|
||||
qse_awk_riof_t pipe;
|
||||
qse_awk_riof_t file;
|
||||
qse_awk_riof_t console;
|
||||
};
|
||||
|
||||
struct qse_awk_rcb_t
|
||||
@ -206,9 +229,9 @@ enum qse_awk_option_t
|
||||
QSE_AWK_IDIV = (1 << 5),
|
||||
|
||||
/* support getline and print */
|
||||
QSE_AWK_EIO = (1 << 7),
|
||||
QSE_AWK_RIO = (1 << 7),
|
||||
|
||||
/* support dual direction pipe. QSE_AWK_EIO must be on */
|
||||
/* support dual direction pipe. QSE_AWK_RIO must be on */
|
||||
QSE_AWK_RWPIPE = (1 << 8),
|
||||
|
||||
/* can terminate a statement with a new line */
|
||||
@ -269,7 +292,7 @@ enum qse_awk_errnum_t
|
||||
QSE_AWK_EFTBIG, /* file or data too big */
|
||||
QSE_AWK_ETBUSY, /* system too busy */
|
||||
QSE_AWK_EISDIR, /* is a directory */
|
||||
QSE_AWK_EIOERR, /* i/o error */
|
||||
QSE_AWK_RIOERR, /* i/o error */
|
||||
|
||||
/* mostly parse errors */
|
||||
QSE_AWK_EOPEN, /* cannot open */
|
||||
@ -412,30 +435,30 @@ enum qse_awk_depth_t
|
||||
QSE_AWK_DEPTH_REX_MATCH = (1 << 5)
|
||||
};
|
||||
|
||||
/* eio types */
|
||||
enum qse_awk_eio_type_t
|
||||
/* rio types */
|
||||
enum qse_awk_rio_type_t
|
||||
{
|
||||
/* eio types available */
|
||||
QSE_AWK_EIO_PIPE,
|
||||
QSE_AWK_EIO_FILE,
|
||||
QSE_AWK_EIO_CONSOLE,
|
||||
/* rio types available */
|
||||
QSE_AWK_RIO_PIPE,
|
||||
QSE_AWK_RIO_FILE,
|
||||
QSE_AWK_RIO_CONSOLE,
|
||||
|
||||
/* reserved for internal use only */
|
||||
QSE_AWK_EIO_NUM
|
||||
QSE_AWK_RIO_NUM
|
||||
};
|
||||
|
||||
enum qse_awk_eio_mode_t
|
||||
enum qse_awk_rio_mode_t
|
||||
{
|
||||
QSE_AWK_EIO_PIPE_READ = 0,
|
||||
QSE_AWK_EIO_PIPE_WRITE = 1,
|
||||
QSE_AWK_EIO_PIPE_RW = 2,
|
||||
QSE_AWK_RIO_PIPE_READ = 0,
|
||||
QSE_AWK_RIO_PIPE_WRITE = 1,
|
||||
QSE_AWK_RIO_PIPE_RW = 2,
|
||||
|
||||
QSE_AWK_EIO_FILE_READ = 0,
|
||||
QSE_AWK_EIO_FILE_WRITE = 1,
|
||||
QSE_AWK_EIO_FILE_APPEND = 2,
|
||||
QSE_AWK_RIO_FILE_READ = 0,
|
||||
QSE_AWK_RIO_FILE_WRITE = 1,
|
||||
QSE_AWK_RIO_FILE_APPEND = 2,
|
||||
|
||||
QSE_AWK_EIO_CONSOLE_READ = 0,
|
||||
QSE_AWK_EIO_CONSOLE_WRITE = 1
|
||||
QSE_AWK_RIO_CONSOLE_READ = 0,
|
||||
QSE_AWK_RIO_CONSOLE_WRITE = 1
|
||||
};
|
||||
|
||||
enum qse_awk_gbl_id_t
|
||||
@ -637,7 +660,8 @@ extern qse_awk_val_t* qse_awk_val_one;
|
||||
*/
|
||||
qse_awk_t* qse_awk_open (
|
||||
qse_mmgr_t* mmgr /* a memory manager */,
|
||||
qse_size_t xtn /* the size of extension in bytes */
|
||||
qse_size_t xtn /* the size of extension in bytes */,
|
||||
qse_ccls_t* ccls
|
||||
);
|
||||
/******/
|
||||
|
||||
|
Reference in New Issue
Block a user