*** empty log message ***
This commit is contained in:
parent
c871f68651
commit
706a535740
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: awk.c,v 1.53 2006-06-19 09:08:50 bacon Exp $
|
||||
* $Id: awk.c,v 1.54 2006-06-19 15:43:27 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk_i.h>
|
||||
@ -225,7 +225,7 @@ xp_size_t xp_awk_getsrcline (xp_awk_t* awk)
|
||||
}
|
||||
|
||||
|
||||
/* TODO: redo it */
|
||||
/* TODO: imrove this... should it close io when it is overridden with a new handler??? */
|
||||
int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg)
|
||||
{
|
||||
if (id < 0 || id >= xp_countof(awk->extio))
|
||||
@ -233,6 +233,7 @@ int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg)
|
||||
awk->errnum = XP_AWK_EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
awk->extio[id] = handler;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: awk_i.h,v 1.17 2006-06-19 09:08:50 bacon Exp $
|
||||
* $Id: awk_i.h,v 1.18 2006-06-19 15:43:27 bacon Exp $
|
||||
*/
|
||||
|
||||
#ifndef _XP_AWK_AWKI_H_
|
||||
@ -10,12 +10,12 @@ typedef struct xp_awk_run_t xp_awk_run_t;
|
||||
typedef struct xp_awk_tree_t xp_awk_tree_t;
|
||||
|
||||
#include <xp/awk/awk.h>
|
||||
#include <xp/awk/tree.h>
|
||||
#include <xp/awk/tab.h>
|
||||
#include <xp/awk/map.h>
|
||||
#include <xp/awk/val.h>
|
||||
#include <xp/awk/run.h>
|
||||
#include <xp/awk/func.h>
|
||||
#include <xp/awk/tree.h>
|
||||
#include <xp/awk/tab.h>
|
||||
#include <xp/awk/run.h>
|
||||
|
||||
#ifdef XP_AWK_STAND_ALONE
|
||||
#include <xp/awk/sa.h>
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: parse.c,v 1.116 2006-06-18 11:18:49 bacon Exp $
|
||||
* $Id: parse.c,v 1.117 2006-06-19 15:43:27 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk_i.h>
|
||||
@ -145,7 +145,8 @@ static xp_awk_nde_t* __parse_primary (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk);
|
||||
|
||||
static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name);
|
||||
static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name);
|
||||
static xp_awk_nde_t* __parse_fncall (
|
||||
xp_awk_t* awk, xp_char_t* name, xp_awk_bfn_t* bfn);
|
||||
static xp_awk_nde_t* __parse_if (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_while (xp_awk_t* awk);
|
||||
static xp_awk_nde_t* __parse_for (xp_awk_t* awk);
|
||||
@ -2043,27 +2044,18 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
|
||||
{
|
||||
xp_awk_nde_t* nde;
|
||||
|
||||
xp_free (name_dup);
|
||||
if (!MATCH(awk,TOKEN_LPAREN))
|
||||
{
|
||||
/* built-in function should be in the form
|
||||
* of the function call */
|
||||
xp_free (name_dup);
|
||||
PANIC (awk, XP_AWK_ELPAREN);
|
||||
}
|
||||
|
||||
/* bfn->handler... */
|
||||
nde = __parse_funcall (awk, name_dup);
|
||||
if (nde == XP_NULL) xp_free (name_dup);
|
||||
nde = __parse_fncall (awk, XP_NULL, bfn);
|
||||
return (xp_awk_nde_t*)nde;
|
||||
}
|
||||
|
||||
/* TODO: user-defined functions */
|
||||
/*
|
||||
if (__is_ufname (name_dup))
|
||||
{
|
||||
}
|
||||
*/
|
||||
|
||||
/* now we know that name_dup is a normal identifier. */
|
||||
if (MATCH(awk,TOKEN_LBRACK))
|
||||
{
|
||||
@ -2076,7 +2068,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
|
||||
{
|
||||
/* function call */
|
||||
xp_awk_nde_t* nde;
|
||||
nde = __parse_funcall (awk, name_dup);
|
||||
nde = __parse_fncall (awk, name_dup, XP_NULL);
|
||||
if (nde == XP_NULL) xp_free (name_dup);
|
||||
return (xp_awk_nde_t*)nde;
|
||||
}
|
||||
@ -2271,7 +2263,8 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name)
|
||||
PANIC (awk, XP_AWK_EUNDEF);
|
||||
}
|
||||
|
||||
static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name)
|
||||
static xp_awk_nde_t* __parse_fncall (
|
||||
xp_awk_t* awk, xp_char_t* name, xp_awk_bfn_t* bfn)
|
||||
{
|
||||
xp_awk_nde_t* head, * curr, * nde;
|
||||
xp_awk_nde_call_t* call;
|
||||
@ -2336,11 +2329,22 @@ static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name)
|
||||
PANIC (awk, XP_AWK_ENOMEM);
|
||||
}
|
||||
|
||||
call->type = XP_AWK_NDE_CALL;
|
||||
call->next = XP_NULL;
|
||||
call->name = name;
|
||||
call->args = head;
|
||||
call->nargs = nargs;
|
||||
if (bfn != XP_NULL)
|
||||
{
|
||||
call->type = XP_AWK_NDE_BFN;
|
||||
call->next = XP_NULL;
|
||||
call->what.bfn = bfn;
|
||||
call->args = head;
|
||||
call->nargs = nargs;
|
||||
}
|
||||
else
|
||||
{
|
||||
call->type = XP_AWK_NDE_UFN;
|
||||
call->next = XP_NULL;
|
||||
call->what.name = name;
|
||||
call->args = head;
|
||||
call->nargs = nargs;
|
||||
}
|
||||
|
||||
return (xp_awk_nde_t*)call;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: run.c,v 1.99 2006-06-19 09:08:50 bacon Exp $
|
||||
* $Id: run.c,v 1.100 2006-06-19 15:43:27 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk_i.h>
|
||||
@ -120,7 +120,8 @@ static xp_awk_val_t* __eval_unary (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_incpre (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_incpst (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_cnd (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_call (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_bfn (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_ufn (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_int (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_real (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
static xp_awk_val_t* __eval_str (xp_awk_run_t* run, xp_awk_nde_t* nde);
|
||||
@ -315,15 +316,15 @@ static int __run_main (xp_awk_run_t* run)
|
||||
};
|
||||
static xp_awk_nde_call_t nde =
|
||||
{
|
||||
XP_AWK_NDE_CALL, /* type */
|
||||
XP_NULL, /* next */
|
||||
m_a_i_n, /* name */
|
||||
XP_NULL /* args */
|
||||
XP_AWK_NDE_UFN, /* type */
|
||||
XP_NULL, /* next */
|
||||
m_a_i_n, /* name */
|
||||
XP_NULL /* args */
|
||||
};
|
||||
|
||||
run->exit_level = EXIT_NONE;
|
||||
|
||||
v = __eval_call(run,(xp_awk_nde_t*)&nde);
|
||||
v = __eval_ufn (run, (xp_awk_nde_t*)&nde);
|
||||
if (v == XP_NULL) n = -1;
|
||||
else
|
||||
{
|
||||
@ -1000,7 +1001,7 @@ static int __run_return_statement (xp_awk_run_t* run, xp_awk_nde_return_t* nde)
|
||||
xp_awk_refdownval (run, STACK_RETVAL(run));
|
||||
STACK_RETVAL(run) = val;
|
||||
|
||||
xp_awk_refupval (val); /* see __eval_call for the trick */
|
||||
xp_awk_refupval (val); /* see __eval_ufn for the trick */
|
||||
/*xp_printf (XP_T("set return value....\n"));*/
|
||||
}
|
||||
|
||||
@ -1065,7 +1066,8 @@ static xp_awk_val_t* __eval_expression (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
__eval_incpre,
|
||||
__eval_incpst,
|
||||
__eval_cnd,
|
||||
__eval_call,
|
||||
__eval_bfn,
|
||||
__eval_ufn,
|
||||
__eval_int,
|
||||
__eval_real,
|
||||
__eval_str,
|
||||
@ -2528,7 +2530,13 @@ static xp_awk_val_t* __eval_cnd (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
return v;
|
||||
}
|
||||
|
||||
static xp_awk_val_t* __eval_call (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
static xp_awk_val_t* __eval_bfn (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
{
|
||||
xp_printf (XP_T("__eval_bfn not implemented properly....\n"));
|
||||
PANIC (run, XP_AWK_EINTERNAL);
|
||||
}
|
||||
|
||||
static xp_awk_val_t* __eval_ufn (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
{
|
||||
xp_awk_func_t* func;
|
||||
xp_awk_pair_t* pair;
|
||||
@ -2540,7 +2548,7 @@ static xp_awk_val_t* __eval_call (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
int n;
|
||||
|
||||
/*xp_printf (XP_T(".....__eval_call\n"));*/
|
||||
pair = xp_awk_map_get (&run->awk->tree.funcs, call->name);
|
||||
pair = xp_awk_map_get (&run->awk->tree.funcs, call->what.name);
|
||||
if (pair == XP_NULL) PANIC (run, XP_AWK_ENOSUCHFUNC);
|
||||
|
||||
func = (xp_awk_func_t*)pair->val;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: tree.c,v 1.54 2006-06-18 10:53:06 bacon Exp $
|
||||
* $Id: tree.c,v 1.55 2006-06-19 15:43:27 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk_i.h>
|
||||
@ -339,10 +339,19 @@ static int __print_expression (xp_awk_nde_t* nde)
|
||||
break;
|
||||
}
|
||||
|
||||
case XP_AWK_NDE_CALL:
|
||||
case XP_AWK_NDE_BFN:
|
||||
{
|
||||
xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)nde;
|
||||
xp_printf (XP_T("%s ("), px->name);
|
||||
xp_printf (XP_T("%s ("), px->what.bfn->name);
|
||||
if (__print_expression_list (px->args) == -1) return -1;
|
||||
xp_printf (XP_T(")"));
|
||||
break;
|
||||
}
|
||||
|
||||
case XP_AWK_NDE_UFN:
|
||||
{
|
||||
xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)nde;
|
||||
xp_printf (XP_T("%s ("), px->what.name);
|
||||
if (__print_expression_list (px->args) == -1) return -1;
|
||||
xp_printf (XP_T(")"));
|
||||
break;
|
||||
@ -912,10 +921,19 @@ void xp_awk_clrpt (xp_awk_nde_t* tree)
|
||||
break;
|
||||
}
|
||||
|
||||
case XP_AWK_NDE_CALL:
|
||||
case XP_AWK_NDE_BFN:
|
||||
{
|
||||
xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)p;
|
||||
xp_free (px->name);
|
||||
/* xp_free (px->what.bfn); */
|
||||
xp_awk_clrpt (px->args);
|
||||
xp_free (p);
|
||||
break;
|
||||
}
|
||||
|
||||
case XP_AWK_NDE_UFN:
|
||||
{
|
||||
xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)p;
|
||||
xp_free (px->what.name);
|
||||
xp_awk_clrpt (px->args);
|
||||
xp_free (p);
|
||||
break;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: tree.h,v 1.45 2006-06-18 10:53:06 bacon Exp $
|
||||
* $Id: tree.h,v 1.46 2006-06-19 15:43:27 bacon Exp $
|
||||
*/
|
||||
|
||||
#ifndef _XP_AWK_TREE_H_
|
||||
@ -39,7 +39,8 @@ enum
|
||||
XP_AWK_NDE_EXP_INCPRE,
|
||||
XP_AWK_NDE_EXP_INCPST,
|
||||
XP_AWK_NDE_CND,
|
||||
XP_AWK_NDE_CALL,
|
||||
XP_AWK_NDE_BFN,
|
||||
XP_AWK_NDE_UFN,
|
||||
XP_AWK_NDE_INT,
|
||||
XP_AWK_NDE_REAL,
|
||||
XP_AWK_NDE_STR,
|
||||
@ -209,11 +210,15 @@ struct xp_awk_nde_var_t
|
||||
xp_awk_nde_t* idx; /* XP_NULL for XXXIDX */
|
||||
};
|
||||
|
||||
/* XP_AWK_NDE_CALL */
|
||||
/* XP_AWK_NDE_BFN, XP_AWK_NDE_UFN */
|
||||
struct xp_awk_nde_call_t
|
||||
{
|
||||
XP_AWK_NDE_HDR;
|
||||
xp_char_t* name;
|
||||
union
|
||||
{
|
||||
xp_char_t* name;
|
||||
xp_awk_bfn_t* bfn;
|
||||
} what;
|
||||
xp_awk_nde_t* args;
|
||||
xp_size_t nargs;
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: awk.c,v 1.38 2006-06-19 09:08:50 bacon Exp $
|
||||
* $Id: awk.c,v 1.39 2006-06-19 15:43:27 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk.h>
|
||||
@ -176,8 +176,12 @@ static xp_ssize_t process_extio_pipe (
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static xp_ssize_t process_extio_file (
|
||||
@ -222,6 +226,11 @@ static xp_ssize_t process_extio_file (
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user