added qse_xli_dupflatstr() and renamed qse_xli_addnextsegtostr() to qse_xli_addsegtostr().
made relevant changes to cmd/httpd/httpd.c for the change of qse_xli_str_t
This commit is contained in:
		| @ -612,20 +612,12 @@ static int read_pair (qse_xli_t* xli) | ||||
| 		{ | ||||
| 			qse_xli_str_t* curstrseg; | ||||
|  | ||||
| pair = qse_xli_insertpairwithstr (xli, parlist, QSE_NULL, key, name, QSE_STR_CSTR(xli->tok.name)); | ||||
| if (pair == QSE_NULL) goto oops; | ||||
|  | ||||
| 			/* add a new pair with the initial string segment */ | ||||
| 			pair = qse_xli_insertpairwithstr (xli, parlist, QSE_NULL, key, name, QSE_STR_CSTR(xli->tok.name)); | ||||
| 			if (pair == QSE_NULL) goto oops; | ||||
|  | ||||
| 			curstrseg = (qse_xli_str_t*)pair->val; | ||||
|  | ||||
| #if 0 | ||||
| 			if (qse_str_ncpy (xli->tmp[0], QSE_STR_PTR(xli->tok.name), QSE_STR_LEN(xli->tok.name) + 1) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); | ||||
| 				goto oops; | ||||
| 			} | ||||
| #endif | ||||
|  | ||||
| 			if (get_token (xli) <= -1) goto oops; | ||||
| 			if (MATCH(xli, TOK_COMMA)) | ||||
| 			{ | ||||
| @ -641,27 +633,14 @@ if (pair == QSE_NULL) goto oops; | ||||
| 					} | ||||
|  | ||||
|  | ||||
| #if 0 | ||||
| 					if (qse_str_ncat (xli->tmp[0], QSE_STR_PTR(xli->tok.name), QSE_STR_LEN(xli->tok.name) + 1) == (qse_size_t)-1) | ||||
| 					{ | ||||
| 						qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); | ||||
| 						goto oops; | ||||
| 					} | ||||
| #endif | ||||
|  | ||||
| curstrseg = qse_xli_addnextsegtostr (xli, curstrseg, QSE_STR_CSTR(xli->tok.name)); | ||||
| if (curstrseg == QSE_NULL) goto oops; | ||||
| 					/* add an additional segment to the string */ | ||||
| 					curstrseg = qse_xli_addsegtostr (xli, curstrseg, QSE_STR_CSTR(xli->tok.name)); | ||||
| 					if (curstrseg == QSE_NULL) goto oops; | ||||
|  | ||||
| 					if (get_token (xli) <= -1) goto oops; /* skip the value */ | ||||
| 				} | ||||
| 				while (MATCH (xli, TOK_COMMA)); | ||||
| 			} | ||||
| 			 | ||||
| #if 0 | ||||
| 			pair = qse_xli_insertpairwithstr ( | ||||
| 				xli, parlist, QSE_NULL, key, name, QSE_STR_CSTR(xli->tmp[0])); | ||||
| 			if (pair == QSE_NULL) goto oops; | ||||
| #endif | ||||
|  | ||||
| 			/* semicolon is mandatory for a string */ | ||||
| 			if (!MATCH (xli, TOK_SEMICOLON)) | ||||
|  | ||||
| @ -286,23 +286,6 @@ qse_xli_pair_t* qse_xli_insertpairwithstr ( | ||||
| 	return tmp; | ||||
| } | ||||
|  | ||||
| qse_xli_str_t* qse_xli_addnextsegtostr ( | ||||
| 	qse_xli_t* xli, qse_xli_str_t* str, const qse_cstr_t* value) | ||||
| { | ||||
| 	qse_xli_str_t* val; | ||||
|  | ||||
| 	val = qse_xli_callocmem (xli, QSE_SIZEOF(*val) + ((value->len  + 1) * QSE_SIZEOF(*value->ptr))); | ||||
| 	if (val == QSE_NULL) return QSE_NULL; | ||||
|  | ||||
| 	val->type = QSE_XLI_STR; | ||||
| 	qse_strncpy ((qse_char_t*)(val + 1), value->ptr, value->len); | ||||
| 	val->ptr = (const qse_char_t*)(val + 1); | ||||
| 	val->len = value->len; | ||||
| 		 | ||||
| 	str->next = val; | ||||
| 	return str->next; | ||||
| } | ||||
|  | ||||
| qse_xli_text_t* qse_xli_inserttext ( | ||||
| 	qse_xli_t* xli, qse_xli_list_t* parent, qse_xli_atom_t* peer, const qse_char_t* str) | ||||
| { | ||||
| @ -369,10 +352,22 @@ static void free_atom (qse_xli_t* xli, qse_xli_atom_t* atom) | ||||
| 	{ | ||||
| 		qse_xli_pair_t* pair = (qse_xli_pair_t*)atom; | ||||
|  | ||||
| 		if (pair->val != &xli->xnil) | ||||
| 		if ((qse_xli_nil_t*)pair->val != &xli->xnil) | ||||
| 		{ | ||||
| 			if (pair->val->type == QSE_XLI_LIST) | ||||
| 				free_list (xli, (qse_xli_list_t*)pair->val); | ||||
| 			else if (pair->val->type == QSE_XLI_STR) | ||||
| 			{ | ||||
| 				qse_xli_str_t* cur, * next;  | ||||
|  | ||||
| 				cur = ((qse_xli_str_t*)pair->val)->next; | ||||
| 				while (cur) | ||||
| 				{ | ||||
| 					next = cur->next; | ||||
| 					QSE_MMGR_FREE (xli->mmgr, cur); | ||||
| 					cur = next; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			QSE_MMGR_FREE (xli->mmgr, pair->val); | ||||
| 		} | ||||
| @ -744,3 +739,45 @@ noent: | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| qse_xli_str_t* qse_xli_addsegtostr ( | ||||
| 	qse_xli_t* xli, qse_xli_str_t* str, const qse_cstr_t* value) | ||||
| { | ||||
| 	qse_xli_str_t* val; | ||||
|  | ||||
| 	val = qse_xli_callocmem (xli, QSE_SIZEOF(*val) + ((value->len  + 1) * QSE_SIZEOF(*value->ptr))); | ||||
| 	if (val == QSE_NULL) return QSE_NULL; | ||||
|  | ||||
| 	val->type = QSE_XLI_STR; | ||||
| 	qse_strncpy ((qse_char_t*)(val + 1), value->ptr, value->len); | ||||
| 	val->ptr = (const qse_char_t*)(val + 1); | ||||
| 	val->len = value->len; | ||||
| 		 | ||||
| 	val->next = str->next; | ||||
| 	str->next = val; | ||||
| 	return str->next; | ||||
| } | ||||
|  | ||||
| qse_char_t* qse_xli_dupflatstr (qse_xli_t* xli, qse_xli_str_t* str, qse_size_t* len, qse_size_t* nsegs) | ||||
| { | ||||
| 	qse_char_t* tmp; | ||||
| 	qse_xli_str_t* cur; | ||||
| 	qse_size_t x, y; | ||||
|  | ||||
| 	for (x = 0, cur = str; cur; cur = cur->next) x += (cur->len + 1); | ||||
|  | ||||
| 	tmp = qse_xli_allocmem (xli, (x + 1) * QSE_SIZEOF(*tmp)); | ||||
| 	if (tmp == QSE_NULL) return QSE_NULL; | ||||
|  | ||||
| 	for (x = 0, y = 0, cur = str; cur; cur = cur->next, y++)  | ||||
| 	{ | ||||
| 		qse_strncpy (&tmp[x], cur->ptr, cur->len); | ||||
| 		x += (cur->len + 1);	 | ||||
| 	} | ||||
| 	tmp[x] = QSE_T('\0');  | ||||
|  | ||||
|  | ||||
| 	if (len) *len = x; | ||||
| 	if (nsegs) *nsegs = y; | ||||
|  | ||||
| 	return tmp; | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user