*** empty log message ***
This commit is contained in:
parent
d2f5ee9b36
commit
503a24f5c1
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.h,v 1.100 2006-08-23 15:41:45 bacon Exp $
|
* $Id: awk.h,v 1.101 2006-08-24 03:30:06 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_AWK_H_
|
#ifndef _XP_AWK_AWK_H_
|
||||||
@ -293,9 +293,10 @@ int xp_awk_getrunerrnum (xp_awk_t* awk, void* run, int* errnum);
|
|||||||
/* functions to access internal stack structure */
|
/* functions to access internal stack structure */
|
||||||
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);
|
xp_awk_val_t* xp_awk_getglobal (void* run, xp_size_t idx);
|
||||||
void xp_awk_setglobal (void* run, xp_size_t idx, 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);
|
||||||
|
void xp_awk_setretval (void* run, xp_awk_val_t* val);
|
||||||
|
|
||||||
/* utility functions exported by awk.h */
|
/* utility functions exported by awk.h */
|
||||||
xp_long_t xp_awk_strtolong (
|
xp_long_t xp_awk_strtolong (
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: extio.c,v 1.31 2006-08-23 15:45:11 bacon Exp $
|
* $Id: extio.c,v 1.32 2006-08-24 03:30:07 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -88,7 +88,10 @@ int xp_awk_readextio (
|
|||||||
{
|
{
|
||||||
xp_awk_extio_t* p = run->extio.chain;
|
xp_awk_extio_t* p = run->extio.chain;
|
||||||
xp_awk_io_t handler;
|
xp_awk_io_t handler;
|
||||||
int extio_type, extio_mode, extio_mask, n;
|
int extio_type, extio_mode, extio_mask, n, ret;
|
||||||
|
xp_awk_val_t* rs;
|
||||||
|
xp_char_t* rs_ptr;
|
||||||
|
xp_size_t rs_len;
|
||||||
|
|
||||||
xp_assert (in_type >= 0 && in_type <= xp_countof(__in_type_map));
|
xp_assert (in_type >= 0 && in_type <= xp_countof(__in_type_map));
|
||||||
xp_assert (in_type >= 0 && in_type <= xp_countof(__in_mode_map));
|
xp_assert (in_type >= 0 && in_type <= xp_countof(__in_mode_map));
|
||||||
@ -168,9 +171,37 @@ int xp_awk_readextio (
|
|||||||
if (n == 0) return 0;
|
if (n == 0) return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read a line */
|
/* ready to read a line */
|
||||||
xp_str_clear (buf);
|
xp_str_clear (buf);
|
||||||
|
|
||||||
|
/* get the record separator */
|
||||||
|
rs = xp_awk_getglobal (run, XP_AWK_GLOBAL_RS);
|
||||||
|
xp_awk_refupval (rs);
|
||||||
|
|
||||||
|
if (rs->type == XP_AWK_VAL_NIL)
|
||||||
|
{
|
||||||
|
rs_ptr = XP_NULL;
|
||||||
|
rs_len = 0;
|
||||||
|
}
|
||||||
|
else if (rs->type == XP_AWK_VAL_STR)
|
||||||
|
{
|
||||||
|
rs_ptr = ((xp_awk_val_str_t*)rs)->buf;
|
||||||
|
rs_len = ((xp_awk_val_str_t*)rs)->len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rs_ptr = xp_awk_valtostr (
|
||||||
|
rs, errnum, xp_true, XP_NULL, &rs_len);
|
||||||
|
if (rs_ptr == XP_NULL)
|
||||||
|
{
|
||||||
|
xp_awk_refdownval (run, rs);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 1;
|
||||||
|
|
||||||
|
/* call the io handler */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
xp_char_t c;
|
xp_char_t c;
|
||||||
@ -181,7 +212,7 @@ int xp_awk_readextio (
|
|||||||
|
|
||||||
if (p->in.eof)
|
if (p->in.eof)
|
||||||
{
|
{
|
||||||
if (XP_STR_LEN(buf) == 0) return 0;
|
if (XP_STR_LEN(buf) == 0) ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,13 +226,14 @@ int xp_awk_readextio (
|
|||||||
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one);
|
XP_AWK_GLOBAL_ERRNO, xp_awk_val_one);
|
||||||
|
|
||||||
*errnum = XP_AWK_EIOHANDLER;
|
*errnum = XP_AWK_EIOHANDLER;
|
||||||
return -1;
|
ret = -1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
{
|
{
|
||||||
p->in.eof = xp_true;
|
p->in.eof = xp_true;
|
||||||
if (XP_STR_LEN(buf) == 0) return 0;
|
if (XP_STR_LEN(buf) == 0) ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,16 +242,38 @@ int xp_awk_readextio (
|
|||||||
}
|
}
|
||||||
|
|
||||||
c = p->in.buf[p->in.pos++];
|
c = p->in.buf[p->in.pos++];
|
||||||
if (c == XP_C('\n')) break;
|
|
||||||
|
if (rs_ptr == XP_NULL)
|
||||||
|
{
|
||||||
|
/* separate by a new line */
|
||||||
|
if (c == XP_C('\n')) break;
|
||||||
|
}
|
||||||
|
else if (rs_len == 0)
|
||||||
|
{
|
||||||
|
/* TODO: */
|
||||||
|
/* separate by a blank line */
|
||||||
|
}
|
||||||
|
else if (rs_len == 1)
|
||||||
|
{
|
||||||
|
if (c == rs_ptr[0]) break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TODO: */
|
||||||
|
/* regular expression */
|
||||||
|
}
|
||||||
|
|
||||||
if (xp_str_ccat (buf, c) == (xp_size_t)-1)
|
if (xp_str_ccat (buf, c) == (xp_size_t)-1)
|
||||||
{
|
{
|
||||||
*errnum = XP_AWK_ENOMEM;
|
*errnum = XP_AWK_ENOMEM;
|
||||||
return -1;
|
ret = -1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
if (rs_ptr != XP_NULL && rs->type != XP_AWK_VAL_STR) xp_free (rs_ptr);
|
||||||
|
xp_awk_refdownval (run, rs);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int xp_awk_writeextio (
|
int xp_awk_writeextio (
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: func.c,v 1.30 2006-08-23 15:46:03 bacon Exp $
|
* $Id: func.c,v 1.31 2006-08-24 03:30:07 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -44,6 +44,7 @@ static xp_awk_bfn_t __sys_bfn[] =
|
|||||||
{ XP_T("split"), 5, 0, 2, 3, XP_T("vrv"), __bfn_split },
|
{ XP_T("split"), 5, 0, 2, 3, XP_T("vrv"), __bfn_split },
|
||||||
{ XP_T("tolower"), 7, 0, 1, 1, XP_NULL, __bfn_tolower },
|
{ XP_T("tolower"), 7, 0, 1, 1, XP_NULL, __bfn_tolower },
|
||||||
{ XP_T("toupper"), 7, 0, 1, 1, XP_NULL, __bfn_toupper },
|
{ XP_T("toupper"), 7, 0, 1, 1, XP_NULL, __bfn_toupper },
|
||||||
|
//{ XP_T("gsub"), 4, 0, 2, 3, XP_T("vrr"), __bfn_gsub },
|
||||||
|
|
||||||
/* TODO: remove these two functions */
|
/* TODO: remove these two functions */
|
||||||
{ XP_T("system"), 6, 0, 1, 1, XP_NULL, __bfn_system },
|
{ XP_T("system"), 6, 0, 1, 1, XP_NULL, __bfn_system },
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.178 2006-08-23 15:47:28 bacon Exp $
|
* $Id: run.c,v 1.179 2006-08-24 03:30:07 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -209,20 +209,15 @@ xp_awk_val_t* xp_awk_getarg (void* run, xp_size_t idx)
|
|||||||
return STACK_ARG ((xp_awk_run_t*)run, idx);
|
return STACK_ARG ((xp_awk_run_t*)run, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xp_awk_setretval (void* run, xp_awk_val_t* val)
|
xp_awk_val_t* xp_awk_getglobal (void* run, xp_size_t idx)
|
||||||
{
|
{
|
||||||
xp_awk_run_t* r = (xp_awk_run_t*)run;
|
return STACK_GLOBAL(((xp_awk_run_t*)run),idx);
|
||||||
xp_awk_refdownval (r, STACK_RETVAL(r));
|
|
||||||
STACK_RETVAL(r) = val;
|
|
||||||
/* should use the same trick as __run_return_statement */
|
|
||||||
xp_awk_refupval (val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* 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(((xp_awk_run_t*)run),idx));
|
||||||
xp_awk_refdownval (run, STACK_GLOBAL(r,idx));
|
STACK_GLOBAL(((xp_awk_run_t*)run),idx) = val;
|
||||||
STACK_GLOBAL(r,idx) = val;
|
|
||||||
xp_awk_refupval (val);
|
xp_awk_refupval (val);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,6 +227,15 @@ void xp_awk_seterrnum (void* run, int errnum)
|
|||||||
r->errnum = errnum;
|
r->errnum = errnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xp_awk_setretval (void* run, xp_awk_val_t* val)
|
||||||
|
{
|
||||||
|
xp_awk_run_t* r = (xp_awk_run_t*)run;
|
||||||
|
xp_awk_refdownval (r, STACK_RETVAL(r));
|
||||||
|
STACK_RETVAL(r) = val;
|
||||||
|
/* should use the same trick as __run_return_statement */
|
||||||
|
xp_awk_refupval (val);
|
||||||
|
}
|
||||||
|
|
||||||
int xp_awk_run (xp_awk_t* awk, xp_awk_runios_t* runios, xp_awk_runcbs_t* runcbs)
|
int xp_awk_run (xp_awk_t* awk, xp_awk_runios_t* runios, xp_awk_runcbs_t* runcbs)
|
||||||
{
|
{
|
||||||
xp_awk_run_t* run;
|
xp_awk_run_t* run;
|
||||||
@ -4480,7 +4484,6 @@ static int __read_record (xp_awk_run_t* run)
|
|||||||
|
|
||||||
__clear_record (run, xp_false);
|
__clear_record (run, xp_false);
|
||||||
|
|
||||||
/*TODO: use RS */
|
|
||||||
n = xp_awk_readextio (
|
n = xp_awk_readextio (
|
||||||
run, XP_AWK_IN_CONSOLE,
|
run, XP_AWK_IN_CONSOLE,
|
||||||
XP_T(""), &run->inrec.line, &errnum);
|
XP_T(""), &run->inrec.line, &errnum);
|
||||||
|
2
ase/test/awk/t31.awk
Normal file
2
ase/test/awk/t31.awk
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
BEGIN { /*RS="";*/ }
|
||||||
|
{ print $0; }
|
Loading…
Reference in New Issue
Block a user