diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index a3b9c169..d0a1d4b6 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -162,6 +162,7 @@ static struct { QSE_T("shift"), QSE_AWK_SHIFT }, { QSE_T("idiv"), QSE_AWK_IDIV }, { QSE_T("extio"), QSE_AWK_EXTIO }, + { QSE_T("rwpipe"), QSE_AWK_RWPIPE }, { QSE_T("newline"), QSE_AWK_NEWLINE }, { QSE_T("baseone"), QSE_AWK_BASEONE }, { QSE_T("stripspaces"), QSE_AWK_STRIPSPACES }, @@ -524,6 +525,7 @@ static int awk_main (int argc, qse_char_t* argv[]) qse_awk_runarg_t runarg[128]; int deparse = 0; struct argout_t ao; + int ret = 0; qse_memset (&ao, 0, QSE_SIZEOF(ao)); @@ -552,8 +554,8 @@ static int awk_main (int argc, qse_char_t* argv[]) qse_awk_geterrmsg(awk) ); - qse_awk_close (awk); - return -1; + ret = -1; + goto oops; } #ifdef _WIN32 @@ -577,10 +579,11 @@ static int awk_main (int argc, qse_char_t* argv[]) qse_awk_geterrmsg(awk) ); - qse_awk_close (awk); - return -1; + ret = -1; + goto oops; } +oops: qse_awk_close (awk); if (ao.ist == QSE_AWK_PARSE_FILES && ao.isp != QSE_NULL) free (ao.isp); @@ -588,7 +591,7 @@ static int awk_main (int argc, qse_char_t* argv[]) if (ao.icf != QSE_NULL) free (ao.icf); if (ao.vm != QSE_NULL) qse_map_close (ao.vm); - return 0; + return ret; } int qse_main (int argc, qse_achar_t* argv[]) diff --git a/qse/include/qse/awk/Awk.hpp b/qse/include/qse/awk/Awk.hpp index 5ec25ce3..7edb543e 100644 --- a/qse/include/qse/awk/Awk.hpp +++ b/qse/include/qse/awk/Awk.hpp @@ -511,7 +511,6 @@ public: ERR_NEXTFEND = QSE_AWK_ENEXTFEND, ERR_PRINTFARG = QSE_AWK_EPRINTFARG, ERR_PREPST = QSE_AWK_EPREPST, - ERR_GLNCPS = QSE_AWK_EGLNCPS, ERR_DIVBY0 = QSE_AWK_EDIVBY0, ERR_OPERAND = QSE_AWK_EOPERAND, ERR_POSIDX = QSE_AWK_EPOSIDX, @@ -572,7 +571,7 @@ public: OPT_SHIFT = QSE_AWK_SHIFT, OPT_IDIV = QSE_AWK_IDIV, OPT_EXTIO = QSE_AWK_EXTIO, - OPT_COPROC = QSE_AWK_COPROC, + OPT_RWPIPE = QSE_AWK_RWPIPE, /** Can terminate a statement with a new line */ OPT_NEWLINE = QSE_AWK_NEWLINE, diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 2ea83e56..3644b619 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -180,8 +180,8 @@ enum qse_awk_option_t /* support getline and print */ QSE_AWK_EXTIO = (1 << 7), - /* support co-process - NOT IMPLEMENTED YET */ - QSE_AWK_COPROC = (1 << 8), + /* support dual direction pipe. QSE_AWK_EXTIO must be on */ + QSE_AWK_RWPIPE = (1 << 8), /* can terminate a statement with a new line */ QSE_AWK_NEWLINE = (1 << 9), @@ -318,7 +318,6 @@ enum qse_awk_errnum_t QSE_AWK_EPRINTFARG, /* printf not followed by any arguments */ QSE_AWK_EPREPST, /* both prefix and postfix increment/decrement operator present */ - QSE_AWK_EGLNCPS, /* coprocess not supported by getline */ /* run time error */ QSE_AWK_EDIVBY0, /* divide by zero */ @@ -391,7 +390,6 @@ enum qse_awk_extio_type_t { /* extio types available */ QSE_AWK_EXTIO_PIPE, - QSE_AWK_EXTIO_COPROC, QSE_AWK_EXTIO_FILE, QSE_AWK_EXTIO_CONSOLE, @@ -403,12 +401,7 @@ enum qse_awk_extio_mode_t { QSE_AWK_EXTIO_PIPE_READ = 0, QSE_AWK_EXTIO_PIPE_WRITE = 1, - - /* - QSE_AWK_EXTIO_COPROC_READ = 0, - QSE_AWK_EXTIO_COPROC_WRITE = 1, - QSE_AWK_EXTIO_COPROC_RDWR = 2, - */ + QSE_AWK_EXTIO_PIPE_RW = 2, QSE_AWK_EXTIO_FILE_READ = 0, QSE_AWK_EXTIO_FILE_WRITE = 1, diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index 187713b3..c5fc1d41 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -1327,7 +1327,6 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs) Run runctx (this); runios.pipe = pipeHandler; - runios.coproc = QSE_NULL; runios.file = fileHandler; runios.console = consoleHandler; runios.data = this; diff --git a/qse/lib/awk/err.c b/qse/lib/awk/err.c index 6cd2fc8d..f54c8d09 100644 --- a/qse/lib/awk/err.c +++ b/qse/lib/awk/err.c @@ -113,7 +113,6 @@ static const qse_char_t* __geterrstr (int errnum) QSE_T("nextfile statement illegal in the END block"), QSE_T("printf not followed by any arguments"), QSE_T("both prefix and postfix increment/decrement operator present"), - QSE_T("coprocess not supported by getline"), QSE_T("divide by zero"), QSE_T("invalid operand"), diff --git a/qse/lib/awk/extio.c b/qse/lib/awk/extio.c index b7308afe..bcfb4ecc 100644 --- a/qse/lib/awk/extio.c +++ b/qse/lib/awk/extio.c @@ -32,7 +32,7 @@ static int in_type_map[] = /* the order should match the order of the * QSE_AWK_IN_XXX values in tree.h */ QSE_AWK_EXTIO_PIPE, - QSE_AWK_EXTIO_COPROC, + QSE_AWK_EXTIO_PIPE, QSE_AWK_EXTIO_FILE, QSE_AWK_EXTIO_CONSOLE }; @@ -42,7 +42,7 @@ static int in_mode_map[] = /* the order should match the order of the * QSE_AWK_IN_XXX values in tree.h */ QSE_AWK_EXTIO_PIPE_READ, - 0, + QSE_AWK_EXTIO_PIPE_RW, QSE_AWK_EXTIO_FILE_READ, QSE_AWK_EXTIO_CONSOLE_READ }; @@ -60,7 +60,7 @@ static int out_type_map[] = /* the order should match the order of the * QSE_AWK_OUT_XXX values in tree.h */ QSE_AWK_EXTIO_PIPE, - QSE_AWK_EXTIO_COPROC, + QSE_AWK_EXTIO_PIPE, QSE_AWK_EXTIO_FILE, QSE_AWK_EXTIO_FILE, QSE_AWK_EXTIO_CONSOLE @@ -71,7 +71,7 @@ static int out_mode_map[] = /* the order should match the order of the * QSE_AWK_OUT_XXX values in tree.h */ QSE_AWK_EXTIO_PIPE_WRITE, - 0, + QSE_AWK_EXTIO_PIPE_RW, QSE_AWK_EXTIO_FILE_WRITE, QSE_AWK_EXTIO_FILE_APPEND, QSE_AWK_EXTIO_CONSOLE_WRITE @@ -109,6 +109,7 @@ int qse_awk_readextio ( extio_mode = in_mode_map[in_type]; extio_mask = in_mask_map[in_type]; + /* get the io handler provided by a user */ handler = run->extio.handler[extio_type]; if (handler == QSE_NULL) { @@ -117,6 +118,7 @@ int qse_awk_readextio ( return -1; } + /* search the chain for exiting an existing io name */ while (p != QSE_NULL) { if (p->type == (extio_type | extio_mask) && @@ -126,6 +128,8 @@ int qse_awk_readextio ( if (p == QSE_NULL) { + /* if the name doesn't exist in the chain, create an entry + * to the chain */ p = (qse_awk_extio_t*) QSE_AWK_ALLOC ( run->awk, QSE_SIZEOF(qse_awk_extio_t)); if (p == QSE_NULL) @@ -157,6 +161,7 @@ int qse_awk_readextio ( qse_awk_setrunerrnum (run, QSE_AWK_ENOERR); + /* request to open the stream */ x = handler (QSE_AWK_IO_OPEN, p, QSE_NULL, 0); if (x <= -1) { @@ -195,7 +200,7 @@ int qse_awk_readextio ( return 0; } - /* ready to read a line */ + /* ready to read a line. clear the line buffer */ qse_str_clear (buf); /* get the record separator */ @@ -240,7 +245,7 @@ int qse_awk_readextio ( qse_awk_setrunerrnum (run, QSE_AWK_ENOERR); - n = handler (QSE_AWK_IO_READ, + n = handler (QSE_AWK_IO_READ, p, p->in.buf, QSE_COUNTOF(p->in.buf)); if (n <= -1) { @@ -406,7 +411,6 @@ int qse_awk_readextio ( return ret; } -#include int qse_awk_writeextio_val ( qse_awk_run_t* run, int out_type, const qse_char_t* name, qse_awk_val_t* v) @@ -467,7 +471,7 @@ int qse_awk_writeextio_str ( /* the file "1.tmp", in the following code snippets, * would be opened by the first print statement, but not by * the second print statement. this is because - * both QSE_AWK_OUT_FILE and QSE_AWK_OUT_FILE_APPEND are + * both QSE_AWK_OUT_FILE and QSE_AWK_OUT_APFILE are * translated to QSE_AWK_EXTIO_FILE and it is used to * keep track of file handles.. * diff --git a/qse/lib/awk/func.c b/qse/lib/awk/func.c index aeab74bd..9d413aa2 100644 --- a/qse/lib/awk/func.c +++ b/qse/lib/awk/func.c @@ -237,7 +237,7 @@ static int bfn_close ( nargs = qse_awk_getnargs (run); QSE_ASSERT (nargs == 1); -/* TODO: support close (xxx, "to"/"from") like gawk */ +/* TODO: support close (xxx, "to"/"from"/"rw"/"r"/"w"/????) */ a0 = qse_awk_getarg (run, 0); QSE_ASSERT (a0 != QSE_NULL); @@ -392,13 +392,9 @@ static int bfn_fflush ( run, QSE_AWK_EXTIO_PIPE, ((len0 == 0)? QSE_NULL: str0), n); /*if (n == -99) return -1;*/ - n = flush_extio ( - run, QSE_AWK_EXTIO_COPROC, - ((len0 == 0)? QSE_NULL: str0), n); - /*if (n == -99) return -1;*/ /* if n remains 1, no ip handlers have been defined for - * file, pipe, and coproc. so make fflush return -1. + * file, pipe, and rwpipe. so make fflush return -1. * if n is -2, no such named io has been found at all * if n is -1, the io handler has returned an error */ if (n != 0) n = -1; diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index 89524cae..d8d4d558 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -60,7 +60,6 @@ enum token_t TOKEN_BOR, TOKEN_BXOR, TOKEN_BAND, - TOKEN_BORAND, TOKEN_TILDE, /* used for unary bitwise-not and regex match */ TOKEN_RSHIFT, TOKEN_LSHIFT, @@ -179,6 +178,7 @@ static qse_awk_nde_t* parse_binary_expr ( qse_awk_nde_t*(*next_level_func)(qse_awk_t*,qse_size_t)); static qse_awk_nde_t* parse_logical_or (qse_awk_t* awk, qse_size_t line); +static qse_awk_nde_t* parse_logical_or_with_extio (qse_awk_t* awk, qse_size_t line); static qse_awk_nde_t* parse_logical_and (qse_awk_t* awk, qse_size_t line); static qse_awk_nde_t* parse_in (qse_awk_t* awk, qse_size_t line); static qse_awk_nde_t* parse_regex_match (qse_awk_t* awk, qse_size_t line); @@ -2227,13 +2227,115 @@ static qse_awk_nde_t* parse_binary_expr ( static qse_awk_nde_t* parse_logical_or (qse_awk_t* awk, qse_size_t line) { - static binmap_t map[] = + if ((awk->option & QSE_AWK_EXTIO) && + (awk->option & QSE_AWK_RWPIPE)) { - { TOKEN_LOR, QSE_AWK_BINOP_LOR }, - { TOKEN_EOF, 0 } - }; + return parse_logical_or_with_extio (awk, line); + } + else + { + static binmap_t map[] = + { + { TOKEN_LOR, QSE_AWK_BINOP_LOR }, + { TOKEN_EOF, 0 } + }; - return parse_binary_expr (awk, line, 1, map, parse_logical_and); + return parse_binary_expr (awk, line, 1, map, parse_logical_and); + } +} + +static qse_awk_nde_t* parse_logical_or_with_extio (qse_awk_t* awk, qse_size_t line) +{ + qse_awk_nde_t* left, * right; + + left = parse_logical_and (awk, line); + if (left == QSE_NULL) return QSE_NULL; + + while (MATCH(awk,TOKEN_LOR)) + { + if (get_token(awk) == -1) + { + qse_awk_clrpt (awk, left); + return QSE_NULL; + } + + if (MATCH(awk,TOKEN_GETLINE)) + { + qse_awk_nde_getline_t* nde; + qse_awk_nde_t* var = QSE_NULL; + + if (get_token(awk) == -1) + { + qse_awk_clrpt (awk, left); + return QSE_NULL; + } + + /* TODO: is this correct? */ + if (MATCH(awk,TOKEN_IDENT)) + { + /* command | getline var */ + + var = parse_primary (awk, awk->token.line); + if (var == QSE_NULL) + { + qse_awk_clrpt (awk, left); + return QSE_NULL; + } + } + + nde = (qse_awk_nde_getline_t*) QSE_AWK_ALLOC ( + awk, QSE_SIZEOF(qse_awk_nde_getline_t)); + if (nde == QSE_NULL) + { + qse_awk_clrpt (awk, left); + + SETERRLIN (awk, QSE_AWK_ENOMEM, line); + return QSE_NULL; + } + + nde->type = QSE_AWK_NDE_GETLINE; + nde->line = line; + nde->next = QSE_NULL; + nde->var = var; + nde->in_type = QSE_AWK_IN_RWPIPE; + nde->in = left; + + left = (qse_awk_nde_t*)nde; + } + else + { + qse_awk_nde_exp_t* nde; + + right = parse_logical_and (awk, awk->token.line); + if (right == QSE_NULL) + { + qse_awk_clrpt (awk, left); + return QSE_NULL; + } + + nde = (qse_awk_nde_exp_t*) QSE_AWK_ALLOC ( + awk, QSE_SIZEOF(qse_awk_nde_exp_t)); + if (nde == QSE_NULL) + { + qse_awk_clrpt (awk, right); + qse_awk_clrpt (awk, left); + + SETERRLIN (awk, QSE_AWK_ENOMEM, line); + return QSE_NULL; + } + + nde->type = QSE_AWK_NDE_EXP_BIN; + nde->line = line; + nde->next = QSE_NULL; + nde->opcode = QSE_AWK_BINOP_LOR; + nde->left = left; + nde->right = right; + + left = (qse_awk_nde_t*)nde; + } + } + + return left; } static qse_awk_nde_t* parse_logical_and (qse_awk_t* awk, qse_size_t line) @@ -2356,16 +2458,8 @@ static qse_awk_nde_t* parse_bitwise_or_with_extio (qse_awk_t* awk, qse_size_t li left = parse_bitwise_xor (awk, line); if (left == QSE_NULL) return QSE_NULL; - while (1) + while (MATCH(awk,TOKEN_BOR)) { - int in_type; - - if (MATCH(awk,TOKEN_BOR)) - in_type = QSE_AWK_IN_PIPE; - else if (MATCH(awk,TOKEN_BORAND)) - in_type = QSE_AWK_IN_COPROC; - else break; - if (get_token(awk) == -1) { qse_awk_clrpt (awk, left); @@ -2412,7 +2506,7 @@ static qse_awk_nde_t* parse_bitwise_or_with_extio (qse_awk_t* awk, qse_size_t li nde->line = line; nde->next = QSE_NULL; nde->var = var; - nde->in_type = in_type; + nde->in_type = QSE_AWK_IN_PIPE; nde->in = left; left = (qse_awk_nde_t*)nde; @@ -2421,15 +2515,6 @@ static qse_awk_nde_t* parse_bitwise_or_with_extio (qse_awk_t* awk, qse_size_t li { qse_awk_nde_exp_t* nde; - if (in_type == QSE_AWK_IN_COPROC) - { - qse_awk_clrpt (awk, left); - - /* TODO: support coprocess */ - SETERRLIN (awk, QSE_AWK_EGLNCPS, line); - return QSE_NULL; - } - right = parse_bitwise_xor (awk, awk->token.line); if (right == QSE_NULL) { @@ -4423,7 +4508,7 @@ static qse_awk_nde_t* parse_print (qse_awk_t* awk, qse_size_t line, int type) !MATCH(awk,TOKEN_GT) && !MATCH(awk,TOKEN_RSHIFT) && !MATCH(awk,TOKEN_BOR) && - !MATCH(awk,TOKEN_BORAND)) + !MATCH(awk,TOKEN_LOR)) { qse_awk_nde_t* args_tail; qse_awk_nde_t* tail_prev; @@ -4467,56 +4552,68 @@ static qse_awk_nde_t* parse_print (qse_awk_t* awk, qse_size_t line, int type) if (awk->token.prev.type != TOKEN_RPAREN && args_tail->type == QSE_AWK_NDE_EXP_BIN) { + int i; qse_awk_nde_exp_t* ep = (qse_awk_nde_exp_t*)args_tail; - if (ep->opcode == QSE_AWK_BINOP_GT) + struct { - qse_awk_nde_t* tmp = args_tail; - - if (tail_prev != QSE_NULL) - tail_prev->next = ep->left; - else args = ep->left; - - out = ep->right; - out_type = QSE_AWK_OUT_FILE; - - QSE_AWK_FREE (awk, tmp); - } - else if (ep->opcode == QSE_AWK_BINOP_RSHIFT) + int opc; + int out; + int opt; + } tab[] = { - qse_awk_nde_t* tmp = args_tail; + { + QSE_AWK_BINOP_GT, + QSE_AWK_OUT_FILE, + 0 + }, + { + QSE_AWK_BINOP_RSHIFT, + QSE_AWK_OUT_APFILE, + 0 + }, + { + QSE_AWK_BINOP_BOR, + QSE_AWK_OUT_PIPE, + 0 + }, + { + QSE_AWK_BINOP_LOR, + QSE_AWK_OUT_RWPIPE, + QSE_AWK_RWPIPE + } + }; - if (tail_prev != QSE_NULL) - tail_prev->next = ep->left; - else args = ep->left; - - out = ep->right; - out_type = QSE_AWK_OUT_FILE_APPEND; - - QSE_AWK_FREE (awk, tmp); - } - else if (ep->opcode == QSE_AWK_BINOP_BOR) + for (i = 0; i < QSE_COUNTOF(tab); i++) { - qse_awk_nde_t* tmp = args_tail; + if (ep->opcode == tab[i].opc) + { + if (tab[i].opt && + !(awk->option&tab[i].opt)) break; - if (tail_prev != QSE_NULL) - tail_prev->next = ep->left; - else args = ep->left; + qse_awk_nde_t* tmp = args_tail; - out = ep->right; - out_type = QSE_AWK_OUT_PIPE; + if (tail_prev != QSE_NULL) + tail_prev->next = ep->left; + else args = ep->left; - QSE_AWK_FREE (awk, tmp); + out = ep->right; + out_type = tab[i].out; + + QSE_AWK_FREE (awk, tmp); + break; + } } } } if (out == QSE_NULL) { - out_type = MATCH(awk,TOKEN_GT)? QSE_AWK_OUT_FILE: - MATCH(awk,TOKEN_RSHIFT)? QSE_AWK_OUT_FILE_APPEND: - MATCH(awk,TOKEN_BOR)? QSE_AWK_OUT_PIPE: - MATCH(awk,TOKEN_BORAND)? QSE_AWK_OUT_COPROC: - QSE_AWK_OUT_CONSOLE; + out_type = MATCH(awk,TOKEN_GT)? QSE_AWK_OUT_FILE: + MATCH(awk,TOKEN_RSHIFT)? QSE_AWK_OUT_APFILE: + MATCH(awk,TOKEN_BOR)? QSE_AWK_OUT_PIPE: + ((awk->option & QSE_AWK_RWPIPE) && + MATCH(awk,TOKEN_LOR))? QSE_AWK_OUT_RWPIPE: + QSE_AWK_OUT_CONSOLE; if (out_type != QSE_AWK_OUT_CONSOLE) { @@ -4765,12 +4862,6 @@ static int get_token (qse_awk_t* awk) ADD_TOKEN_CHAR (awk, c); GET_CHAR (awk); } - else if ((awk->option & QSE_AWK_COPROC) && c == QSE_T('&')) - { - SET_TOKEN_TYPE (awk, TOKEN_BORAND); - ADD_TOKEN_CHAR (awk, c); - GET_CHAR (awk); - } else if (c == QSE_T('=')) { SET_TOKEN_TYPE (awk, TOKEN_BOR_ASSIGN); diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 400e812d..8bcace03 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -863,7 +863,6 @@ static int init_run ( if (runios != QSE_NULL) { run->extio.handler[QSE_AWK_EXTIO_PIPE] = runios->pipe; - run->extio.handler[QSE_AWK_EXTIO_COPROC] = runios->coproc; run->extio.handler[QSE_AWK_EXTIO_FILE] = runios->file; run->extio.handler[QSE_AWK_EXTIO_CONSOLE] = runios->console; run->extio.data = runios->data; @@ -2780,9 +2779,9 @@ static int run_print (qse_awk_run_t* run, qse_awk_nde_print_t* nde) QSE_ASSERT ( (nde->out_type == QSE_AWK_OUT_PIPE && nde->out != QSE_NULL) || - (nde->out_type == QSE_AWK_OUT_COPROC && nde->out != QSE_NULL) || + (nde->out_type == QSE_AWK_OUT_RWPIPE && nde->out != QSE_NULL) || (nde->out_type == QSE_AWK_OUT_FILE && nde->out != QSE_NULL) || - (nde->out_type == QSE_AWK_OUT_FILE_APPEND && nde->out != QSE_NULL) || + (nde->out_type == QSE_AWK_OUT_APFILE && nde->out != QSE_NULL) || (nde->out_type == QSE_AWK_OUT_CONSOLE && nde->out == QSE_NULL)); /* check if destination has been specified. */ @@ -2941,9 +2940,9 @@ static int run_printf (qse_awk_run_t* run, qse_awk_nde_print_t* nde) QSE_ASSERT ( (nde->out_type == QSE_AWK_OUT_PIPE && nde->out != QSE_NULL) || - (nde->out_type == QSE_AWK_OUT_COPROC && nde->out != QSE_NULL) || + (nde->out_type == QSE_AWK_OUT_RWPIPE && nde->out != QSE_NULL) || (nde->out_type == QSE_AWK_OUT_FILE && nde->out != QSE_NULL) || - (nde->out_type == QSE_AWK_OUT_FILE_APPEND && nde->out != QSE_NULL) || + (nde->out_type == QSE_AWK_OUT_APFILE && nde->out != QSE_NULL) || (nde->out_type == QSE_AWK_OUT_CONSOLE && nde->out == QSE_NULL)); if (nde->out != QSE_NULL) @@ -6186,7 +6185,7 @@ static qse_awk_val_t* eval_getline (qse_awk_run_t* run, qse_awk_nde_t* nde) QSE_ASSERT ( (p->in_type == QSE_AWK_IN_PIPE && p->in != QSE_NULL) || - (p->in_type == QSE_AWK_IN_COPROC && p->in != QSE_NULL) || + (p->in_type == QSE_AWK_IN_RWPIPE && p->in != QSE_NULL) || (p->in_type == QSE_AWK_IN_FILE && p->in != QSE_NULL) || (p->in_type == QSE_AWK_IN_CONSOLE && p->in == QSE_NULL)); diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index b55e2cc6..9751c3ad 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -351,14 +351,20 @@ static qse_ssize_t awk_extio_pipe ( if (epa->mode == QSE_AWK_EXTIO_PIPE_READ) { - /* TODO: should specify ERRTOOUT */ + /* TODO: should we specify ERRTOOUT? */ flags = QSE_PCP_READOUT | - QSE_PCP_ERRTOOUT; + QSE_PCP_ERRTOOUT; } else if (epa->mode == QSE_AWK_EXTIO_PIPE_WRITE) { flags = QSE_PCP_WRITEIN; } + else if (epa->mode == QSE_AWK_EXTIO_PIPE_RW) + { + flags = QSE_PCP_READOUT | + QSE_PCP_ERRTOOUT | + QSE_PCP_WRITEIN; + } else return -1; /* TODO: any way to set the error number? */ /*dprint (QSE_T("opening %s of type %d (pipe)\n"), epa->name, epa->type);*/ diff --git a/qse/lib/awk/tree.c b/qse/lib/awk/tree.c index f2fbe317..1cc5852d 100644 --- a/qse/lib/awk/tree.c +++ b/qse/lib/awk/tree.c @@ -87,7 +87,7 @@ static const qse_char_t* incop_str[] = static const qse_char_t* getline_inop_str[] = { QSE_T("|"), - QSE_T("|&"), + QSE_T("||"), QSE_T("<"), QSE_T("") }; @@ -95,7 +95,7 @@ static const qse_char_t* getline_inop_str[] = static const qse_char_t* print_outop_str[] = { QSE_T("|"), - QSE_T("|&"), + QSE_T("||"), QSE_T(">"), QSE_T(">>"), QSE_T("") @@ -562,7 +562,7 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde) qse_awk_nde_getline_t* px = (qse_awk_nde_getline_t*)nde; if (px->in != QSE_NULL && (px->in_type == QSE_AWK_IN_PIPE || - px->in_type == QSE_AWK_IN_COPROC)) + px->in_type == QSE_AWK_IN_RWPIPE)) { PRINT_EXPRESSION (awk, px->in); PUT_SRCSTR (awk, QSE_T(" ")); diff --git a/qse/lib/awk/tree.h b/qse/lib/awk/tree.h index 13742c5d..3b04f7e9 100644 --- a/qse/lib/awk/tree.h +++ b/qse/lib/awk/tree.h @@ -82,7 +82,7 @@ enum qse_awk_in_type_t * __in_type_map and __in_opt_map in extio.c */ QSE_AWK_IN_PIPE, - QSE_AWK_IN_COPROC, + QSE_AWK_IN_RWPIPE, QSE_AWK_IN_FILE, QSE_AWK_IN_CONSOLE }; @@ -93,9 +93,9 @@ enum qse_awk_out_type_t * __out_type_map and __out_opt_map in extio.c */ QSE_AWK_OUT_PIPE, - QSE_AWK_OUT_COPROC, + QSE_AWK_OUT_RWPIPE, /* dual direction pipe */ QSE_AWK_OUT_FILE, - QSE_AWK_OUT_FILE_APPEND, + QSE_AWK_OUT_APFILE, /* file for appending */ QSE_AWK_OUT_CONSOLE };