*** empty log message ***
This commit is contained in:
parent
012777d425
commit
95b904c8e9
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
int xp_awk_writeextio_nl (
|
if (v->type == XP_AWK_VAL_STR)
|
||||||
xp_awk_run_t* run, int out_type,
|
|
||||||
const xp_char_t* name, xp_awk_val_t* v)
|
|
||||||
{
|
{
|
||||||
return __writeextio (run, out_type, name, v, xp_true);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __writeextio (
|
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_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, xp_bool_t nl)
|
const xp_char_t* name, xp_char_t* str, xp_size_t len)
|
||||||
{
|
{
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
182
ase/awk/run.c
182
ase/awk/run.c
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user