*** empty log message ***

This commit is contained in:
hyung-hwan 2006-12-17 14:56:07 +00:00
parent b4d8b06a66
commit 0f31bffe69
10 changed files with 106 additions and 177 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.168 2006-12-16 16:12:07 bacon Exp $ * $Id: awk.h,v 1.169 2006-12-17 14:56:05 bacon Exp $
*/ */
#ifndef _ASE_AWK_AWK_H_ #ifndef _ASE_AWK_AWK_H_
@ -319,14 +319,14 @@ enum
ASE_AWK_ESCALARTOMAP, /* cannot change a scalar value to a map */ ASE_AWK_ESCALARTOMAP, /* cannot change a scalar value to a map */
ASE_AWK_EMAPNOTALLOWED, /* a map is not allowed */ ASE_AWK_EMAPNOTALLOWED, /* a map is not allowed */
ASE_AWK_EVALTYPE, /* wrong value type */ ASE_AWK_EVALTYPE, /* wrong value type */
ASE_AWK_EPIPE, /* pipe operation error */
ASE_AWK_ENEXTCALL, /* next called from BEGIN or END */ ASE_AWK_ENEXTCALL, /* next called from BEGIN or END */
ASE_AWK_ENEXTFILECALL, /* nextfile called from BEGIN or END */ ASE_AWK_ENEXTFILECALL, /* nextfile called from BEGIN or END */
ASE_AWK_EIOIMPL, /* wrong user io handler implementation */ ASE_AWK_EIOIMPL, /* wrong user io handler implementation */
ASE_AWK_EBFNIMPL, /* wrong builtin function implementation */ ASE_AWK_EBFNIMPL, /* wrong builtin function implementation */
ASE_AWK_EBFNFAIL, /* builtin function handler failed */ ASE_AWK_EBFNFAIL, /* builtin function handler failed */
ASE_AWK_ENOSUCHIO, /* no such io name found */ ASE_AWK_ENOSUCHIO, /* no such io name found */
ASE_AWK_EIOHANDLER, /* io handler has returned an error */ ASE_AWK_EIOHANDLER, /* i/o callback returned an error */
ASE_AWK_EIONAME, /* invalid i/o name */
ASE_AWK_EFMTARG, /* arguments to format string not sufficient */ ASE_AWK_EFMTARG, /* arguments to format string not sufficient */
ASE_AWK_EFMTCONV, /* recursion detected in format conversion */ ASE_AWK_EFMTCONV, /* recursion detected in format conversion */
ASE_AWK_ECONVFMTCHAR, /* an invalid character found in CONVFMT */ ASE_AWK_ECONVFMTCHAR, /* an invalid character found in CONVFMT */
@ -451,9 +451,12 @@ void* ase_awk_getruncustomdata (ase_awk_run_t* awk);
/* functions to manipulate the run-time error */ /* functions to manipulate the run-time error */
int ase_awk_getrunerrnum (ase_awk_run_t* run); int ase_awk_getrunerrnum (ase_awk_run_t* run);
int ase_awk_getrunerrlin (ase_awk_run_t* run);
const ase_char_t* ase_awk_getrunerrmsg (ase_awk_run_t* run); const ase_char_t* ase_awk_getrunerrmsg (ase_awk_run_t* run);
void ase_awk_setrunerrnum (ase_awk_run_t* run, int errnum); void ase_awk_setrunerrnum (ase_awk_run_t* run, int errnum);
void ase_awk_setrunerrmsg (ase_awk_run_t* run, const ase_char_t* msg); void ase_awk_setrunerror (
ase_awk_run_t* run, int errnum,
ase_size_t errlin, const ase_char_t* msg);
/* functions to manipulate built-in functions */ /* functions to manipulate built-in functions */
void* ase_awk_addbfn ( void* ase_awk_addbfn (

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk_i.h,v 1.92 2006-12-16 16:12:07 bacon Exp $ * $Id: awk_i.h,v 1.93 2006-12-17 14:56:06 bacon Exp $
*/ */
#ifndef _ASE_AWK_AWKI_H_ #ifndef _ASE_AWK_AWKI_H_
@ -329,6 +329,7 @@ struct ase_awk_run_t
} depth; } depth;
int errnum; int errnum;
ase_size_t errlin;
ase_char_t errmsg[256]; ase_char_t errmsg[256];
void* custom_data; void* custom_data;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: err.c,v 1.60 2006-12-16 16:12:07 bacon Exp $ * $Id: err.c,v 1.61 2006-12-17 14:56:06 bacon Exp $
*/ */
#include <ase/awk/awk_i.h> #include <ase/awk/awk_i.h>
@ -117,14 +117,14 @@ const ase_char_t* ase_awk_geterrstr (int errnum)
ASE_T("cannot change a scalar value to a map"), ASE_T("cannot change a scalar value to a map"),
ASE_T("a map is not allowed"), ASE_T("a map is not allowed"),
ASE_T("wrong value type"), ASE_T("wrong value type"),
ASE_T("pipe operation error"),
ASE_T("next cannot be called from the BEGIN or END block"), ASE_T("next cannot be called from the BEGIN or END block"),
ASE_T("nextfile cannot be called from the BEGIN or END block"), ASE_T("nextfile cannot be called from the BEGIN or END block"),
ASE_T("wrong implementation of user-defined io handler"), ASE_T("wrong implementation of user-defined io handler"),
ASE_T("wrong implementation of built-in function handler"), ASE_T("wrong implementation of built-in function handler"),
ASE_T("built-in function handler returned an error"), ASE_T("built-in function handler returned an error"),
ASE_T("no such io name found"), ASE_T("no such io name found"),
ASE_T("io handler has returned an error"), ASE_T("i/o handler returned an error"),
ASE_T("invalid i/o name"),
ASE_T("not sufficient arguments to formatting sequence"), ASE_T("not sufficient arguments to formatting sequence"),
ASE_T("recursion detected in format conversion"), ASE_T("recursion detected in format conversion"),
ASE_T("invalid character in CONVFMT"), ASE_T("invalid character in CONVFMT"),

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.c,v 1.66 2006-12-09 11:49:03 bacon Exp $ * $Id: extio.c,v 1.67 2006-12-17 14:56:06 bacon Exp $
*/ */
#include <ase/awk/awk_i.h> #include <ase/awk/awk_i.h>
@ -147,12 +147,6 @@ int ase_awk_readextio (
{ {
ASE_AWK_FREE (run->awk, p->name); ASE_AWK_FREE (run->awk, p->name);
ASE_AWK_FREE (run->awk, p); ASE_AWK_FREE (run->awk, p);
/* TODO: use meaningful error code */
if (ase_awk_setglobal (
run, ASE_AWK_GLOBAL_ERRNO,
ase_awk_val_one) == -1) return -1;
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -229,18 +223,8 @@ int ase_awk_readextio (
if (n <= -1) if (n <= -1)
{ {
/* handler error. getline should return -1 */ /* handler error. getline should return -1 */
/* TODO: use meaningful error code */ run->errnum = ASE_AWK_EIOHANDLER;
if (ase_awk_setglobal ( ret = -1;
run, ASE_AWK_GLOBAL_ERRNO,
ase_awk_val_one) == -1)
{
ret = -1;
}
else
{
run->errnum = ASE_AWK_EIOHANDLER;
ret = -1;
}
break; break;
} }
@ -481,12 +465,6 @@ int ase_awk_writeextio_str (
{ {
ASE_AWK_FREE (run->awk, p->name); ASE_AWK_FREE (run->awk, p->name);
ASE_AWK_FREE (run->awk, p); ASE_AWK_FREE (run->awk, p);
/* TODO: use meaningful error code */
if (ase_awk_setglobal (
run, ASE_AWK_GLOBAL_ERRNO,
ase_awk_val_one) == -1) return -1;
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -526,11 +504,6 @@ int ase_awk_writeextio_str (
if (n <= -1) if (n <= -1)
{ {
/* TODO: use meaningful error code */
if (ase_awk_setglobal (
run, ASE_AWK_GLOBAL_ERRNO,
ase_awk_val_one) == -1) return -1;
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -586,11 +559,6 @@ int ase_awk_flushextio (
if (n <= -1) if (n <= -1)
{ {
/* TODO: use meaningful error code */
if (ase_awk_setglobal (
run, ASE_AWK_GLOBAL_ERRNO,
ase_awk_val_one) == -1) return -1;
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -604,10 +572,6 @@ int ase_awk_flushextio (
if (ok) return 0; if (ok) return 0;
/* there is no corresponding extio for name */ /* there is no corresponding extio for name */
/* TODO: use meaningful error code. but is this needed? */
if (ase_awk_setglobal (
run, ASE_AWK_GLOBAL_ERRNO, ase_awk_val_one) == -1) return -1;
run->errnum = ASE_AWK_ENOSUCHIO; run->errnum = ASE_AWK_ENOSUCHIO;
return -1; return -1;
} }
@ -805,7 +769,6 @@ int ase_awk_closeextio_read (
if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1) if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1)
{ {
/* this is not a run-time error.*/ /* this is not a run-time error.*/
/* TODO: set ERRNO */
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -868,7 +831,6 @@ int ase_awk_closeextio_write (
if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1) if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1)
{ {
/* this is not a run-time error.*/ /* this is not a run-time error.*/
/* TODO: set ERRNO */
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -887,7 +849,6 @@ int ase_awk_closeextio_write (
} }
/* this is not a run-time error */ /* this is not a run-time error */
/* TODO: set ERRNO */
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -910,7 +871,6 @@ int ase_awk_closeextio (ase_awk_run_t* run, const ase_char_t* name)
if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1) if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1)
{ {
/* this is not a run-time error.*/ /* this is not a run-time error.*/
/* TODO: set ERRNO */
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }
@ -929,7 +889,6 @@ int ase_awk_closeextio (ase_awk_run_t* run, const ase_char_t* name)
} }
/* this is not a run-time error */ /* this is not a run-time error */
/* TODO: set ERRNO */
run->errnum = ASE_AWK_EIOHANDLER; run->errnum = ASE_AWK_EIOHANDLER;
return -1; return -1;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: func.c,v 1.84 2006-11-29 14:52:06 bacon Exp $ * $Id: func.c,v 1.85 2006-12-17 14:56:06 bacon Exp $
*/ */
#include <ase/awk/awk_i.h> #include <ase/awk/awk_i.h>
@ -206,7 +206,6 @@ static int __bfn_close (
* closeextio_read or closeextio_write. */ * closeextio_read or closeextio_write. */
if (a0->type != ASE_AWK_VAL_STR) ASE_AWK_FREE (run->awk, name); if (a0->type != ASE_AWK_VAL_STR) ASE_AWK_FREE (run->awk, name);
n = -1; n = -1;
/* TODO: need to set ERRNO??? */
goto skip_close; goto skip_close;
} }
@ -219,7 +218,6 @@ static int __bfn_close (
if (a0->type != ASE_AWK_VAL_STR) if (a0->type != ASE_AWK_VAL_STR)
ASE_AWK_FREE (run->awk, name); ASE_AWK_FREE (run->awk, name);
n = -1; n = -1;
/* TODO: need to set ERRNO??? */
goto skip_close; goto skip_close;
} }
} }
@ -313,7 +311,7 @@ static int __bfn_fflush (
} }
/* the target name contains a null character. /* the target name contains a null character.
* make fflush return -1 and set ERRNO accordingly */ * make fflush return -1 */
ptr = str0; end = str0 + len0; ptr = str0; end = str0 + len0;
while (ptr < end) while (ptr < end)
{ {

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parse.c,v 1.223 2006-12-16 14:43:50 bacon Exp $ * $Id: parse.c,v 1.224 2006-12-17 14:56:06 bacon Exp $
*/ */
#include <ase/awk/awk_i.h> #include <ase/awk/awk_i.h>
@ -273,7 +273,6 @@ static struct __bvent __bvtab[] =
{ ASE_T("ARGV"), 4, 0 }, { ASE_T("ARGV"), 4, 0 },
{ ASE_T("CONVFMT"), 7, 0 }, { ASE_T("CONVFMT"), 7, 0 },
{ ASE_T("ENVIRON"), 7, 0 }, { ASE_T("ENVIRON"), 7, 0 },
{ ASE_T("ERRNO"), 5, 0 },
{ ASE_T("FILENAME"), 8, 0 }, { ASE_T("FILENAME"), 8, 0 },
{ ASE_T("FNR"), 3, 0 }, { ASE_T("FNR"), 3, 0 },
{ ASE_T("FS"), 2, 0 }, { ASE_T("FS"), 2, 0 },
@ -1024,7 +1023,6 @@ static ase_awk_nde_t* __parse_block (ase_awk_t* awk, ase_bool_t is_top)
/* if (head == ASE_NULL) tmp = 0; */ /* if (head == ASE_NULL) tmp = 0; */
block->type = ASE_AWK_NDE_BLK; block->type = ASE_AWK_NDE_BLK;
//block->line =
block->next = ASE_NULL; block->next = ASE_NULL;
block->body = head; block->body = head;
@ -3253,8 +3251,11 @@ static ase_awk_nde_t* __parse_print (ase_awk_t* awk, int type)
ase_awk_nde_print_t* nde; ase_awk_nde_print_t* nde;
ase_awk_nde_t* args = ASE_NULL; ase_awk_nde_t* args = ASE_NULL;
ase_awk_nde_t* out = ASE_NULL; ase_awk_nde_t* out = ASE_NULL;
ase_size_t line;
int out_type; int out_type;
line = awk->token.prev.line;
if (!MATCH(awk,TOKEN_SEMICOLON) && if (!MATCH(awk,TOKEN_SEMICOLON) &&
!MATCH(awk,TOKEN_GT) && !MATCH(awk,TOKEN_GT) &&
!MATCH(awk,TOKEN_RSHIFT) && !MATCH(awk,TOKEN_RSHIFT) &&
@ -3391,6 +3392,7 @@ static ase_awk_nde_t* __parse_print (ase_awk_t* awk, int type)
} }
nde->type = type; nde->type = type;
nde->line = line;
nde->next = ASE_NULL; nde->next = ASE_NULL;
nde->args = args; nde->args = args;
nde->out_type = out_type; nde->out_type = out_type;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.303 2006-12-16 16:22:05 bacon Exp $ * $Id: run.c,v 1.304 2006-12-17 14:56:06 bacon Exp $
*/ */
#include <ase/awk/awk_i.h> #include <ase/awk/awk_i.h>
@ -547,6 +547,11 @@ int ase_awk_getrunerrnum (ase_awk_run_t* run)
return run->errnum; return run->errnum;
} }
int ase_awk_getrunerrlin (ase_awk_run_t* run)
{
return run->errlin;
}
const ase_char_t* ase_awk_getrunerrmsg (ase_awk_run_t* run) const ase_char_t* ase_awk_getrunerrmsg (ase_awk_run_t* run)
{ {
if (run->errmsg[0] == ASE_T('\0')) if (run->errmsg[0] == ASE_T('\0'))
@ -558,12 +563,18 @@ const ase_char_t* ase_awk_getrunerrmsg (ase_awk_run_t* run)
void ase_awk_setrunerrnum (ase_awk_run_t* run, int errnum) void ase_awk_setrunerrnum (ase_awk_run_t* run, int errnum)
{ {
run->errnum = errnum; run->errnum = errnum;
run->errlin = 0;
run->errmsg[0] = ASE_T('\0'); run->errmsg[0] = ASE_T('\0');
} }
void ase_awk_setrunerrmsg (ase_awk_run_t* run, const ase_char_t* msg) void ase_awk_setrunerror (
ase_awk_run_t* run, int errnum,
ase_size_t errlin, const ase_char_t* msg)
{ {
ase_awk_strxcpy (run->errmsg, ASE_COUNTOF(run->errmsg), msg); run->errnum = errnum;
run->errlin = errlin;
if (msg == ASE_NULL) run->errmsg[0] = ASE_T('\0');
else ase_awk_strxcpy (run->errmsg, ASE_COUNTOF(run->errmsg), msg);
} }
int ase_awk_run (ase_awk_t* awk, int ase_awk_run (ase_awk_t* awk,
@ -619,8 +630,10 @@ int ase_awk_run (ase_awk_t* awk,
return -1; return -1;
} }
/* clear the run error code */ /* clear the run error */
run->errnum = ASE_AWK_ENOERR; run->errnum = ASE_AWK_ENOERR;
run->errlin = 0;
run->errmsg[0] = ASE_T('\0');
/* execute the start callback if it exists */ /* execute the start callback if it exists */
if (runcbs != ASE_NULL && runcbs->on_start != ASE_NULL) if (runcbs != ASE_NULL && runcbs->on_start != ASE_NULL)
@ -1494,7 +1507,7 @@ static int __run_pattern_blocks (ase_awk_run_t* run)
} }
/* In case of getline, the code would make getline return -1, /* In case of getline, the code would make getline return -1,
* set ERRNO, make this function return 0 after having checked * and make this function return 0 after having checked
* if closextio has returned -1 and errnum has been set to * if closextio has returned -1 and errnum has been set to
* ASE_AWK_EIOHANDLER. But this part of the code ends the input for * ASE_AWK_EIOHANDLER. But this part of the code ends the input for
* the implicit pattern-block loop, which is totally different * the implicit pattern-block loop, which is totally different
@ -2479,7 +2492,12 @@ static int __run_print (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
/* if so, resolve the destination name */ /* if so, resolve the destination name */
v = __eval_expression (run, nde->out); v = __eval_expression (run, nde->out);
if (v == ASE_NULL) return -1; if (v == ASE_NULL)
{
ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1;
}
ase_awk_refupval (run, v); ase_awk_refupval (run, v);
out = ase_awk_valtostr ( out = ase_awk_valtostr (
@ -2487,35 +2505,20 @@ static int __run_print (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
if (out == ASE_NULL) if (out == ASE_NULL)
{ {
ase_awk_refdownval (run, v); ase_awk_refdownval (run, v);
//ase_awk_setrunerrline (nde->line); ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
ase_awk_refdownval (run, v); ase_awk_refdownval (run, v);
if (len <= 0) if (len <= 0)
{ {
/* if the destination name is empty, it skips the /* the destination name is empty */
* writing and flags an error and ERRNO */
ase_awk_val_t* no;
ASE_AWK_FREE (run->awk, out); ASE_AWK_FREE (run->awk, out);
ase_awk_setrunerror (
no = ase_awk_makeintval (run, ASE_AWK_ENOENT); run, ASE_AWK_EIONAME, nde->line,
if (no == ASE_NULL) ASE_T("destination name empty in print"));
{ return -1;
run->errnum = ASE_AWK_ENOMEM;
return -1;
}
ase_awk_refupval (run, no);
if (ase_awk_setglobal (run, ASE_AWK_GLOBAL_ERRNO, no) == -1)
{
ase_awk_refdownval (run, no);
return -1;
}
ase_awk_refdownval (run, no);
goto skip_write;
} }
/* it needs to check if the destination name contains /* it needs to check if the destination name contains
@ -2524,27 +2527,12 @@ static int __run_print (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
{ {
if (out[--len] == ASE_T('\0')) if (out[--len] == ASE_T('\0'))
{ {
/* if so, the error is flagged thru ERRNO */ /* if so, it skips writing */
ase_awk_val_t* no;
ASE_AWK_FREE (run->awk, out); ASE_AWK_FREE (run->awk, out);
ase_awk_setrunerror (
no = ase_awk_makeintval (run, ASE_AWK_ENOENT); run, ASE_AWK_EIONAME, nde->line,
if (no == ASE_NULL) ASE_T("destination name containing a null character in print"));
{ return -1;
run->errnum = ASE_AWK_ENOMEM;
return -1;
}
ase_awk_refupval (run, no);
if (ase_awk_setglobal (run, ASE_AWK_GLOBAL_ERRNO, no) == -1)
{
ase_awk_refdownval (run, no);
return -1;
}
ase_awk_refdownval (run, no);
goto skip_write;
} }
} }
} }
@ -2561,14 +2549,13 @@ static int __run_print (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
run, nde->out_type, dst, run, nde->out_type, dst,
ASE_AWK_STR_BUF(&run->inrec.line), ASE_AWK_STR_BUF(&run->inrec.line),
ASE_AWK_STR_LEN(&run->inrec.line)); ASE_AWK_STR_LEN(&run->inrec.line));
if (n < 0 && run->errnum != ASE_AWK_EIOHANDLER) if (n < 0 /*&& run->errnum != ASE_AWK_EIOHANDLER*/)
{ {
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
//ase_awk_setrunerrline (nde->line); ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
/* TODO: how to handle n == -1 && errnum == ASE_AWK_EIOHANDLER.
* that is the user handler returned an error... */
} }
else else
{ {
@ -2592,10 +2579,11 @@ static int __run_print (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
run, nde->out_type, dst, run, nde->out_type, dst,
run->global.ofs.ptr, run->global.ofs.ptr,
run->global.ofs.len); run->global.ofs.len);
if (n < 0 && run->errnum != ASE_AWK_EIOHANDLER) if (n < 0 /*&& run->errnum != ASE_AWK_EIOHANDLER*/)
{ {
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
//ase_awk_setrunerrline (nde->line); ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
} }
@ -2604,25 +2592,23 @@ static int __run_print (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
if (v == ASE_NULL) if (v == ASE_NULL)
{ {
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
//ase_awk_setrunerrline (nde->line); ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
ase_awk_refupval (run, v); ase_awk_refupval (run, v);
n = ase_awk_writeextio_val (run, nde->out_type, dst, v); n = ase_awk_writeextio_val (run, nde->out_type, dst, v);
if (n < 0 && run->errnum != ASE_AWK_EIOHANDLER) if (n < 0 /*&& run->errnum != ASE_AWK_EIOHANDLER*/)
{ {
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
ase_awk_refdownval (run, v); ase_awk_refdownval (run, v);
//ase_awk_setrunerrline (nde->line); ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
ase_awk_refdownval (run, v); ase_awk_refdownval (run, v);
/* TODO: how to handle n == -1 && run->errnum == ASE_AWK_EIOHANDLER.
* that is the user handler returned an error... */
} }
} }
@ -2630,18 +2616,14 @@ static int __run_print (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
n = ase_awk_writeextio_str ( n = ase_awk_writeextio_str (
run, nde->out_type, dst, run, nde->out_type, dst,
run->global.ors.ptr, run->global.ors.len); run->global.ors.ptr, run->global.ors.len);
if (n < 0 && run->errnum != ASE_AWK_EIOHANDLER) if (n < 0 /*&& run->errnum != ASE_AWK_EIOHANDLER*/)
{ {
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
//ase_awk_setrunerrline (nde->line); ase_awk_setrunerror (run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
/* TODO: how to handle n == -1 && errnum == ASE_AWK_EIOHANDLER.
* that is the user handler returned an error... */
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
ase_awk_setglobal (run, ASE_AWK_GLOBAL_ERRNO, ase_awk_val_zero);
skip_write: skip_write:
return 0; return 0;
@ -2667,7 +2649,12 @@ static int __run_printf (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
ase_size_t len; ase_size_t len;
v = __eval_expression (run, nde->out); v = __eval_expression (run, nde->out);
if (v == ASE_NULL) return -1; if (v == ASE_NULL)
{
ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1;
}
ase_awk_refupval (run, v); ase_awk_refupval (run, v);
out = ase_awk_valtostr ( out = ase_awk_valtostr (
@ -2675,6 +2662,8 @@ static int __run_printf (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
if (out == ASE_NULL) if (out == ASE_NULL)
{ {
ase_awk_refdownval (run, v); ase_awk_refdownval (run, v);
ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
ase_awk_refdownval (run, v); ase_awk_refdownval (run, v);
@ -2682,25 +2671,11 @@ static int __run_printf (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
if (len <= 0) if (len <= 0)
{ {
/* the output destination name is empty. */ /* the output destination name is empty. */
ase_awk_val_t* no;
ASE_AWK_FREE (run->awk, out); ASE_AWK_FREE (run->awk, out);
ase_awk_setrunerror (
no = ase_awk_makeintval (run, ASE_AWK_ENOENT); run, ASE_AWK_EIONAME, nde->line,
if (no == ASE_NULL) ASE_T("destination name empty in printf"));
{ return -1;
run->errnum = ASE_AWK_ENOMEM;
return -1;
}
ase_awk_refupval (run, no);
if (ase_awk_setglobal (run, ASE_AWK_GLOBAL_ERRNO, no) == -1)
{
ase_awk_refdownval (run, no);
return -1;
}
ase_awk_refdownval (run, no);
goto skip_write;
} }
while (len > 0) while (len > 0)
@ -2709,26 +2684,11 @@ static int __run_printf (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
{ {
/* the output destination name contains a null /* the output destination name contains a null
* character. */ * character. */
ase_awk_val_t* no;
ASE_AWK_FREE (run->awk, out); ASE_AWK_FREE (run->awk, out);
ase_awk_setrunerror (
no = ase_awk_makeintval (run, ASE_AWK_ENOENT); run, ASE_AWK_EIONAME, nde->line,
if (no == ASE_NULL) ASE_T("destination name containing a null character in printf"));
{ return -1;
run->errnum = ASE_AWK_ENOMEM;
return -1;
}
ase_awk_refupval (run, no);
if (ase_awk_setglobal (run, ASE_AWK_GLOBAL_ERRNO, no) == -1)
{
ase_awk_refdownval (run, no);
return -1;
}
ase_awk_refdownval (run, no);
goto skip_write;
} }
} }
} }
@ -2753,6 +2713,7 @@ static int __run_printf (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
if (v == ASE_NULL) if (v == ASE_NULL)
{ {
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
ase_awk_setrunerror (run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
@ -2762,10 +2723,12 @@ static int __run_printf (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
/* the remaining arguments are ignored as the format cannot /* the remaining arguments are ignored as the format cannot
* contain any % characters */ * contain any % characters */
n = ase_awk_writeextio_val (run, nde->out_type, dst, v); n = ase_awk_writeextio_val (run, nde->out_type, dst, v);
if (n < 0 && run->errnum != ASE_AWK_EIOHANDLER) if (n < 0 /*&& run->errnum != ASE_AWK_EIOHANDLER*/)
{ {
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
ase_awk_refdownval (run, v); ase_awk_refdownval (run, v);
ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
} }
@ -2780,6 +2743,8 @@ static int __run_printf (ase_awk_run_t* run, ase_awk_nde_print_t* nde)
{ {
if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out); if (out != ASE_NULL) ASE_AWK_FREE (run->awk, out);
ase_awk_refdownval (run, v); ase_awk_refdownval (run, v);
ase_awk_setrunerror (
run, run->errnum, nde->line, ASE_NULL);
return -1; return -1;
} }
} }
@ -2804,7 +2769,7 @@ static int __formatted_output (
if (ptr == ASE_NULL) return -1; if (ptr == ASE_NULL) return -1;
n = ase_awk_writeextio_str (run, out_type, dst, ptr, len); n = ase_awk_writeextio_str (run, out_type, dst, ptr, len);
if (n < 0 && run->errnum != ASE_AWK_EIOHANDLER) return -1; if (n < 0 /*&& run->errnum != ASE_AWK_EIOHANDLER*/) return -1;
return 0; return 0;
} }
@ -5552,7 +5517,6 @@ static ase_awk_val_t* __eval_getline (ase_awk_run_t* run, ase_awk_nde_t* nde)
{ {
/* the input source name contains a null /* the input source name contains a null
* character. make getline return -1 */ * character. make getline return -1 */
/* TODO: set ERRNO */
ASE_AWK_FREE (run->awk, in); ASE_AWK_FREE (run->awk, in);
n = -1; n = -1;
goto skip_read; goto skip_read;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.h,v 1.29 2006-12-04 06:04:07 bacon Exp $ * $Id: run.h,v 1.30 2006-12-17 14:56:07 bacon Exp $
*/ */
#ifndef _ASE_AWK_RUN_H_ #ifndef _ASE_AWK_RUN_H_
@ -85,7 +85,6 @@ enum ase_awk_global_id_t
ASE_AWK_GLOBAL_ARGV, ASE_AWK_GLOBAL_ARGV,
ASE_AWK_GLOBAL_CONVFMT, ASE_AWK_GLOBAL_CONVFMT,
ASE_AWK_GLOBAL_ENVIRON, ASE_AWK_GLOBAL_ENVIRON,
ASE_AWK_GLOBAL_ERRNO,
ASE_AWK_GLOBAL_FILENAME, ASE_AWK_GLOBAL_FILENAME,
ASE_AWK_GLOBAL_FNR, ASE_AWK_GLOBAL_FNR,
ASE_AWK_GLOBAL_FS, ASE_AWK_GLOBAL_FS,

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.c,v 1.142 2006-12-17 13:12:08 bacon Exp $ * $Id: awk.c,v 1.143 2006-12-17 14:56:07 bacon Exp $
*/ */
#include <ase/awk/awk.h> #include <ase/awk/awk.h>
@ -281,7 +281,7 @@ static ase_ssize_t process_extio_pipe (
else if (epa->mode == ASE_AWK_EXTIO_PIPE_WRITE) else if (epa->mode == ASE_AWK_EXTIO_PIPE_WRITE)
mode = ASE_T("w"); mode = ASE_T("w");
else return -1; /* TODO: any way to set the error number? */ else return -1; /* TODO: any way to set the error number? */
awk_dprintf (ASE_T("opending %s of type %d (pipe)\n"), epa->name, epa->type); awk_dprintf (ASE_T("opening %s of type %d (pipe)\n"), epa->name, epa->type);
handle = awk_popen (epa->name, mode); handle = awk_popen (epa->name, mode);
if (handle == NULL) return -1; if (handle == NULL) return -1;
epa->handle = (void*)handle; epa->handle = (void*)handle;
@ -349,7 +349,7 @@ static ase_ssize_t process_extio_file (
mode = ASE_T("a"); mode = ASE_T("a");
else return -1; /* TODO: any way to set the error number? */ else return -1; /* TODO: any way to set the error number? */
awk_dprintf (ASE_T("opending %s of type %d (file)\n"), epa->name, epa->type); awk_dprintf (ASE_T("opening %s of type %d (file)\n"), epa->name, epa->type);
handle = awk_fopen (epa->name, mode); handle = awk_fopen (epa->name, mode);
if (handle == NULL) return -1; if (handle == NULL) return -1;
@ -648,10 +648,11 @@ static void on_run_end (
{ {
if (errnum != ASE_AWK_ENOERR) if (errnum != ASE_AWK_ENOERR)
{ {
//const ase_awk_t* errmsg = ase_awk_getrunerrmsg (run); awk_dprintf (ASE_T("AWK ENDED WITH AN ERROR\n"));
awk_dprintf ( awk_dprintf (ASE_T("CODE [%d] LINE [%u] %s\n"),
ASE_T("AWK ABOUT TO END WITH AN ERROR - [%d] %s\n"), errnum,
errnum, ase_awk_getrunerrmsg (run)); (unsigned int)ase_awk_getrunerrlin(run),
ase_awk_getrunerrmsg(run));
} }
else awk_dprintf (ASE_T("AWK ENDED SUCCESSFULLY\n")); else awk_dprintf (ASE_T("AWK ENDED SUCCESSFULLY\n"));

View File

@ -25,5 +25,7 @@ BEGIN {
print .0; print .0;
print 10; print 10;
print fflush ("abc");
} }