*** empty log message ***

This commit is contained in:
hyung-hwan 2006-07-05 16:20:23 +00:00
parent 5dbb39f51d
commit b9f2687e1d
7 changed files with 272 additions and 26 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.76 2006-07-01 16:07:06 bacon Exp $ * $Id: awk.h,v 1.77 2006-07-05 16:20:23 bacon Exp $
*/ */
#ifndef _XP_AWK_AWK_H_ #ifndef _XP_AWK_AWK_H_
@ -130,6 +130,7 @@ enum
/* run time error */ /* run time error */
XP_AWK_EDIVBYZERO, /* divide by zero */ XP_AWK_EDIVBYZERO, /* divide by zero */
XP_AWK_EOPERAND, /* invalid operand */ XP_AWK_EOPERAND, /* invalid operand */
XP_AWK_EPOSIDX, /* wrong position index */
XP_AWK_ENOSUCHFUNC, /* no such function */ XP_AWK_ENOSUCHFUNC, /* no such function */
XP_AWK_ENOTASSIGNABLE, /* value not assignable */ XP_AWK_ENOTASSIGNABLE, /* value not assignable */
XP_AWK_ENOTINDEXABLE, /* not indexable variable */ XP_AWK_ENOTINDEXABLE, /* not indexable variable */

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk_i.h,v 1.25 2006-07-03 04:09:56 bacon Exp $ * $Id: awk_i.h,v 1.26 2006-07-05 16:20:23 bacon Exp $
*/ */
#ifndef _XP_AWK_AWKI_H_ #ifndef _XP_AWK_AWKI_H_
@ -166,12 +166,13 @@ struct xp_awk_run_t
xp_size_t buf_len; xp_size_t buf_len;
xp_bool_t eof; xp_bool_t eof;
xp_str_t line; xp_str_t line;
/*
xp_awk_val_t** flds;
xp_size_t nflds;
*/
xp_char_t** flds;
xp_size_t nflds; xp_size_t nflds;
struct
{
xp_char_t* ptr;
xp_size_t len;
}* flds;
} inrec; } inrec;
/* extio chain */ /* extio chain */

View File

