diff --git a/ase/awk/awk.c b/ase/awk/awk.c index beec3850..df44a2c3 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.98 2006-12-13 14:13:06 bacon Exp $ + * $Id: awk.c,v 1.99 2006-12-15 14:58:14 bacon Exp $ */ #if defined(__BORLANDC__) @@ -11,16 +11,14 @@ static void __free_afn (void* awk, void* afn); -ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns) +ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns, int* errnum) { ase_awk_t* awk; - if (sysfns == ASE_NULL) return ASE_NULL; - - if (sysfns->malloc == ASE_NULL || - sysfns->free == ASE_NULL) return ASE_NULL; - - if (sysfns->is_upper == ASE_NULL || + if (sysfns == ASE_NULL || + sysfns->malloc == ASE_NULL || + sysfns->free == ASE_NULL || + sysfns->is_upper == ASE_NULL || sysfns->is_lower == ASE_NULL || sysfns->is_alpha == ASE_NULL || sysfns->is_digit == ASE_NULL || @@ -32,14 +30,16 @@ ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns) sysfns->is_cntrl == ASE_NULL || sysfns->is_punct == ASE_NULL || sysfns->to_upper == ASE_NULL || - sysfns->to_lower == ASE_NULL) return ASE_NULL; - - if (sysfns->sprintf == ASE_NULL || - sysfns->aprintf == ASE_NULL || - sysfns->dprintf == ASE_NULL || - sysfns->abort == ASE_NULL) return ASE_NULL; - - if (sysfns->pow == ASE_NULL) return ASE_NULL; + sysfns->to_lower == ASE_NULL || + sysfns->pow == ASE_NULL || + sysfns->sprintf == ASE_NULL || + sysfns->aprintf == ASE_NULL || + sysfns->dprintf == ASE_NULL || + sysfns->abort == ASE_NULL) + { + *errnum = ASE_AWK_ESYSFNS; + return ASE_NULL; + } #if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) awk = (ase_awk_t*) malloc (ASE_SIZEOF(ase_awk_t)); @@ -47,7 +47,11 @@ ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns) awk = (ase_awk_t*) sysfns->malloc ( ASE_SIZEOF(ase_awk_t), sysfns->custom_data); #endif - if (awk == ASE_NULL) return ASE_NULL; + if (awk == ASE_NULL) + { + *errnum = ASE_AWK_ENOMEM; + return ASE_NULL; + } /* it uses the built-in ase_awk_memset because awk is not * fully initialized yet */ @@ -64,6 +68,7 @@ ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns) if (ase_awk_str_open (&awk->token.name, 128, awk) == ASE_NULL) { ASE_AWK_FREE (awk, awk); + *errnum = ASE_AWK_ENOMEM; return ASE_NULL; } @@ -73,6 +78,7 @@ ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns) { ase_awk_str_close (&awk->token.name); ASE_AWK_FREE (awk, awk); + *errnum = ASE_AWK_ENOMEM; return ASE_NULL; } @@ -81,6 +87,7 @@ ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns) ase_awk_str_close (&awk->token.name); ase_awk_map_close (&awk->tree.afns); ASE_AWK_FREE (awk, awk); + *errnum = ASE_AWK_ENOMEM; return ASE_NULL; } @@ -90,6 +97,7 @@ ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns) ase_awk_map_close (&awk->tree.afns); ase_awk_tab_close (&awk->parse.globals); ASE_AWK_FREE (awk, awk); + *errnum = ASE_AWK_ENOMEM; return ASE_NULL; } @@ -100,6 +108,7 @@ ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns) ase_awk_tab_close (&awk->parse.globals); ase_awk_tab_close (&awk->parse.locals); ASE_AWK_FREE (awk, awk); + *errnum = ASE_AWK_ENOMEM; return ASE_NULL; } diff --git a/ase/awk/awk.h b/ase/awk/awk.h index d991bde2..2cce5a9b 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.165 2006-12-14 07:55:51 bacon Exp $ + * $Id: awk.h,v 1.166 2006-12-15 14:58:14 bacon Exp $ */ #ifndef _ASE_AWK_AWK_H_ @@ -19,22 +19,22 @@ typedef struct ase_awk_runios_t ase_awk_runios_t; typedef struct ase_awk_runcbs_t ase_awk_runcbs_t; typedef struct ase_awk_runarg_t ase_awk_runarg_t; -typedef void* (*ase_awk_malloc_t) (ase_size_t n, void* custom_data); +typedef void* (*ase_awk_malloc_t) (ase_size_t n, void* custom_data); typedef void* (*ase_awk_realloc_t) (void* ptr, ase_size_t n, void* custom_data); -typedef void (*ase_awk_free_t) (void* ptr, void* custom_data); -typedef void* (*ase_awk_memcpy_t) (void* dst, const void* src, ase_size_t n); -typedef void* (*ase_awk_memset_t) (void* dst, int val, ase_size_t n); +typedef void (*ase_awk_free_t) (void* ptr, void* custom_data); +typedef void* (*ase_awk_memcpy_t) (void* dst, const void* src, ase_size_t n); +typedef void* (*ase_awk_memset_t) (void* dst, int val, ase_size_t n); typedef ase_bool_t (*ase_awk_isctype_t) (ase_cint_t c); typedef ase_cint_t (*ase_awk_toctype_t) (ase_cint_t c); typedef ase_real_t (*ase_awk_pow_t) (ase_real_t x, ase_real_t y); + typedef int (*ase_awk_sprintf_t) ( ase_char_t* buf, ase_size_t size, const ase_char_t* fmt, ...); typedef void (*ase_awk_aprintf_t) (const ase_char_t* fmt, ...); typedef void (*ase_awk_dprintf_t) (const ase_char_t* fmt, ...); -typedef void (*ase_awk_abort_t) (void); - -typedef void (*ase_awk_lock_t) (ase_awk_t* awk, void* custom_data); +typedef void (*ase_awk_abort_t) (void); +typedef void (*ase_awk_lock_t) (ase_awk_t* awk, void* custom_data); typedef ase_ssize_t (*ase_awk_io_t) ( int cmd, void* arg, ase_char_t* data, ase_size_t count); @@ -183,11 +183,14 @@ enum /* support getline and print */ ASE_AWK_EXTIO = (1 << 8), + /* support co-process */ + ASE_AWK_COPROC = (1 << 9), + /* support blockless patterns */ - ASE_AWK_BLOCKLESS = (1 << 9), + ASE_AWK_BLOCKLESS = (1 << 10), /* use 1 as the start index for string operations */ - ASE_AWK_STRINDEXONE = (1 << 10), + ASE_AWK_STRINDEXONE = (1 << 11), /* strip off leading and trailing spaces when splitting a record * into fields with a regular expression. @@ -202,13 +205,13 @@ enum * The program splits " a b c " into [a], [b], [c] when this * option is on while into [], [a], [b], [c], [] when it is off. */ - ASE_AWK_STRIPSPACES = (1 << 11), + ASE_AWK_STRIPSPACES = (1 << 12), /* enable the nextoutfile keyword */ - ASE_AWK_NEXTOFILE = (1 << 12), + ASE_AWK_NEXTOFILE = (1 << 13), /* a newline terminates a statement */ - ASE_AWK_NEWLINE = (1 << 13) + ASE_AWK_NEWLINE = (1 << 14) }; /* error code */ @@ -220,10 +223,12 @@ enum ASE_AWK_EEXIST, /* existing data found */ ASE_AWK_ENOENT, /* no such data entry found */ ASE_AWK_EACCES, /* access denied */ + ASE_AWK_ERUNTIME, /* run-time error */ ASE_AWK_ERUNNING, /* there are running instances */ ASE_AWK_ETOOMANYRUNS, /* too many running instances */ ASE_AWK_ERECURSION, /* recursion too deep */ + ASE_AWK_ESYSFNS, /* system functions not proper */ ASE_AWK_ESRCINOPEN, ASE_AWK_ESRCINCLOSE, @@ -383,7 +388,7 @@ enum extern "C" { #endif -ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns); +ase_awk_t* ase_awk_open (const ase_awk_sysfns_t* sysfns, int* errnum); int ase_awk_close (ase_awk_t* awk); int ase_awk_clear (ase_awk_t* awk); diff --git a/ase/awk/err.c b/ase/awk/err.c index 103e882f..f0d81200 100644 --- a/ase/awk/err.c +++ b/ase/awk/err.c @@ -1,5 +1,5 @@ /* - * $Id: err.c,v 1.58 2006-12-12 05:16:29 bacon Exp $ + * $Id: err.c,v 1.59 2006-12-15 14:58:14 bacon Exp $ */ #include @@ -23,6 +23,7 @@ const ase_char_t* ase_awk_geterrstr (int errnum) ASE_T("one or more running instances"), ASE_T("too many running instances"), ASE_T("recursion too deep"), + ASE_T("system functions not provided or not proper"), ASE_T("cannot open source input"), ASE_T("cannot close source input"), diff --git a/ase/awk/jni.c b/ase/awk/jni.c index 563d12de..638ee9ed 100644 --- a/ase/awk/jni.c +++ b/ase/awk/jni.c @@ -1,5 +1,5 @@ /* - * $Id: jni.c,v 1.40 2006-12-13 14:16:12 bacon Exp $ + * $Id: jni.c,v 1.41 2006-12-15 14:58:15 bacon Exp $ */ #include @@ -182,7 +182,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj) jthrowable except; ase_awk_t* awk; ase_awk_sysfns_t sysfns; - int opt; + int opt, errnum; memset (&sysfns, 0, sizeof(sysfns)); sysfns.malloc = __awk_malloc; @@ -211,7 +211,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj) sysfns.dprintf = __awk_dprintf; sysfns.abort = abort; - awk = ase_awk_open (&sysfns); + awk = ase_awk_open (&sysfns, &errnum); if (awk == NULL) { except = (*env)->FindClass (env, CLASS_EXCEPTION); diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 8486561c..4a98d788 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.221 2006-12-12 05:16:30 bacon Exp $ + * $Id: parse.c,v 1.222 2006-12-15 14:58:15 bacon Exp $ */ #include @@ -3608,7 +3608,7 @@ static int __get_token (ase_awk_t* awk) ADD_TOKEN_CHAR (awk, c); GET_CHAR (awk); } - else if (c == ASE_T('&')) + else if ((awk->option & ASE_AWK_COPROC) && c == ASE_T('&')) { SET_TOKEN_TYPE (awk, TOKEN_BORAND); ADD_TOKEN_CHAR (awk, c); diff --git a/ase/test/awk/awk.c b/ase/test/awk/awk.c index 7b1d10a6..25509d01 100644 --- a/ase/test/awk/awk.c +++ b/ase/test/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.136 2006-12-13 14:17:01 bacon Exp $ + * $Id: awk.c,v 1.137 2006-12-15 14:58:37 bacon Exp $ */ #include @@ -739,7 +739,7 @@ static int __main (int argc, ase_char_t* argv[]) ase_awk_runarg_t runarg[10]; ase_awk_sysfns_t sysfns; struct src_io src_io = { NULL, NULL }; - int opt, i, file_count = 0; + int opt, i, file_count = 0, errnum; #ifdef _WIN32 sysfns_data_t sysfns_data; #endif @@ -753,6 +753,7 @@ static int __main (int argc, ase_char_t* argv[]) ASE_AWK_SHADING | ASE_AWK_SHIFT | ASE_AWK_EXTIO | + /*ASE_AWK_COPROC |*/ ASE_AWK_BLOCKLESS | ASE_AWK_STRINDEXONE | ASE_AWK_STRIPSPACES | @@ -829,12 +830,14 @@ static int __main (int argc, ase_char_t* argv[]) sysfns.custom_data = &sysfns_data; #endif - if ((awk = ase_awk_open(&sysfns)) == ASE_NULL) + if ((awk = ase_awk_open(&sysfns, &errnum)) == ASE_NULL) { #ifdef _WIN32 HeapDestroy (sysfns_data.heap); #endif - xp_printf (ASE_T("Error: cannot open awk\n")); + xp_printf ( + ASE_T("ERROR: cannot parse awk [%d] %s\n"), + errnum, ase_awk_geterrstr(errnum)); return -1; }