*** empty log message ***
This commit is contained in:
parent
e1d5b43bae
commit
b6c7322571
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.c,v 1.57 2006-06-27 10:53:04 bacon Exp $
|
* $Id: awk.c,v 1.58 2006-07-13 15:43:39 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -89,6 +89,9 @@ xp_awk_t* xp_awk_open (void)
|
|||||||
|
|
||||||
for (i = 0; i < xp_countof(awk->extio); i++) awk->extio[i] = XP_NULL;
|
for (i = 0; i < xp_countof(awk->extio); i++) awk->extio[i] = XP_NULL;
|
||||||
|
|
||||||
|
awk->bfn.sys = XP_NULL;
|
||||||
|
awk->bfn.user = XP_NULL;
|
||||||
|
|
||||||
return awk;
|
return awk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk_i.h,v 1.29 2006-07-07 09:48:23 bacon Exp $
|
* $Id: awk_i.h,v 1.30 2006-07-13 15:43:39 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_AWKI_H_
|
#ifndef _XP_AWK_AWKI_H_
|
||||||
@ -129,6 +129,13 @@ struct xp_awk_t
|
|||||||
xp_size_t column;
|
xp_size_t column;
|
||||||
} token;
|
} token;
|
||||||
|
|
||||||
|
/* builtin functions */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
xp_awk_bfn_t* sys;
|
||||||
|
xp_awk_bfn_t* user;
|
||||||
|
} bfn;
|
||||||
|
|
||||||
/* housekeeping */
|
/* housekeeping */
|
||||||
int errnum;
|
int errnum;
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: func.c,v 1.7 2006-07-13 03:10:35 bacon Exp $
|
* $Id: func.c,v 1.8 2006-07-13 15:43:39 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -14,25 +14,37 @@
|
|||||||
static int __bfn_close (void* run);
|
static int __bfn_close (void* run);
|
||||||
|
|
||||||
/* TODO: move it under the awk structure... */
|
/* TODO: move it under the awk structure... */
|
||||||
static xp_awk_bfn_t __bfn[] =
|
static xp_awk_bfn_t __sys_bfn[] =
|
||||||
{
|
{
|
||||||
{ XP_T("system"), (1 << 5), 1, 1, XP_NULL },
|
{ XP_T("system"), (1 << 5), 1, 1, XP_NULL },
|
||||||
{ XP_T("close"), XP_AWK_EXTIO, 1, 1, __bfn_close },
|
{ XP_T("close"), XP_AWK_EXTIO, 1, 1, __bfn_close },
|
||||||
{ XP_NULL, 0, 0, 0, XP_NULL }
|
{ XP_NULL, 0, 0, 0, XP_NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static xp_awk_bfn_t* __usr_bfn = XP_NULL;
|
||||||
|
|
||||||
xp_awk_bfn_t* xp_awk_addbfn (
|
xp_awk_bfn_t* xp_awk_addbfn (
|
||||||
xp_awk_t* awk, const xp_char_t* name, int when_valid,
|
xp_awk_t* awk, const xp_char_t* name, int when_valid,
|
||||||
xp_size_t min_args, xp_size_t max_args, int (*handler)(void*))
|
xp_size_t min_args, xp_size_t max_args, int (*handler)(void*))
|
||||||
{
|
{
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
return XP_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
xp_awk_bfn_t* xp_awk_getbfn (xp_awk_t* awk, const xp_char_t* name)
|
xp_awk_bfn_t* xp_awk_getbfn (xp_awk_t* awk, const xp_char_t* name)
|
||||||
{
|
{
|
||||||
xp_awk_bfn_t* p;
|
xp_awk_bfn_t* p;
|
||||||
|
|
||||||
for (p = __bfn; p->name != XP_NULL; p++)
|
for (p = __sys_bfn; p->name != XP_NULL; p++)
|
||||||
|
{
|
||||||
|
if (p->valid != 0 &&
|
||||||
|
(awk->opt.parse & p->valid) == 0) continue;
|
||||||
|
|
||||||
|
if (xp_strcmp (p->name, name) == 0) return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: */
|
||||||
|
for (p = awk->bfn.user; p != XP_NULL; p = p->next)
|
||||||
{
|
{
|
||||||
if (p->valid != 0 &&
|
if (p->valid != 0 &&
|
||||||
(awk->opt.parse & p->valid) == 0) continue;
|
(awk->opt.parse & p->valid) == 0) continue;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: func.h,v 1.3 2006-06-21 15:37:51 bacon Exp $
|
* $Id: func.h,v 1.4 2006-07-13 15:43:39 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_FUNC_H_
|
#ifndef _XP_AWK_FUNC_H_
|
||||||
@ -19,6 +19,8 @@ struct xp_awk_bfn_t
|
|||||||
xp_size_t min_args;
|
xp_size_t min_args;
|
||||||
xp_size_t max_args;
|
xp_size_t max_args;
|
||||||
int (*handler) (void* run);
|
int (*handler) (void* run);
|
||||||
|
|
||||||
|
xp_awk_bfn_t* next;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.132 2006-07-13 03:10:35 bacon Exp $
|
* $Id: run.c,v 1.133 2006-07-13 15:43:39 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -1772,6 +1772,8 @@ static xp_awk_val_t* __do_assignment_pos (
|
|||||||
}
|
}
|
||||||
xp_free (str);
|
xp_free (str);
|
||||||
|
|
||||||
|
/* TODO: consider if "val" of a non-string type should be
|
||||||
|
* converted into a string value */
|
||||||
xp_awk_refdownval (run, run->inrec.d0);
|
xp_awk_refdownval (run, run->inrec.d0);
|
||||||
run->inrec.d0 = val;
|
run->inrec.d0 = val;
|
||||||
xp_awk_refupval (val);
|
xp_awk_refupval (val);
|
||||||
@ -3758,8 +3760,10 @@ static void __clear_record (xp_awk_run_t* run, xp_bool_t noline)
|
|||||||
static int __recomp_record_fields (xp_awk_run_t* run,
|
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_awk_val_t* v;
|
xp_awk_val_t* v;
|
||||||
|
xp_char_t* ofsp = XP_NULL, * ofs;
|
||||||
|
xp_size_t ofs_len;
|
||||||
|
xp_size_t max, i, nflds;
|
||||||
|
|
||||||
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;
|
||||||
@ -3769,7 +3773,11 @@ static int __recomp_record_fields (xp_awk_run_t* run,
|
|||||||
{
|
{
|
||||||
void* tmp = xp_realloc (
|
void* tmp = xp_realloc (
|
||||||
run->inrec.flds, xp_sizeof(*run->inrec.flds) * max);
|
run->inrec.flds, xp_sizeof(*run->inrec.flds) * max);
|
||||||
if (tmp == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM);
|
if (tmp == XP_NULL)
|
||||||
|
{
|
||||||
|
*errnum = XP_AWK_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
run->inrec.flds = tmp;
|
run->inrec.flds = tmp;
|
||||||
run->inrec.maxflds = max;
|
run->inrec.maxflds = max;
|
||||||
@ -3779,14 +3787,33 @@ static int __recomp_record_fields (xp_awk_run_t* run,
|
|||||||
|
|
||||||
xp_str_clear (&run->inrec.line);
|
xp_str_clear (&run->inrec.line);
|
||||||
|
|
||||||
|
if (max > 1)
|
||||||
|
{
|
||||||
|
v = STACK_GLOBAL(run, XP_AWK_GLOBAL_OFS);
|
||||||
|
if (v != xp_awk_val_nil)
|
||||||
|
{
|
||||||
|
ofsp = xp_awk_valtostr (v, errnum, XP_NULL, &ofs_len);
|
||||||
|
if (ofsp == XP_NULL) return -1;
|
||||||
|
|
||||||
|
ofs = ofsp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* OFS not set */
|
||||||
|
ofs = XP_T(" ");
|
||||||
|
ofs_len = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < max; i++)
|
for (i = 0; i < max; i++)
|
||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{
|
{
|
||||||
/* TODO: use OFS */
|
if (xp_str_ncat (
|
||||||
if (xp_str_ccat (
|
&run->inrec.line, ofs, ofs_len) == (xp_size_t)-1)
|
||||||
&run->inrec.line, XP_T(' ')) == (xp_size_t)-1)
|
|
||||||
{
|
{
|
||||||
|
if (ofsp != XP_NULL) xp_free (ofsp);
|
||||||
*errnum = XP_AWK_ENOMEM;
|
*errnum = XP_AWK_ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3804,6 +3831,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
|
|||||||
if (xp_str_ncat (
|
if (xp_str_ncat (
|
||||||
&run->inrec.line, str, len) == (xp_size_t)-1)
|
&run->inrec.line, str, len) == (xp_size_t)-1)
|
||||||
{
|
{
|
||||||
|
if (ofsp != XP_NULL) xp_free (ofsp);
|
||||||
*errnum = XP_AWK_ENOMEM;
|
*errnum = XP_AWK_ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3811,6 +3839,7 @@ static int __recomp_record_fields (xp_awk_run_t* run,
|
|||||||
tmp = xp_awk_makestrval (str,len);
|
tmp = xp_awk_makestrval (str,len);
|
||||||
if (tmp == XP_NULL)
|
if (tmp == XP_NULL)
|
||||||
{
|
{
|
||||||
|
if (ofsp != XP_NULL) xp_free (ofsp);
|
||||||
*errnum = XP_AWK_ENOMEM;
|
*errnum = XP_AWK_ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3831,10 +3860,14 @@ static int __recomp_record_fields (xp_awk_run_t* run,
|
|||||||
if (xp_str_cat (
|
if (xp_str_cat (
|
||||||
&run->inrec.line, XP_T("")) == (xp_size_t)-1)
|
&run->inrec.line, XP_T("")) == (xp_size_t)-1)
|
||||||
{
|
{
|
||||||
|
if (ofsp != XP_NULL) xp_free (ofsp);
|
||||||
*errnum = XP_AWK_ENOMEM;
|
*errnum = XP_AWK_ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* xp_awk_refdownval should not be called over
|
||||||
|
* run->inrec.flds[i].val as it is not initialized
|
||||||
|
* to any valid values */
|
||||||
/*xp_awk_refdownval (run, run->inrec.flds[i].val);*/
|
/*xp_awk_refdownval (run, run->inrec.flds[i].val);*/
|
||||||
run->inrec.flds[i].val = xp_awk_val_zls;
|
run->inrec.flds[i].val = xp_awk_val_zls;
|
||||||
xp_awk_refupval (xp_awk_val_zls);
|
xp_awk_refupval (xp_awk_val_zls);
|
||||||
@ -3854,18 +3887,26 @@ static int __recomp_record_fields (xp_awk_run_t* run,
|
|||||||
if (xp_str_ncat (&run->inrec.line,
|
if (xp_str_ncat (&run->inrec.line,
|
||||||
tmp->buf, tmp->len) == (xp_size_t)-1)
|
tmp->buf, tmp->len) == (xp_size_t)-1)
|
||||||
{
|
{
|
||||||
|
if (ofsp != XP_NULL) xp_free (ofsp);
|
||||||
*errnum = XP_AWK_ENOMEM;
|
*errnum = XP_AWK_ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ofsp != XP_NULL) xp_free (ofsp);
|
||||||
|
|
||||||
v = STACK_GLOBAL(run, XP_AWK_GLOBAL_NF);
|
v = STACK_GLOBAL(run, XP_AWK_GLOBAL_NF);
|
||||||
xp_assert (v->type == XP_AWK_VAL_INT);
|
xp_assert (v->type == XP_AWK_VAL_INT);
|
||||||
if (((xp_awk_val_int_t*)v)->val != max)
|
if (((xp_awk_val_int_t*)v)->val != max)
|
||||||
{
|
{
|
||||||
v = xp_awk_makeintval (run, (xp_long_t)max);
|
v = xp_awk_makeintval (run, (xp_long_t)max);
|
||||||
if (v == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM);
|
if (v == XP_NULL)
|
||||||
|
{
|
||||||
|
*errnum = XP_AWK_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
xp_awk_setglobal (run, XP_AWK_GLOBAL_NF, v);
|
xp_awk_setglobal (run, XP_AWK_GLOBAL_NF, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: tree.h,v 1.57 2006-07-01 16:07:06 bacon Exp $
|
* $Id: tree.h,v 1.58 2006-07-13 15:43:39 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_TREE_H_
|
#ifndef _XP_AWK_TREE_H_
|
||||||
@ -81,6 +81,7 @@ enum
|
|||||||
XP_AWK_OUT_CONSOLE
|
XP_AWK_OUT_CONSOLE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* afn (awk function defined with the keyword function) */
|
||||||
typedef struct xp_awk_afn_t xp_awk_afn_t;
|
typedef struct xp_awk_afn_t xp_awk_afn_t;
|
||||||
|
|
||||||
typedef struct xp_awk_nde_t xp_awk_nde_t;
|
typedef struct xp_awk_nde_t xp_awk_nde_t;
|
||||||
|
@ -1,24 +1,5 @@
|
|||||||
/*
|
|
||||||
{
|
|
||||||
print "1111111111111";
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
print "22222222222222";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
print "33333333333333333";
|
|
||||||
}
|
|
||||||
|
|
||||||
END
|
|
||||||
{
|
|
||||||
print "\a";
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
global x, y;
|
global x, y;
|
||||||
|
|
||||||
{
|
{
|
||||||
print "NF = " NF;
|
print "NF = " NF;
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
@ -33,6 +14,7 @@ global x, y;
|
|||||||
//$3 = $2;
|
//$3 = $2;
|
||||||
//$2 = $2;
|
//$2 = $2;
|
||||||
|
|
||||||
|
OFS["1234"]=":";
|
||||||
$20 = 10;
|
$20 = 10;
|
||||||
print $0;
|
print $0;
|
||||||
print "--------------------";
|
print "--------------------";
|
||||||
|
@ -1 +1 @@
|
|||||||
{ $0=" "; /*print NF;*/ print "a" $0 "b"; x = $1; }
|
{ $0=" "; print NF; print "a" $0 "b"; x = $1; }
|
||||||
|
Loading…
Reference in New Issue
Block a user