@ -1,5 +1,5 @@
/* /*
* $Id: err.c,v 1.25 2006-07-01 16:07:06 bacon Exp $ * $Id: err.c,v 1.26 2006-07-05 16:20:23 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -62,6 +62,7 @@ const xp_char_t* xp_awk_geterrstr (xp_awk_t* awk)
XP_T("divide by zero"), XP_T("divide by zero"),
XP_T("invalid operand"), XP_T("invalid operand"),
XP_T("wrong position index"),
XP_T("no such function"), XP_T("no such function"),
XP_T("value not assignable"), XP_T("value not assignable"),
XP_T("variable not indexable"), XP_T("variable not indexable"),

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.122 2006-07-03 04:09:56 bacon Exp $ * $Id: run.c,v 1.123 2006-07-05 16:20:23 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -155,6 +155,7 @@ static void __raw_pop (xp_awk_run_t* run);
static void __raw_pop_times (xp_awk_run_t* run, xp_size_t times); static void __raw_pop_times (xp_awk_run_t* run, xp_size_t times);
static int __read_record (xp_awk_run_t* run); static int __read_record (xp_awk_run_t* run);
static int __split_record (xp_awk_run_t* run);
static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r); static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r);
static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde);
@ -297,7 +298,14 @@ static void __close_run (xp_awk_run_t* run)
/* destroy named variables */ /* destroy named variables */
xp_awk_map_close (&run->named); xp_awk_map_close (&run->named);
/* destroy input data */ /* destroy input record */
if (run->inrec.flds != XP_NULL)
{
xp_free (run->inrec.flds);
run->inrec.flds = XP_NULL;
run->inrec.nflds = 0;
}
xp_assert (run->inrec.nflds == 0);
xp_str_close (&run->inrec.line); xp_str_close (&run->inrec.line);
/* destroy values in free list */ /* destroy values in free list */
@ -508,7 +516,7 @@ static int __run_pattern_blocks (xp_awk_run_t* run)
run->exit_level = EXIT_NONE; run->exit_level = EXIT_NONE;
x = __read_record(run); x = __read_record (run);
if (x == -1) if (x == -1)
{ {
/* don't care about the result of input close */ /* don't care about the result of input close */
@ -3309,9 +3317,42 @@ static xp_awk_val_t* __eval_argidx (xp_awk_run_t* run, xp_awk_nde_t* nde)
static xp_awk_val_t* __eval_pos (xp_awk_run_t* run, xp_awk_nde_t* nde) static xp_awk_val_t* __eval_pos (xp_awk_run_t* run, xp_awk_nde_t* nde)
{ {
/* TODO: */ xp_awk_nde_pos_t* pos = (xp_awk_nde_pos_t*)nde;
xp_printf (XP_T("eval_pos not competed....\n")); xp_awk_val_t* v;
return XP_NULL; xp_long_t lv;
xp_real_t rv;
int n;
v = __eval_expression (run, pos->val);
if (v == XP_NULL) return XP_NULL;
xp_awk_refupval (v);
n = __val_to_num (v, &lv, &rv);
xp_awk_refdownval (run, v);
if (n == -1) PANIC (run, XP_AWK_EPOSIDX);
if (n == 1) lv = (xp_long_t)rv;
if (lv == 0)
{
v = xp_awk_makestrval (
XP_STR_BUF(&run->inrec.line),
XP_STR_LEN(&run->inrec.line));
if (v == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
}
else if (lv > 0 && lv <= run->inrec.nflds)
{
v = xp_awk_makestrval (
run->inrec.flds[lv-1].ptr,
run->inrec.flds[lv-1].len);
if (v == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
}
else
{
v = xp_awk_val_nil;
}
return v;
} }
static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde) static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde)
@ -3439,12 +3480,6 @@ static int __read_record (xp_awk_run_t* run)
xp_char_t c; xp_char_t c;
xp_str_clear (&run->inrec.line); xp_str_clear (&run->inrec.line);
if (run->inrec.flds != XP_NULL)
{
xp_free (run->inrec.flds);
run->inrec.flds = XP_NULL;
}
run->inrec.nflds = 0;
while (1) while (1)
{ {
@ -3483,8 +3518,60 @@ static int __read_record (xp_awk_run_t* run)
} }
} }
/* TODO: compose each field */ if (__split_record (run) == -1) return -1;
return 1;
return 1; /* has read a record */
}
static int __split_record (xp_awk_run_t* run)
{
/* TODO: support FS and regular expression */
xp_char_t* p, * tok;
xp_size_t len, tok_len, nflds;
/* clear input record fields */
if (run->inrec.flds != XP_NULL)
{
xp_free (run->inrec.flds);
run->inrec.flds = XP_NULL;
run->inrec.nflds = 0;
}
xp_assert (run->inrec.nflds == 0);
/* scan the input record to count the fields */
p = XP_STR_BUF(&run->inrec.line);
len = XP_STR_LEN(&run->inrec.line);
nflds = 0;
while (p != XP_NULL)
{
p = xp_strxtok (p, len, XP_T(" \t"), &tok, &tok_len);
nflds++;
len = len - tok_len;
}
/* allocate space */
run->inrec.flds = xp_malloc (xp_sizeof(*run->inrec.flds) * nflds);
if (run->inrec.flds == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM);
/* scan again and split it */
p = XP_STR_BUF(&run->inrec.line);
len = XP_STR_LEN(&run->inrec.line);
while (p != XP_NULL)
{
p = xp_strxtok (p, len, XP_T(" \t"), &tok, &tok_len);
run->inrec.flds[run->inrec.nflds].ptr = tok;
run->inrec.flds[run->inrec.nflds].len = tok_len;
run->inrec.nflds++;
len = len - tok_len;
}
xp_assert (nflds == run->inrec.nflds);
return 0;
} }
static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r) static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r)
@ -3498,13 +3585,13 @@ static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r)
if (v->type == XP_AWK_VAL_INT) if (v->type == XP_AWK_VAL_INT)
{ {
*l = ((xp_awk_val_int_t*)v)->val; *l = ((xp_awk_val_int_t*)v)->val;
return 0; return 0; /* long */
} }
if (v->type == XP_AWK_VAL_REAL) if (v->type == XP_AWK_VAL_REAL)
{ {
*r = ((xp_awk_val_real_t*)v)->val; *r = ((xp_awk_val_real_t*)v)->val;
return 1; return 1; /* real */
} }
if (v->type == XP_AWK_VAL_STR) if (v->type == XP_AWK_VAL_STR)

View File

