cleaned up code
This commit is contained in:
		| @ -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) 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); | ||||||
|  | |||||||
| @ -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, | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user