*** empty log message ***
This commit is contained in:
parent
022d99d196
commit
988d787034
175
ase/awk/run.c
175
ase/awk/run.c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.127 2006-07-09 16:06:04 bacon Exp $
|
* $Id: run.c,v 1.128 2006-07-10 04:51:38 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -80,6 +80,10 @@ static xp_awk_val_t* __do_assignment_map (
|
|||||||
static xp_awk_val_t* __do_assignment_pos (
|
static xp_awk_val_t* __do_assignment_pos (
|
||||||
xp_awk_run_t* run, xp_awk_nde_pos_t* pos, xp_awk_val_t* val);
|
xp_awk_run_t* run, xp_awk_nde_pos_t* pos, xp_awk_val_t* val);
|
||||||
|
|
||||||
|
static int __recomp_record_fields (
|
||||||
|
xp_awk_run_t* run, xp_size_t lv,
|
||||||
|
xp_char_t* str, xp_size_t len, int* errnum);
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binary (
|
static xp_awk_val_t* __eval_binary (
|
||||||
xp_awk_run_t* run, xp_awk_nde_t* nde);
|
xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||||
static xp_awk_val_t* __eval_binop_lor (
|
static xp_awk_val_t* __eval_binop_lor (
|
||||||
@ -1780,60 +1784,24 @@ static xp_awk_val_t* __do_assignment_pos (
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
xp_char_t* ptr;
|
/* TODO: change xp_awk_valtostr to return the length
|
||||||
xp_size_t len;
|
* so that xp_strlen doesn't have to be called here */
|
||||||
xp_long_t i;
|
xp_size_t xlen = xp_strlen(str);
|
||||||
|
|
||||||
xp_str_clear (&run->inrec.line);
|
xp_str_clear (&run->inrec.line);
|
||||||
|
if (__recomp_record_fields (
|
||||||
for (i = 0; i < lv - 1; i++)
|
run, (xp_size_t)lv, str, xlen, &errnum) == -1)
|
||||||
{
|
|
||||||
ptr = XP_T(""); len = 0;
|
|
||||||
if (i < run->inrec.nflds)
|
|
||||||
{
|
|
||||||
ptr = run->inrec.flds[i].ptr;
|
|
||||||
len = run->inrec.flds[i].len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: use OFS for record recomputation */
|
|
||||||
if ((i > 0 && xp_str_ccat (&run->inrec.line, XP_T(' ')) == (xp_size_t)-1) ||
|
|
||||||
xp_str_ncat (&run->inrec.line, ptr, len) == (xp_size_t)-1)
|
|
||||||
{
|
{
|
||||||
xp_free (str);
|
xp_free (str);
|
||||||
__clear_record (run, xp_false);
|
__clear_record (run, xp_false);
|
||||||
PANIC (run, XP_AWK_ENOMEM);
|
PANIC (run, errnum);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (xp_str_cat (&run->inrec.line, str) == (xp_size_t)-1)
|
|
||||||
{
|
|
||||||
xp_free (str);
|
|
||||||
__clear_record (run, xp_false);
|
|
||||||
PANIC (run, XP_AWK_ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
xp_free (str);
|
xp_free (str);
|
||||||
|
|
||||||
for (i = lv; i < run->inrec.nflds; i++)
|
/* recompose $0 */
|
||||||
{
|
v = xp_awk_makestrval (
|
||||||
ptr = XP_T(""); len = 0;
|
XP_STR_BUF(&run->inrec.line),
|
||||||
if (i < run->inrec.nflds)
|
XP_STR_LEN(&run->inrec.line));
|
||||||
{
|
|
||||||
ptr = run->inrec.flds[i].ptr;
|
|
||||||
len = run->inrec.flds[i].len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: use OFS for record recomputation */
|
|
||||||
if (xp_str_ccat (&run->inrec.line, XP_T(' ')) == (xp_size_t)-1 ||
|
|
||||||
xp_str_ncat (&run->inrec.line, ptr, len) == (xp_size_t)-1)
|
|
||||||
{
|
|
||||||
__clear_record (run, xp_false);
|
|
||||||
PANIC (run, XP_AWK_ENOMEM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
v = xp_awk_makestrval (XP_STR_BUF(&run->inrec.line), XP_STR_LEN(&run->inrec.line));
|
|
||||||
if (v == XP_NULL)
|
if (v == XP_NULL)
|
||||||
{
|
{
|
||||||
__clear_record (run, xp_false);
|
__clear_record (run, xp_false);
|
||||||
@ -1841,15 +1809,118 @@ static xp_awk_val_t* __do_assignment_pos (
|
|||||||
}
|
}
|
||||||
|
|
||||||
xp_awk_refdownval (run, run->inrec.d0);
|
xp_awk_refdownval (run, run->inrec.d0);
|
||||||
run->inrec.d0 = val;
|
run->inrec.d0 = v;
|
||||||
xp_awk_refupval (val);
|
xp_awk_refupval (v);
|
||||||
|
|
||||||
/* TODO: adjust fields */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 max, i, nflds;
|
||||||
|
|
||||||
|
xp_assert (lv > 0);
|
||||||
|
max = (lv > run->inrec.nflds)? lv: run->inrec.nflds;
|
||||||
|
|
||||||
|
nflds = run->inrec.nflds;
|
||||||
|
if (max > run->inrec.maxflds)
|
||||||
|
{
|
||||||
|
void* tmp = xp_realloc (
|
||||||
|
run->inrec.flds, xp_sizeof(*run->inrec.flds) * max);
|
||||||
|
if (tmp == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM);
|
||||||
|
|
||||||
|
run->inrec.flds = tmp;
|
||||||
|
run->inrec.maxflds = max;
|
||||||
|
}
|
||||||
|
|
||||||
|
lv = lv - 1; /* adjust the value to 0-based index */
|
||||||
|
|
||||||
|
for (i = 0; i < max; i++)
|
||||||
|
{
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
/* TODO: use OFS */
|
||||||
|
if (xp_str_ccat (
|
||||||
|
&run->inrec.line, XP_T(' ')) == (xp_size_t)-1)
|
||||||
|
{
|
||||||
|
*errnum = XP_AWK_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == lv)
|
||||||
|
{
|
||||||
|
xp_awk_val_t* tmp;
|
||||||
|
|
||||||
|
run->inrec.flds[i].ptr =
|
||||||
|
XP_STR_BUF(&run->inrec.line) +
|
||||||
|
XP_STR_LEN(&run->inrec.line);
|
||||||
|
run->inrec.flds[i].len = len;
|
||||||
|
|
||||||
|
if (xp_str_ncat (
|
||||||
|
&run->inrec.line, str, len) == (xp_size_t)-1)
|
||||||
|
{
|
||||||
|
*errnum = XP_AWK_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = xp_awk_makestrval (str,len);
|
||||||
|
if (tmp == XP_NULL)
|
||||||
|
{
|
||||||
|
*errnum = XP_AWK_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < nflds)
|
||||||
|
xp_awk_refdownval (run, run->inrec.flds[i].val);
|
||||||
|
run->inrec.flds[i].val = tmp;
|
||||||
|
xp_awk_refupval (tmp);
|
||||||
|
}
|
||||||
|
else if (i >= nflds)
|
||||||
|
{
|
||||||
|
run->inrec.flds[i].ptr =
|
||||||
|
XP_STR_BUF(&run->inrec.line) +
|
||||||
|
XP_STR_LEN(&run->inrec.line);
|
||||||
|
run->inrec.flds[i].len = 0;
|
||||||
|
|
||||||
|
if (xp_str_cat (
|
||||||
|
&run->inrec.line, XP_T("")) == (xp_size_t)-1)
|
||||||
|
{
|
||||||
|
*errnum = XP_AWK_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*xp_awk_refdownval (run, run->inrec.flds[i].val);*/
|
||||||
|
run->inrec.flds[i].val = xp_awk_val_zls;
|
||||||
|
xp_awk_refupval (xp_awk_val_zls);
|
||||||
|
run->inrec.nflds++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xp_awk_val_str_t* tmp;
|
||||||
|
|
||||||
|
tmp = (xp_awk_val_str_t*)run->inrec.flds[i].val;
|
||||||
|
|
||||||
|
run->inrec.flds[i].ptr =
|
||||||
|
XP_STR_BUF(&run->inrec.line) +
|
||||||
|
XP_STR_LEN(&run->inrec.line);
|
||||||
|
run->inrec.flds[i].len = tmp->len;
|
||||||
|
|
||||||
|
if (xp_str_ncat (&run->inrec.line,
|
||||||
|
tmp->buf, tmp->len) == (xp_size_t)-1)
|
||||||
|
{
|
||||||
|
*errnum = XP_AWK_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binary (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
static xp_awk_val_t* __eval_binary (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||||
{
|
{
|
||||||
static binop_func_t __binop_func[] =
|
static binop_func_t __binop_func[] =
|
||||||
@ -3495,7 +3566,7 @@ static xp_awk_val_t* __eval_pos (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
|||||||
if (lv == 0) v = run->inrec.d0;
|
if (lv == 0) v = run->inrec.d0;
|
||||||
else if (lv > 0 && lv <= run->inrec.nflds)
|
else if (lv > 0 && lv <= run->inrec.nflds)
|
||||||
v = run->inrec.flds[lv-1].val;
|
v = run->inrec.flds[lv-1].val;
|
||||||
else v = xp_awk_val_nil;
|
else v = xp_awk_val_zls; /*xp_awk_val_nil;*/
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: val.c,v 1.37 2006-07-06 15:54:41 bacon Exp $
|
* $Id: val.c,v 1.38 2006-07-10 04:51:38 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -13,6 +13,9 @@
|
|||||||
static xp_awk_val_nil_t __awk_nil = { XP_AWK_VAL_NIL, 0 };
|
static xp_awk_val_nil_t __awk_nil = { XP_AWK_VAL_NIL, 0 };
|
||||||
xp_awk_val_t* xp_awk_val_nil = (xp_awk_val_t*)&__awk_nil;
|
xp_awk_val_t* xp_awk_val_nil = (xp_awk_val_t*)&__awk_nil;
|
||||||
|
|
||||||
|
static xp_awk_val_str_t __awk_zls = { XP_AWK_VAL_STR, 0, XP_T(""), 0 };
|
||||||
|
xp_awk_val_t* xp_awk_val_zls = (xp_awk_val_t*)&__awk_zls;
|
||||||
|
|
||||||
static xp_awk_val_int_t __awk_int[] =
|
static xp_awk_val_int_t __awk_int[] =
|
||||||
{
|
{
|
||||||
{ XP_AWK_VAL_INT, 0, -1 },
|
{ XP_AWK_VAL_INT, 0, -1 },
|
||||||
@ -183,7 +186,9 @@ xp_awk_val_t* xp_awk_makemapval (xp_awk_run_t* run)
|
|||||||
|
|
||||||
xp_bool_t xp_awk_isbuiltinval (xp_awk_val_t* val)
|
xp_bool_t xp_awk_isbuiltinval (xp_awk_val_t* val)
|
||||||
{
|
{
|
||||||
return val == XP_NULL || val == xp_awk_val_nil ||
|
return val == XP_NULL ||
|
||||||
|
val == xp_awk_val_nil ||
|
||||||
|
val == xp_awk_val_zls ||
|
||||||
(val >= (xp_awk_val_t*)&__awk_int[0] &&
|
(val >= (xp_awk_val_t*)&__awk_int[0] &&
|
||||||
val <= (xp_awk_val_t*)&__awk_int[xp_countof(__awk_int)-1]);
|
val <= (xp_awk_val_t*)&__awk_int[xp_countof(__awk_int)-1]);
|
||||||
}
|
}
|
||||||
@ -198,7 +203,7 @@ xp_printf (XP_T("\n"));*/
|
|||||||
switch (val->type)
|
switch (val->type)
|
||||||
{
|
{
|
||||||
case XP_AWK_VAL_NIL:
|
case XP_AWK_VAL_NIL:
|
||||||
if (val != xp_awk_val_nil) xp_free (val);
|
xp_free (val);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case XP_AWK_VAL_INT:
|
case XP_AWK_VAL_INT:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: val.h,v 1.27 2006-07-01 16:07:06 bacon Exp $
|
* $Id: val.h,v 1.28 2006-07-10 04:51:38 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_VAL_H_
|
#ifndef _XP_AWK_VAL_H_
|
||||||
@ -93,6 +93,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
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);
|
||||||
|
@ -23,9 +23,11 @@ END
|
|||||||
//print $0 = "wow this is just a test";
|
//print $0 = "wow this is just a test";
|
||||||
//print $0 = "";
|
//print $0 = "";
|
||||||
//print $0;
|
//print $0;
|
||||||
$1="abcdefghi";
|
|
||||||
|
$7="abcdefghi";
|
||||||
print a = $6;
|
print a = $6;
|
||||||
print "[" $0 "],[" a "]";
|
print "[" $0 "],[" a "]";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
print $6;
|
print $6;
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user