@ -1,5 +1,5 @@
/* /*
* $Id: sa.c,v 1.23 2006-06-28 08:56:59 bacon Exp $ * $Id: sa.c,v 1.24 2006-07-05 16:20:23 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -92,6 +92,148 @@ int xp_strxncmp (
return (*s1 > *s2)? 1: -1; return (*s1 > *s2)? 1: -1;
} }
xp_char_t* xp_strtok (const xp_char_t* s,
const xp_char_t* delim, xp_char_t** tok, xp_size_t* tok_len)
{
const xp_char_t* p = s, *d;
const xp_char_t* sp = XP_NULL, * ep = XP_NULL;
xp_char_t c;
int delim_mode;
/* skip preceding space xp_char_tacters */
while (/* *p != XP_T('\0') && */ xp_isspace(*p)) p++;
if (delim == XP_NULL) delim_mode = 0;
else {
delim_mode = 1;
for (d = delim; *d != XP_T('\0'); d++)
if (!xp_isspace(*d)) delim_mode = 2;
}
if (delim_mode == 0) {
/* when XP_NULL is given as "delim", it has an effect of cutting
preceding and trailing space characters off "s". */
while ((c = *p) != XP_T('\0')) {
if (!xp_isspace(c)) {
if (sp == XP_NULL) sp = p;
ep = p;
}
p++;
}
}
else if (delim_mode == 1) {
while ((c = *p) != XP_T('\0')) {
if (xp_isspace(c)) break;
if (sp == XP_NULL) sp = p;
ep = p++;
}
}
else { /* if (delim_mode == 2) { */
while ((c = *p) != XP_T('\0')) {
if (xp_isspace(c)) {
p++;
continue;
}
for (d = delim; *d; d++) {
if (c == *d) {
goto exit_loop;
}
}
if (sp == XP_NULL) sp = p;
ep = p++;
}
}
exit_loop:
if (sp == XP_NULL) {
*tok = XP_NULL;
*tok_len = (xp_size_t)0;
}
else {
*tok = (xp_char_t*)sp;
*tok_len = ep - sp + 1;
}
return (c == XP_T('\0'))? XP_NULL: ((xp_char_t*)++p);
}
xp_char_t* xp_strxtok (const xp_char_t* s, xp_size_t len,
const xp_char_t* delim, xp_char_t** tok, xp_size_t* tok_len)
{
const xp_char_t* p = s, *d;
const xp_char_t* end = s + len;
const xp_char_t* sp = XP_NULL, * ep = XP_NULL;
xp_char_t c;
int delim_mode;
/* skip preceding space xp_char_tacters */
while (p < end && xp_isspace(*p)) p++;
if (delim == XP_NULL) delim_mode = 0;
else
{
delim_mode = 1;
for (d = delim; *d != XP_T('\0'); d++)
if (!xp_isspace(*d)) delim_mode = 2;
}
if (delim_mode == 0)
{
/* when XP_NULL is given as "delim", it has an effect of cutting
preceding and trailing space xp_char_tacters off "s". */
while (p < end) {
c = *p;
if (!xp_isspace(c)) {
if (sp == XP_NULL) sp = p;
ep = p;
}
p++;
}
}
else if (delim_mode == 1)
{
while (p < end)
{
c = *p;
if (xp_isspace(c)) break;
if (sp == XP_NULL) sp = p;
ep = p++;
}
}
else /* if (delim_mode == 2) { */
{
while (p < end)
{
c = *p;
if (xp_isspace(c))
{
p++;
continue;
}
for (d = delim; *d != XP_T('\0'); d++)
{
if (c == *d) goto exit_loop;
}
if (sp == XP_NULL) sp = p;
ep = p++;
}
}
exit_loop:
if (sp == XP_NULL)
{
*tok = XP_NULL;
*tok_len = (xp_size_t)0;
}
else
{
*tok = (xp_char_t*)sp;
*tok_len = ep - sp + 1;
}
return (p >= end)? XP_NULL: ((xp_char_t*)++p);
}
int xp_printf (const xp_char_t* fmt, ...) int xp_printf (const xp_char_t* fmt, ...)
{ {
int n; int n;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: sa.h,v 1.24 2006-06-16 07:35:07 bacon Exp $ * $Id: sa.h,v 1.25 2006-07-05 16:20:23 bacon Exp $
*/ */
#ifndef _XP_AWK_SA_H_ #ifndef _XP_AWK_SA_H_
@ -111,6 +111,14 @@ int xp_strxncmp (
const xp_char_t* s1, xp_size_t len1, const xp_char_t* s1, xp_size_t len1,
const xp_char_t* s2, xp_size_t len2); const xp_char_t* s2, xp_size_t len2);
#define xp_strtok xp_awk_strtok
xp_char_t* xp_strtok (const xp_char_t* s,
const xp_char_t* delim, xp_char_t** tok, xp_size_t* tok_len);
#define xp_strxtok xp_awk_strxtok
xp_char_t* xp_strxtok (const xp_char_t* s, xp_size_t len,
const xp_char_t* delim, xp_char_t** tok, xp_size_t* tok_len);
#define xp_printf xp_awk_printf #define xp_printf xp_awk_printf
int xp_printf (const xp_char_t* fmt, ...); int xp_printf (const xp_char_t* fmt, ...);

View File

@ -1,3 +1,4 @@
/*
{ {
print "1111111111111"; print "1111111111111";
} }
@ -15,3 +16,8 @@ END
{ {
print "\a"; print "\a";
} }
*/
{
$3 = "10";
print $0, $2, $5;
}