*** empty log message ***
This commit is contained in:
parent
fbfceeda5f
commit
6a969fbdd8
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.c,v 1.55 2006-06-20 15:27:50 bacon Exp $
|
* $Id: awk.c,v 1.56 2006-06-22 04:25:44 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -160,18 +160,18 @@ void xp_awk_setrunopt (xp_awk_t* awk, int opt)
|
|||||||
awk->opt.run = opt;
|
awk->opt.run = opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
int xp_awk_attsrc (xp_awk_t* awk, xp_awk_io_t src, void* arg)
|
int xp_awk_attsrc (xp_awk_t* awk, xp_awk_io_t handler, void* arg)
|
||||||
{
|
{
|
||||||
if (xp_awk_detsrc(awk) == -1) return -1;
|
if (xp_awk_detsrc(awk) == -1) return -1;
|
||||||
|
|
||||||
xp_assert (awk->srcio == XP_NULL);
|
xp_assert (awk->srcio == XP_NULL);
|
||||||
if (src(XP_AWK_INPUT_OPEN, arg, XP_NULL, 0) == -1)
|
if (handler (XP_AWK_IO_OPEN, 0, arg, XP_NULL, 0) == -1)
|
||||||
{
|
{
|
||||||
awk->errnum = XP_AWK_ESRCINOPEN;
|
awk->errnum = XP_AWK_ESRCINOPEN;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
awk->srcio = src;
|
awk->srcio = handler;
|
||||||
awk->srcio_arg = arg;
|
awk->srcio_arg = arg;
|
||||||
awk->lex.curc = XP_CHAR_EOF;
|
awk->lex.curc = XP_CHAR_EOF;
|
||||||
awk->lex.ungotc_count = 0;
|
awk->lex.ungotc_count = 0;
|
||||||
@ -188,7 +188,8 @@ int xp_awk_detsrc (xp_awk_t* awk)
|
|||||||
{
|
{
|
||||||
xp_ssize_t n;
|
xp_ssize_t n;
|
||||||
|
|
||||||
n = awk->srcio (XP_AWK_INPUT_CLOSE, awk->srcio_arg, XP_NULL, 0);
|
n = awk->srcio (
|
||||||
|
XP_AWK_IO_CLOSE, 0, awk->srcio_arg, XP_NULL, 0);
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
{
|
{
|
||||||
awk->errnum = XP_AWK_ESRCINCLOSE;
|
awk->errnum = XP_AWK_ESRCINCLOSE;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.h,v 1.70 2006-06-21 15:37:51 bacon Exp $
|
* $Id: awk.h,v 1.71 2006-06-22 04:25:44 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_AWK_H_
|
#ifndef _XP_AWK_AWK_H_
|
||||||
@ -9,12 +9,11 @@
|
|||||||
#include <xp/macros.h>
|
#include <xp/macros.h>
|
||||||
|
|
||||||
typedef struct xp_awk_t xp_awk_t;
|
typedef struct xp_awk_t xp_awk_t;
|
||||||
|
typedef struct xp_awk_val_t xp_awk_val_t;
|
||||||
|
typedef struct xp_awk_extio_t xp_awk_extio_t;
|
||||||
|
|
||||||
typedef xp_ssize_t (*xp_awk_io_t) (
|
typedef xp_ssize_t (*xp_awk_io_t) (
|
||||||
int cmd, void* arg, xp_char_t* data, xp_size_t count);
|
int cmd, int opt, void* arg, xp_char_t* data, xp_size_t count);
|
||||||
|
|
||||||
typedef struct xp_awk_extio_t xp_awk_extio_t;
|
|
||||||
typedef struct xp_awk_val_t xp_awk_val_t;
|
|
||||||
|
|
||||||
struct xp_awk_extio_t
|
struct xp_awk_extio_t
|
||||||
{
|
{
|
||||||
@ -27,15 +26,21 @@ struct xp_awk_extio_t
|
|||||||
/* io function commands */
|
/* io function commands */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
XP_AWK_INPUT_OPEN = 0,
|
XP_AWK_IO_OPEN = 0,
|
||||||
XP_AWK_INPUT_CLOSE = 1,
|
XP_AWK_IO_CLOSE = 1,
|
||||||
XP_AWK_INPUT_NEXT = 2,
|
XP_AWK_IO_READ = 2,
|
||||||
XP_AWK_INPUT_DATA = 3,
|
XP_AWK_IO_WRITE = 3,
|
||||||
|
XP_AWK_IO_NEXT = 4
|
||||||
|
};
|
||||||
|
|
||||||
XP_AWK_OUTPUT_OPEN = 4,
|
enum
|
||||||
XP_AWK_OUTPUT_CLOSE = 5,
|
{
|
||||||
XP_AWK_OUTPUT_NEXT = 6,
|
XP_AWK_IO_FILE_READ = 0,
|
||||||
XP_AWK_OUTPUT_DATA = 7
|
XP_AWK_IO_FILE_WRITE = 1,
|
||||||
|
XP_AWK_IO_FILE_APPEND = 2,
|
||||||
|
|
||||||
|
XP_AWK_IO_PIPE_READ = 0,
|
||||||
|
XP_AWK_IO_PIPE_WRITE = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
/* parse options */
|
/* parse options */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: extio.c,v 1.7 2006-06-21 15:37:51 bacon Exp $
|
* $Id: extio.c,v 1.8 2006-06-22 04:25:44 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -15,6 +15,7 @@ int xp_awk_readextio (
|
|||||||
{
|
{
|
||||||
xp_awk_extio_t* p = run->extio;
|
xp_awk_extio_t* p = run->extio;
|
||||||
xp_awk_io_t handler = run->awk->extio[type];
|
xp_awk_io_t handler = run->awk->extio[type];
|
||||||
|
int ioopt;
|
||||||
|
|
||||||
if (handler == XP_NULL)
|
if (handler == XP_NULL)
|
||||||
{
|
{
|
||||||
@ -51,7 +52,13 @@ int xp_awk_readextio (
|
|||||||
p->handle = XP_NULL;
|
p->handle = XP_NULL;
|
||||||
p->next = XP_NULL;
|
p->next = XP_NULL;
|
||||||
|
|
||||||
if (handler (XP_AWK_INPUT_OPEN, p, XP_NULL, 0) == -1)
|
if (type == XP_AWK_EXTIO_PIPE)
|
||||||
|
ioopt = XP_AWK_IO_PIPE_READ;
|
||||||
|
else if (type == XP_AWK_EXTIO_FILE)
|
||||||
|
ioopt = XP_AWK_IO_FILE_READ;
|
||||||
|
else ioopt = 0; /* TODO: how to handle this??? */
|
||||||
|
|
||||||
|
if (handler (XP_AWK_IO_OPEN, ioopt, p, XP_NULL, 0) == -1)
|
||||||
{
|
{
|
||||||
xp_free (p->name);
|
xp_free (p->name);
|
||||||
xp_free (p);
|
xp_free (p);
|
||||||
@ -81,7 +88,7 @@ int xp_awk_readextio (
|
|||||||
{
|
{
|
||||||
xp_char_t buf[1024];
|
xp_char_t buf[1024];
|
||||||
|
|
||||||
if (handler (XP_AWK_INPUT_DATA, p, buf, xp_countof(buf)) == 0)
|
if (handler (XP_AWK_IO_READ, 0, p, buf, xp_countof(buf)) == 0)
|
||||||
{
|
{
|
||||||
/* no more data. end of data stream */
|
/* no more data. end of data stream */
|
||||||
return 0;
|
return 0;
|
||||||
@ -107,9 +114,9 @@ int xp_awk_closeextio (xp_awk_run_t* run, const xp_char_t* name, int* errnum)
|
|||||||
|
|
||||||
if (handler != NULL)
|
if (handler != NULL)
|
||||||
{
|
{
|
||||||
/* TODO: io command should not be XP_AWK_INPUT_CLOSE
|
/* TODO: io command should not be XP_AWK_IO_CLOSE
|
||||||
* it should be more generic form than this... */
|
* it should be more generic form than this... */
|
||||||
if (handler (XP_AWK_INPUT_CLOSE, p, XP_NULL, 0) == -1)
|
if (handler (XP_AWK_IO_CLOSE, 0, p, XP_NULL, 0) == -1)
|
||||||
{
|
{
|
||||||
/* this is not a run-time error.*/
|
/* this is not a run-time error.*/
|
||||||
*errnum = XP_AWK_ENOERR;
|
*errnum = XP_AWK_ENOERR;
|
||||||
@ -149,7 +156,7 @@ void xp_awk_clearextio (xp_awk_run_t* run)
|
|||||||
{
|
{
|
||||||
/* TODO: io command should not be XP_AWK_INPUT_CLOSE
|
/* TODO: io command should not be XP_AWK_INPUT_CLOSE
|
||||||
* it should be more generic form than this... */
|
* it should be more generic form than this... */
|
||||||
n = handler (XP_AWK_INPUT_CLOSE, run->extio, XP_NULL, 0);
|
n = handler (XP_AWK_IO_CLOSE, 0, run->extio, XP_NULL, 0);
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
{
|
{
|
||||||
/* TODO:
|
/* TODO:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: parse.c,v 1.119 2006-06-21 15:37:51 bacon Exp $
|
* $Id: parse.c,v 1.120 2006-06-22 04:25:44 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -3443,7 +3443,7 @@ static int __get_char (xp_awk_t* awk)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
n = awk->srcio (XP_AWK_INPUT_DATA, awk->srcio_arg, &c, 1);
|
n = awk->srcio (XP_AWK_IO_READ, awk->srcio_arg, &c, 1);
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
{
|
{
|
||||||
awk->errnum = XP_AWK_ESRCINDATA;
|
awk->errnum = XP_AWK_ESRCINDATA;
|
||||||
@ -3453,7 +3453,7 @@ static int __get_char (xp_awk_t* awk)
|
|||||||
*/
|
*/
|
||||||
if (awk->lex.buf_pos >= awk->lex.buf_len)
|
if (awk->lex.buf_pos >= awk->lex.buf_len)
|
||||||
{
|
{
|
||||||
n = awk->srcio (XP_AWK_INPUT_DATA,
|
n = awk->srcio (XP_AWK_IO_READ, 0,
|
||||||
awk->srcio_arg, awk->lex.buf, xp_countof(awk->lex.buf));
|
awk->srcio_arg, awk->lex.buf, xp_countof(awk->lex.buf));
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.104 2006-06-21 15:37:51 bacon Exp $
|
* $Id: run.c,v 1.105 2006-06-22 04:25:44 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -481,7 +481,7 @@ static int __run_pattern_blocks (xp_awk_run_t* run)
|
|||||||
|
|
||||||
xp_assert (run->txtio != XP_NULL);
|
xp_assert (run->txtio != XP_NULL);
|
||||||
|
|
||||||
n = run->txtio (XP_AWK_INPUT_OPEN, run->txtio_arg, XP_NULL, 0);
|
n = run->txtio (XP_AWK_IO_OPEN, 0, run->txtio_arg, XP_NULL, 0);
|
||||||
if (n == -1) PANIC_I (run, XP_AWK_ETXTINOPEN);
|
if (n == -1) PANIC_I (run, XP_AWK_ETXTINOPEN);
|
||||||
|
|
||||||
run->input.buf_pos = 0;
|
run->input.buf_pos = 0;
|
||||||
@ -499,7 +499,7 @@ static int __run_pattern_blocks (xp_awk_run_t* run)
|
|||||||
if (x == -1)
|
if (x == -1)
|
||||||
{
|
{
|
||||||
/* don't care about the result of input close */
|
/* don't care about the result of input close */
|
||||||
run->txtio (XP_AWK_INPUT_CLOSE,
|
run->txtio (XP_AWK_IO_CLOSE, 0,
|
||||||
run->txtio_arg, XP_NULL, 0);
|
run->txtio_arg, XP_NULL, 0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -515,13 +515,13 @@ xp_printf (XP_T("**** line [%s]\n"), XP_STR_BUF(&run->input.line));
|
|||||||
if (__run_pattern_block_chain (run, run->awk->tree.chain) == -1)
|
if (__run_pattern_block_chain (run, run->awk->tree.chain) == -1)
|
||||||
{
|
{
|
||||||
/* don't care about the result of input close */
|
/* don't care about the result of input close */
|
||||||
run->txtio (XP_AWK_INPUT_CLOSE,
|
run->txtio (XP_AWK_IO_CLOSE, 0,
|
||||||
run->txtio_arg, XP_NULL, 0);
|
run->txtio_arg, XP_NULL, 0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
n = run->txtio (XP_AWK_INPUT_CLOSE, run->txtio_arg, XP_NULL, 0);
|
n = run->txtio (XP_AWK_IO_CLOSE, 0, run->txtio_arg, XP_NULL, 0);
|
||||||
if (n == -1) PANIC_I (run, XP_AWK_ETXTINCLOSE);
|
if (n == -1) PANIC_I (run, XP_AWK_ETXTINCLOSE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1070,7 +1070,9 @@ xp_printf (XP_T("**** next NOT IMPLEMENTED...\n"));
|
|||||||
static int __run_nextfile_statement (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde)
|
static int __run_nextfile_statement (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde)
|
||||||
{
|
{
|
||||||
xp_ssize_t n;
|
xp_ssize_t n;
|
||||||
n = run->txtio (XP_AWK_INPUT_NEXT, run->txtio_arg, XP_NULL, 0);
|
|
||||||
|
/* TODO: how to pass opt properly for IO_NEXT??? -> READ? WRITE? */
|
||||||
|
n = run->txtio (XP_AWK_IO_NEXT, 0, run->txtio_arg, XP_NULL, 0);
|
||||||
if (n == -1) PANIC_I (run, XP_AWK_ETXTINNEXT);
|
if (n == -1) PANIC_I (run, XP_AWK_ETXTINNEXT);
|
||||||
return (n == -1)? -1: 0;
|
return (n == -1)? -1: 0;
|
||||||
}
|
}
|
||||||
@ -3048,7 +3050,7 @@ static int __read_text_input (xp_awk_run_t* run)
|
|||||||
{
|
{
|
||||||
if (run->input.buf_pos >= run->input.buf_len)
|
if (run->input.buf_pos >= run->input.buf_len)
|
||||||
{
|
{
|
||||||
n = run->txtio (XP_AWK_INPUT_DATA, run->txtio_arg,
|
n = run->txtio (XP_AWK_IO_READ, 0, run->txtio_arg,
|
||||||
run->input.buf, xp_countof(run->input.buf));
|
run->input.buf, xp_countof(run->input.buf));
|
||||||
if (n == -1) PANIC_I (run, XP_AWK_ETXTINDATA);
|
if (n == -1) PANIC_I (run, XP_AWK_ETXTINDATA);
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.c,v 1.40 2006-06-21 13:52:15 bacon Exp $
|
* $Id: awk.c,v 1.41 2006-06-22 04:25:44 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk.h>
|
#include <xp/awk/awk.h>
|
||||||
@ -37,20 +37,20 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static xp_ssize_t process_source (
|
static xp_ssize_t process_source (
|
||||||
int cmd, void* arg, xp_char_t* data, xp_size_t size)
|
int cmd, int opt, void* arg, xp_char_t* data, xp_size_t size)
|
||||||
{
|
{
|
||||||
xp_char_t c;
|
xp_char_t c;
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case XP_AWK_INPUT_OPEN:
|
case XP_AWK_IO_OPEN:
|
||||||
case XP_AWK_INPUT_CLOSE:
|
case XP_AWK_IO_CLOSE:
|
||||||
case XP_AWK_INPUT_NEXT:
|
case XP_AWK_IO_NEXT:
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_INPUT_DATA:
|
case XP_AWK_IO_READ:
|
||||||
{
|
{
|
||||||
if (size <= 0) return -1;
|
if (size <= 0) return -1;
|
||||||
#ifdef XP_CHAR_IS_MCHAR
|
#ifdef XP_CHAR_IS_MCHAR
|
||||||
@ -63,18 +63,16 @@ static xp_ssize_t process_source (
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_OUTPUT_OPEN:
|
case XP_AWK_IO_WRITE:
|
||||||
case XP_AWK_OUTPUT_CLOSE:
|
|
||||||
case XP_AWK_OUTPUT_NEXT:
|
|
||||||
case XP_AWK_OUTPUT_DATA:
|
|
||||||
{
|
{
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct data_io
|
struct data_io
|
||||||
{
|
{
|
||||||
const char* input_file;
|
const char* input_file;
|
||||||
@ -82,34 +80,28 @@ struct data_io
|
|||||||
};
|
};
|
||||||
|
|
||||||
static xp_ssize_t process_data (
|
static xp_ssize_t process_data (
|
||||||
int cmd, void* arg, xp_char_t* data, xp_size_t size)
|
int cmd, int opt, void* arg, xp_char_t* data, xp_size_t size)
|
||||||
{
|
{
|
||||||
struct data_io* io = (struct data_io*)arg;
|
struct data_io* io = (struct data_io*)arg;
|
||||||
xp_char_t c;
|
xp_char_t c;
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case XP_AWK_INPUT_OPEN:
|
case XP_AWK_IO_OPEN:
|
||||||
{
|
{
|
||||||
io->input_handle = fopen (io->input_file, "r");
|
io->input_handle = fopen (io->input_file, "r");
|
||||||
if (io->input_handle == NULL) return -1;
|
if (io->input_handle == NULL) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_INPUT_CLOSE:
|
case XP_AWK_IO_CLOSE:
|
||||||
{
|
{
|
||||||
fclose (io->input_handle);
|
fclose (io->input_handle);
|
||||||
io->input_handle = NULL;
|
io->input_handle = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_INPUT_NEXT:
|
case XP_AWK_IO_READ:
|
||||||
{
|
|
||||||
/* input switching not supported for the time being... */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
case XP_AWK_INPUT_DATA:
|
|
||||||
{
|
{
|
||||||
if (size <= 0) return -1;
|
if (size <= 0) return -1;
|
||||||
#ifdef XP_CHAR_IS_MCHAR
|
#ifdef XP_CHAR_IS_MCHAR
|
||||||
@ -122,10 +114,71 @@ static xp_ssize_t process_data (
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_OUTPUT_OPEN:
|
case XP_AWK_IO_WRITE:
|
||||||
case XP_AWK_OUTPUT_CLOSE:
|
{
|
||||||
case XP_AWK_OUTPUT_NEXT:
|
return -1;
|
||||||
case XP_AWK_OUTPUT_DATA:
|
}
|
||||||
|
|
||||||
|
case XP_AWK_IO_NEXT:
|
||||||
|
{
|
||||||
|
/* input switching not supported for the time being... */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static xp_ssize_t process_extio_pipe (
|
||||||
|
int cmd, int opt, void* arg, xp_char_t* data, xp_size_t size)
|
||||||
|
{
|
||||||
|
xp_awk_extio_t* epa = (xp_awk_extio_t*)arg;
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case XP_AWK_IO_OPEN:
|
||||||
|
{
|
||||||
|
FILE* handle;
|
||||||
|
const xp_char_t* mode;
|
||||||
|
|
||||||
|
if (opt == XP_AWK_IO_PIPE_READ)
|
||||||
|
mode = XP_T("r");
|
||||||
|
else if (opt == XP_AWK_IO_PIPE_WRITE)
|
||||||
|
mode = XP_T("w");
|
||||||
|
else return -1; /* TODO: any way to set the error number? */
|
||||||
|
handle = _tpopen (epa->name, mode);
|
||||||
|
if (handle == NULL) return -1;
|
||||||
|
epa->handle = (void*)handle;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case XP_AWK_IO_CLOSE:
|
||||||
|
{
|
||||||
|
xp_printf (XP_TEXT("closing %s of type %d\n"), epa->name, epa->type);
|
||||||
|
fclose ((FILE*)epa->handle);
|
||||||
|
epa->handle = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case XP_AWK_IO_READ:
|
||||||
|
{
|
||||||
|
if (_fgetts (data, size, (FILE*)epa->handle) == XP_NULL)
|
||||||
|
return 0;
|
||||||
|
return xp_strlen(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
case XP_AWK_IO_WRITE:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if (_fputts (data, size, (FILE*)epa->handle) == XP_NULL)
|
||||||
|
return 0;
|
||||||
|
return size;
|
||||||
|
*/
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
case XP_AWK_IO_NEXT:
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -134,74 +187,33 @@ static xp_ssize_t process_data (
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_ssize_t process_extio_pipe (
|
|
||||||
int cmd, void* arg, xp_char_t* data, xp_size_t size)
|
|
||||||
{
|
|
||||||
xp_awk_extio_t* epa = (xp_awk_extio_t*)arg;
|
|
||||||
|
|
||||||
switch (cmd)
|
|
||||||
{
|
|
||||||
case XP_AWK_INPUT_OPEN:
|
|
||||||
{
|
|
||||||
FILE* handle;
|
|
||||||
handle = _tpopen (epa->name, XP_T("r"));
|
|
||||||
if (handle == NULL) return -1;
|
|
||||||
epa->handle = (void*)handle;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case XP_AWK_INPUT_CLOSE:
|
|
||||||
{
|
|
||||||
xp_printf (XP_TEXT("closing %s of type %d\n"), epa->name, epa->type);
|
|
||||||
fclose ((FILE*)epa->handle);
|
|
||||||
epa->handle = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case XP_AWK_INPUT_DATA:
|
|
||||||
{
|
|
||||||
if (_fgetts (data, size, epa->handle) == XP_NULL)
|
|
||||||
return 0;
|
|
||||||
return xp_strlen(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
case XP_AWK_INPUT_NEXT:
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
case XP_AWK_OUTPUT_OPEN:
|
|
||||||
case XP_AWK_OUTPUT_CLOSE:
|
|
||||||
case XP_AWK_OUTPUT_DATA:
|
|
||||||
case XP_AWK_OUTPUT_NEXT:
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static xp_ssize_t process_extio_file (
|
static xp_ssize_t process_extio_file (
|
||||||
int cmd, void* arg, xp_char_t* data, xp_size_t size)
|
int cmd, int opt, void* arg, xp_char_t* data, xp_size_t size)
|
||||||
{
|
{
|
||||||
xp_awk_extio_t* epa = (xp_awk_extio_t*)arg;
|
xp_awk_extio_t* epa = (xp_awk_extio_t*)arg;
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case XP_AWK_INPUT_OPEN:
|
case XP_AWK_IO_OPEN:
|
||||||
{
|
{
|
||||||
FILE* handle;
|
FILE* handle;
|
||||||
handle = _tfopen (epa->name, XP_T("r"));
|
const xp_char_t* mode;
|
||||||
|
|
||||||
|
if (opt == XP_AWK_IO_FILE_READ)
|
||||||
|
mode = XP_T("r");
|
||||||
|
else if (opt == XP_AWK_IO_FILE_WRITE)
|
||||||
|
mode = XP_T("w");
|
||||||
|
else if (opt == XP_AWK_IO_FILE_APPEND)
|
||||||
|
mode = XP_T("a");
|
||||||
|
else return -1; /* TODO: any way to set the error number? */
|
||||||
|
|
||||||
|
handle = _tfopen (epa->name, mode);
|
||||||
if (handle == NULL) return -1;
|
if (handle == NULL) return -1;
|
||||||
epa->handle = (void*)handle;
|
epa->handle = (void*)handle;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_INPUT_CLOSE:
|
case XP_AWK_IO_CLOSE:
|
||||||
{
|
{
|
||||||
xp_printf (XP_TEXT("closing %s of type %d\n"), epa->name, epa->type);
|
xp_printf (XP_TEXT("closing %s of type %d\n"), epa->name, epa->type);
|
||||||
fclose ((FILE*)epa->handle);
|
fclose ((FILE*)epa->handle);
|
||||||
@ -209,32 +221,31 @@ xp_printf (XP_TEXT("closing %s of type %d\n"), epa->name, epa->type);
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_INPUT_DATA:
|
case XP_AWK_IO_READ:
|
||||||
{
|
{
|
||||||
if (_fgetts (data, size, epa->handle) == XP_NULL)
|
if (_fgetts (data, size, (FILE*)epa->handle) == XP_NULL)
|
||||||
return 0;
|
return 0;
|
||||||
return xp_strlen(data);
|
return xp_strlen(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_INPUT_NEXT:
|
case XP_AWK_IO_WRITE:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if (_fputts (data, size, (FILE*)epa->handle) == XP_NULL)
|
||||||
|
return 0;
|
||||||
|
return size;
|
||||||
|
*/
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
case XP_AWK_IO_NEXT:
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XP_AWK_OUTPUT_OPEN:
|
|
||||||
case XP_AWK_OUTPUT_CLOSE:
|
|
||||||
case XP_AWK_OUTPUT_DATA:
|
|
||||||
case XP_AWK_OUTPUT_NEXT:
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user