*** empty log message ***

This commit is contained in:
hyung-hwan 2006-07-12 07:25:15 +00:00
parent ba4ea092ce
commit ca1048eb31
6 changed files with 71 additions and 13 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.77 2006-07-05 16:20:23 bacon Exp $ * $Id: awk.h,v 1.78 2006-07-12 07:25:15 bacon Exp $
*/ */
#ifndef _XP_AWK_AWK_H_ #ifndef _XP_AWK_AWK_H_
@ -183,6 +183,7 @@ int xp_awk_run (xp_awk_t* awk, xp_awk_io_t txtio, void* txtio_arg);
xp_size_t xp_awk_getnargs (void* run); xp_size_t xp_awk_getnargs (void* run);
xp_awk_val_t* xp_awk_getarg (void* run, xp_size_t idx); xp_awk_val_t* xp_awk_getarg (void* run, xp_size_t idx);
void xp_awk_setretval (void* run, xp_awk_val_t* val); void xp_awk_setretval (void* run, xp_awk_val_t* val);
void xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val);
void xp_awk_seterrnum (void* run, int errnum); void xp_awk_seterrnum (void* run, int errnum);
/* utility functions exported by awk.h */ /* utility functions exported by awk.h */

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.130 2006-07-10 14:28:45 bacon Exp $ * $Id: run.c,v 1.131 2006-07-12 07:25:15 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -199,6 +199,14 @@ void xp_awk_setretval (void* run, xp_awk_val_t* val)
xp_awk_refupval (val); xp_awk_refupval (val);
} }
void xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
{
xp_awk_run_t* r = (xp_awk_run_t*)run;
xp_awk_refdownval (run, STACK_GLOBAL(r,idx));
STACK_GLOBAL(r,idx) = val;
xp_awk_refupval (val);
}
void xp_awk_seterrnum (void* run, int errnum) void xp_awk_seterrnum (void* run, int errnum)
{ {
xp_awk_run_t* r = (xp_awk_run_t*)run; xp_awk_run_t* r = (xp_awk_run_t*)run;
@ -3658,6 +3666,7 @@ static int __split_record (xp_awk_run_t* run)
xp_char_t* p, * tok; xp_char_t* p, * tok;
xp_size_t len, tok_len, nflds; xp_size_t len, tok_len, nflds;
xp_awk_val_t* v;
/* inrec should be cleared before __split_record is called */ /* inrec should be cleared before __split_record is called */
xp_assert (run->inrec.nflds == 0); xp_assert (run->inrec.nflds == 0);
@ -3711,11 +3720,9 @@ static int __split_record (xp_awk_run_t* run)
run->inrec.flds[run->inrec.nflds].len = tok_len; run->inrec.flds[run->inrec.nflds].len = tok_len;
run->inrec.flds[run->inrec.nflds].val = run->inrec.flds[run->inrec.nflds].val =
xp_awk_makestrval (tok, tok_len); xp_awk_makestrval (tok, tok_len);
if (run->inrec.flds[run->inrec.nflds].val == XP_NULL) if (run->inrec.flds[run->inrec.nflds].val == XP_NULL)
{
__clear_record (run, xp_false);
PANIC_I (run, XP_AWK_ENOMEM); PANIC_I (run, XP_AWK_ENOMEM);
}
xp_awk_refupval (run->inrec.flds[run->inrec.nflds].val); xp_awk_refupval (run->inrec.flds[run->inrec.nflds].val);
run->inrec.nflds++; run->inrec.nflds++;
@ -3724,6 +3731,11 @@ static int __split_record (xp_awk_run_t* run)
(p - XP_STR_BUF(&run->inrec.line)); (p - XP_STR_BUF(&run->inrec.line));
} }
/* set the number of fields */
v = xp_awk_makeintval (run, (xp_long_t)nflds);
if (v == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM);
xp_awk_setglobal (run, XP_AWK_GLOBAL_NF, v);
xp_assert (nflds == run->inrec.nflds); xp_assert (nflds == run->inrec.nflds);
return 0; return 0;
} }
@ -3745,6 +3757,7 @@ 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);
} }
xp_assert (run->inrec.nflds == 0); xp_assert (run->inrec.nflds == 0);
@ -3755,6 +3768,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
xp_size_t lv, xp_char_t* str, xp_size_t len, int* errnum) xp_size_t lv, xp_char_t* str, xp_size_t len, int* errnum)
{ {
xp_size_t max, i, nflds; xp_size_t max, i, nflds;
xp_awk_val_t* v;
xp_assert (lv > 0); xp_assert (lv > 0);
max = (lv > run->inrec.nflds)? lv: run->inrec.nflds; max = (lv > run->inrec.nflds)? lv: run->inrec.nflds;
@ -3855,6 +3869,15 @@ static int __recomp_record_fields (xp_awk_run_t* run,
} }
} }
v = STACK_GLOBAL(run, XP_AWK_GLOBAL_NF);
xp_assert (v->type == XP_AWK_VAL_INT);
if (((xp_awk_val_int_t*)v)->val != max)
{
v = xp_awk_makeintval (run, (xp_long_t)max);
if (v == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM);
xp_awk_setglobal (run, XP_AWK_GLOBAL_NF, v);
}
return 0; return 0;
} }
@ -3971,3 +3994,4 @@ static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde)
return str; return str;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.h,v 1.14 2006-06-29 15:40:30 bacon Exp $ * $Id: run.h,v 1.15 2006-07-12 07:25:15 bacon Exp $
*/ */
#ifndef _XP_AWK_RUN_H_ #ifndef _XP_AWK_RUN_H_
@ -73,4 +73,31 @@ enum
XP_AWK_INCOP_MINUS XP_AWK_INCOP_MINUS
}; };
enum
{
/* this table should match __bvtab in parse.c */
XP_AWK_GLOBAL_ARGC,
XP_AWK_GLOBAL_ARGIND,
XP_AWK_GLOBAL_ARGV,
XP_AWK_GLOBAL_CONVFMT,
XP_AWK_GLOBAL_FIELDWIDTHS,
XP_AWK_GLOBAL_ENVIRON,
XP_AWK_GLOBAL_ERRNO,
XP_AWK_GLOBAL_FILENAME,
XP_AWK_GLOBAL_FNR,
XP_AWK_GLOBAL_FS,
XP_AWK_GLOBAL_INORECASE,
XP_AWK_GLOBAL_NF,
XP_AWK_GLOBAL_NR,
XP_AWK_GLOBAL_OFMT,
XP_AWK_GLOBAL_OFS,
XP_AWK_GLOBAL_ORS,
XP_AWK_GLOBAL_RS,
XP_AWK_GLOBAL_RT,
XP_AWK_GLOBAL_RSTART,
XP_AWK_GLOBAL_RLENGTH,
XP_AWK_GLOBAL_SUBSEP
};
#endif #endif

