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_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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
|
||||||
{
|
|
||||||
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
|
#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)
|
|
||||||
{
|
|
||||||
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 */
|
/* 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)
|
|
||||||
{
|
|
||||||
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);
|
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)
|
|
||||||
{
|
|
||||||
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);
|
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);
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user