* added qse_cptl_t/qse_xptl_t

* deleted word substitution functions from awk
This commit is contained in:
2011-05-24 10:52:37 +00:00
parent 40711d3320
commit 7e6a4dc0d5
20 changed files with 289 additions and 550 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp 462 2011-05-18 14:36:40Z hyunghwan.chung $
* $Id: Awk.cpp 474 2011-05-23 16:52:37Z hyunghwan.chung $
*
Copyright 2006-2011 Chung, Hyung-Hwan.
This file is part of QSE.
@ -806,8 +806,8 @@ Awk::Value::IndexIterator Awk::Value::getFirstIndex (Index* idx) const
iptr = qse_awk_rtx_getfirstmapvalitr (this->run->rtx, this->val, &itr);
if (iptr == QSE_NULL) return IndexIterator::END; // no more key
idx->ptr = (const char_t*)QSE_AWK_VAL_MAP_ITR_KPTR(iptr);
idx->len = QSE_AWK_VAL_MAP_ITR_KLEN(iptr);
idx->ptr = QSE_AWK_VAL_MAP_ITR_KEY_PTR(iptr);
idx->len = QSE_AWK_VAL_MAP_ITR_KEY_LEN(iptr);
return itr;
}
@ -827,8 +827,8 @@ Awk::Value::IndexIterator Awk::Value::getNextIndex (
iptr = qse_awk_rtx_getnextmapvalitr (this->run->rtx, this->val, &itr);
if (iptr == QSE_NULL) return IndexIterator::END; // no more key
idx->ptr = (const char_t*)QSE_AWK_VAL_MAP_ITR_KPTR(iptr);
idx->len = QSE_AWK_VAL_MAP_ITR_KLEN(iptr);
idx->ptr = QSE_AWK_VAL_MAP_ITR_KEY_PTR(iptr);
idx->len = QSE_AWK_VAL_MAP_ITR_KEY_LEN(iptr);
return itr;
}
@ -1567,30 +1567,6 @@ int Awk::deleteFunction (const char_t* name)
return n;
}
int Awk::getWord (const cstr_t* ow, cstr_t* nw)
{
QSE_ASSERT (awk != QSE_NULL);
return qse_awk_getword (awk, ow, nw);
}
int Awk::setWord (const cstr_t* ow, const cstr_t* nw)
{
QSE_ASSERT (awk != QSE_NULL);
return qse_awk_setword (awk, ow, nw);
}
int Awk::unsetWord (const cstr_t* w)
{
QSE_ASSERT (awk != QSE_NULL);
return qse_awk_unsetword (awk, w);
}
void Awk::unsetAllWords ()
{
QSE_ASSERT (awk != QSE_NULL);
qse_awk_unsetallwords (awk);
}
Awk::ssize_t Awk::readSource (
awk_t* awk, sio_cmd_t cmd, sio_arg_t* arg,
char_t* data, size_t count)

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.c 459 2011-05-17 14:37:51Z hyunghwan.chung $
* $Id: awk.c 474 2011-05-23 16:52:37Z hyunghwan.chung $
*
Copyright 2006-2011 Chung, Hyung-Hwan.
This file is part of QSE.
@ -161,26 +161,6 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_awk_prm_t* prm)
if (init_token (mmgr, &awk->tok) == -1) goto oops;
if (init_token (mmgr, &awk->ntok) == -1) goto oops;
awk->wtab = qse_htb_open (
mmgr, QSE_SIZEOF(awk),
512, 70, QSE_SIZEOF(qse_char_t), QSE_SIZEOF(qse_char_t)
);
if (awk->wtab == QSE_NULL) goto oops;
*(qse_awk_t**)QSE_XTN(awk->wtab) = awk;
qse_htb_setmancbs (awk->wtab,
qse_htb_mancbs(QSE_HTB_MANCBS_INLINE_COPIERS)
);
awk->rwtab = qse_htb_open (
mmgr, QSE_SIZEOF(awk),
512, 70, QSE_SIZEOF(qse_char_t), QSE_SIZEOF(qse_char_t)
);
if (awk->rwtab == QSE_NULL) goto oops;
*(qse_awk_t**)QSE_XTN(awk->rwtab) = awk;
qse_htb_setmancbs (awk->rwtab,
qse_htb_mancbs(QSE_HTB_MANCBS_INLINE_COPIERS)
);
awk->sio.names = qse_htb_open (
mmgr, QSE_SIZEOF(awk), 128, 70, QSE_SIZEOF(qse_char_t), 1
);
@ -280,8 +260,6 @@ oops:
if (awk->parse.funs) qse_htb_close (awk->parse.funs);
if (awk->tree.funs) qse_htb_close (awk->tree.funs);
if (awk->sio.names) qse_htb_close (awk->sio.names);
if (awk->rwtab) qse_htb_close (awk->rwtab);
if (awk->wtab) qse_htb_close (awk->wtab);
fini_token (&awk->ntok);
fini_token (&awk->tok);
fini_token (&awk->ptok);
@ -305,9 +283,6 @@ int qse_awk_close (qse_awk_t* awk)
qse_htb_close (awk->tree.funs);
qse_htb_close (awk->sio.names);
qse_htb_close (awk->rwtab);
qse_htb_close (awk->wtab);
fini_token (&awk->ntok);
fini_token (&awk->tok);
fini_token (&awk->ptok);
@ -424,89 +399,6 @@ void qse_awk_stopall (qse_awk_t* awk)
awk->stopall = QSE_TRUE;
}
int qse_awk_getword (qse_awk_t* awk, const qse_cstr_t* okw, qse_cstr_t* nkw)
{
qse_htb_pair_t* p;
p = qse_htb_search (awk->wtab, okw->ptr, okw->len);
if (p == QSE_NULL) return -1;
nkw->ptr = ((qse_cstr_t*)p->vptr)->ptr;
nkw->len = ((qse_cstr_t*)p->vptr)->len;
return 0;
}
int qse_awk_unsetword (qse_awk_t* awk, const qse_cstr_t* kw)
{
qse_htb_pair_t* p;
QSE_ASSERT (kw->ptr != QSE_NULL);
p = qse_htb_search (awk->wtab, kw->ptr, kw->len);
if (p == QSE_NULL)
{
qse_awk_seterrnum (awk, QSE_AWK_ENOENT, kw);
return -1;
}
qse_htb_delete (awk->rwtab, QSE_HTB_VPTR(p), QSE_HTB_VLEN(p));
qse_htb_delete (awk->wtab, kw->ptr, kw->len);
return 0;
}
void qse_awk_unsetallwords (qse_awk_t* awk)
{
qse_htb_clear (awk->wtab);
qse_htb_clear (awk->rwtab);
}
int qse_awk_setword (
qse_awk_t* awk, const qse_cstr_t* okw, const qse_cstr_t* nkw)
{
if (nkw == QSE_NULL)
{
if (okw == QSE_NULL)
{
/* clear the entire table */
qse_awk_unsetallwords (awk);
return 0;
}
return qse_awk_unsetword (awk, okw);
}
else if (okw == QSE_NULL)
{
qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL);
return -1;
}
QSE_ASSERT (okw->ptr != QSE_NULL);
QSE_ASSERT (nkw->ptr != QSE_NULL);
/* set the word */
if (qse_htb_upsert (
awk->wtab,
(qse_char_t*)okw->ptr, okw->len,
(qse_char_t*)nkw->ptr, nkw->len) == QSE_NULL)
{
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1;
}
if (qse_htb_upsert (
awk->rwtab,
(qse_char_t*)nkw->ptr, nkw->len,
(qse_char_t*)okw->ptr, okw->len) == QSE_NULL)
{
qse_htb_delete (awk->wtab, okw->ptr, okw->len);
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1;
}
return 0;
}
qse_size_t qse_awk_getmaxdepth (qse_awk_t* awk, qse_awk_depth_t type)
{
return (type == QSE_AWK_DEPTH_BLOCK_PARSE)? awk->parse.depth.max.block:

View File

@ -1,5 +1,5 @@
/*
* $Id: fnc.c 463 2011-05-19 02:50:51Z hyunghwan.chung $
* $Id: fnc.c 474 2011-05-23 16:52:37Z hyunghwan.chung $
*
Copyright 2006-2011 Chung, Hyung-Hwan.
This file is part of QSE.
@ -186,8 +186,6 @@ qse_awk_fnc_t* qse_awk_getfnc (
{
qse_awk_fnc_t* fnc;
qse_htb_pair_t* pair;
const qse_char_t* k;
qse_size_t l;
/* search the system function table */
/* TODO: some speed up? binary search by ordering the table? */
@ -196,66 +194,12 @@ qse_awk_fnc_t* qse_awk_getfnc (
if (fnc->valid != 0 &&
(awk->option & fnc->valid) != fnc->valid) continue;
pair = qse_htb_search (
awk->wtab, fnc->name.ptr, fnc->name.len);
if (pair != QSE_NULL)
{
/* found in the customized word table */
k = QSE_HTB_VPTR(pair);
l = QSE_HTB_VLEN(pair);
}
else
{
k = fnc->name.ptr;
l = fnc->name.len;
}
if (qse_strxncmp (k, l, name, len) == 0) return fnc;
if (qse_strxncmp (
fnc->name.ptr, fnc->name.len,
name, len) == 0) return fnc;
}
/* NOTE: I suspect this block of code might be very fragile.
* because I'm trying to support qse_awk_setword in
* a very flimsy way here. Would it be better to drop
* qse_awk_setword totally? */
pair = qse_htb_search (awk->rwtab, name, len);
if (pair != QSE_NULL)
{
/* the current name is a target name for
* one of the original word. */
k = QSE_HTB_VPTR(pair);
l = QSE_HTB_VLEN(pair);
}
else
{
pair = qse_htb_search (awk->wtab, name, len);
if (pair != QSE_NULL)
{
k = QSE_HTB_VPTR(pair);
l = QSE_HTB_VLEN(pair);
if (qse_strxncmp (name, len, k, l) != 0)
{
/* it name is not a target name but has
* a target name different from itself,
* it cannot be a intrinsic function name.
*
* For instance, name is "sin" here after
* qse_awk_setword ("sin", "cain") is called.
* If name were "cain", it would be handled
* in the outmost if block */
return QSE_NULL;
}
}
else
{
k = name;
l = len;
}
}
/* END NOTE */
pair = qse_htb_search (awk->fnc.user, k, l);
pair = qse_htb_search (awk->fnc.user, name, len);
if (pair == QSE_NULL) return QSE_NULL;
fnc = (qse_awk_fnc_t*)QSE_HTB_VPTR(pair);

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.c 462 2011-05-18 14:36:40Z hyunghwan.chung $
* $Id: parse.c 474 2011-05-23 16:52:37Z hyunghwan.chung $
*
Copyright 2006-2011 Chung, Hyung-Hwan.
This file is part of QSE.
@ -237,8 +237,7 @@ typedef struct kwent_t kwent_t;
struct kwent_t
{
const qse_char_t* name;
qse_size_t namelen;
qse_cstr_t name;
int type;
int valid; /* the entry is valid when this option is set */
};
@ -247,30 +246,30 @@ static kwent_t kwtab[] =
{
/* keep this table in sync with the kw_t enums in <parse.h>.
* also keep it sorted by the first field for binary search */
{ QSE_T("BEGIN"), 5, TOK_BEGIN, QSE_AWK_PABLOCK },
{ QSE_T("END"), 3, TOK_END, QSE_AWK_PABLOCK },
{ QSE_T("break"), 5, TOK_BREAK, 0 },
{ QSE_T("continue"), 8, TOK_CONTINUE, 0 },
{ QSE_T("delete"), 6, TOK_DELETE, 0 },
{ QSE_T("do"), 2, TOK_DO, 0 },
{ QSE_T("else"), 4, TOK_ELSE, 0 },
{ QSE_T("exit"), 4, TOK_EXIT, 0 },
{ QSE_T("for"), 3, TOK_FOR, 0 },
{ QSE_T("function"), 8, TOK_FUNCTION, 0 },
{ QSE_T("getline"), 7, TOK_GETLINE, QSE_AWK_RIO },
{ QSE_T("global"), 6, TOK_GLOBAL, QSE_AWK_EXPLICIT },
{ QSE_T("if"), 2, TOK_IF, 0 },
{ QSE_T("in"), 2, TOK_IN, 0 },
{ QSE_T("include"), 7, TOK_INCLUDE, QSE_AWK_INCLUDE },
{ QSE_T("local"), 5, TOK_LOCAL, QSE_AWK_EXPLICIT },
{ QSE_T("next"), 4, TOK_NEXT, QSE_AWK_PABLOCK },
{ QSE_T("nextfile"), 8, TOK_NEXTFILE, QSE_AWK_PABLOCK },
{ QSE_T("nextofile"), 9, TOK_NEXTOFILE, QSE_AWK_PABLOCK | QSE_AWK_NEXTOFILE },
{ QSE_T("print"), 5, TOK_PRINT, QSE_AWK_RIO },
{ QSE_T("printf"), 6, TOK_PRINTF, QSE_AWK_RIO },
{ QSE_T("reset"), 5, TOK_RESET, QSE_AWK_RESET },
{ QSE_T("return"), 6, TOK_RETURN, 0 },
{ QSE_T("while"), 5, TOK_WHILE, 0 }
{ { QSE_T("BEGIN"), 5 }, TOK_BEGIN, QSE_AWK_PABLOCK },
{ { QSE_T("END"), 3 }, TOK_END, QSE_AWK_PABLOCK },
{ { QSE_T("break"), 5 }, TOK_BREAK, 0 },
{ { QSE_T("continue"), 8 }, TOK_CONTINUE, 0 },
{ { QSE_T("delete"), 6 }, TOK_DELETE, 0 },
{ { QSE_T("do"), 2 }, TOK_DO, 0 },
{ { QSE_T("else"), 4 }, TOK_ELSE, 0 },
{ { QSE_T("exit"), 4 }, TOK_EXIT, 0 },
{ { QSE_T("for"), 3 }, TOK_FOR, 0 },
{ { QSE_T("function"), 8 }, TOK_FUNCTION, 0 },
{ { QSE_T("getline"), 7 }, TOK_GETLINE, QSE_AWK_RIO },
{ { QSE_T("global"), 6 }, TOK_GLOBAL, QSE_AWK_EXPLICIT },
{ { QSE_T("if"), 2 }, TOK_IF, 0 },
{ { QSE_T("in"), 2 }, TOK_IN, 0 },
{ { QSE_T("include"), 7 }, TOK_INCLUDE, QSE_AWK_INCLUDE },
{ { QSE_T("local"), 5 }, TOK_LOCAL, QSE_AWK_EXPLICIT },
{ { QSE_T("next"), 4 }, TOK_NEXT, QSE_AWK_PABLOCK },
{ { QSE_T("nextfile"), 8 }, TOK_NEXTFILE, QSE_AWK_PABLOCK },
{ { QSE_T("nextofile"), 9 }, TOK_NEXTOFILE, QSE_AWK_PABLOCK | QSE_AWK_NEXTOFILE },
{ { QSE_T("print"), 5 }, TOK_PRINT, QSE_AWK_RIO },
{ { QSE_T("printf"), 6 }, TOK_PRINTF, QSE_AWK_RIO },
{ { QSE_T("reset"), 5 }, TOK_RESET, QSE_AWK_RESET },
{ { QSE_T("return"), 6 }, TOK_RETURN, 0 },
{ { QSE_T("while"), 5 }, TOK_WHILE, 0 }
};
typedef struct global_t global_t;
@ -493,21 +492,9 @@ const qse_char_t* qse_awk_getgblname (
return QSE_LDA_DPTR(awk->parse.gbls,idx);
}
qse_cstr_t* qse_awk_getkw (qse_awk_t* awk, int id, qse_cstr_t* s)
void qse_awk_getkwname (qse_awk_t* awk, qse_awk_kwid_t id, qse_cstr_t* s)
{
qse_htb_pair_t* p;
s->ptr = kwtab[id].name;
s->len = kwtab[id].namelen;
p = qse_htb_search (awk->wtab, s->ptr, s->len);
if (p != QSE_NULL)
{
s->ptr = QSE_HTB_VPTR(p);
s->len = QSE_HTB_VLEN(p);
}
return s;
*s = kwtab[id].name;
}
static int parse (qse_awk_t* awk)
@ -1679,25 +1666,11 @@ struct check_global_t
static qse_lda_walk_t check_global (qse_lda_t* lda, qse_size_t index, void* arg)
{
qse_cstr_t tmp;
qse_awk_t* awk = *(qse_awk_t**)QSE_XTN(lda);
/*qse_awk_t* awk = *(qse_awk_t**)QSE_XTN(lda);*/
check_global_t* cg = (check_global_t*)arg;
tmp.ptr = QSE_LDA_DPTR(lda,index);
tmp.len = QSE_LDA_DLEN(lda,index);
if (index < awk->tree.ngbls_base)
{
qse_htb_pair_t* pair;
pair = qse_htb_search (awk->wtab, tmp.ptr, tmp.len);
if (pair != QSE_NULL)
{
tmp.ptr = ((qse_cstr_t*)(pair->vptr))->ptr;
tmp.len = ((qse_cstr_t*)(pair->vptr))->len;
}
}
if (qse_strxncmp(tmp.ptr, tmp.len, cg->name.ptr, cg->name.len) == 0)
tmp = *(qse_cstr_t*)QSE_LDA_DATA(lda,index);
if (qse_strxncmp (tmp.ptr, tmp.len, cg->name.ptr, cg->name.len) == 0)
{
cg->index = index;
return QSE_LDA_WALK_STOP;
@ -1976,8 +1949,7 @@ static qse_awk_t* collect_locals (
return QSE_NULL;
}
lcl.ptr = QSE_STR_PTR(awk->tok.name);
lcl.len = QSE_STR_LEN(awk->tok.name);
lcl = *QSE_STR_XSTR(awk->tok.name);
/* check if it conflicts with a builtin function name
* function f() { local length; } */
@ -5726,75 +5698,39 @@ static int preget_token (qse_awk_t* awk)
static int classify_ident (
qse_awk_t* awk, const qse_char_t* name, qse_size_t len)
{
if (QSE_HTB_SIZE(awk->wtab) <= 0)
/* perform binary search */
/* declaring left, right, mid to be of int is ok
* because we know kwtab is small enough. */
int left = 0, right = QSE_COUNTOF(kwtab) - 1, mid;
while (left <= right)
{
/* perform binary search if no custom words are specified */
int n;
kwent_t* kwp;
/* declaring left, right, mid to be of int is ok
* because we know kwtab is small enough. */
int left = 0, right = QSE_COUNTOF(kwtab) - 1, mid;
mid = (left + right) / 2;
kwp = &kwtab[mid];
while (left <= right)
n = qse_strxncmp (kwp->name.ptr, kwp->name.len, name, len);
if (n > 0)
{
int n;
kwent_t* kwp;
/* if left, right, mid were of qse_size_t,
* you would need the following line.
if (mid == 0) break;
*/
right = mid - 1;
}
else if (n < 0) left = mid + 1;
else
{
if (kwp->valid != 0 &&
(awk->option & kwp->valid) != kwp->valid)
break;
mid = (left + right) / 2;
kwp = &kwtab[mid];
n = qse_strxncmp (kwp->name, kwp->namelen, name, len);
if (n > 0)
{
/* if left, right, mid were of qse_size_t,
* you would need the following line.
if (mid == 0) break;
*/
right = mid - 1;
}
else if (n < 0) left = mid + 1;
else
{
if (kwp->valid != 0 &&
(awk->option & kwp->valid) != kwp->valid)
break;
return kwp->type;
}
return kwp->type;
}
}
else
{
/* perform linear search if there are any custom words set */
kwent_t* kwp, * end;
qse_htb_pair_t* pair;
end = kwtab + QSE_COUNTOF(kwtab);
for (kwp = kwtab; kwp < end; kwp++)
{
const qse_char_t* k;
qse_size_t l;
if (kwp->valid != 0 &&
(awk->option & kwp->valid) != kwp->valid) continue;
pair = qse_htb_search (awk->wtab, kwp->name, kwp->namelen);
if (pair != QSE_NULL)
{
k = ((qse_cstr_t*)(pair->vptr))->ptr;
l = ((qse_cstr_t*)(pair->vptr))->len;
}
else
{
k = kwp->name;
l = kwp->namelen;
}
if (qse_strxncmp (k, l, name, len) == 0)
{
return kwp->type;
}
}
}
return TOK_IDENT;
}
@ -5859,7 +5795,7 @@ static int deparse (qse_awk_t* awk)
QSE_ASSERT (awk->tree.ngbls > 0);
qse_awk_getkw (awk, KW_GLOBAL, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_GLOBAL, &kw);
if (qse_awk_putsrcstrx(awk,kw.ptr,kw.len) <= -1)
{
EXIT_DEPARSE ();
@ -5952,7 +5888,7 @@ static int deparse (qse_awk_t* awk)
{
qse_cstr_t kw;
qse_awk_getkw (awk, KW_BEGIN, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_BEGIN, &kw);
if (qse_awk_putsrcstrx (awk, kw.ptr, kw.len) <= -1) EXIT_DEPARSE ();
if (qse_awk_putsrcstr (awk, QSE_T(" ")) <= -1) EXIT_DEPARSE ();
@ -6014,7 +5950,7 @@ static int deparse (qse_awk_t* awk)
{
qse_cstr_t kw;
qse_awk_getkw (awk, KW_END, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_END, &kw);
if (qse_awk_putsrcstrx (awk, kw.ptr, kw.len) <= -1) EXIT_DEPARSE ();
if (qse_awk_putsrcstr (awk, QSE_T(" ")) <= -1) EXIT_DEPARSE ();
@ -6073,7 +6009,7 @@ static qse_htb_walk_t deparse_func (
x->ret = -1; return QSE_HTB_WALK_STOP; \
}
qse_awk_getkw (df->awk, KW_FUNCTION, &kw);
qse_awk_getkwname (df->awk, QSE_AWK_KWID_FUNCTION, &kw);
PUT_SX (df, kw.ptr, kw.len);
PUT_C (df, QSE_T(' '));

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.h 441 2011-04-22 14:28:43Z hyunghwan.chung $
* $Id: parse.h 474 2011-05-23 16:52:37Z hyunghwan.chung $
*
Copyright 2006-2011 Chung, Hyung-Hwan.
This file is part of QSE.
@ -22,47 +22,66 @@
#define _QSE_LIB_AWK_PARSE_H_
/* these enums should match kwtab in parse.c */
enum kw_t
enum qse_awk_kwid_t
{
KW_BEGIN,
KW_END,
KW_BREAK,
KW_CONTINUE,
KW_DELETE,
KW_DO,
KW_ELSE,
KW_EXIT,
KW_FOR,
KW_FUNCTION,
KW_GETLINE,
KW_GLOBAL,
KW_IF,
KW_IN,
KW_INCLUDE,
KW_LOCAL,
KW_NEXT,
KW_NEXTFILE,
KW_NEXTOFILE,
KW_PRINT,
KW_PRINTF,
KW_RESET,
KW_RETURN,
KW_WHILE
QSE_AWK_KWID_BEGIN,
QSE_AWK_KWID_END,
QSE_AWK_KWID_BREAK,
QSE_AWK_KWID_CONTINUE,
QSE_AWK_KWID_DELETE,
QSE_AWK_KWID_DO,
QSE_AWK_KWID_ELSE,
QSE_AWK_KWID_EXIT,
QSE_AWK_KWID_FOR,
QSE_AWK_KWID_FUNCTION,
QSE_AWK_KWID_GETLINE,
QSE_AWK_KWID_GLOBAL,
QSE_AWK_KWID_IF,
QSE_AWK_KWID_IN,
QSE_AWK_KWID_INCLUDE,
QSE_AWK_KWID_LOCAL,
QSE_AWK_KWID_NEXT,
QSE_AWK_KWID_NEXTFILE,
QSE_AWK_KWID_NEXTOFILE,
QSE_AWK_KWID_PRINT,
QSE_AWK_KWID_PRINTF,
QSE_AWK_KWID_RESET,
QSE_AWK_KWID_RETURN,
QSE_AWK_KWID_WHILE
};
typedef enum qse_awk_kwid_t qse_awk_kwid_t;
#ifdef __cplusplus
extern "C" {
#endif
int qse_awk_putsrcstr (qse_awk_t* awk, const qse_char_t* str);
int qse_awk_putsrcstr (
qse_awk_t* awk,
const qse_char_t* str
);
int qse_awk_putsrcstrx (
qse_awk_t* awk, const qse_char_t* str, qse_size_t len);
qse_awk_t* awk,
const qse_char_t* str,
qse_size_t len
);
const qse_char_t* qse_awk_getgblname (
qse_awk_t* awk, qse_size_t idx, qse_size_t* len);
qse_cstr_t* qse_awk_getkw (qse_awk_t* awk, int id, qse_cstr_t* s);
qse_awk_t* awk,
qse_size_t idx,
qse_size_t* len
);
int qse_awk_initgbls (qse_awk_t* awk);
void qse_awk_getkwname (
qse_awk_t* awk,
qse_awk_kwid_t id,
qse_cstr_t* s
);
int qse_awk_initgbls (
qse_awk_t* awk
);
#ifdef __cplusplus
}

View File

@ -1,5 +1,5 @@
/*
* $Id: tree.c 447 2011-05-01 13:28:51Z hyunghwan.chung $
* $Id: tree.c 474 2011-05-23 16:52:37Z hyunghwan.chung $
*
Copyright 2006-2011 Chung, Hyung-Hwan.
This file is part of QSE.
@ -576,7 +576,7 @@ static int print_expr (qse_awk_t* awk, qse_awk_nde_t* nde)
PUT_SRCSTR (awk, QSE_T(" "));
}
qse_awk_getkw (awk, KW_GETLINE, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_GETLINE, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
if (px->var != QSE_NULL)
{
@ -647,7 +647,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
if (px->nlcls > 0)
{
PRINT_TABS (awk, depth + 1);
qse_awk_getkw (awk, KW_LOCAL, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_LOCAL, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" "));
@ -692,7 +692,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
qse_awk_nde_if_t* px = (qse_awk_nde_if_t*)p;
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_IF, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_IF, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" ("));
PRINT_EXPR (awk, px->test);
@ -708,7 +708,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
if (px->else_part != QSE_NULL)
{
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_ELSE, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_ELSE, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_NL (awk);
if (px->else_part->type == QSE_AWK_NDE_BLK)
@ -724,7 +724,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
qse_awk_nde_while_t* px = (qse_awk_nde_while_t*)p;
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_WHILE, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_WHILE, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" ("));
PRINT_EXPR (awk, px->test);
@ -746,7 +746,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
qse_awk_nde_while_t* px = (qse_awk_nde_while_t*)p;
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_DO, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_DO, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_NL (awk);
if (px->body->type == QSE_AWK_NDE_BLK)
@ -759,7 +759,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
}
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_WHILE, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_WHILE, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" ("));
PRINT_EXPR (awk, px->test);
@ -773,7 +773,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
qse_awk_nde_for_t* px = (qse_awk_nde_for_t*)p;
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_FOR, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_FOR, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" ("));
if (px->init != QSE_NULL)
@ -809,7 +809,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
qse_awk_nde_foreach_t* px = (qse_awk_nde_foreach_t*)p;
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_FOR, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_FOR, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" "));
PRINT_EXPR (awk, px->test);
@ -828,7 +828,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
case QSE_AWK_NDE_BREAK:
{
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_BREAK, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_BREAK, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(";"));
PUT_NL (awk);
@ -838,7 +838,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
case QSE_AWK_NDE_CONTINUE:
{
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_CONTINUE, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_CONTINUE, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(";"));
PUT_NL (awk);
@ -850,14 +850,14 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
PRINT_TABS (awk, depth);
if (((qse_awk_nde_return_t*)p)->val == QSE_NULL)
{
qse_awk_getkw (awk, KW_RETURN, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_RETURN, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(";"));
PUT_NL (awk);
}
else
{
qse_awk_getkw (awk, KW_RETURN, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_RETURN, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" "));
QSE_ASSERT (((qse_awk_nde_return_t*)p)->val->next == QSE_NULL);
@ -876,14 +876,14 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
if (px->val == QSE_NULL)
{
qse_awk_getkw (awk, KW_EXIT, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_EXIT, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(";"));
PUT_NL (awk);
}
else
{
qse_awk_getkw (awk, KW_EXIT, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_EXIT, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" "));
QSE_ASSERT (px->val->next == QSE_NULL);
@ -897,7 +897,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
case QSE_AWK_NDE_NEXT:
{
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_NEXT, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_NEXT, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(";"));
PUT_NL (awk);
@ -909,12 +909,12 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
PRINT_TABS (awk, depth);
if (((qse_awk_nde_nextfile_t*)p)->out)
{
qse_awk_getkw (awk, KW_NEXTOFILE, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_NEXTOFILE, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
}
else
{
qse_awk_getkw (awk, KW_NEXTFILE, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_NEXTFILE, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
}
PUT_SRCSTR (awk, QSE_T(";"));
@ -925,7 +925,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
case QSE_AWK_NDE_DELETE:
{
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_DELETE, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_DELETE, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" "));
qse_awk_prnpt (awk, ((qse_awk_nde_delete_t*)p)->var);
@ -935,7 +935,7 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
case QSE_AWK_NDE_RESET:
{
PRINT_TABS (awk, depth);
qse_awk_getkw (awk, KW_RESET, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_RESET, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
PUT_SRCSTR (awk, QSE_T(" "));
qse_awk_prnpt (awk, ((qse_awk_nde_reset_t*)p)->var);
@ -951,12 +951,12 @@ static int print_stmt (qse_awk_t* awk, qse_awk_nde_t* p, int depth)
if (p->type == QSE_AWK_NDE_PRINT)
{
qse_awk_getkw (awk, KW_PRINT, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_PRINT, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
}
else
{
qse_awk_getkw (awk, KW_PRINTF, &kw);
qse_awk_getkwname (awk, QSE_AWK_KWID_PRINTF, &kw);
PUT_SRCSTRX (awk, kw.ptr, kw.len);
}