fixing get_file_name() of sed
This commit is contained in:
		| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: str_dyn.c 76 2009-02-22 14:18:06Z hyunghwan.chung $ |  * $Id: str_dyn.c 109 2009-03-24 01:44:31Z hyunghwan.chung $ | ||||||
|  * |  * | ||||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. |    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||||
|  |  | ||||||
| @ -217,7 +217,6 @@ qse_size_t qse_str_cat (qse_str_t* str, const qse_char_t* s) | |||||||
| 	return qse_str_ncat (str, s, qse_strlen(s)); | 	return qse_str_ncat (str, s, qse_strlen(s)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| qse_size_t qse_str_ncat (qse_str_t* str, const qse_char_t* s, qse_size_t len) | qse_size_t qse_str_ncat (qse_str_t* str, const qse_char_t* s, qse_size_t len) | ||||||
| { | { | ||||||
| 	if (len > str->capa - str->len)  | 	if (len > str->capa - str->len)  | ||||||
|  | |||||||
| @ -215,6 +215,7 @@ static void* compile_regex (qse_sed_t* sed, qse_char_t rxend) | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if (c == QSE_T('n')) c = QSE_T('\n'); | 			if (c == QSE_T('n')) c = QSE_T('\n'); | ||||||
|  | 			else if (c == QSE_T('r')) c = QSE_T('\r'); | ||||||
| 			// TODO: support more escaped characters?? | 			// TODO: support more escaped characters?? | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @ -403,7 +404,7 @@ static int get_label (qse_sed_t* sed, qse_sed_cmd_t* cmd) | |||||||
| 		}  | 		}  | ||||||
| 		c = NXTSC (sed); | 		c = NXTSC (sed); | ||||||
| 	} | 	} | ||||||
| 	while (!IS_CMDTERM(c) && !IS_SPACE(c)); | 	while (!IS_CMDTERM(c) && !IS_SPACE(c)) ; | ||||||
|  |  | ||||||
| 	if (qse_map_search ( | 	if (qse_map_search ( | ||||||
| 		&sed->labs, QSE_STR_PTR(t), QSE_STR_LEN(t)) != QSE_NULL) | 		&sed->labs, QSE_STR_PTR(t), QSE_STR_LEN(t)) != QSE_NULL) | ||||||
| @ -519,6 +520,7 @@ static int get_file_name (qse_sed_t* sed, qse_sed_cmd_t* cmd) | |||||||
| { | { | ||||||
| 	qse_cint_t c; | 	qse_cint_t c; | ||||||
| 	qse_str_t* t = QSE_NULL; | 	qse_str_t* t = QSE_NULL; | ||||||
|  | 	qse_size_t trailing_spaces = 0; | ||||||
|  |  | ||||||
| 	/* skip white spaces */ | 	/* skip white spaces */ | ||||||
| 	c = CURSC(sed); | 	c = CURSC(sed); | ||||||
| @ -546,6 +548,24 @@ static int get_file_name (qse_sed_t* sed, qse_sed_cmd_t* cmd) | |||||||
| 			goto oops; | 			goto oops; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		if (IS_SPACE(c)) trailing_spaces++; | ||||||
|  | 		else trailing_spaces = 0; | ||||||
|  |  | ||||||
|  | 		if (c == QSE_T('\\')) | ||||||
|  | 		{ | ||||||
|  | 			c = NXTSC (sed); | ||||||
|  | 			if (c == QSE_T('\0') || | ||||||
|  | 			    c == QSE_CHAR_EOF ||  | ||||||
|  | 			    IS_LINTERM(c)) | ||||||
|  | 			{ | ||||||
|  | 				sed->errnum = QSE_SED_EFILIL; | ||||||
|  | 				goto oops; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if (c == QSE_T('n')) c = QSE_T('\n'); | ||||||
|  | 			else if (c == QSE_T('r')) c = QSE_T('\r'); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		if (qse_str_ccat (t, c) == (qse_size_t)-1)  | 		if (qse_str_ccat (t, c) == (qse_size_t)-1)  | ||||||
| 		{ | 		{ | ||||||
| 			sed->errnum = QSE_SED_ENOMEM; | 			sed->errnum = QSE_SED_ENOMEM; | ||||||
| @ -554,10 +574,19 @@ static int get_file_name (qse_sed_t* sed, qse_sed_cmd_t* cmd) | |||||||
|  |  | ||||||
| 		c = NXTSC (sed); | 		c = NXTSC (sed); | ||||||
| 	} | 	} | ||||||
| 	while (!IS_CMDTERM(c) && !IS_SPACE(c)); | 	while (!IS_CMDTERM(c)); | ||||||
|  |  | ||||||
| 	if (terminate_command (sed) == -1) goto oops; | 	if (terminate_command (sed) == -1) goto oops; | ||||||
|  |  | ||||||
|  | 	if (trailing_spaces > 0) | ||||||
|  | 	{ | ||||||
|  | 		qse_str_delete ( | ||||||
|  | 			t,  | ||||||
|  | 			QSE_STR_LEN(t) - trailing_spaces, | ||||||
|  | 			trailing_spaces | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	qse_str_yield (t, &cmd->u.filename, 0); | 	qse_str_yield (t, &cmd->u.filename, 0); | ||||||
| 	qse_str_close (t); | 	qse_str_close (t); | ||||||
| 	return 0; | 	return 0; | ||||||
| @ -611,6 +640,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if (c == QSE_T('n')) c = QSE_T('\n'); | 			if (c == QSE_T('n')) c = QSE_T('\n'); | ||||||
|  | 			else if (c == QSE_T('r')) c = QSE_T('\r'); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		b[0] = c; | 		b[0] = c; | ||||||
| @ -642,6 +672,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if (c == QSE_T('n')) c = QSE_T('\n'); | 			if (c == QSE_T('n')) c = QSE_T('\n'); | ||||||
|  | 			else if (c == QSE_T('r')) c = QSE_T('\r'); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (pos >= QSE_STR_LEN(t)) | 		if (pos >= QSE_STR_LEN(t)) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user