cleaned up code

This commit is contained in:
hyung-hwan 2009-03-02 08:54:28 +00:00
parent 004ba389f2
commit 8e221ca599
4 changed files with 99 additions and 64 deletions

View File

@ -33,12 +33,16 @@ enum qse_sed_errnum_t
QSE_SED_ECMDGB, /* command garbled */ QSE_SED_ECMDGB, /* command garbled */
QSE_SED_ELBLTL, /* label too long */ QSE_SED_ELBLTL, /* label too long */
QSE_SED_EREXBL, /* regular expression build error */ QSE_SED_EREXBL, /* regular expression build error */
QSE_SED_EA2NNC, /* address 2 not necessary */ QSE_SED_EA1PHB, /* address 1 prohibited */
QSE_SED_EA2PHB, /* address 2 prohibited */
QSE_SED_ENEWLN /* a new line is expected */
}; };
typedef struct qse_sed_t qse_sed_t; typedef struct qse_sed_t qse_sed_t;
typedef struct qse_sed_c_t qse_sed_c_t; /* command */
typedef enum qse_sed_errnum_t qse_sed_errnum_t; typedef enum qse_sed_errnum_t qse_sed_errnum_t;
struct qse_sed_t struct qse_sed_t
{ {
QSE_DEFINE_COMMON_FIELDS (sed) QSE_DEFINE_COMMON_FIELDS (sed)
@ -48,7 +52,13 @@ struct qse_sed_t
qse_str_t rexbuf; /* temporary regular expression buffer */ qse_str_t rexbuf; /* temporary regular expression buffer */
/* command array */ /* command array */
qse_lda_t cmds; /*qse_lda_t cmds;*/
struct
{
qse_sed_c_t* buf;
qse_sed_c_t* cur;
qse_sed_c_t* end;
} cmd;
}; };

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c 89 2009-02-28 15:27:03Z hyunghwan.chung $ * $Id: run.c 91 2009-03-01 14:54:28Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
@ -3584,15 +3584,7 @@ static qse_awk_val_t* do_assignment_map (
len = QSE_COUNTOF(idxbuf); len = QSE_COUNTOF(idxbuf);
str = idxnde_to_str (run, var->idx, idxbuf, &len); str = idxnde_to_str (run, var->idx, idxbuf, &len);
/* TODO: VERIFY if (str == QSE_NULL) return QSE_NULL;
if (str == QSE_NULL)
{
str = idxnde_to_str (run, var->idx, QSE_NULL, &len);
*/
if (str == QSE_NULL) return QSE_NULL;
/*
}
*/
#ifdef DEBUG_RUN #ifdef DEBUG_RUN
qse_dprintf (QSE_T("**** index str=>%s, map->ref=%d, map->type=%d\n"), qse_dprintf (QSE_T("**** index str=>%s, map->ref=%d, map->type=%d\n"),
@ -3896,17 +3888,7 @@ static qse_awk_val_t* eval_binop_in (
str = (left->type == QSE_AWK_NDE_GRP)? str = (left->type == QSE_AWK_NDE_GRP)?
idxnde_to_str (run, ((qse_awk_nde_grp_t*)left)->body, idxbuf, &len): idxnde_to_str (run, ((qse_awk_nde_grp_t*)left)->body, idxbuf, &len):
idxnde_to_str (run, left, idxbuf, &len); idxnde_to_str (run, left, idxbuf, &len);
/* TODO: VERIFY if (str == QSE_NULL) return QSE_NULL;
if (str == QSE_NULL)
{
str = (left->type == QSE_AWK_NDE_GRP)?
idxnde_to_str (run, ((qse_awk_nde_grp_t*)left)->body, QSE_NULL, &len):
idxnde_to_str (run, left, QSE_NULL, &len);
*/
if (str == QSE_NULL) return QSE_NULL;
/*
}
*/
/* evaluate the right-hand side of the operator */ /* evaluate the right-hand side of the operator */
QSE_ASSERT (right->next == QSE_NULL); QSE_ASSERT (right->next == QSE_NULL);
@ -6081,15 +6063,7 @@ static qse_awk_val_t** get_reference_indexed (
len = QSE_COUNTOF(idxbuf); len = QSE_COUNTOF(idxbuf);
str = idxnde_to_str (run, nde->idx, idxbuf, &len); str = idxnde_to_str (run, nde->idx, idxbuf, &len);
/* TODO: VERIFY if (str == QSE_NULL) return QSE_NULL;
if (str == QSE_NULL)
{
str = idxnde_to_str (run, nde->idx, QSE_NULL, &len);
*/
if (str == QSE_NULL) return QSE_NULL;
/*
}
*/
pair = qse_map_search ((*(qse_awk_val_map_t**)val)->map, str, len); pair = qse_map_search ((*(qse_awk_val_map_t**)val)->map, str, len);
if (pair == QSE_NULL) if (pair == QSE_NULL)
@ -6237,15 +6211,7 @@ static qse_awk_val_t* eval_indexed (
len = QSE_COUNTOF(idxbuf); len = QSE_COUNTOF(idxbuf);
str = idxnde_to_str (run, nde->idx, idxbuf, &len); str = idxnde_to_str (run, nde->idx, idxbuf, &len);
/* TODO: VERIFY if (str == QSE_NULL) return QSE_NULL;
if (str == QSE_NULL)
{
str = idxnde_to_str (run, nde->idx, QSE_NULL, &len);
*/
if (str == QSE_NULL) return QSE_NULL;
/*
}
*/
pair = qse_map_search ((*(qse_awk_val_map_t**)val)->map, str, len); pair = qse_map_search ((*(qse_awk_val_map_t**)val)->map, str, len);
if (str != idxbuf) QSE_AWK_FREE (run->awk, str); if (str != idxbuf) QSE_AWK_FREE (run->awk, str);

View File

@ -65,6 +65,16 @@ qse_sed_t* qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr)
return QSE_NULL; return QSE_NULL;
} }
/* TODO: use different data structure... */
sed->cmd.buf = QSE_MMGR_ALLOC (sed->mmgr, QSE_SIZEOF(qse_sed_c_t) * 1000);
if (sed->cmd.buf == QSE_NULL)
{
qse_str_fini (&sed->rexbuf);
return QSE_NULL;
}
sed->cmd.cur = sed->cmd.buf;
sed->cmd.end = sed->cmd.buf + 1000 - 1;
return sed; return sed;
} }
@ -187,8 +197,9 @@ static const qse_char_t* command (
qse_sed_t* sed, const qse_char_t* ptr, const qse_char_t* end) qse_sed_t* sed, const qse_char_t* ptr, const qse_char_t* end)
{ {
qse_cint_t c; qse_cint_t c;
qse_sed_c_t* cmd = sed->cmd.cur;
c = CC (ptr, end); c = NC (ptr, end);
switch (c) switch (c)
{ {
@ -196,33 +207,58 @@ static const qse_char_t* command (
sed->errnum = QSE_SED_ECMDNR; sed->errnum = QSE_SED_ECMDNR;
return QSE_NULL; return QSE_NULL;
#if 0
case QSE_T('{'): case QSE_T('{'):
/* insert a negaited branch command at the beginning /* insert a negated branch command at the beginning
* of a group. this way, all the commands in a group * of a group. this way, all the commands in a group
* can be skipped. the branch target is set once a * can be skipped. the branch target is set once a
* corresponding } is met. */ * corresponding } is met. */
cmd.type = QSE_SED_C_BRANCH; cmd->type = QSE_SED_C_JMP;
cmd.negfl = !cmd.negfl; cmd->negfl = !cmd->negfl;
break; break;
case QSE_T('}'): case QSE_T('}'):
break; break;
case QSE_T('='): case QSE_T(':'):
cmd = QSE_SED_C_EQ; if (cmd->a1.type != QSE_SED_A_NONE)
if (ad2.type != QSE_SED_A_NONE)
{ {
sed->errnum = QSE_SED_EA2NNC; /* label cannot have an address */
sed->errnum = QSE_SED_EA1PHB;
return QSE_NULL;
}
/* skip white spaces */
/* TODO: ... */
break;
case QSE_T('='):
cmd->type = QSE_SED_C_EQ;
if (cmd->a2.type != QSE_SED_A_NONE)
{
sed->errnum = QSE_SED_EA2PHB;
return QSE_NULL; return QSE_NULL;
} }
break; break;
#endif
case QSE_T(':'):
break;
case QSE_T('a'): case QSE_T('a'):
cmd->type = QSE_SED_C_A;
if (cmd->a2.type != QSE_SED_A_NONE)
{
sed->errnum = QSE_SED_EA2PHB;
return QSE_NULL;
}
c = CC (ptr, end);
if (c == QSE_T('\\')) c = NC (ptr, end);
if (c != QSE_T('\n')) /* TODO: handle \r\n or others */
{
/* new line is expected */
sed->errnum = QSE_SED_ENEWLN;
return QSE_NULL;
}
/* TODO: get the next line... */
break; break;
case QSE_T('c'): case QSE_T('c'):
@ -297,8 +333,16 @@ static const qse_char_t* fcomp (
{ {
qse_cint_t c; qse_cint_t c;
const qse_char_t* end = ptr + len; const qse_char_t* end = ptr + len;
qse_sed_a_t a1, a2;
qse_sed_c_t* cmd = sed->cmd.cur;
/*
* # comment
* :label
* zero-address-command
* address[!] one-address-command
* address-range[!] address-range-command
*/
while (1) while (1)
{ {
c = CC (ptr, end); c = CC (ptr, end);
@ -315,29 +359,36 @@ static const qse_char_t* fcomp (
if (c == QSE_T(';')) if (c == QSE_T(';'))
{ {
/* semicolon without a meaningful address-command pair */
ptr++; ptr++;
continue; continue;
} }
/* initialize the current command */
QSE_MEMSET (cmd, 0, QSE_SIZEOF(*cmd));
/* process address */ /* process address */
ptr = address (sed, ptr, end, &a1); ptr = address (sed, ptr, end, &cmd->a1);
if (ptr == QSE_NULL) return QSE_NULL; if (ptr == QSE_NULL) return QSE_NULL;
c = CC (ptr, end); c = CC (ptr, end);
if (a1.type != QSE_SED_A_NONE) if (cmd->a1.type != QSE_SED_A_NONE)
{ {
/* if (a1.type == QSE_SED_A_LAST) /* if (cmd->a1.type == QSE_SED_A_LAST)
{ {
// TODO: ???? // TODO: ????
} */ } */
if (c == QSE_T(',') || c == QSE_T(';')) if (c == QSE_T(',') || c == QSE_T(';'))
{ {
/* maybe an address range */
ptr++; ptr++;
ptr = address (sed, ptr, end, &a2);
/* TODO: skip white spaces??? */
ptr = address (sed, ptr, end, &cmd->a2);
if (ptr == QSE_NULL) return QSE_NULL; if (ptr == QSE_NULL) return QSE_NULL;
c = CC (ptr, end); c = CC (ptr, end);
} }
else a2.type = QSE_SED_A_NONE; else cmd->a2.type = QSE_SED_A_NONE;
} }
/* skip white spaces */ /* skip white spaces */
@ -347,14 +398,21 @@ static const qse_char_t* fcomp (
c = CC (ptr, end); c = CC (ptr, end);
} }
if (c == QSE_T('!')) if (c == QSE_T('!'))
{ {
/* negate */ /* negate */
cmd->negfl = 1;
} }
ptr = command (sed, ptr, end); ptr = command (sed, ptr, end);
if (ptr == QSE_NULL) return QSE_NULL; if (ptr == QSE_NULL) return QSE_NULL;
if (sed->cmd.cur >= sed->cmd.end)
{
/* TODO: too many commands */
}
cmd = ++sed->cmd.cur;
} }
return ptr; return ptr;

View File

@ -24,7 +24,6 @@
typedef qse_int_t qse_sed_line_t; typedef qse_int_t qse_sed_line_t;
typedef struct qse_sed_a_t qse_sed_a_t; /* address */ typedef struct qse_sed_a_t qse_sed_a_t; /* address */
typedef struct qse_sed_c_t qse_sed_c_t; /* command */
typedef struct qse_sed_l_t qse_sed_l_t; /* label */ typedef struct qse_sed_l_t qse_sed_l_t; /* label */
struct qse_sed_a_t struct qse_sed_a_t
@ -61,7 +60,9 @@ struct qse_sed_c_t
enum enum
{ {
QSE_SED_C_A, QSE_SED_C_JMP,
QSE_SED_C_A, /* append text */
QSE_SED_C_B, QSE_SED_C_B,
QSE_SED_C_C, QSE_SED_C_C,
QSE_SED_C_CD, QSE_SED_C_CD,
@ -70,7 +71,7 @@ struct qse_sed_c_t
QSE_SED_C_CP, QSE_SED_C_CP,
QSE_SED_C_D, QSE_SED_C_D,
QSE_SED_C_E, QSE_SED_C_E,
QSE_SED_C_EQ, QSE_SED_C_EQ, /* print the current line number */
QSE_SED_C_F, QSE_SED_C_F,
QSE_SED_C_G, QSE_SED_C_G,
QSE_SED_C_CG, QSE_SED_C_CG,