*** empty log message ***

This commit is contained in:
hyung-hwan 2006-08-30 07:15:14 +00:00
parent e6dc5c7a66
commit e198b2632d
10 changed files with 125 additions and 36 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.c,v 1.37 2006-08-29 15:01:44 bacon Exp $ * $Id: extio.c,v 1.38 2006-08-30 07:15:14 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -254,7 +254,8 @@ int xp_awk_readextio (
if (rs_ptr == XP_NULL) if (rs_ptr == XP_NULL)
{ {
/* separate by a new line */ /* separate by a new line */
if (c == XP_T('\n')) break; /* TODO: handle different line terminator like \r\n */
if (c == XP_T('\n')) break;
} }
else if (rs_len == 0) else if (rs_len == 0)
{ {
@ -320,13 +321,50 @@ int xp_awk_readextio (
break; break;
} }
/* TODO: handle difference line terminator like \r\n */ /* TODO: handle different line terminator like \r\n */
if (c == XP_T('\n')) line_len = 0; if (c == XP_T('\n')) line_len = 0;
else line_len = line_len + 1; else line_len = line_len + 1;
} }
if (rs_ptr != XP_NULL && rs->type != XP_AWK_VAL_STR) xp_free (rs_ptr); if (rs_ptr != XP_NULL && rs->type != XP_AWK_VAL_STR) xp_free (rs_ptr);
xp_awk_refdownval (run, rs); xp_awk_refdownval (run, rs);
/* increment NR */
if (ret != -1)
{
xp_awk_val_t* nr;
xp_long_t lv;
xp_real_t rv;
nr = xp_awk_getglobal (run, XP_AWK_GLOBAL_NR);
xp_awk_refupval (nr);
n = xp_awk_valtonum (nr, &lv, &rv);
xp_awk_refdownval (run, nr);
if (n == -1)
{
run->errnum = XP_AWK_EVALTYPE;
ret = -1;
}
else
{
if (n == 1) lv = (xp_long_t)rv;
nr = xp_awk_makeintval (run, lv + 1);
if (nr == XP_NULL)
{
run->errnum = XP_AWK_ENOMEM;
ret = -1;
}
else
{
if (xp_awk_setglobal (
run, XP_AWK_GLOBAL_NR, nr) == -1) ret = -1;
}
}
}
return ret; return ret;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parse.c,v 1.169 2006-08-29 15:01:44 bacon Exp $ * $Id: parse.c,v 1.170 2006-08-30 07:15:14 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -3700,7 +3700,7 @@ static int __get_charstr (xp_awk_t* awk)
{ {
if (awk->src.lex.curc != XP_T('\"')) if (awk->src.lex.curc != XP_T('\"'))
{ {
/* the starting quote has been comsumed before this function /* the starting quote has been consumed before this function
* has been called */ * has been called */
ADD_TOKEN_CHAR (awk, awk->src.lex.curc); ADD_TOKEN_CHAR (awk, awk->src.lex.curc);
} }
@ -3709,13 +3709,18 @@ static int __get_charstr (xp_awk_t* awk)
static int __get_rexstr (xp_awk_t* awk) static int __get_rexstr (xp_awk_t* awk)
{ {
if (awk->src.lex.curc != XP_T('/')) if (awk->src.lex.curc == XP_T('/'))
{ {
/* the starting slash has been comsumed before this function /* this part of the function is different from __get_charstr
* has been called */ * because of the way this function is called */
ADD_TOKEN_CHAR (awk, awk->src.lex.curc); GET_CHAR (awk);
return 0;
}
else
{
ADD_TOKEN_CHAR (awk, awk->src.lex.curc);
return __get_string (awk, XP_T('/'), XP_T('\\'), xp_true);
} }
return __get_string (awk, XP_T('/'), XP_T('\\'), xp_true);
} }
static int __get_string ( static int __get_string (

View File

@ -1,5 +1,5 @@
/* /*
* $Id: rex.c,v 1.23 2006-08-16 15:21:17 bacon Exp $ * $Id: rex.c,v 1.24 2006-08-30 07:15:14 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -348,9 +348,28 @@ int xp_awk_safematchrex (void* code,
void xp_awk_freerex (void* code) void xp_awk_freerex (void* code)
{ {
xp_assert (code != XP_NULL);
xp_free (code); xp_free (code);
} }
xp_bool_t xp_awk_isemptyrex (void* code)
{
const xp_byte_t* p = code;
xp_size_t nb, el;
xp_assert (p != XP_NULL);
nb = *(xp_size_t*)p; p += xp_sizeof(nb);
el = *(xp_size_t*)p; p += xp_sizeof(el);
/* an empty regular expression look like:
* | expression |
* | header | branch |
* | | branch header |
* | NB(1) | EL(16) | NA(1) | BL(8) | */
return (nb == 1 && el == xp_sizeof(xp_size_t)*4)? xp_true: xp_false;
}
static int __build_pattern (__builder_t* builder) static int __build_pattern (__builder_t* builder)
{ {
int n; int n;
@ -1574,7 +1593,7 @@ static const xp_byte_t* __print_pattern (const xp_byte_t* p)
nb = *(xp_size_t*)p; p += xp_sizeof(nb); nb = *(xp_size_t*)p; p += xp_sizeof(nb);
el = *(xp_size_t*)p; p += xp_sizeof(el); el = *(xp_size_t*)p; p += xp_sizeof(el);
//xp_printf (XP_T("NA = %u, EL = %u\n"), (unsigned int)nb, (unsigned int)el); xp_printf (XP_T("NB = %u, EL = %u\n"), (unsigned int)nb, (unsigned int)el);
for (i = 0; i < nb; i++) for (i = 0; i < nb; i++)
{ {
@ -1591,7 +1610,7 @@ static const xp_byte_t* __print_branch (const xp_byte_t* p)
na = *(xp_size_t*)p; p += xp_sizeof(na); na = *(xp_size_t*)p; p += xp_sizeof(na);
bl = *(xp_size_t*)p; p += xp_sizeof(bl); bl = *(xp_size_t*)p; p += xp_sizeof(bl);
//xp_printf (XP_T("NA = %u, BL = %u\n"), (unsigned int) na, (unsigned int)bl); xp_printf (XP_T("NA = %u, BL = %u\n"), (unsigned int) na, (unsigned int)bl);
for (i = 0; i < na; i++) for (i = 0; i < na; i++)
{ {

View File

@ -1,5 +1,5 @@
/* /*
* $Id: rex.h,v 1.13 2006-08-16 11:35:53 bacon Exp $ * $Id: rex.h,v 1.14 2006-08-30 07:15:14 bacon Exp $
**/ **/
#ifndef _XP_AWK_REX_H_ #ifndef _XP_AWK_REX_H_
@ -62,6 +62,8 @@ int xp_awk_safematchrex (void* code,
void xp_awk_freerex (void* code); void xp_awk_freerex (void* code);
xp_bool_t xp_awk_isemptyrex (void* code);
#ifndef XP_AWK_NTDDK #ifndef XP_AWK_NTDDK
void xp_awk_printrex (void* code); void xp_awk_printrex (void* code);
#endif #endif

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.182 2006-08-29 15:01:45 bacon Exp $ * $Id: run.c,v 1.183 2006-08-30 07:15:14 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -622,12 +622,21 @@ static int __run_main (xp_awk_run_t* run)
/* restore the stack_top with the saved value /* restore the stack_top with the saved value
* instead of calling __raw_pop as many times as * instead of calling __raw_pop as many times as
* the successful __raw_push. it is ok because * the successful __raw_push. it is ok because
* the values pushed so fare are all xp_awk_val_nil */ * the values pushed so far are all xp_awk_val_nil */
run->stack_top = saved_stack_top; run->stack_top = saved_stack_top;
PANIC_I (run, XP_AWK_ENOMEM); PANIC_I (run, XP_AWK_ENOMEM);
} }
} }
if (xp_awk_setglobal (run, XP_AWK_GLOBAL_NR, xp_awk_val_zero) == -1)
{
/* it can simply restore the top of the stack this way
* because the values pused onto the stack so far are
* all xp_awk_val_nils */
run->stack_top = saved_stack_top;
return -1;
}
run->exit_level = EXIT_NONE; run->exit_level = EXIT_NONE;
if (run->awk->option & XP_AWK_RUNMAIN) if (run->awk->option & XP_AWK_RUNMAIN)
@ -1825,22 +1834,34 @@ static xp_awk_val_t* __eval_expression (xp_awk_run_t* run, xp_awk_nde_t* nde)
if (v->type == XP_AWK_VAL_REX) if (v->type == XP_AWK_VAL_REX)
{ {
xp_assert (run->inrec.d0->type == XP_AWK_VAL_STR); if (run->inrec.d0->type == XP_AWK_VAL_NIL)
xp_awk_refupval (v);
n = xp_awk_matchrex (
((xp_awk_val_rex_t*)v)->code,
((xp_awk_val_str_t*)run->inrec.d0)->buf,
((xp_awk_val_str_t*)run->inrec.d0)->len,
XP_NULL, XP_NULL, &errnum);
if (n == -1)
{ {
xp_awk_refdownval (run, v); /* the record has never been read.
PANIC (run, errnum); * probably, this functions has been triggered
* by the statements in the BEGIN block */
n = xp_awk_isemptyrex(
((xp_awk_val_rex_t*)v)->code)? 1: 0;
} }
else
{
xp_assert (run->inrec.d0->type == XP_AWK_VAL_STR);
xp_awk_refdownval (run, v); xp_awk_refupval (v);
n = xp_awk_matchrex (
((xp_awk_val_rex_t*)v)->code,
((xp_awk_val_str_t*)run->inrec.d0)->buf,
((xp_awk_val_str_t*)run->inrec.d0)->len,
XP_NULL, XP_NULL, &errnum);
if (n == -1)
{
xp_awk_refdownval (run, v);
PANIC (run, errnum);
}
xp_awk_refdownval (run, v);
}
v = xp_awk_makeintval (run, (n != 0)); v = xp_awk_makeintval (run, (n != 0));
if (v == XP_NULL) PANIC (run, XP_AWK_ENOMEM); if (v == XP_NULL) PANIC (run, XP_AWK_ENOMEM);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: sa.h,v 1.31 2006-08-16 11:35:54 bacon Exp $ * $Id: sa.h,v 1.32 2006-08-30 07:15:14 bacon Exp $
*/ */
#ifndef _XP_AWK_SA_H_ #ifndef _XP_AWK_SA_H_
@ -96,6 +96,7 @@
#define XP_STR_SIZE(x) ((x)->size + 1) #define XP_STR_SIZE(x) ((x)->size + 1)
#define XP_STR_CAPA(x) ((x)->capa) #define XP_STR_CAPA(x) ((x)->capa)
#define XP_STR_BUF(x) ((x)->buf) #define XP_STR_BUF(x) ((x)->buf)
#define XP_STR_CHAR(x,idx) ((x)->buf[idx])
typedef struct xp_str_t xp_str_t; typedef struct xp_str_t xp_str_t;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.c,v 1.78 2006-08-28 14:30:08 bacon Exp $ * $Id: awk.c,v 1.79 2006-08-30 07:15:14 bacon Exp $
*/ */
#include <xp/awk/awk.h> #include <xp/awk/awk.h>
@ -567,7 +567,8 @@ static int __main (int argc, xp_char_t* argv[])
return -1; return -1;
} }
opt = XP_AWK_EXPLICIT | XP_AWK_UNIQUE | XP_AWK_DBLSLASHES | opt = XP_AWK_EXPLICIT | XP_AWK_UNIQUE | XP_AWK_HASHSIGN |
/*XP_AWK_DBLSLASHES |*/
XP_AWK_SHADING | XP_AWK_IMPLICIT | XP_AWK_SHIFT | XP_AWK_SHADING | XP_AWK_IMPLICIT | XP_AWK_SHIFT |
XP_AWK_EXTIO | XP_AWK_BLOCKLESS | XP_AWK_STRINDEXONE; XP_AWK_EXTIO | XP_AWK_BLOCKLESS | XP_AWK_STRINDEXONE;

View File

@ -19,7 +19,8 @@ int xp_main (int argc, const xp_char_t* argv[])
//ptn = XP_T("^he.llo(jo(in|kk)s|com)+h*e{1,40}abc|[^abc][de-f]|^he.llo(jo(in|kk)s|com)+h*e{1,40}abc|[^abc][de-f]"); //ptn = XP_T("^he.llo(jo(in|kk)s|com)+h*e{1,40}abc|[^abc][de-f]|^he.llo(jo(in|kk)s|com)+h*e{1,40}abc|[^abc][de-f]");
//ptn = XP_T("^he.llo(jo(in|kk)s|com)+h*e{1,40}abc|[^abc][de-f]"); //ptn = XP_T("^he.llo(jo(in|kk)s|com)+h*e{1,40}abc|[^abc][de-f]");
//ptn = XP_T("^he.llo(jo(in|kk)s|com)|[^x[:space:][:alpha:]j][^abc][de-f]|^he.llo(jo(in|kk)s|com)|[^x[:space:][:alpha:]j][^abc][de-f]"); //ptn = XP_T("^he.llo(jo(in|kk)s|com)|[^x[:space:][:alpha:]j][^abc][de-f]|^he.llo(jo(in|kk)s|com)|[^x[:space:][:alpha:]j][^abc][de-f]");
ptn = XP_T("^.{0,2}.z[^[:space:]]+(abc|zzz){1,2}khg"); //ptn = XP_T("^.{0,2}.z[^[:space:]]+(abc|zzz){1,2}khg");
ptn = XP_T("");
rex = xp_awk_buildrex (ptn, xp_strlen(ptn), &errnum); rex = xp_awk_buildrex (ptn, xp_strlen(ptn), &errnum);
if (rex == XP_NULL) if (rex == XP_NULL)
@ -28,6 +29,7 @@ int xp_main (int argc, const xp_char_t* argv[])
return -1; return -1;
} }
xp_printf (XP_T("isemptyrex => %d\n"), xp_awk_isemptyrex (rex));
xp_printf (XP_T("NA: %u\n"), (unsigned int)XP_AWK_REX_NA(rex)); xp_printf (XP_T("NA: %u\n"), (unsigned int)XP_AWK_REX_NA(rex));
xp_printf (XP_T("LEN: %u\n"), (unsigned int)XP_AWK_REX_LEN(rex)); xp_printf (XP_T("LEN: %u\n"), (unsigned int)XP_AWK_REX_LEN(rex));
xp_awk_printrex (rex); xp_awk_printrex (rex);

View File

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

View File

@ -5,7 +5,7 @@ BEGIN {
delete NF; delete NF;
print "NF[1]=", NF[1]; print "NF[1]=", NF[1];
NF[1] = 20; // this line should not be allowed 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 "AWK IMPLEMENTATION ERROR: hey... NF[1] = 20 has succeeded in the BEGIN block. your interpreter must be wrong";
print "NF[1]=", NF[1]; print "NF[1]=", NF[1];
} }