cleaned up code
This commit is contained in:
parent
004ba389f2
commit
8e221ca599
@ -33,12 +33,16 @@ enum qse_sed_errnum_t
|
||||
QSE_SED_ECMDGB, /* command garbled */
|
||||
QSE_SED_ELBLTL, /* label too long */
|
||||
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_c_t qse_sed_c_t; /* command */
|
||||
typedef enum qse_sed_errnum_t qse_sed_errnum_t;
|
||||
|
||||
|
||||
struct qse_sed_t
|
||||
{
|
||||
QSE_DEFINE_COMMON_FIELDS (sed)
|
||||
@ -48,7 +52,13 @@ struct qse_sed_t
|
||||
qse_str_t rexbuf; /* temporary regular expression buffer */
|
||||
|
||||
/* 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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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.
|
||||
|
||||
@ -3584,15 +3584,7 @@ static qse_awk_val_t* do_assignment_map (
|
||||
|
||||
len = QSE_COUNTOF(idxbuf);
|
||||
str = idxnde_to_str (run, var->idx, idxbuf, &len);
|
||||
/* TODO: VERIFY
|
||||
if (str == QSE_NULL)
|
||||
{
|
||||
str = idxnde_to_str (run, var->idx, QSE_NULL, &len);
|
||||
*/
|
||||
if (str == QSE_NULL) return QSE_NULL;
|
||||
/*
|
||||
}
|
||||
*/
|
||||
if (str == QSE_NULL) return QSE_NULL;
|
||||
|
||||
#ifdef DEBUG_RUN
|
||||
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)?
|
||||
idxnde_to_str (run, ((qse_awk_nde_grp_t*)left)->body, idxbuf, &len):
|
||||
idxnde_to_str (run, left, idxbuf, &len);
|
||||
/* TODO: VERIFY
|
||||
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;
|
||||
/*
|
||||
}
|
||||
*/
|
||||
if (str == QSE_NULL) return QSE_NULL;
|
||||
|
||||
/* evaluate the right-hand side of the operator */
|
||||
QSE_ASSERT (right->next == QSE_NULL);
|
||||
@ -6081,15 +6063,7 @@ static qse_awk_val_t** get_reference_indexed (
|
||||
|
||||
len = QSE_COUNTOF(idxbuf);
|
||||
str = idxnde_to_str (run, nde->idx, idxbuf, &len);
|
||||
/* TODO: VERIFY
|
||||
if (str == QSE_NULL)
|
||||
{
|
||||
str = idxnde_to_str (run, nde->idx, QSE_NULL, &len);
|
||||
*/
|
||||
if (str == QSE_NULL) return QSE_NULL;
|
||||
/*
|
||||
}
|
||||
*/
|
||||
if (str == QSE_NULL) return QSE_NULL;
|
||||
|
||||
pair = qse_map_search ((*(qse_awk_val_map_t**)val)->map, str, len);
|
||||
if (pair == QSE_NULL)
|
||||
@ -6237,15 +6211,7 @@ static qse_awk_val_t* eval_indexed (
|
||||
|
||||
len = QSE_COUNTOF(idxbuf);
|
||||
str = idxnde_to_str (run, nde->idx, idxbuf, &len);
|
||||
/* TODO: VERIFY
|
||||
if (str == QSE_NULL)
|
||||
{
|
||||
str = idxnde_to_str (run, nde->idx, QSE_NULL, &len);
|
||||
*/
|
||||
if (str == QSE_NULL) return QSE_NULL;
|
||||
/*
|
||||
}
|
||||
*/
|
||||
if (str == QSE_NULL) return QSE_NULL;
|
||||
|
||||
pair = qse_map_search ((*(qse_awk_val_map_t**)val)->map, str, len);
|
||||
if (str != idxbuf) QSE_AWK_FREE (run->awk, str);
|
||||
|
@ -65,6 +65,16 @@ qse_sed_t* qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr)
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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_cint_t c;
|
||||
qse_sed_c_t* cmd = sed->cmd.cur;
|
||||
|
||||
c = CC (ptr, end);
|
||||
c = NC (ptr, end);
|
||||
|
||||
switch (c)
|
||||
{
|
||||
@ -196,33 +207,58 @@ static const qse_char_t* command (
|
||||
sed->errnum = QSE_SED_ECMDNR;
|
||||
return QSE_NULL;
|
||||
|
||||
#if 0
|
||||
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
|
||||
* can be skipped. the branch target is set once a
|
||||
* corresponding } is met. */
|
||||
cmd.type = QSE_SED_C_BRANCH;
|
||||
cmd.negfl = !cmd.negfl;
|
||||
cmd->type = QSE_SED_C_JMP;
|
||||
cmd->negfl = !cmd->negfl;
|
||||
break;
|
||||
|
||||
case QSE_T('}'):
|
||||
break;
|
||||
|
||||
case QSE_T('='):
|
||||
cmd = QSE_SED_C_EQ;
|
||||
if (ad2.type != QSE_SED_A_NONE)
|
||||
case QSE_T(':'):
|
||||
if (cmd->a1.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;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case QSE_T(':'):
|
||||
break;
|
||||
|
||||
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;
|
||||
|
||||
case QSE_T('c'):
|
||||
@ -297,8 +333,16 @@ static const qse_char_t* fcomp (
|
||||
{
|
||||
qse_cint_t c;
|
||||
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)
|
||||
{
|
||||
c = CC (ptr, end);
|
||||
@ -315,29 +359,36 @@ static const qse_char_t* fcomp (
|
||||
|
||||
if (c == QSE_T(';'))
|
||||
{
|
||||
/* semicolon without a meaningful address-command pair */
|
||||
ptr++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* initialize the current command */
|
||||
QSE_MEMSET (cmd, 0, QSE_SIZEOF(*cmd));
|
||||
|
||||
/* process address */
|
||||
ptr = address (sed, ptr, end, &a1);
|
||||
ptr = address (sed, ptr, end, &cmd->a1);
|
||||
if (ptr == QSE_NULL) return QSE_NULL;
|
||||
|
||||
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: ????
|
||||
} */
|
||||
if (c == QSE_T(',') || c == QSE_T(';'))
|
||||
{
|
||||
/* maybe an address range */
|
||||
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;
|
||||
c = CC (ptr, end);
|
||||
}
|
||||
else a2.type = QSE_SED_A_NONE;
|
||||
else cmd->a2.type = QSE_SED_A_NONE;
|
||||
}
|
||||
|
||||
/* skip white spaces */
|
||||
@ -347,14 +398,21 @@ static const qse_char_t* fcomp (
|
||||
c = CC (ptr, end);
|
||||
}
|
||||
|
||||
|
||||
if (c == QSE_T('!'))
|
||||
{
|
||||
/* negate */
|
||||
cmd->negfl = 1;
|
||||
}
|
||||
|
||||
ptr = command (sed, ptr, end);
|
||||
if (ptr == QSE_NULL) return QSE_NULL;
|
||||
|
||||
if (sed->cmd.cur >= sed->cmd.end)
|
||||
{
|
||||
/* TODO: too many commands */
|
||||
}
|
||||
|
||||
cmd = ++sed->cmd.cur;
|
||||
}
|
||||
|
||||
return ptr;
|
||||
|
@ -24,7 +24,6 @@
|
||||
typedef qse_int_t qse_sed_line_t;
|
||||
|
||||
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 */
|
||||
|
||||
struct qse_sed_a_t
|
||||
@ -61,7 +60,9 @@ struct qse_sed_c_t
|
||||
|
||||
enum
|
||||
{
|
||||
QSE_SED_C_A,
|
||||
QSE_SED_C_JMP,
|
||||
|
||||
QSE_SED_C_A, /* append text */
|
||||
QSE_SED_C_B,
|
||||
QSE_SED_C_C,
|
||||
QSE_SED_C_CD,
|
||||
@ -70,7 +71,7 @@ struct qse_sed_c_t
|
||||
QSE_SED_C_CP,
|
||||
QSE_SED_C_D,
|
||||
QSE_SED_C_E,
|
||||
QSE_SED_C_EQ,
|
||||
QSE_SED_C_EQ, /* print the current line number */
|
||||
QSE_SED_C_F,
|
||||
QSE_SED_C_G,
|
||||
QSE_SED_C_CG,
|
||||
|
Loading…
Reference in New Issue
Block a user