*** empty log message ***

This commit is contained in:
hyung-hwan 2006-08-29 15:01:45 +00:00
parent 7025893959
commit e6dc5c7a66
8 changed files with 86 additions and 20 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.102 2006-08-27 10:45:36 bacon Exp $ * $Id: awk.h,v 1.103 2006-08-29 15:01:44 bacon Exp $
*/ */
#ifndef _XP_AWK_AWK_H_ #ifndef _XP_AWK_AWK_H_
@ -170,6 +170,7 @@ enum
XP_AWK_ELXUNG, /* lexer failed to unget a character */ XP_AWK_ELXUNG, /* lexer failed to unget a character */
XP_AWK_EENDSRC, /* unexpected end of source */ XP_AWK_EENDSRC, /* unexpected end of source */
XP_AWK_EENDCOMMENT, /* unexpected end of a comment */
XP_AWK_EENDSTR, /* unexpected end of a string */ XP_AWK_EENDSTR, /* unexpected end of a string */
XP_AWK_EENDREX, /* unexpected end of a regular expression */ XP_AWK_EENDREX, /* unexpected end of a regular expression */
XP_AWK_ELBRACE, /* left brace expected */ XP_AWK_ELBRACE, /* left brace expected */

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk_i.h,v 1.46 2006-08-21 02:53:42 bacon Exp $ * $Id: awk_i.h,v 1.47 2006-08-29 15:01:44 bacon Exp $
*/ */
#ifndef _XP_AWK_AWKI_H_ #ifndef _XP_AWK_AWKI_H_
@ -189,6 +189,7 @@ struct xp_awk_run_t
{ {
xp_awk_io_t handler[XP_AWK_EXTIO_NUM]; xp_awk_io_t handler[XP_AWK_EXTIO_NUM];
xp_awk_extio_t* chain; xp_awk_extio_t* chain;
void* rs_rex;
} extio; } extio;
int errnum; int errnum;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: err.c,v 1.38 2006-08-23 15:41:46 bacon Exp $ * $Id: err.c,v 1.39 2006-08-29 15:01:44 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -43,6 +43,7 @@ const xp_char_t* xp_awk_geterrstr (int errnum)
XP_T("cannot unget character"), XP_T("cannot unget character"),
XP_T("unexpected end of source"), XP_T("unexpected end of source"),
XP_T("unexpected end of a comment"),
XP_T("unexpected end of a string"), XP_T("unexpected end of a string"),
XP_T("unexpected end of a regular expression"), XP_T("unexpected end of a regular expression"),
XP_T("left brace expected"), XP_T("left brace expected"),

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.c,v 1.36 2006-08-27 15:29:20 bacon Exp $ * $Id: extio.c,v 1.37 2006-08-29 15:01:44 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -285,16 +285,15 @@ int xp_awk_readextio (
} }
else else
{ {
#if 0
xp_char_t* match_ptr; xp_char_t* match_ptr;
xp_size_t match_len; xp_size_t match_len;
/* TODO: */
/* regular expression */
/* TODO: safematchrex ?? */ xp_assert (run->extio.rs_rex != NULL);
n = xp_awk_matchrex (rs_rex,
/* TODO: safematchrex */
n = xp_awk_matchrex (run->extio.rs_rex,
XP_STR_BUF(buf), XP_STR_LEN(buf), XP_STR_BUF(buf), XP_STR_LEN(buf),
&match_ptr, &match_len, errnum); &match_ptr, &match_len, &run->errnum);
if (n == -1) if (n == -1)
{ {
ret = -1; ret = -1;
@ -303,10 +302,15 @@ int xp_awk_readextio (
if (n == 1) if (n == 1)
{ {
/* matched... */ /* the match should be found at the end of
/* DO SOMTHING */ * the current buffer */
xp_assert (
XP_STR_BUF(buf) + XP_STR_LEN(buf) ==
match_ptr + match_len);
XP_STR_LEN(buf) -= match_len;
break;
} }
#endif
} }
if (xp_str_ccat (buf, c) == (xp_size_t)-1) if (xp_str_ccat (buf, c) == (xp_size_t)-1)

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parse.c,v 1.168 2006-08-23 15:46:29 bacon Exp $ * $Id: parse.c,v 1.169 2006-08-29 15:01:44 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -3970,9 +3970,21 @@ static int __skip_comment (xp_awk_t* awk)
do do
{ {
GET_CHAR_TO (awk, c); GET_CHAR_TO (awk, c);
if (c == XP_CHAR_EOF)
{
awk->errnum = XP_AWK_EENDCOMMENT;
return -1;
}
if (c == XP_T('*')) if (c == XP_T('*'))
{ {
GET_CHAR_TO (awk, c); GET_CHAR_TO (awk, c);
if (c == XP_CHAR_EOF)
{
awk->errnum = XP_AWK_EENDCOMMENT;
return -1;
}
if (c == XP_T('/')) if (c == XP_T('/'))
{ {
GET_CHAR_TO (awk, c); GET_CHAR_TO (awk, c);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.181 2006-08-27 15:29:21 bacon Exp $ * $Id: run.c,v 1.182 2006-08-29 15:01:45 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -216,12 +216,14 @@ 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_val_t* old = STACK_GLOBAL((xp_awk_run_t*)run,idx); xp_awk_run_t* r = (xp_awk_run_t*)run;
xp_awk_val_t* old = STACK_GLOBAL(r,idx);
if (old->type == XP_AWK_VAL_MAP) if (old->type == XP_AWK_VAL_MAP)
{ {
/* once a variable becomes an array, /* once a variable becomes an array,
* it cannot be changed to a scalar variable */ * it cannot be changed to a scalar variable */
PANIC_I ((xp_awk_run_t*)run, XP_AWK_EMAPTOSCALAR); PANIC_I (r, XP_AWK_EMAPTOSCALAR);
} }
/* TODO: is this correct?? */ /* TODO: is this correct?? */
@ -230,12 +232,50 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
idx != XP_AWK_GLOBAL_ARGV) idx != XP_AWK_GLOBAL_ARGV)
{ {
/* TODO: better error code */ /* TODO: better error code */
PANIC_I ((xp_awk_run_t*)run, XP_AWK_ESCALARTOMAP); PANIC_I (r, XP_AWK_ESCALARTOMAP);
} }
if (idx == XP_AWK_GLOBAL_RS) if (idx == XP_AWK_GLOBAL_RS)
{ {
/* TODO: if idx == XP_AWK_GLOBAL_RS and it is multi-char sttring, compile it */ xp_char_t* rs_ptr;
xp_size_t rs_len;
if (val->type == XP_AWK_VAL_STR)
{
rs_ptr = ((xp_awk_val_str_t*)val)->buf;
rs_len = ((xp_awk_val_str_t*)val)->len;
}
else
{
/* due to the expression evaluation rule, the
* regular expression can not be an assigned value */
xp_assert (val->type != XP_AWK_VAL_REX);
rs_ptr = xp_awk_valtostr (
val, &r->errnum, xp_true, XP_NULL, &rs_len);
if (rs_ptr == XP_NULL) return -1;
}
if (rs_len > 1)
{
void* rex;
/* compile the regular expression */
/* TODO: use safebuild */
rex = xp_awk_buildrex (rs_ptr, rs_len, &r->errnum);
if (rex == XP_NULL)
{
if (val->type != XP_AWK_VAL_STR)
xp_free (rs_ptr);
return -1;
}
if (r->extio.rs_rex != XP_NULL)
xp_awk_freerex (r->extio.rs_rex);
r->extio.rs_rex = rex;
}
if (val->type != XP_AWK_VAL_STR) xp_free (rs_ptr);
} }
/* TODO: if idx == XP_AWK_GLOBAL_NF recompute $0, etc */ /* TODO: if idx == XP_AWK_GLOBAL_NF recompute $0, etc */
@ -494,6 +534,7 @@ static int __init_run (
run->extio.handler[XP_AWK_EXTIO_FILE] = runios->file; run->extio.handler[XP_AWK_EXTIO_FILE] = runios->file;
run->extio.handler[XP_AWK_EXTIO_CONSOLE] = runios->console; run->extio.handler[XP_AWK_EXTIO_CONSOLE] = runios->console;
run->extio.chain = XP_NULL; run->extio.chain = XP_NULL;
run->extio.rs_rex = XP_NULL;
return 0; return 0;
} }
@ -506,6 +547,11 @@ static void __deinit_run (xp_awk_run_t* run)
/* TODO: what if this operation fails? */ /* TODO: what if this operation fails? */
xp_awk_clearextio (run); xp_awk_clearextio (run);
xp_assert (run->extio.chain == XP_NULL); xp_assert (run->extio.chain == XP_NULL);
if (run->extio.rs_rex != XP_NULL)
{
xp_free (run->extio.rs_rex);
run->extio.rs_rex = XP_NULL;
}
/* destroy input record. __clear_record should be called /* destroy input record. __clear_record should be called
* before the run stack has been destroyed because it may try * before the run stack has been destroyed because it may try

View File

@ -1,2 +1,2 @@
BEGIN { RS = ""; } BEGIN { /*RS = "Asia";*/ /*RS=746;*/ RS=/USA/; }
{ print "RECORD: ", $0; } { print "RECORD: ", $0; }

1
ase/test/awk/t34.awk Normal file
View File

@ -0,0 +1 @@
/* unterminated comment