*** empty log message ***

This commit is contained in:
hyung-hwan 2006-09-29 11:18:13 +00:00
parent 012777d425
commit 95b904c8e9
6 changed files with 168 additions and 134 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk_i.h,v 1.60 2006-09-27 14:11:31 bacon Exp $ * $Id: awk_i.h,v 1.61 2006-09-29 11:18:13 bacon Exp $
*/ */
#ifndef _XP_AWK_AWKI_H_ #ifndef _XP_AWK_AWKI_H_
@ -248,12 +248,22 @@ struct xp_awk_run_t
void* fs; void* fs;
int ignorecase; int ignorecase;
struct
{
xp_char_t* ptr;
xp_size_t len;
} ofmt;
struct struct
{ {
xp_char_t* ptr; xp_char_t* ptr;
xp_size_t len; xp_size_t len;
} ofs; } ofs;
struct struct
{
xp_char_t* ptr;
xp_size_t len;
} ors;
struct
{ {
xp_char_t* ptr; xp_char_t* ptr;
xp_size_t len; xp_size_t len;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.c,v 1.48 2006-09-22 14:04:25 bacon Exp $ * $Id: extio.c,v 1.49 2006-09-29 11:18:13 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -72,10 +72,6 @@ static int __out_mask_map[] =
__MASK_WRITE __MASK_WRITE
}; };
static int __writeextio (
xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v, xp_bool_t nl);
int xp_awk_readextio ( int xp_awk_readextio (
xp_awk_run_t* run, int in_type, xp_awk_run_t* run, int in_type,
const xp_char_t* name, xp_awk_str_t* buf) const xp_char_t* name, xp_awk_str_t* buf)
@ -360,28 +356,37 @@ int xp_awk_readextio (
return ret; return ret;
} }
int xp_awk_writeextio ( int xp_awk_writeextio_val (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v) const xp_char_t* name, xp_awk_val_t* v)
{ {
return __writeextio (run, out_type, name, v, xp_false); xp_char_t* str;
xp_size_t len;
int n;
if (v->type == XP_AWK_VAL_STR)
{
str = ((xp_awk_val_str_t*)v)->buf;
len = ((xp_awk_val_str_t*)v)->len;
}
else
{
str = xp_awk_valtostr (run, v, xp_true, XP_NULL, &len);
if (str == XP_NULL) return -1;
}
n = xp_awk_writeextio_str (run, out_type, name, str, len);
if (v->type != XP_AWK_VAL_STR) XP_AWK_FREE (run->awk, str);
return n;
} }
int xp_awk_writeextio_nl ( int xp_awk_writeextio_str (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v) const xp_char_t* name, xp_char_t* str, xp_size_t len)
{
return __writeextio (run, out_type, name, v, xp_true);
}
static int __writeextio (
xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v, xp_bool_t nl)
{ {
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;
xp_char_t* str;
xp_size_t len;
int extio_type, extio_mode, extio_mask, n; int extio_type, extio_mode, extio_mask, n;
xp_assert (out_type >= 0 && out_type <= xp_countof(__out_type_map)); xp_assert (out_type >= 0 && out_type <= xp_countof(__out_type_map));
@ -401,21 +406,6 @@ static int __writeextio (
return -1; return -1;
} }
if (v->type == XP_AWK_VAL_STR)
{
str = ((xp_awk_val_str_t*)v)->buf;
len = ((xp_awk_val_str_t*)v)->len;
}
else
{
/* convert the value to string representation first */
/* TOOD: consider using a shared buffer when calling
* xp_awk_valtostr. maybe run->shared_buf.extio */
str = xp_awk_valtostr (run, v, xp_true, XP_NULL, &len);
if (str == XP_NULL) return -1;
}
/* look for the corresponding extio for name */ /* look for the corresponding extio for name */
while (p != XP_NULL) while (p != XP_NULL)
{ {
@ -441,7 +431,6 @@ static int __writeextio (
run->awk, xp_sizeof(xp_awk_extio_t)); run->awk, xp_sizeof(xp_awk_extio_t));
if (p == XP_NULL) if (p == XP_NULL)
{ {
if (v->type != XP_AWK_VAL_STR) XP_AWK_FREE (run->awk, str);
run->errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -450,7 +439,6 @@ static int __writeextio (
if (p->name == XP_NULL) if (p->name == XP_NULL)
{ {
XP_AWK_FREE (run->awk, p); XP_AWK_FREE (run->awk, p);
if (v->type != XP_AWK_VAL_STR) XP_AWK_FREE (run->awk, str);
run->errnum = XP_AWK_ENOMEM; run->errnum = XP_AWK_ENOMEM;
return -1; return -1;
} }
@ -465,7 +453,6 @@ static int __writeextio (
{ {
XP_AWK_FREE (run->awk, p->name); XP_AWK_FREE (run->awk, p->name);
XP_AWK_FREE (run->awk, p); XP_AWK_FREE (run->awk, p);
if (v->type != XP_AWK_VAL_STR) XP_AWK_FREE (run->awk, str);
/* TODO: use meaningful error code */ /* TODO: use meaningful error code */
if (xp_awk_setglobal ( if (xp_awk_setglobal (
@ -484,41 +471,11 @@ static int __writeextio (
if (n == 0) return 0; if (n == 0) return 0;
} }
/* TODO: */
/* TODO: */
/* TODO: if write handler returns less than the request, loop */ /* TODO: if write handler returns less than the request, loop */
/* TODO: */
/* TODO: */
if (len > 0) if (len > 0)
{ {
n = handler (XP_AWK_IO_WRITE, p, str, len); n = handler (XP_AWK_IO_WRITE, p, str, len);
if (n == -1)
{
if (v->type != XP_AWK_VAL_STR) XP_AWK_FREE (run->awk, str);
/* TODO: use meaningful error code */
if (xp_awk_setglobal (
run, XP_AWK_GLOBAL_ERRNO,
xp_awk_val_one) == -1) return -1;
run->errnum = XP_AWK_EIOHANDLER;
return -1;
}
if (n == 0)
{
if (v->type != XP_AWK_VAL_STR) XP_AWK_FREE (run->awk, str);
return 0;
}
}
if (v->type != XP_AWK_VAL_STR) XP_AWK_FREE (run->awk, str);
if (nl)
{
/* TODO: use proper NEWLINE separator */
n = handler (XP_AWK_IO_WRITE, p, XP_T("\n"), 1);
if (n == -1) if (n == -1)
{ {
/* TODO: use meaningful error code */ /* TODO: use meaningful error code */
@ -536,6 +493,7 @@ static int __writeextio (
return 1; return 1;
} }
int xp_awk_flushextio ( int xp_awk_flushextio (
xp_awk_run_t* run, int out_type, const xp_char_t* name) xp_awk_run_t* run, int out_type, const xp_char_t* name)
{ {

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.h,v 1.12 2006-08-31 16:00:18 bacon Exp $ * $Id: extio.h,v 1.13 2006-09-29 11:18:13 bacon Exp $
*/ */
#ifndef _XP_AWK_EXTIO_H_ #ifndef _XP_AWK_EXTIO_H_
@ -17,13 +17,13 @@ int xp_awk_readextio (
xp_awk_run_t* run, int in_type, xp_awk_run_t* run, int in_type,
const xp_char_t* name, xp_awk_str_t* buf); const xp_char_t* name, xp_awk_str_t* buf);
int xp_awk_writeextio ( int xp_awk_writeextio_val (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v); const xp_char_t* name, xp_awk_val_t* v);
int xp_awk_writeextio_nl ( int xp_awk_writeextio_str (
xp_awk_run_t* run, int out_type, xp_awk_run_t* run, int out_type,
const xp_char_t* name, xp_awk_val_t* v); const xp_char_t* name, xp_char_t* str, xp_size_t len);
int xp_awk_flushextio ( int xp_awk_flushextio (
xp_awk_run_t* run, int out_type, const xp_char_t* name); xp_awk_run_t* run, int out_type, const xp_char_t* name);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.211 2006-09-28 13:47:58 bacon Exp $ * $Id: run.c,v 1.212 2006-09-29 11:18:13 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -36,7 +36,16 @@ enum
#define PANIC_I(run,code) \ #define PANIC_I(run,code) \
do { (run)->errnum = (code); return -1; } while (0) do { (run)->errnum = (code); return -1; } while (0)
#if (XP_SIZEOF_LONG_DOUBLE != 0)
#define DEFAULT_OFMT XP_T("%.6Lg")
#elif (XP_SIZEOF_DOUBLE != 0)
#define DEFAULT_OFMT XP_T("%.6g")
#else
#error Unsupported floating-point type size
#endif
#define DEFAULT_OFS XP_T(" ") #define DEFAULT_OFS XP_T(" ")
#define DEFAULT_ORS XP_T("\n")
#define DEFAULT_SUBSEP XP_T("\034") #define DEFAULT_SUBSEP XP_T("\034")
static void __add_run (xp_awk_t* awk, xp_awk_run_t* run); static void __add_run (xp_awk_t* awk, xp_awk_run_t* run);
@ -233,56 +242,7 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
PANIC_I (r, XP_AWK_ESCALARTOMAP); PANIC_I (r, XP_AWK_ESCALARTOMAP);
} }
if (idx == XP_AWK_GLOBAL_RS) if (idx == XP_AWK_GLOBAL_FS)
{
xp_char_t* rs_ptr;
xp_size_t rs_len;
if (val->type == XP_AWK_VAL_STR)
{
rs_ptr = ((xp_awk_val_str_t*)val)->buf;
rs_len = ((xp_awk_val_str_t*)val)->len;
}
else
{
/* due to the expression evaluation rule, the
* regular expression can not be an assigned value */
xp_assert (val->type != XP_AWK_VAL_REX);
rs_ptr = xp_awk_valtostr (
run, val, xp_true, XP_NULL, &rs_len);
if (rs_ptr == XP_NULL) return -1;
}
if (rs_len > 1)
{
void* rex;
/* compile the regular expression */
/* TODO: use safebuild */
rex = xp_awk_buildrex (
((xp_awk_run_t*)run)->awk,
rs_ptr, rs_len, &r->errnum);
if (rex == XP_NULL)
{
if (val->type != XP_AWK_VAL_STR)
XP_AWK_FREE (((xp_awk_run_t*)run)->awk, rs_ptr);
return -1;
}
if (r->global.rs != XP_NULL)
{
xp_awk_freerex (
((xp_awk_run_t*)run)->awk,
r->global.rs);
}
r->global.rs = rex;
}
if (val->type != XP_AWK_VAL_STR)
XP_AWK_FREE (((xp_awk_run_t*)run)->awk, rs_ptr);
}
else if (idx == XP_AWK_GLOBAL_FS)
{ {
xp_char_t* fs_ptr; xp_char_t* fs_ptr;
xp_size_t fs_len; xp_size_t fs_len;
@ -362,6 +322,18 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
if (__shorten_record (r, (xp_size_t)lv) == -1) return -1; if (__shorten_record (r, (xp_size_t)lv) == -1) return -1;
} }
} }
else if (idx == XP_AWK_GLOBAL_OFMT)
{
xp_char_t* ofmt_ptr;
xp_size_t ofmt_len;
ofmt_ptr = xp_awk_valtostr (
run, val, xp_true, XP_NULL, &ofmt_len);
if (ofmt_ptr == XP_NULL) return -1;
r->global.ofmt.ptr = ofmt_ptr;
r->global.ofmt.len = ofmt_len;
}
else if (idx == XP_AWK_GLOBAL_OFS) else if (idx == XP_AWK_GLOBAL_OFS)
{ {
xp_char_t* ofs_ptr; xp_char_t* ofs_ptr;
@ -374,6 +346,67 @@ int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val)
r->global.ofs.ptr = ofs_ptr; r->global.ofs.ptr = ofs_ptr;
r->global.ofs.len = ofs_len; r->global.ofs.len = ofs_len;
} }
else if (idx == XP_AWK_GLOBAL_ORS)
{
xp_char_t* ors_ptr;
xp_size_t ors_len;
ors_ptr = xp_awk_valtostr (
run, val, xp_true, XP_NULL, &ors_len);
if (ors_ptr == XP_NULL) return -1;
r->global.ors.ptr = ors_ptr;
r->global.ors.len = ors_len;
}
else if (idx == XP_AWK_GLOBAL_RS)
{
xp_char_t* rs_ptr;
xp_size_t rs_len;
if (val->type == XP_AWK_VAL_STR)
{
rs_ptr = ((xp_awk_val_str_t*)val)->buf;
rs_len = ((xp_awk_val_str_t*)val)->len;
}
else
{
/* due to the expression evaluation rule, the
* regular expression can not be an assigned value */
xp_assert (val->type != XP_AWK_VAL_REX);
rs_ptr = xp_awk_valtostr (
run, val, xp_true, XP_NULL, &rs_len);
if (rs_ptr == XP_NULL) return -1;
}
if (rs_len > 1)
{
void* rex;
/* compile the regular expression */
/* TODO: use safebuild */
rex = xp_awk_buildrex (
((xp_awk_run_t*)run)->awk,
rs_ptr, rs_len, &r->errnum);
if (rex == XP_NULL)
{
if (val->type != XP_AWK_VAL_STR)
XP_AWK_FREE (((xp_awk_run_t*)run)->awk, rs_ptr);
return -1;
}
if (r->global.rs != XP_NULL)
{
xp_awk_freerex (
((xp_awk_run_t*)run)->awk,
r->global.rs);
}
r->global.rs = rex;
}
if (val->type != XP_AWK_VAL_STR)
XP_AWK_FREE (((xp_awk_run_t*)run)->awk, rs_ptr);
}
else if (idx == XP_AWK_GLOBAL_SUBSEP) else if (idx == XP_AWK_GLOBAL_SUBSEP)
{ {
xp_char_t* subsep_ptr; xp_char_t* subsep_ptr;
@ -637,8 +670,12 @@ static int __init_run (
run->global.rs = XP_NULL; run->global.rs = XP_NULL;
run->global.fs = XP_NULL; run->global.fs = XP_NULL;
run->global.ignorecase = 0; run->global.ignorecase = 0;
run->global.ofmt.ptr = DEFAULT_OFMT;
run->global.ofmt.len = xp_awk_strlen(DEFAULT_OFMT);
run->global.ofs.ptr = DEFAULT_OFS; run->global.ofs.ptr = DEFAULT_OFS;
run->global.ofs.len = xp_awk_strlen(DEFAULT_OFS); run->global.ofs.len = xp_awk_strlen(DEFAULT_OFS);
run->global.ors.ptr = DEFAULT_ORS;
run->global.ors.len = xp_awk_strlen(DEFAULT_ORS);
run->global.subsep.ptr = DEFAULT_SUBSEP; run->global.subsep.ptr = DEFAULT_SUBSEP;
run->global.subsep.len = xp_awk_strlen(DEFAULT_SUBSEP); run->global.subsep.len = xp_awk_strlen(DEFAULT_SUBSEP);
@ -665,6 +702,14 @@ static void __deinit_run (xp_awk_run_t* run)
run->global.fs = XP_NULL; run->global.fs = XP_NULL;
} }
if (run->global.ofmt.ptr != XP_NULL &&
run->global.ofmt.ptr != DEFAULT_OFMT)
{
XP_AWK_FREE (run->awk, run->global.ofmt.ptr);
run->global.ofmt.ptr = XP_NULL;
run->global.ofmt.len = 0;
}
if (run->global.ofs.ptr != XP_NULL && if (run->global.ofs.ptr != XP_NULL &&
run->global.ofs.ptr != DEFAULT_OFS) run->global.ofs.ptr != DEFAULT_OFS)
{ {
@ -673,6 +718,14 @@ static void __deinit_run (xp_awk_run_t* run)
run->global.ofs.len = 0; run->global.ofs.len = 0;
} }
if (run->global.ors.ptr != XP_NULL &&
run->global.ors.ptr != DEFAULT_ORS)
{
XP_AWK_FREE (run->awk, run->global.ors.ptr);
run->global.ors.ptr = XP_NULL;
run->global.ors.len = 0;
}
if (run->global.subsep.ptr != XP_NULL && if (run->global.subsep.ptr != XP_NULL &&
run->global.subsep.ptr != DEFAULT_SUBSEP) run->global.subsep.ptr != DEFAULT_SUBSEP)
{ {
@ -1108,8 +1161,12 @@ static int __run_block (xp_awk_run_t* run, xp_awk_nde_blk_t* nde)
/* blockless pattern - execute print $0*/ /* blockless pattern - execute print $0*/
xp_awk_refupval (run->inrec.d0); xp_awk_refupval (run->inrec.d0);
n = xp_awk_writeextio_nl (run, /*n = xp_awk_writeextio_val (run,
XP_AWK_OUT_CONSOLE, XP_T(""), run->inrec.d0); XP_AWK_OUT_CONSOLE, XP_T(""), run->inrec.d0);*/
n = xp_awk_writeextio_str (run,
XP_AWK_OUT_CONSOLE, XP_T(""),
XP_AWK_STR_BUF(&run->inrec.line),
XP_AWK_STR_LEN(&run->inrec.line));
if (n == -1) if (n == -1)
{ {
xp_awk_refdownval (run, run->inrec.d0); xp_awk_refdownval (run, run->inrec.d0);
@ -1902,7 +1959,7 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
v = run->inrec.d0; v = run->inrec.d0;
xp_awk_refupval (v); xp_awk_refupval (v);
n = xp_awk_writeextio (run, p->out_type, dst, v); n = xp_awk_writeextio_val (run, p->out_type, dst, v);
if (n < 0 && run->errnum != XP_AWK_EIOHANDLER) if (n < 0 && run->errnum != XP_AWK_EIOHANDLER)
{ {
if (out != XP_NULL) XP_AWK_FREE (run->awk, out); if (out != XP_NULL) XP_AWK_FREE (run->awk, out);
@ -1925,7 +1982,7 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
} }
xp_awk_refupval (v); xp_awk_refupval (v);
n = xp_awk_writeextio (run, p->out_type, dst, v); n = xp_awk_writeextio_val (run, p->out_type, dst, v);
if (n < 0 && run->errnum != XP_AWK_EIOHANDLER) if (n < 0 && run->errnum != XP_AWK_EIOHANDLER)
{ {
if (out != XP_NULL) XP_AWK_FREE (run->awk, out); if (out != XP_NULL) XP_AWK_FREE (run->awk, out);
@ -1934,6 +1991,15 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
} }
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);
n = xp_awk_writeextio_str (
run, p->out_type, dst,
run->global.ofs.ptr, run->global.ofs.len);
if (n < 0 && run->errnum != XP_AWK_EIOHANDLER)
{
if (out != XP_NULL) XP_AWK_FREE (run->awk, out);
return -1;
}
/* TODO: how to handle n == -1 && run->errnum == XP_AWK_EIOHANDLER. /* TODO: how to handle n == -1 && run->errnum == XP_AWK_EIOHANDLER.
* that is the user handler returned an error... */ * that is the user handler returned an error... */
@ -1941,9 +2007,9 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
} }
} }
/* TODO: change xp_awk_val_nil to n = xp_awk_writeextio_str (
* xp_awk_val_empty_string or something */ run, p->out_type, dst,
n = xp_awk_writeextio_nl (run, p->out_type, dst, xp_awk_val_nil); run->global.ors.ptr, run->global.ors.len);
if (n < 0 && run->errnum != XP_AWK_EIOHANDLER) if (n < 0 && run->errnum != XP_AWK_EIOHANDLER)
{ {
if (out != XP_NULL) XP_AWK_FREE (run->awk, out); if (out != XP_NULL) XP_AWK_FREE (run->awk, out);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: val.c,v 1.64 2006-09-28 14:21:23 bacon Exp $ * $Id: val.c,v 1.65 2006-09-29 11:18:13 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -564,10 +564,10 @@ static xp_char_t* __val_real_to_str (
#if (XP_SIZEOF_LONG_DOUBLE != 0) #if (XP_SIZEOF_LONG_DOUBLE != 0)
run->awk->syscas->sprintf ( run->awk->syscas->sprintf (
tbuf, xp_countof(tbuf), XP_T("%.30Lg"), (long double)v->val); tbuf, xp_countof(tbuf), XP_T("%.6Lg"), (long double)v->val);
#elif (XP_SIZEOF_DOUBLE != 0) #elif (XP_SIZEOF_DOUBLE != 0)
run->awk->syscas->sprintf ( run->awk->syscas->sprintf (
tbuf, xp_countof(tbuf), XP_T("%.30g"), (double)v->val); tbuf, xp_countof(tbuf), XP_T("%.6g"), (double)v->val);
#else #else
#error unsupported floating-point data type #error unsupported floating-point data type
#endif #endif

View File

@ -1,6 +1,6 @@
BEGIN { BEGIN {
print "1==1 : " (1 == 1); print "1==1 : ", (1 == 1);
print "1==0 : " (1 == 0); print "1==0 : ", (1 == 0);
print "1.0==1 : " (1.0 == 1); print "1.0==1 : " (1.0 == 1);
print "1.1==1 : " (1.1 == 1); print "1.1==1 : " (1.1 == 1);