*** empty log message ***
This commit is contained in:
parent
1f94f4c4e6
commit
6dc8b225d6
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: parse.c,v 1.129 2006-06-29 15:40:30 bacon Exp $
|
||||
* $Id: parse.c,v 1.130 2006-06-30 03:53:16 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk_i.h>
|
||||
@ -68,6 +68,10 @@ enum
|
||||
TOKEN_BEGIN,
|
||||
TOKEN_END,
|
||||
TOKEN_FUNCTION,
|
||||
|
||||
TOKEN_LOCAL,
|
||||
TOKEN_GLOBAL,
|
||||
|
||||
TOKEN_IF,
|
||||
TOKEN_ELSE,
|
||||
TOKEN_WHILE,
|
||||
@ -78,15 +82,12 @@ enum
|
||||
TOKEN_RETURN,
|
||||
TOKEN_EXIT,
|
||||
TOKEN_DELETE,
|
||||
TOKEN_GETLINE,
|
||||
TOKEN_NEXT,
|
||||
TOKEN_NEXTFILE,
|
||||
TOKEN_PRINT,
|
||||
TOKEN_PRINTF,
|
||||
|
||||
TOKEN_LOCAL,
|
||||
TOKEN_GLOBAL,
|
||||
|
||||
TOKEN_GETLINE,
|
||||
TOKEN_IDENT,
|
||||
TOKEN_INT,
|
||||
TOKEN_REAL,
|
||||
@ -184,11 +185,20 @@ struct __kwent
|
||||
|
||||
static struct __kwent __kwtab[] =
|
||||
{
|
||||
/* operators */
|
||||
{ XP_T("in"), TOKEN_IN, 0 },
|
||||
|
||||
/* top-level block starters */
|
||||
{ XP_T("BEGIN"), TOKEN_BEGIN, 0 },
|
||||
{ XP_T("END"), TOKEN_END, 0 },
|
||||
|
||||
{ XP_T("function"), TOKEN_FUNCTION, 0 },
|
||||
{ XP_T("func"), TOKEN_FUNCTION, 0 },
|
||||
|
||||
/* keywords for variable declaration */
|
||||
{ XP_T("local"), TOKEN_LOCAL, XP_AWK_EXPLICIT },
|
||||
{ XP_T("global"), TOKEN_GLOBAL, XP_AWK_EXPLICIT },
|
||||
|
||||
/* keywords that start statements excluding expression statements */
|
||||
{ XP_T("if"), TOKEN_IF, 0 },
|
||||
{ XP_T("else"), TOKEN_ELSE, 0 },
|
||||
{ XP_T("while"), TOKEN_WHILE, 0 },
|
||||
@ -199,16 +209,13 @@ static struct __kwent __kwtab[] =
|
||||
{ XP_T("return"), TOKEN_RETURN, 0 },
|
||||
{ XP_T("exit"), TOKEN_EXIT, 0 },
|
||||
{ XP_T("delete"), TOKEN_DELETE, 0 },
|
||||
{ XP_T("getline"), TOKEN_GETLINE, XP_AWK_EXTIO },
|
||||
{ XP_T("next"), TOKEN_NEXT, 0 },
|
||||
{ XP_T("nextfile"), TOKEN_NEXTFILE, 0 },
|
||||
{ XP_T("print"), TOKEN_PRINT, XP_AWK_EXTIO },
|
||||
{ XP_T("printf"), TOKEN_PRINTF, XP_AWK_EXTIO },
|
||||
|
||||
{ XP_T("local"), TOKEN_LOCAL, XP_AWK_EXPLICIT },
|
||||
{ XP_T("global"), TOKEN_GLOBAL, XP_AWK_EXPLICIT },
|
||||
|
||||
{ XP_T("in"), TOKEN_IN, 0 },
|
||||
/* keywords that can start an expression */
|
||||
{ XP_T("getline"), TOKEN_GETLINE, XP_AWK_EXTIO },
|
||||
|
||||
{ XP_NULL, 0, 0 }
|
||||
};
|
||||
@ -1629,7 +1636,7 @@ static xp_awk_nde_t* __parse_concat (xp_awk_t* awk)
|
||||
|
||||
/* TODO: write a better code to do this....
|
||||
* first of all, is the following check sufficient??? */
|
||||
while (awk->token.type > TOKEN_QUEST)
|
||||
while (MATCH(awk,TOKEN_LPAREN) || awk->token.type >= TOKEN_GETLINE)
|
||||
{
|
||||
right = __parse_additive (awk);
|
||||
if (right == XP_NULL)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: run.c,v 1.115 2006-06-29 15:40:30 bacon Exp $
|
||||
* $Id: run.c,v 1.116 2006-06-30 03:53:16 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk_i.h>
|
||||
@ -13,6 +13,8 @@
|
||||
#include <xp/bas/memory.h>
|
||||
#endif
|
||||
|
||||
#define DEF_BUF_CAPA 256
|
||||
|
||||
#define STACK_INCREMENT 512
|
||||
|
||||
#define STACK_AT(run,n) ((run)->stack[(run)->stack_base+(n)])
|
||||
@ -250,14 +252,14 @@ static int __open_run (
|
||||
|
||||
run->input.buf_pos = 0;
|
||||
run->input.buf_len = 0;
|
||||
if (xp_str_open (&run->input.line, 256) == XP_NULL)
|
||||
if (xp_str_open (&run->input.line, DEF_BUF_CAPA) == XP_NULL)
|
||||
{
|
||||
run->errnum = XP_AWK_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (xp_awk_map_open (&run->named,
|
||||
run, 256, __free_namedval) == XP_NULL)
|
||||
run, DEF_BUF_CAPA, __free_namedval) == XP_NULL)
|
||||
{
|
||||
xp_str_close (&run->input.line);
|
||||
run->errnum = XP_AWK_ENOMEM;
|
||||
@ -2342,9 +2344,49 @@ static xp_awk_val_t* __eval_binop_exp (
|
||||
static xp_awk_val_t* __eval_binop_concat (
|
||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||
{
|
||||
xp_printf (XP_T("eval_binop_concat not implemented yet...\n"));
|
||||
PANIC (run, XP_AWK_EINTERNAL);
|
||||
return XP_NULL;
|
||||
xp_str_t lv, rv;
|
||||
xp_awk_val_t* res;
|
||||
int errnum;
|
||||
|
||||
if (xp_str_open (&lv, DEF_BUF_CAPA) == XP_NULL)
|
||||
{
|
||||
PANIC (run, XP_AWK_ENOMEM);
|
||||
}
|
||||
|
||||
if (xp_str_open (&rv, DEF_BUF_CAPA) == XP_NULL)
|
||||
{
|
||||
xp_str_close (&lv);
|
||||
PANIC (run, XP_AWK_ENOMEM);
|
||||
}
|
||||
|
||||
if (xp_awk_valtostr (left, &errnum, &lv) == XP_NULL)
|
||||
{
|
||||
xp_str_close (&lv);
|
||||
xp_str_close (&rv);
|
||||
PANIC (run, errnum);
|
||||
}
|
||||
|
||||
if (xp_awk_valtostr (right, &errnum, &rv) == XP_NULL)
|
||||
{
|
||||
xp_str_close (&lv);
|
||||
xp_str_close (&rv);
|
||||
PANIC (run, errnum);
|
||||
}
|
||||
|
||||
res = xp_awk_makestrval2 (
|
||||
XP_STR_BUF(&lv), XP_STR_LEN(&lv),
|
||||
XP_STR_BUF(&rv), XP_STR_LEN(&rv));
|
||||
if (res == XP_NULL)
|
||||
{
|
||||
xp_str_close (&lv);
|
||||
xp_str_close (&rv);
|
||||
PANIC (run, XP_AWK_ENOMEM);
|
||||
}
|
||||
|
||||
xp_str_close (&lv);
|
||||
xp_str_close (&rv);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static xp_awk_val_t* __eval_binop_ma (
|
||||
@ -3108,7 +3150,7 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
dst = (in == XP_NULL)? XP_T(""): in;
|
||||
|
||||
/* TODO: optimization in line buffer management */
|
||||
if (xp_str_open (&buf, 256) == XP_NULL)
|
||||
if (xp_str_open (&buf, DEF_BUF_CAPA) == XP_NULL)
|
||||
{
|
||||
if (in != XP_NULL) xp_free (in);
|
||||
PANIC (run, XP_AWK_ENOMEM);
|
||||
@ -3306,7 +3348,7 @@ static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
/* multidimensional index */
|
||||
xp_str_t idxstr;
|
||||
|
||||
if (xp_str_open (&idxstr, 256) == XP_NULL)
|
||||
if (xp_str_open (&idxstr, DEF_BUF_CAPA) == XP_NULL)
|
||||
{
|
||||
PANIC (run, XP_AWK_ENOMEM);
|
||||
}
|
||||
|
@ -29,5 +29,6 @@ BEGIN
|
||||
getline x < "abc";
|
||||
print x > "abc";
|
||||
|
||||
print 1 2 getline j j;
|
||||
print "abc" 1 + 2 3 + 49 2 / 3;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user