View File

@ -1,5 +1,5 @@
/* /*
* $Id: val.c,v 1.38 2006-07-10 04:51:38 bacon Exp $ * $Id: val.c,v 1.39 2006-07-12 07:25:15 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -31,6 +31,9 @@ static xp_awk_val_int_t __awk_int[] =
{ XP_AWK_VAL_INT, 0, 9 }, { XP_AWK_VAL_INT, 0, 9 },
}; };
xp_awk_val_t* xp_awk_val_zero = (xp_awk_val_t*)&__awk_int[1];
xp_awk_val_t* xp_awk_val_one = (xp_awk_val_t*)&__awk_int[2];
xp_awk_val_t* xp_awk_makeintval (xp_awk_run_t* run, xp_long_t v) xp_awk_val_t* xp_awk_makeintval (xp_awk_run_t* run, xp_long_t v)
{ {
xp_awk_val_int_t* val; xp_awk_val_int_t* val;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: val.h,v 1.28 2006-07-10 04:51:38 bacon Exp $ * $Id: val.h,v 1.29 2006-07-12 07:25:15 bacon Exp $
*/ */
#ifndef _XP_AWK_VAL_H_ #ifndef _XP_AWK_VAL_H_
@ -94,6 +94,8 @@ extern "C" {
extern xp_awk_val_t* xp_awk_val_nil; extern xp_awk_val_t* xp_awk_val_nil;
extern xp_awk_val_t* xp_awk_val_zls; extern xp_awk_val_t* xp_awk_val_zls;
extern xp_awk_val_t* xp_awk_val_zero;
extern xp_awk_val_t* xp_awk_val_one;
xp_awk_val_t* xp_awk_makeintval (xp_awk_run_t* run, xp_long_t v); xp_awk_val_t* xp_awk_makeintval (xp_awk_run_t* run, xp_long_t v);
xp_awk_val_t* xp_awk_makerealval (xp_awk_run_t* run, xp_real_t v); xp_awk_val_t* xp_awk_makerealval (xp_awk_run_t* run, xp_real_t v);

View File

@ -20,18 +20,19 @@ END
global x, y; global x, y;
{ {
print "NF = " NF;
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
{ {
print $i; print $i;
if (i == 3) a = $i; if (i == 3) a = $i;
} }
/* $1 = 100;
$1 = $2; //$1 = $2;
$3 = $2; //$3 = $2;
$2 = $2; //$2 = $2;
$20 = 10;
print $0; print $0;
*/
print "--------------------"; print "--------------------";
print NF; print NF;
print "===================="; print "====================";