*** empty log message ***

This commit is contained in:
hyung-hwan 2006-08-27 15:29:21 +00:00
parent 6f39ff48ec
commit 5778a30090
7 changed files with 290 additions and 248 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.c,v 1.35 2006-08-25 23:50:15 bacon Exp $ * $Id: extio.c,v 1.36 2006-08-27 15:29:20 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -80,11 +80,11 @@ static int __out_mask_map[] =
static int __writeextio ( static int __writeextio (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v, int* errnum, xp_bool_t nl); const xp_char_t* name, xp_awk_val_t* v, xp_bool_t nl);
int xp_awk_readextio ( int xp_awk_readextio (
xp_awk_run_t* run, int in_type, xp_awk_run_t* run, int in_type,
const xp_char_t* name, xp_str_t* buf, int* errnum) const xp_char_t* name, xp_str_t* buf)
{ {
xp_awk_extio_t* p = run->extio.chain; xp_awk_extio_t* p = run->extio.chain;
xp_awk_io_t handler; xp_awk_io_t handler;
@ -107,7 +107,7 @@ int xp_awk_readextio (
if (handler == XP_NULL) if (handler == XP_NULL)
{ {
/* no io handler provided */ /* no io handler provided */
*errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */ run->errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */
return -1; return -1;
} }
@ -123,7 +123,7 @@ int xp_awk_readextio (
p = (xp_awk_extio_t*) xp_malloc (xp_sizeof(xp_awk_extio_t)); p = (xp_awk_extio_t*) xp_malloc (xp_sizeof(xp_awk_extio_t));
if (p == XP_NULL) if (p == XP_NULL)
{ {
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -131,7 +131,7 @@ int xp_awk_readextio (
if (p->name == XP_NULL) if (p->name == XP_NULL)
{ {
xp_free (p); xp_free (p);
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -153,10 +153,11 @@ int xp_awk_readextio (
xp_free (p); xp_free (p);
/* TODO: use meaningful error code */ /* TODO: use meaningful error code */
xp_awk_setglobal (run, if (xp_awk_setglobal (
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); run, XP_AWK_GLOBAL_ERRNO,
xp_awk_val_one) == -1) return -1;
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -192,7 +193,7 @@ int xp_awk_readextio (
else else
{ {
rs_ptr = xp_awk_valtostr ( rs_ptr = xp_awk_valtostr (
rs, errnum, xp_true, XP_NULL, &rs_len); rs, &run->errnum, xp_true, XP_NULL, &rs_len);
if (rs_ptr == XP_NULL) if (rs_ptr == XP_NULL)
{ {
xp_awk_refdownval (run, rs); xp_awk_refdownval (run, rs);
@ -223,11 +224,17 @@ int xp_awk_readextio (
{ {
/* handler error. getline should return -1 */ /* handler error. getline should return -1 */
/* TODO: use meaningful error code */ /* TODO: use meaningful error code */
xp_awk_setglobal (run, if (xp_awk_setglobal (
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); run, XP_AWK_GLOBAL_ERRNO,
xp_awk_val_one) == -1)
*errnum = XP_AWK_EIOHANDLER; {
ret = -1; ret = -1;
}
else
{
run->errnum = XP_AWK_EIOHANDLER;
ret = -1;
}
break; break;
} }
@ -304,7 +311,7 @@ int xp_awk_readextio (
if (xp_str_ccat (buf, c) == (xp_size_t)-1) if (xp_str_ccat (buf, c) == (xp_size_t)-1)
{ {
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
ret = -1; ret = -1;
break; break;
} }
@ -321,21 +328,21 @@ int xp_awk_readextio (
int xp_awk_writeextio ( int xp_awk_writeextio (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v, int* errnum) const xp_char_t* name, xp_awk_val_t* v)
{ {
return __writeextio (run, out_type, name, v, errnum, xp_false); return __writeextio (run, out_type, name, v, xp_false);
} }
int xp_awk_writeextio_nl ( int xp_awk_writeextio_nl (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v, int* errnum) const xp_char_t* name, xp_awk_val_t* v)
{ {
return __writeextio (run, out_type, name, v, errnum, xp_true); return __writeextio (run, out_type, name, v, xp_true);
} }
static int __writeextio ( static int __writeextio (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v, int* errnum, xp_bool_t nl) const xp_char_t* name, xp_awk_val_t* v, xp_bool_t nl)
{ {
xp_awk_extio_t* p = run->extio.chain; xp_awk_extio_t* p = run->extio.chain;
xp_awk_io_t handler; xp_awk_io_t handler;
@ -356,7 +363,7 @@ static int __writeextio (
if (handler == XP_NULL) if (handler == XP_NULL)
{ {
/* no io handler provided */ /* no io handler provided */
*errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */ run->errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */
return -1; return -1;
} }
@ -372,7 +379,7 @@ static int __writeextio (
/* TOOD: consider using a shared buffer when calling /* TOOD: consider using a shared buffer when calling
* xp_awk_valtostr. maybe run->shared_buf.extio */ * xp_awk_valtostr. maybe run->shared_buf.extio */
str = xp_awk_valtostr ( str = xp_awk_valtostr (
v, errnum, xp_true, NULL, &len); v, &run->errnum, xp_true, NULL, &len);
if (str == XP_NULL) return -1; if (str == XP_NULL) return -1;
} }
@ -401,7 +408,7 @@ static int __writeextio (
if (p == XP_NULL) if (p == XP_NULL)
{ {
if (v->type != XP_AWK_VAL_STR) xp_free (str); if (v->type != XP_AWK_VAL_STR) xp_free (str);
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -410,7 +417,7 @@ static int __writeextio (
{ {
xp_free (p); xp_free (p);
if (v->type != XP_AWK_VAL_STR) xp_free (str); if (v->type != XP_AWK_VAL_STR) xp_free (str);
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -427,10 +434,11 @@ static int __writeextio (
if (v->type != XP_AWK_VAL_STR) xp_free (str); if (v->type != XP_AWK_VAL_STR) xp_free (str);
/* TODO: use meaningful error code */ /* TODO: use meaningful error code */
xp_awk_setglobal (run, if (xp_awk_setglobal (
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); run, XP_AWK_GLOBAL_ERRNO,
xp_awk_val_one) == -1) return -1;
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -456,9 +464,11 @@ static int __writeextio (
if (v->type != XP_AWK_VAL_STR) xp_free (str); if (v->type != XP_AWK_VAL_STR) xp_free (str);
/* TODO: use meaningful error code */ /* TODO: use meaningful error code */
xp_awk_setglobal (run, if (xp_awk_setglobal (
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); run, XP_AWK_GLOBAL_ERRNO,
*errnum = XP_AWK_EIOHANDLER; xp_awk_val_one) == -1) return -1;
run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -478,9 +488,11 @@ static int __writeextio (
if (n == -1) if (n == -1)
{ {
/* TODO: use meaningful error code */ /* TODO: use meaningful error code */
xp_awk_setglobal (run, if (xp_awk_setglobal (
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); run, XP_AWK_GLOBAL_ERRNO,
*errnum = XP_AWK_EIOHANDLER; xp_awk_val_one) == -1) return -1;
run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -491,7 +503,7 @@ static int __writeextio (
} }
int xp_awk_flushextio ( int xp_awk_flushextio (
xp_awk_run_t* run, int out_type, const xp_char_t* name, int* errnum) xp_awk_run_t* run, int out_type, const xp_char_t* name)
{ {
xp_awk_extio_t* p = run->extio.chain; xp_awk_extio_t* p = run->extio.chain;
xp_awk_io_t handler; xp_awk_io_t handler;
@ -511,7 +523,7 @@ int xp_awk_flushextio (
if (handler == XP_NULL) if (handler == XP_NULL)
{ {
/* no io handler provided */ /* no io handler provided */
*errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */ run->errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */
return -1; return -1;
} }
@ -526,9 +538,11 @@ int xp_awk_flushextio (
if (n == -1) if (n == -1)
{ {
/* TODO: use meaningful error code */ /* TODO: use meaningful error code */
xp_awk_setglobal (run, if (xp_awk_setglobal (
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); run, XP_AWK_GLOBAL_ERRNO,
*errnum = XP_AWK_EIOHANDLER; xp_awk_val_one) == -1) return -1;
run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -542,14 +556,15 @@ int xp_awk_flushextio (
/* there is no corresponding extio for name */ /* there is no corresponding extio for name */
/* TODO: use meaningful error code. but is this needed? */ /* TODO: use meaningful error code. but is this needed? */
xp_awk_setglobal (run, if (xp_awk_setglobal (
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); run, XP_AWK_GLOBAL_ERRNO, xp_awk_val_one) == -1) return -1;
*errnum = XP_AWK_ENOSUCHIO;
run->errnum = XP_AWK_ENOSUCHIO;
return -1; return -1;
} }
int xp_awk_nextextio_read ( int xp_awk_nextextio_read (
xp_awk_run_t* run, int in_type, const xp_char_t* name, int* errnum) xp_awk_run_t* run, int in_type, const xp_char_t* name)
{ {
xp_awk_extio_t* p = run->extio.chain; xp_awk_extio_t* p = run->extio.chain;
xp_awk_io_t handler; xp_awk_io_t handler;
@ -568,7 +583,7 @@ int xp_awk_nextextio_read (
if (handler == XP_NULL) if (handler == XP_NULL)
{ {
/* no io handler provided */ /* no io handler provided */
*errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */ run->errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */
return -1; return -1;
} }
@ -582,7 +597,7 @@ int xp_awk_nextextio_read (
if (p == XP_NULL) if (p == XP_NULL)
{ {
/* something is totally wrong */ /* something is totally wrong */
*errnum = XP_AWK_EINTERNAL; run->errnum = XP_AWK_EINTERNAL;
return -1; return -1;
} }
@ -590,7 +605,7 @@ int xp_awk_nextextio_read (
if (n == -1) if (n == -1)
{ {
/* TODO: is this errnum correct? */ /* TODO: is this errnum correct? */
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -598,7 +613,7 @@ int xp_awk_nextextio_read (
} }
int xp_awk_closeextio_read ( int xp_awk_closeextio_read (
xp_awk_run_t* run, int in_type, const xp_char_t* name, int* errnum) xp_awk_run_t* run, int in_type, const xp_char_t* name)
{ {
xp_awk_extio_t* p = run->extio.chain, * px = XP_NULL; xp_awk_extio_t* p = run->extio.chain, * px = XP_NULL;
xp_awk_io_t handler; xp_awk_io_t handler;
@ -617,7 +632,7 @@ int xp_awk_closeextio_read (
if (handler == XP_NULL) if (handler == XP_NULL)
{ {
/* no io handler provided */ /* no io handler provided */
*errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */ run->errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */
return -1; return -1;
} }
@ -635,7 +650,7 @@ int xp_awk_closeextio_read (
{ {
/* this is not a run-time error.*/ /* this is not a run-time error.*/
/* TODO: set ERRNO */ /* TODO: set ERRNO */
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
} }
@ -653,12 +668,12 @@ int xp_awk_closeextio_read (
} }
/* this is not a run-time error */ /* this is not a run-time error */
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
int xp_awk_closeextio_write ( int xp_awk_closeextio_write (
xp_awk_run_t* run, int out_type, const xp_char_t* name, int* errnum) xp_awk_run_t* run, int out_type, const xp_char_t* name)
{ {
xp_awk_extio_t* p = run->extio.chain, * px = XP_NULL; xp_awk_extio_t* p = run->extio.chain, * px = XP_NULL;
xp_awk_io_t handler; xp_awk_io_t handler;
@ -677,7 +692,7 @@ int xp_awk_closeextio_write (
if (handler == XP_NULL) if (handler == XP_NULL)
{ {
/* no io handler provided */ /* no io handler provided */
*errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */ run->errnum = XP_AWK_EIOIMPL; /* TODO: change the error code */
return -1; return -1;
} }
@ -695,7 +710,7 @@ int xp_awk_closeextio_write (
{ {
/* this is not a run-time error.*/ /* this is not a run-time error.*/
/* TODO: set ERRNO */ /* TODO: set ERRNO */
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
} }
@ -714,12 +729,11 @@ int xp_awk_closeextio_write (
/* this is not a run-time error */ /* this is not a run-time error */
/* TODO: set ERRNO */ /* TODO: set ERRNO */
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
int xp_awk_closeextio ( int xp_awk_closeextio (xp_awk_run_t* run, const xp_char_t* name)
xp_awk_run_t* run, const xp_char_t* name, int* errnum)
{ {
xp_awk_extio_t* p = run->extio.chain, * px = XP_NULL; xp_awk_extio_t* p = run->extio.chain, * px = XP_NULL;
@ -738,7 +752,7 @@ int xp_awk_closeextio (
{ {
/* this is not a run-time error.*/ /* this is not a run-time error.*/
/* TODO: set ERRNO */ /* TODO: set ERRNO */
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }
} }
@ -757,7 +771,7 @@ int xp_awk_closeextio (
/* this is not a run-time error */ /* this is not a run-time error */
/* TODO: set ERRNO */ /* TODO: set ERRNO */
*errnum = XP_AWK_EIOHANDLER; run->errnum = XP_AWK_EIOHANDLER;
return -1; return -1;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.h,v 1.10 2006-08-22 15:10:48 bacon Exp $ * $Id: extio.h,v 1.11 2006-08-27 15:29:21 bacon Exp $
*/ */
#ifndef _XP_AWK_EXTIO_H_ #ifndef _XP_AWK_EXTIO_H_
@ -15,33 +15,32 @@ extern "C"
int xp_awk_readextio ( int xp_awk_readextio (
xp_awk_run_t* run, int in_type, xp_awk_run_t* run, int in_type,
const xp_char_t* name, xp_str_t* buf, int* errnum); const xp_char_t* name, xp_str_t* buf);
int xp_awk_writeextio ( int xp_awk_writeextio (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v, int* errnum); const xp_char_t* name, xp_awk_val_t* v);
int xp_awk_writeextio_nl ( int xp_awk_writeextio_nl (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v, int* errnum); const xp_char_t* name, xp_awk_val_t* v);
int xp_awk_flushextio ( int xp_awk_flushextio (
xp_awk_run_t* run, int out_type, const xp_char_t* name, int* errnum); xp_awk_run_t* run, int out_type, const xp_char_t* name);
int xp_awk_nextextio_read ( int xp_awk_nextextio_read (
xp_awk_run_t* run, int in_type, const xp_char_t* name, int* errnum); xp_awk_run_t* run, int in_type, const xp_char_t* name);
/* TODO: /* TODO:
int xp_awk_nextextio_write ( int xp_awk_nextextio_write (
xp_awk_run_t* run, int out_type, const xp_char_t* name, int* errnum); xp_awk_run_t* run, int out_type, const xp_char_t* name);
*/ */
int xp_awk_closeextio_read ( int xp_awk_closeextio_read (
xp_awk_run_t* run, int in_type, const xp_char_t* name, int* errnum); xp_awk_run_t* run, int in_type, const xp_char_t* name);
int xp_awk_closeextio_write ( int xp_awk_closeextio_write (
xp_awk_run_t* run, int out_type, const xp_char_t* name, int* errnum); xp_awk_run_t* run, int out_type, const xp_char_t* name);
int xp_awk_closeextio ( int xp_awk_closeextio (xp_awk_run_t* run, const xp_char_t* name);
xp_awk_run_t* run, const xp_char_t* name, int* errnum);
void xp_awk_clearextio (xp_awk_run_t* run); void xp_awk_clearextio (xp_awk_run_t* run);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: func.c,v 1.33 2006-08-26 16:30:53 bacon Exp $ * $Id: func.c,v 1.34 2006-08-27 15:29:21 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -202,11 +202,10 @@ static int __bfn_close (xp_awk_t* awk, void* run)
} }
} }
n = xp_awk_closeextio (run, name, &errnum); n = xp_awk_closeextio (run, name);
if (n == -1 && errnum != XP_AWK_EIOHANDLER) if (n == -1 && ((xp_awk_run_t*)run)->errnum != XP_AWK_EIOHANDLER)
{ {
if (a0->type != XP_AWK_VAL_STR) xp_free (name); if (a0->type != XP_AWK_VAL_STR) xp_free (name);
xp_awk_seterrnum (run, errnum);
return -1; return -1;
} }
@ -224,13 +223,36 @@ skip_close:
return 0; return 0;
} }
static int __flush_extio (
xp_awk_run_t* run, int extio, const xp_char_t* name, int n)
{
int n2;
if (run->extio.handler[extio] != XP_NULL)
{
n2 = xp_awk_flushextio (run, XP_AWK_OUT_FILE, name);
if (n2 == -1)
{
if (run->errnum == XP_AWK_EIOHANDLER) n = -1;
else if (run->errnum == XP_AWK_ENOSUCHIO)
{
if (n != 0) n = -2;
}
else n = -99;
}
else if (n != -1) n = 0;
}
return n;
}
static int __bfn_fflush (xp_awk_t* awk, void* run) static int __bfn_fflush (xp_awk_t* awk, void* run)
{ {
xp_size_t nargs; xp_size_t nargs;
xp_awk_val_t* a0; xp_awk_val_t* a0;
xp_char_t* str0; xp_char_t* str0;
xp_size_t len0; xp_size_t len0;
int errnum, n, n2; int errnum, n;
nargs = xp_awk_getnargs (run); nargs = xp_awk_getnargs (run);
xp_assert (nargs >= 0 && nargs <= 1); xp_assert (nargs >= 0 && nargs <= 1);
@ -238,15 +260,15 @@ static int __bfn_fflush (xp_awk_t* awk, void* run)
if (nargs == 0) if (nargs == 0)
{ {
/* flush the console output */ /* flush the console output */
n = xp_awk_flushextio (run, n = xp_awk_flushextio (run, XP_AWK_OUT_CONSOLE, XP_T(""));
XP_AWK_OUT_CONSOLE, XP_T(""), &errnum);
if (n == -1 && if (n == -1 &&
errnum != XP_AWK_EIOHANDLER && ((xp_awk_run_t*)run)->errnum != XP_AWK_EIOHANDLER &&
errnum != XP_AWK_ENOSUCHIO) ((xp_awk_run_t*)run)->errnum != XP_AWK_ENOSUCHIO)
{ {
xp_awk_seterrnum (run, errnum);
return -1; return -1;
} }
/* fflush() should return -1 on EIOHANDLER and ENOSUCHIO */
} }
else else
{ {
@ -288,68 +310,18 @@ static int __bfn_fflush (xp_awk_t* awk, void* run)
/* flush the given extio */ /* flush the given extio */
n = 1; n = 1;
if (((xp_awk_run_t*)run)->extio.handler[XP_AWK_EXTIO_FILE] != XP_NULL) n = __flush_extio (
{ run, XP_AWK_EXTIO_FILE,
n2 = xp_awk_flushextio ( ((len0 == 0)? XP_NULL: str0), 1);
run, XP_AWK_OUT_FILE, if (n == -99) return -1;
((len0 == 0)? XP_NULL: str0), &errnum); n = __flush_extio (
if (n2 == -1) run, XP_AWK_EXTIO_PIPE,
{ ((len0 == 0)? XP_NULL: str0), n);
if (errnum == XP_AWK_EIOHANDLER) n = -1; if (n == -99) return -1;
else if (errnum == XP_AWK_ENOSUCHIO) n = __flush_extio (
{ run, XP_AWK_EXTIO_COPROC,
if (n != 0) n = -2; ((len0 == 0)? XP_NULL: str0), n);
} if (n == -99) return -1;
else
{
xp_awk_seterrnum (run, errnum);
return -1;
}
}
else if (n != -1) n = 0;
}
if (((xp_awk_run_t*)run)->extio.handler[XP_AWK_EXTIO_PIPE] != XP_NULL)
{
n2 = xp_awk_flushextio (
run, XP_AWK_OUT_PIPE,
((len0 == 0)? XP_NULL: str0), &errnum);
if (n2 == -1)
{
if (errnum == XP_AWK_EIOHANDLER) n = -1;
else if (errnum == XP_AWK_ENOSUCHIO)
{
if (n != 0) n = -2;
}
else
{
xp_awk_seterrnum (run, errnum);
return -1;
}
}
else if (n != -1) n = 0;
}
if (((xp_awk_run_t*)run)->extio.handler[XP_AWK_EXTIO_COPROC] != XP_NULL)
{
n2 = xp_awk_flushextio (
run, XP_AWK_OUT_COPROC,
((len0 == 0)? XP_NULL: str0), &errnum);
if (n2 == -1)
{
if (errnum == XP_AWK_EIOHANDLER) n = -1;
else if (errnum == XP_AWK_ENOSUCHIO)
{
if (n != 0) n = -2;
}
else
{
xp_awk_seterrnum (run, errnum);
return -1;
}
}
else if (n != -1) n = 0;
}
/* if n remains 1, no ip handlers have been defined for /* if n remains 1, no ip handlers have been defined for
* file, pipe, and coproc. so make fflush return -1. * file, pipe, and coproc. so make fflush return -1.

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.180 2006-08-27 10:45:36 bacon Exp $ * $Id: run.c,v 1.181 2006-08-27 15:29:21 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -179,9 +179,9 @@ static int __read_record (xp_awk_run_t* run);
static int __set_record ( static int __set_record (
xp_awk_run_t* run, const xp_char_t* str, xp_size_t len); xp_awk_run_t* run, const xp_char_t* str, xp_size_t len);
static int __split_record (xp_awk_run_t* run); static int __split_record (xp_awk_run_t* run);
static void __clear_record (xp_awk_run_t* run, xp_bool_t noline); static int __clear_record (xp_awk_run_t* run, xp_bool_t noline);
static int __recomp_record_fields (xp_awk_run_t* run, static int __recomp_record_fields (
xp_size_t lv, xp_char_t* str, xp_size_t len, int* errnum); xp_awk_run_t* run, xp_size_t lv, xp_char_t* str, xp_size_t len);
static xp_char_t* __idxnde_to_str ( static xp_char_t* __idxnde_to_str (
xp_awk_run_t* run, xp_awk_nde_t* nde, xp_size_t* len); xp_awk_run_t* run, xp_awk_nde_t* nde, xp_size_t* len);
@ -216,12 +216,6 @@ xp_awk_val_t* xp_awk_getglobal (void* run, xp_size_t idx)
int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val) int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
{ {
/*
xp_awk_refdownval (run, STACK_GLOBAL(((xp_awk_run_t*)run),idx));
STACK_GLOBAL(((xp_awk_run_t*)run),idx) = val;
xp_awk_refupval (val);
*/
xp_awk_val_t* old = STACK_GLOBAL((xp_awk_run_t*)run,idx); xp_awk_val_t* old = STACK_GLOBAL((xp_awk_run_t*)run,idx);
if (old->type == XP_AWK_VAL_MAP) if (old->type == XP_AWK_VAL_MAP)
{ {
@ -230,8 +224,22 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
PANIC_I ((xp_awk_run_t*)run, XP_AWK_EMAPTOSCALAR); PANIC_I ((xp_awk_run_t*)run, XP_AWK_EMAPTOSCALAR);
} }
/* TODO: if var->id.idxa == XP_AWK_GLOBAL_NF recompute $0, etc */ /* TODO: is this correct?? */
if (val->type == XP_AWK_VAL_MAP &&
(idx >= XP_AWK_GLOBAL_ARGC && idx <= XP_AWK_GLOBAL_SUBSEP) &&
idx != XP_AWK_GLOBAL_ARGV)
{
/* TODO: better error code */
PANIC_I ((xp_awk_run_t*)run, XP_AWK_ESCALARTOMAP);
}
if (idx == XP_AWK_GLOBAL_RS)
{
/* TODO: if idx == XP_AWK_GLOBAL_RS and it is multi-char sttring, compile it */ /* TODO: if idx == XP_AWK_GLOBAL_RS and it is multi-char sttring, compile it */
}
/* TODO: if idx == XP_AWK_GLOBAL_NF recompute $0, etc */
xp_awk_refdownval (run, old); xp_awk_refdownval (run, old);
STACK_GLOBAL((xp_awk_run_t*)run,idx) = val; STACK_GLOBAL((xp_awk_run_t*)run,idx) = val;
xp_awk_refupval (val); xp_awk_refupval (val);
@ -720,7 +728,6 @@ static int __run_pattern_blocks (xp_awk_run_t* run)
{ {
xp_ssize_t n; xp_ssize_t n;
xp_bool_t need_to_close = xp_false; xp_bool_t need_to_close = xp_false;
int errnum;
run->inrec.buf_pos = 0; run->inrec.buf_pos = 0;
run->inrec.buf_len = 0; run->inrec.buf_len = 0;
@ -737,9 +744,13 @@ static int __run_pattern_blocks (xp_awk_run_t* run)
x = __read_record (run); x = __read_record (run);
if (x == -1) if (x == -1)
{ {
int saved = run->errnum;
/* don't care about the result of input close */ /* don't care about the result of input close */
xp_awk_closeextio_read ( xp_awk_closeextio_read (
run, XP_AWK_IN_CONSOLE, XP_T(""), &errnum); run, XP_AWK_IN_CONSOLE, XP_T(""));
run->errnum = saved;
return -1; return -1;
} }
@ -748,8 +759,12 @@ static int __run_pattern_blocks (xp_awk_run_t* run)
if (__run_pattern_block_chain (run, run->awk->tree.chain) == -1) if (__run_pattern_block_chain (run, run->awk->tree.chain) == -1)
{ {
int saved = run->errnum;
xp_awk_closeextio_read ( xp_awk_closeextio_read (
run, XP_AWK_IN_CONSOLE, XP_T(""), &errnum); run, XP_AWK_IN_CONSOLE, XP_T(""));
run->errnum = saved;
return -1; return -1;
} }
} }
@ -764,13 +779,12 @@ static int __run_pattern_blocks (xp_awk_run_t* run)
if (need_to_close) if (need_to_close)
{ {
n = xp_awk_closeextio_read ( n = xp_awk_closeextio_read (
run, XP_AWK_IN_CONSOLE, XP_T(""), &errnum); run, XP_AWK_IN_CONSOLE, XP_T(""));
if (n == -1) if (n == -1)
{ {
if (errnum == XP_AWK_EIOHANDLER) if (run->errnum == XP_AWK_EIOHANDLER)
PANIC_I (run, XP_AWK_ECONINCLOSE); PANIC_I (run, XP_AWK_ECONINCLOSE);
else else return -1;
PANIC_I (run, errnum);
} }
} }
@ -901,24 +915,20 @@ static int __run_block (xp_awk_run_t* run, xp_awk_nde_blk_t* nde)
if (nde == XP_NULL) if (nde == XP_NULL)
{ {
/* blockless pattern - execute print $0*/ /* blockless pattern - execute print $0*/
int errnum;
xp_awk_refupval (run->inrec.d0); xp_awk_refupval (run->inrec.d0);
n = xp_awk_writeextio_nl (run, n = xp_awk_writeextio_nl (run,
XP_AWK_OUT_CONSOLE, XP_T(""), run->inrec.d0, &errnum); XP_AWK_OUT_CONSOLE, XP_T(""), run->inrec.d0);
if (n == -1) if (n == -1)
{ {
xp_awk_refdownval (run, run->inrec.d0); xp_awk_refdownval (run, run->inrec.d0);
if (errnum == XP_AWK_EIOHANDLER) if (run->errnum == XP_AWK_EIOHANDLER)
PANIC_I (run, XP_AWK_ECONOUTDATA); PANIC_I (run, XP_AWK_ECONOUTDATA);
else else return -1;
PANIC_I (run, errnum);
} }
xp_awk_refdownval (run, run->inrec.d0); xp_awk_refdownval (run, run->inrec.d0);
return 0; return 0;
} }
@ -1426,7 +1436,7 @@ static int __run_nextfile (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde)
/* TODO: some extentions such as nextfile "in/out"; /* TODO: some extentions such as nextfile "in/out";
* what about awk -i in1,in2,in3 -o out1,out2,out3 ? * what about awk -i in1,in2,in3 -o out1,out2,out3 ?
*/ */
int n, errnum; int n;
if (run->active_block == (xp_awk_nde_blk_t*)run->awk->tree.begin || if (run->active_block == (xp_awk_nde_blk_t*)run->awk->tree.begin ||
run->active_block == (xp_awk_nde_blk_t*)run->awk->tree.end) run->active_block == (xp_awk_nde_blk_t*)run->awk->tree.end)
@ -1434,14 +1444,12 @@ static int __run_nextfile (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde)
PANIC_I (run, XP_AWK_ENEXTFILECALL); PANIC_I (run, XP_AWK_ENEXTFILECALL);
} }
n = xp_awk_nextextio_read ( n = xp_awk_nextextio_read (run, XP_AWK_IN_CONSOLE, XP_T(""));
run, XP_AWK_IN_CONSOLE, XP_T(""), &errnum);
if (n == -1) if (n == -1)
{ {
if (errnum == XP_AWK_EIOHANDLER) if (run->errnum == XP_AWK_EIOHANDLER)
PANIC_I (run, XP_AWK_ECONINNEXT); PANIC_I (run, XP_AWK_ECONINNEXT);
else else return -1;
PANIC_I (run, errnum);
} }
if (n == 0) if (n == 0)
@ -1513,7 +1521,6 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
xp_char_t* key; xp_char_t* key;
xp_size_t key_len; xp_size_t key_len;
xp_awk_val_t* idx; xp_awk_val_t* idx;
int errnum;
xp_assert (var->idx != XP_NULL); xp_assert (var->idx != XP_NULL);
@ -1521,11 +1528,12 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
if (idx == XP_NULL) return -1; if (idx == XP_NULL) return -1;
xp_awk_refupval (idx); xp_awk_refupval (idx);
key = xp_awk_valtostr (idx, key = xp_awk_valtostr (
&errnum, xp_true, XP_NULL, &key_len); idx, &run->errnum,
xp_true, XP_NULL, &key_len);
xp_awk_refdownval (run, idx); xp_awk_refdownval (run, idx);
if (key == XP_NULL) PANIC_I (run, errnum); if (key == XP_NULL) return -1;
xp_awk_map_remove (map, key, key_len); xp_awk_map_remove (map, key, key_len);
xp_free (key); xp_free (key);
@ -1569,15 +1577,28 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
* the previous value because it was nil. */ * the previous value because it was nil. */
if (var->type == XP_AWK_NDE_GLOBAL || if (var->type == XP_AWK_NDE_GLOBAL ||
var->type == XP_AWK_NDE_GLOBALIDX) var->type == XP_AWK_NDE_GLOBALIDX)
STACK_GLOBAL(run,var->id.idxa) = tmp; {
if (xp_awk_setglobal (
run, var->id.idxa, tmp) == -1)
{
xp_awk_refupval (tmp);
xp_awk_refdownval (run, tmp);
return -1;
}
}
else if (var->type == XP_AWK_NDE_LOCAL || else if (var->type == XP_AWK_NDE_LOCAL ||
var->type == XP_AWK_NDE_LOCALIDX) var->type == XP_AWK_NDE_LOCALIDX)
{
STACK_LOCAL(run,var->id.idxa) = tmp; STACK_LOCAL(run,var->id.idxa) = tmp;
else STACK_ARG(run,var->id.idxa) = tmp;
xp_awk_refupval (tmp); xp_awk_refupval (tmp);
} }
else else
{
STACK_ARG(run,var->id.idxa) = tmp;
xp_awk_refupval (tmp);
}
}
else
{ {
xp_awk_map_t* map; xp_awk_map_t* map;
@ -1592,7 +1613,6 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
xp_char_t* key; xp_char_t* key;
xp_size_t key_len; xp_size_t key_len;
xp_awk_val_t* idx; xp_awk_val_t* idx;
int errnum;
xp_assert (var->idx != XP_NULL); xp_assert (var->idx != XP_NULL);
@ -1600,11 +1620,12 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
if (idx == XP_NULL) return -1; if (idx == XP_NULL) return -1;
xp_awk_refupval (idx); xp_awk_refupval (idx);
key = xp_awk_valtostr (idx, key = xp_awk_valtostr (
&errnum, xp_true, XP_NULL, &key_len); idx, &run->errnum,
xp_true, XP_NULL, &key_len);
xp_awk_refdownval (run, idx); xp_awk_refdownval (run, idx);
if (key == XP_NULL) PANIC_I (run, errnum); if (key == XP_NULL) return -1;
xp_awk_map_remove (map, key, key_len); xp_awk_map_remove (map, key, key_len);
xp_free (key); xp_free (key);
@ -1691,12 +1712,12 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
v = run->inrec.d0; v = run->inrec.d0;
xp_awk_refupval (v); xp_awk_refupval (v);
n = xp_awk_writeextio (run, p->out_type, dst, v, &errnum); n = xp_awk_writeextio (run, p->out_type, dst, v);
if (n < 0 && errnum != XP_AWK_EIOHANDLER) if (n < 0 && run->errnum != XP_AWK_EIOHANDLER)
{ {
if (out != XP_NULL) xp_free (out); if (out != XP_NULL) xp_free (out);
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);
PANIC_I (run, errnum); return -1;
} }
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);
/* TODO: how to handle n == -1 && errnum == XP_AWK_EIOHANDLER. /* TODO: how to handle n == -1 && errnum == XP_AWK_EIOHANDLER.
@ -1714,17 +1735,16 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
} }
xp_awk_refupval (v); xp_awk_refupval (v);
n = xp_awk_writeextio ( n = xp_awk_writeextio (run, p->out_type, dst, v);
run, p->out_type, dst, v, &errnum); if (n < 0 && run->errnum != XP_AWK_EIOHANDLER)
if (n < 0 && errnum != XP_AWK_EIOHANDLER)
{ {
if (out != XP_NULL) xp_free (out); if (out != XP_NULL) xp_free (out);
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);
PANIC_I (run, errnum); return -1;
} }
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);
/* TODO: how to handle n == -1 && errnum == XP_AWK_EIOHANDLER. /* TODO: how to handle n == -1 && run->errnum == XP_AWK_EIOHANDLER.
* that is the user handler returned an error... */ * that is the user handler returned an error... */
/* TODO: print proper field separator */ /* TODO: print proper field separator */
@ -1733,12 +1753,11 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
/* TODO: change xp_awk_val_nil to /* TODO: change xp_awk_val_nil to
* xp_awk_val_empty_string or something */ * xp_awk_val_empty_string or something */
n = xp_awk_writeextio_nl ( n = xp_awk_writeextio_nl (run, p->out_type, dst, xp_awk_val_nil);
run, p->out_type, dst, xp_awk_val_nil, &errnum); if (n < 0 && run->errnum != XP_AWK_EIOHANDLER)
if (n < 0 && errnum != XP_AWK_EIOHANDLER)
{ {
if (out != XP_NULL) xp_free (out); if (out != XP_NULL) xp_free (out);
PANIC_I (run, errnum); return -1;
} }
/* TODO: how to handle n == -1 && errnum == XP_AWK_EIOHANDLER. /* TODO: how to handle n == -1 && errnum == XP_AWK_EIOHANDLER.
@ -1977,20 +1996,6 @@ static xp_awk_val_t* __do_assignment_scalar (
} }
else if (var->type == XP_AWK_NDE_GLOBAL) else if (var->type == XP_AWK_NDE_GLOBAL)
{ {
#if 0
xp_awk_val_t* old = STACK_GLOBAL(run,var->id.idxa);
if (old->type == XP_AWK_VAL_MAP)
{
/* once a variable becomes an array,
* it cannot be changed to a scalar variable */
PANIC (run, XP_AWK_EMAPTOSCALAR);
}
/* TODO: if var->id.idxa == XP_AWK_GLOBAL_NF recompute $0, etc */
xp_awk_refdownval (run, old);
STACK_GLOBAL(run,var->id.idxa) = val;
xp_awk_refupval (val);
#endif
if (xp_awk_setglobal ( if (xp_awk_setglobal (
run, var->id.idxa, val) == -1) return XP_NULL; run, var->id.idxa, val) == -1) return XP_NULL;
} }
@ -2079,27 +2084,39 @@ static xp_awk_val_t* __do_assignment_map (
xp_awk_refdownval (run, tmp); xp_awk_refdownval (run, tmp);
PANIC (run, XP_AWK_ENOMEM); PANIC (run, XP_AWK_ENOMEM);
} }
xp_awk_refupval (tmp);
} }
else if (var->type == XP_AWK_NDE_GLOBALIDX) else if (var->type == XP_AWK_NDE_GLOBALIDX)
{ {
/* decrease the reference count of the previous value. /* decrease the reference count of the previous value.
* in fact, this is not necessary as map is always * in fact, this is not necessary as map is always
* xp_awk_val_nil here. */ * xp_awk_val_nil here. */
/*
xp_awk_refdownval (run, (xp_awk_val_t*)map); xp_awk_refdownval (run, (xp_awk_val_t*)map);
STACK_GLOBAL(run,var->id.idxa) = tmp; STACK_GLOBAL(run,var->id.idxa) = tmp;
xp_awk_refupval (tmp);
*/
if (xp_awk_setglobal (run, var->id.idxa, tmp) == -1)
{
xp_awk_refupval (tmp);
xp_awk_refdownval (run, tmp);
return XP_NULL;
}
} }
else if (var->type == XP_AWK_NDE_LOCALIDX) else if (var->type == XP_AWK_NDE_LOCALIDX)
{ {
xp_awk_refdownval (run, (xp_awk_val_t*)map); xp_awk_refdownval (run, (xp_awk_val_t*)map);
STACK_LOCAL(run,var->id.idxa) = tmp; STACK_LOCAL(run,var->id.idxa) = tmp;
xp_awk_refupval (tmp);
} }
else /* if (var->type == XP_AWK_NDE_ARGIDX) */ else /* if (var->type == XP_AWK_NDE_ARGIDX) */
{ {
xp_awk_refdownval (run, (xp_awk_val_t*)map); xp_awk_refdownval (run, (xp_awk_val_t*)map);
STACK_ARG(run,var->id.idxa) = tmp; STACK_ARG(run,var->id.idxa) = tmp;
xp_awk_refupval (tmp);
} }
xp_awk_refupval (tmp);
map = (xp_awk_val_map_t*) tmp; map = (xp_awk_val_map_t*) tmp;
} }
else if (map->type != XP_AWK_VAL_MAP) else if (map->type != XP_AWK_VAL_MAP)
@ -2153,12 +2170,16 @@ static xp_awk_val_t* __do_assignment_pos (
if (lv == 0) if (lv == 0)
{ {
__clear_record (run, xp_false); if (__clear_record (run, xp_false) == -1)
{
xp_free (str);
return XP_NULL;
}
if (xp_str_ncpy (&run->inrec.line, str, len) == (xp_size_t)-1) if (xp_str_ncpy (&run->inrec.line, str, len) == (xp_size_t)-1)
{ {
xp_free (str); xp_free (str);
PANIC (run, errnum); PANIC (run, XP_AWK_ENOMEM);
} }
xp_free (str); xp_free (str);
@ -2188,18 +2209,21 @@ static xp_awk_val_t* __do_assignment_pos (
if (__split_record (run) == -1) if (__split_record (run) == -1)
{ {
errnum = run->errnum;
__clear_record (run, xp_false); __clear_record (run, xp_false);
run->errnum = errnum;
return XP_NULL; return XP_NULL;
} }
} }
else else
{ {
if (__recomp_record_fields ( if (__recomp_record_fields (run, (xp_size_t)lv, str, len) == -1)
run, (xp_size_t)lv, str, len, &errnum) == -1)
{ {
errnum = run->errnum;
xp_free (str); xp_free (str);
__clear_record (run, xp_false); __clear_record (run, xp_false);
PANIC (run, errnum); run->errnum = errnum;
return XP_NULL;
} }
xp_free (str); xp_free (str);
@ -4396,18 +4420,19 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde)
PANIC (run, XP_AWK_ENOMEM); PANIC (run, XP_AWK_ENOMEM);
} }
n = xp_awk_readextio (run, p->in_type, dst, &buf, &errnum); n = xp_awk_readextio (run, p->in_type, dst, &buf);
if (in != XP_NULL) xp_free (in); if (in != XP_NULL) xp_free (in);
if (n < 0) if (n < 0)
{ {
if (errnum != XP_AWK_EIOHANDLER) if (run->errnum != XP_AWK_EIOHANDLER)
{ {
xp_str_close (&buf); xp_str_close (&buf);
PANIC (run, errnum); return XP_NULL;
} }
/* if errnum == XP_AWK_EIOHANDLER, make getline return -1 */ /* if run->errnum == XP_AWK_EIOHANDLER,
* make getline return -1 */
n = -1; n = -1;
} }
@ -4416,7 +4441,11 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde)
if (p->var == XP_NULL) if (p->var == XP_NULL)
{ {
/* set $0 with the input value */ /* set $0 with the input value */
__clear_record (run, xp_false); if (__clear_record (run, xp_false) == -1)
{
xp_str_close (&buf);
return XP_NULL;
}
if (__set_record (run, if (__set_record (run,
XP_STR_BUF(&buf), XP_STR_LEN(&buf)) == -1) XP_STR_BUF(&buf), XP_STR_LEN(&buf)) == -1)
@ -4502,19 +4531,16 @@ static void __raw_pop_times (xp_awk_run_t* run, xp_size_t times)
static int __read_record (xp_awk_run_t* run) static int __read_record (xp_awk_run_t* run)
{ {
xp_ssize_t n; xp_ssize_t n;
int errnum;
__clear_record (run, xp_false); if (__clear_record (run, xp_false) == -1) return -1;
n = xp_awk_readextio ( n = xp_awk_readextio (
run, XP_AWK_IN_CONSOLE, run, XP_AWK_IN_CONSOLE, XP_T(""), &run->inrec.line);
XP_T(""), &run->inrec.line, &errnum);
if (n < 0) if (n < 0)
{ {
if (errnum == XP_AWK_EIOHANDLER) if (run->errnum == XP_AWK_EIOHANDLER)
PANIC_I (run, XP_AWK_ECONINDATA); PANIC_I (run, XP_AWK_ECONINDATA);
else else return -1;
PANIC_I (run, errnum);
} }
if (n == 0) if (n == 0)
{ {
@ -4532,6 +4558,7 @@ static int __read_record (xp_awk_run_t* run)
static int __set_record (xp_awk_run_t* run, const xp_char_t* str, xp_size_t len) static int __set_record (xp_awk_run_t* run, const xp_char_t* str, xp_size_t len)
{ {
xp_awk_val_t* v; xp_awk_val_t* v;
int errnum;
v = xp_awk_makestrval (str, len); v = xp_awk_makestrval (str, len);
if (v == XP_NULL) if (v == XP_NULL)
@ -4548,7 +4575,9 @@ static int __set_record (xp_awk_run_t* run, const xp_char_t* str, xp_size_t len)
if (__split_record (run) == -1) if (__split_record (run) == -1)
{ {
errnum = run->errnum;
__clear_record (run, xp_false); __clear_record (run, xp_false);
run->errnum = errnum;
return -1; return -1;
} }
@ -4631,15 +4660,16 @@ static int __split_record (xp_awk_run_t* run)
/* set the number of fields */ /* set the number of fields */
v = xp_awk_makeintval (run, (xp_long_t)nflds); v = xp_awk_makeintval (run, (xp_long_t)nflds);
if (v == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM); if (v == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM);
xp_awk_setglobal (run, XP_AWK_GLOBAL_NF, v); if (xp_awk_setglobal (run, XP_AWK_GLOBAL_NF, v) == -1) return -1;
xp_assert (nflds == run->inrec.nflds); xp_assert (nflds == run->inrec.nflds);
return 0; return 0;
} }
static void __clear_record (xp_awk_run_t* run, xp_bool_t noline) static int __clear_record (xp_awk_run_t* run, xp_bool_t noline)
{ {
xp_size_t i; xp_size_t i;
int n = 0;
xp_awk_refdownval (run, run->inrec.d0); xp_awk_refdownval (run, run->inrec.d0);
run->inrec.d0 = xp_awk_val_nil; run->inrec.d0 = xp_awk_val_nil;
@ -4654,15 +4684,25 @@ static void __clear_record (xp_awk_run_t* run, xp_bool_t noline)
xp_awk_refdownval (run, run->inrec.flds[i].val); xp_awk_refdownval (run, run->inrec.flds[i].val);
} }
run->inrec.nflds = 0; run->inrec.nflds = 0;
xp_awk_setglobal (run, XP_AWK_GLOBAL_NF, xp_awk_val_zero);
if (xp_awk_setglobal (
run, XP_AWK_GLOBAL_NF, xp_awk_val_zero) == -1)
{
/* first of all, this should never happen.
* if it happened, it would return an error
* after all the clearance tasks */
n = -1;
}
} }
xp_assert (run->inrec.nflds == 0); xp_assert (run->inrec.nflds == 0);
if (!noline) xp_str_clear (&run->inrec.line); if (!noline) xp_str_clear (&run->inrec.line);
return n;
} }
static int __recomp_record_fields (xp_awk_run_t* run, static int __recomp_record_fields (
xp_size_t lv, xp_char_t* str, xp_size_t len, int* errnum) xp_awk_run_t* run, xp_size_t lv, xp_char_t* str, xp_size_t len)
{ {
xp_awk_val_t* v; xp_awk_val_t* v;
xp_char_t* ofsp = XP_NULL, * ofs; xp_char_t* ofsp = XP_NULL, * ofs;
@ -4682,14 +4722,14 @@ static int __recomp_record_fields (xp_awk_run_t* run,
run->inrec.flds, xp_sizeof(*run->inrec.flds) * max); run->inrec.flds, xp_sizeof(*run->inrec.flds) * max);
if (tmp == XP_NULL) if (tmp == XP_NULL)
{ {
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
#else #else
tmp = xp_malloc (xp_sizeof(*run->inrec.flds) * max); tmp = xp_malloc (xp_sizeof(*run->inrec.flds) * max);
if (tmp == XP_NULL) if (tmp == XP_NULL)
{ {
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
if (run->inrec.flds != XP_NULL) if (run->inrec.flds != XP_NULL)
@ -4714,7 +4754,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
if (v != xp_awk_val_nil) if (v != xp_awk_val_nil)
{ {
ofsp = xp_awk_valtostr ( ofsp = xp_awk_valtostr (
v, errnum, xp_true, XP_NULL, &ofs_len); v, &run->errnum, xp_true, XP_NULL, &ofs_len);
if (ofsp == XP_NULL) return -1; if (ofsp == XP_NULL) return -1;
ofs = ofsp; ofs = ofsp;
@ -4737,7 +4777,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
ofs, ofs_len) == (xp_size_t)-1) ofs, ofs_len) == (xp_size_t)-1)
{ {
if (ofsp != XP_NULL) xp_free (ofsp); if (ofsp != XP_NULL) xp_free (ofsp);
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
} }
@ -4755,7 +4795,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
&run->inrec.line, str, len) == (xp_size_t)-1) &run->inrec.line, str, len) == (xp_size_t)-1)
{ {
if (ofsp != XP_NULL) xp_free (ofsp); if (ofsp != XP_NULL) xp_free (ofsp);
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -4763,7 +4803,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
if (tmp == XP_NULL) if (tmp == XP_NULL)
{ {
if (ofsp != XP_NULL) xp_free (ofsp); if (ofsp != XP_NULL) xp_free (ofsp);
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -4784,7 +4824,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
&run->inrec.line, XP_T("")) == (xp_size_t)-1) &run->inrec.line, XP_T("")) == (xp_size_t)-1)
{ {
if (ofsp != XP_NULL) xp_free (ofsp); if (ofsp != XP_NULL) xp_free (ofsp);
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -4811,7 +4851,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
tmp->buf, tmp->len) == (xp_size_t)-1) tmp->buf, tmp->len) == (xp_size_t)-1)
{ {
if (ofsp != XP_NULL) xp_free (ofsp); if (ofsp != XP_NULL) xp_free (ofsp);
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
} }
@ -4826,11 +4866,12 @@ static int __recomp_record_fields (xp_awk_run_t* run,
v = xp_awk_makeintval (run, (xp_long_t)max); v = xp_awk_makeintval (run, (xp_long_t)max);
if (v == XP_NULL) if (v == XP_NULL)
{ {
*errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
xp_awk_setglobal (run, XP_AWK_GLOBAL_NF, v); if (xp_awk_setglobal (
run, XP_AWK_GLOBAL_NF, v) == -1) return -1;
} }
return 0; return 0;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.h,v 1.15 2006-07-12 07:25:15 bacon Exp $ * $Id: run.h,v 1.16 2006-08-27 15:29:21 bacon Exp $
*/ */
#ifndef _XP_AWK_RUN_H_ #ifndef _XP_AWK_RUN_H_
@ -75,7 +75,9 @@ enum
enum enum
{ {
/* this table should match __bvtab in parse.c */ /* this table should match __bvtab in parse.c.
* in addition, xp_awk_setglobal also counts
* on the order of these values */
XP_AWK_GLOBAL_ARGC, XP_AWK_GLOBAL_ARGC,
XP_AWK_GLOBAL_ARGIND, XP_AWK_GLOBAL_ARGIND,

View File

@ -1,5 +1,4 @@
BEGIN BEGIN {
{
print "more"; print "more";
//print | "more"; //print | "more";
//print > "echo"; //print > "echo";

15
ase/test/awk/t33.awk Normal file
View File

@ -0,0 +1,15 @@
BEGIN {
ARGV[1] = 20;
print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
delete NF;
print "NF[1]=", NF[1];
NF[1] = 20; // this line should not be allowed
print "AWK IMPLEMENTATION ERROR: hey... NF[1] = 20 has succeeded in the BEGIN block. your interpreter must be wrong";
print "NF[1]=", NF[1];
}
{
NF = 30;
}