added qse_freexliroot() and qse_xli_yeildroot().
changed qse_xli_getpairxtn() to qse_getxlipairxtn()
This commit is contained in:
		| @ -123,7 +123,7 @@ static void print_usage (QSE_FILE* out, int argc, qse_char_t* argv[]) | ||||
| { | ||||
| 	const qse_char_t* b = qse_basename (argv[0]); | ||||
|  | ||||
| 	qse_fprintf (out, QSE_T("USAGE: %s [options] -f input-file [key]\n"), b); | ||||
| 	qse_fprintf (out, QSE_T("USAGE: %s [options] -i input-file [key]\n"), b); | ||||
|  | ||||
| 	qse_fprintf (out, QSE_T("options as follows:\n")); | ||||
| 	qse_fprintf (out, QSE_T(" -h/--help                 show this message\n")); | ||||
| @ -565,6 +565,7 @@ oops: | ||||
| 		qse_fprintf (QSE_STDERR, QSE_T("-------------------------------------------------------\n")); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -501,11 +501,6 @@ QSE_EXPORT void qse_xli_freemem ( | ||||
| 	void*      ptr | ||||
| ); | ||||
|  | ||||
| QSE_EXPORT void* qse_xli_getpairxtn ( | ||||
| 	qse_xli_t*        xli, | ||||
| 	qse_xli_pair_t*   pair | ||||
| ); | ||||
|  | ||||
| QSE_EXPORT qse_xli_pair_t* qse_xli_insertpair ( | ||||
| 	qse_xli_t*        xli, | ||||
| 	qse_xli_list_t*   list, | ||||
| @ -606,6 +601,9 @@ QSE_EXPORT void qse_xli_clearroot ( | ||||
| 	qse_xli_t* xli | ||||
| ); | ||||
|  | ||||
| QSE_EXPORT qse_xli_list_t* qse_xli_yieldroot ( | ||||
| 	qse_xli_t* xli | ||||
| ); | ||||
|  | ||||
| QSE_EXPORT void qse_xli_clear ( | ||||
| 	qse_xli_t* xli | ||||
| @ -639,6 +637,18 @@ QSE_EXPORT int qse_xli_write ( | ||||
| 	qse_xli_io_impl_t io | ||||
| ); | ||||
|  | ||||
|  | ||||
| QSE_EXPORT void* qse_getxlipairxtn ( | ||||
| 	qse_xli_pair_t* pair | ||||
| ); | ||||
|  | ||||
| /** | ||||
|  * The qse_freexliroot() function frees the root list acquired with qse_xli_yeildroot(). | ||||
|  */ | ||||
| QSE_EXPORT void qse_freexliroot ( | ||||
| 	qse_xli_list_t* root | ||||
| ); | ||||
|  | ||||
| #if defined(__cplusplus) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -830,7 +830,7 @@ static int read_pair (qse_xli_t* xli) | ||||
| 		xli->tok_status &= ~TOK_STATUS_ENABLE_NSTR; | ||||
|  | ||||
| 		/* no value has been specified for the pair */ | ||||
| 		pair = qse_xli_insertpair (xli, parlist, QSE_NULL, key.ptr, name, (qse_xli_val_t*)&xli->xnil); | ||||
| 		pair = qse_xli_insertpair (xli, parlist, QSE_NULL, key.ptr, name, (qse_xli_val_t*)&xli->root->xnil); | ||||
| 		if (pair == QSE_NULL) goto oops; | ||||
|  | ||||
| 		/* skip the semicolon */ | ||||
| @ -937,7 +937,7 @@ static int read_root_list (qse_xli_t* xli) | ||||
| { | ||||
| 	qse_xli_list_link_t* link; | ||||
|  | ||||
| 	link = make_list_link (xli, &xli->root); | ||||
| 	link = make_list_link (xli, &xli->root->list); | ||||
| 	if (link == QSE_NULL) return -1; | ||||
|  | ||||
| 	if (get_char (xli) <= -1 || get_token (xli) <= -1 || __read_list (xli) <= -1) | ||||
|  | ||||
| @ -317,7 +317,7 @@ int qse_xli_write (qse_xli_t* xli, qse_xli_io_impl_t io) | ||||
| 	if (open_new_stream (xli, QSE_NULL, 0) <= -1) return -1; | ||||
|  | ||||
| 	/* begin writing the root list */ | ||||
| 	n = write_list (xli, &xli->root, 0); | ||||
| 	n = write_list (xli, &xli->root->list, 0); | ||||
| 	 | ||||
| 	/* close all open streams. there should be only the | ||||
| 	 * top-level stream here if there occurred no errors */ | ||||
|  | ||||
| @ -21,9 +21,9 @@ | ||||
| #include "xli.h" | ||||
| #include <qse/cmn/chr.h> | ||||
|  | ||||
| static void free_val (qse_xli_t* xli, qse_xli_val_t* val); | ||||
| static void free_list (qse_xli_t* xli, qse_xli_list_t* list); | ||||
| static void free_atom (qse_xli_t* xli, qse_xli_atom_t* atom); | ||||
| static void free_val (qse_xli_root_list_t* xli, qse_xli_val_t* val); | ||||
| static void free_list (qse_xli_root_list_t* xli, qse_xli_list_t* list); | ||||
| static void free_atom (qse_xli_root_list_t* xli, qse_xli_atom_t* atom); | ||||
|  | ||||
| qse_xli_t* qse_xli_open (qse_mmgr_t* mmgr, qse_size_t xtnsize) | ||||
| { | ||||
| @ -70,13 +70,18 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr) | ||||
| 	if (xli->schema == QSE_NULL) goto oops; | ||||
| 	qse_rbt_setstyle (xli->schema, qse_getrbtstyle(QSE_RBT_STYLE_INLINE_COPIERS)); | ||||
|  | ||||
| 	xli->root.type = QSE_XLI_LIST; | ||||
| 	xli->xnil.type = QSE_XLI_NIL; | ||||
| 	xli->root = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(*xli->root)); | ||||
| 	if (xli->root == QSE_NULL) goto oops; | ||||
| 	QSE_MEMSET (xli->root, 0, QSE_SIZEOF(*xli->root)); | ||||
| 	xli->root->list.type = QSE_XLI_LIST; | ||||
| 	xli->root->xnil.type = QSE_XLI_NIL; | ||||
| 	xli->root->mmgr = mmgr; | ||||
|  | ||||
| 	return 0; | ||||
|  | ||||
| oops: | ||||
| 	qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); | ||||
| 	if (xli->root) QSE_MMGR_FREE (mmgr, xli->root); | ||||
| 	if (xli->schema) qse_rbt_close (xli->schema); | ||||
| 	if (xli->tok.name) qse_str_close (xli->tok.name); | ||||
| 	if (xli->dotted_curkey) qse_str_close (xli->dotted_curkey); | ||||
| @ -86,6 +91,7 @@ oops: | ||||
| void qse_xli_fini (qse_xli_t* xli) | ||||
| { | ||||
| 	qse_xli_clear (xli); | ||||
| 	QSE_MMGR_FREE (xli->mmgr, xli->root); | ||||
|  | ||||
| 	qse_rbt_close (xli->schema); | ||||
| 	qse_str_close (xli->tok.name); | ||||
| @ -182,7 +188,7 @@ static void insert_atom ( | ||||
| 	qse_xli_t* xli, qse_xli_list_t* parent,  | ||||
| 	qse_xli_atom_t* peer, qse_xli_atom_t* atom) | ||||
| { | ||||
| 	if (parent == QSE_NULL) parent = &xli->root; | ||||
| 	if (parent == QSE_NULL) parent = &xli->root->list; | ||||
|  | ||||
| 	if (peer == QSE_NULL)	 | ||||
| 	{ | ||||
| @ -244,10 +250,6 @@ static qse_xli_pair_t* insert_pair ( | ||||
| 	return pair; | ||||
| } | ||||
|  | ||||
| void* qse_xli_getpairxtn (qse_xli_t* xli, qse_xli_pair_t* pair) | ||||
| { | ||||
| 	return (void*)(pair + 1); | ||||
| } | ||||
|  | ||||
| qse_xli_pair_t* qse_xli_insertpair ( | ||||
| 	qse_xli_t* xli, qse_xli_list_t* parent, qse_xli_atom_t* peer, | ||||
| @ -334,7 +336,7 @@ qse_xli_pair_t* qse_xli_insertpairwithstrs ( | ||||
| 		str = qse_xli_addsegtostr (xli, str, &value[i]);			 | ||||
| 		if (str == QSE_NULL) | ||||
| 		{ | ||||
| 			free_atom (xli, (qse_xli_atom_t*)tmp); | ||||
| 			free_atom (xli->root, (qse_xli_atom_t*)tmp); | ||||
| 			return QSE_NULL; | ||||
| 		} | ||||
| 	} | ||||
| @ -400,12 +402,12 @@ qse_xli_eof_t* qse_xli_inserteof ( | ||||
|  | ||||
| /* ------------------------------------------------------ */ | ||||
|  | ||||
| static void free_val (qse_xli_t* xli, qse_xli_val_t* val) | ||||
| static void free_val (qse_xli_root_list_t* root, qse_xli_val_t* val) | ||||
| { | ||||
| 	if ((qse_xli_nil_t*)val != &xli->xnil) | ||||
| 	if ((qse_xli_nil_t*)val != &root->xnil) | ||||
| 	{ | ||||
| 		if (val->type == QSE_XLI_LIST) | ||||
| 			free_list (xli, (qse_xli_list_t*)val); | ||||
| 			free_list (root, (qse_xli_list_t*)val); | ||||
| 		else if (val->type == QSE_XLI_STR) | ||||
| 		{ | ||||
| 			qse_xli_str_t* cur, * next;  | ||||
| @ -414,22 +416,22 @@ static void free_val (qse_xli_t* xli, qse_xli_val_t* val) | ||||
| 			while (cur) | ||||
| 			{ | ||||
| 				next = cur->next; | ||||
| 				QSE_MMGR_FREE (xli->mmgr, cur); | ||||
| 				QSE_MMGR_FREE (root->mmgr, cur); | ||||
| 				cur = next; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		QSE_MMGR_FREE (xli->mmgr, val); | ||||
| 		QSE_MMGR_FREE (root->mmgr, val); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void free_atom (qse_xli_t* xli, qse_xli_atom_t* atom) | ||||
| static void free_atom (qse_xli_root_list_t* root, qse_xli_atom_t* atom) | ||||
| { | ||||
| 	if (atom->type == QSE_XLI_PAIR) free_val (xli, ((qse_xli_pair_t*)atom)->val); | ||||
| 	QSE_MMGR_FREE (xli->mmgr, atom); | ||||
| 	if (atom->type == QSE_XLI_PAIR) free_val (root, ((qse_xli_pair_t*)atom)->val); | ||||
| 	QSE_MMGR_FREE (root->mmgr, atom); | ||||
| } | ||||
|  | ||||
| static void free_list (qse_xli_t* xli, qse_xli_list_t* list) | ||||
| static void free_list (qse_xli_root_list_t* root, qse_xli_list_t* list) | ||||
| { | ||||
| 	qse_xli_atom_t* p, * n; | ||||
|  | ||||
| @ -437,17 +439,20 @@ static void free_list (qse_xli_t* xli, qse_xli_list_t* list) | ||||
| 	while (p) | ||||
| 	{ | ||||
| 		n = p->next; | ||||
| 		free_atom (xli, p);	 | ||||
| 		free_atom (root, p);	 | ||||
| 		p = n; | ||||
| 	} | ||||
|  | ||||
| 	list->head = QSE_NULL; | ||||
| 	list->tail = QSE_NULL; | ||||
|  | ||||
| 	/* this doesn't destroy the list itself.  | ||||
| 	 * the caller must destory the list if necessary. */ | ||||
| } | ||||
|  | ||||
| void qse_xli_clear (qse_xli_t* xli) | ||||
| { | ||||
| 	free_list (xli, &xli->root); | ||||
| 	free_list (xli->root, &xli->root->list); | ||||
| 	qse_rbt_clear (xli->schema); | ||||
|  | ||||
| 	qse_xli_seterrnum (xli, QSE_XLI_ENOERR, QSE_NULL); | ||||
| @ -457,14 +462,35 @@ void qse_xli_clear (qse_xli_t* xli) | ||||
|  | ||||
| qse_xli_list_t* qse_xli_getroot (qse_xli_t* xli) | ||||
| { | ||||
| 	return &xli->root; | ||||
| 	/*return &xli->root.list;*/ | ||||
| 	return (qse_xli_list_t*)xli->root; | ||||
| } | ||||
|  | ||||
| void qse_xli_clearroot (qse_xli_t* xli) | ||||
| { | ||||
| 	free_list (xli, &xli->root); | ||||
| 	free_list (xli->root, &xli->root->list); | ||||
| } | ||||
|  | ||||
| qse_xli_list_t* qse_xli_yieldroot (qse_xli_t* xli) | ||||
| { | ||||
| 	qse_xli_root_list_t* tmp, * tmp2; | ||||
|  | ||||
| 	tmp = QSE_MMGR_ALLOC (xli->mmgr, QSE_SIZEOF(*tmp)); | ||||
| 	if (tmp == QSE_NULL)  | ||||
| 	{ | ||||
| 		qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); | ||||
| 		return QSE_NULL; | ||||
| 	} | ||||
|  | ||||
| 	QSE_MEMSET (tmp, 0, QSE_SIZEOF(*tmp)); | ||||
| 	tmp->list.type = QSE_XLI_LIST; | ||||
| 	tmp->xnil.type = QSE_XLI_NIL; | ||||
| 	tmp->mmgr = xli->mmgr; | ||||
|  | ||||
| 	tmp2 = xli->root; | ||||
| 	xli->root = tmp; | ||||
| 	return (qse_xli_list_t*)tmp2; | ||||
| } | ||||
|  | ||||
| /* ------------------------------------------------------ */ | ||||
|  | ||||
| @ -642,7 +668,7 @@ qse_xli_pair_t* qse_xli_findpair (qse_xli_t* xli, const qse_xli_list_t* list, co | ||||
| 	const qse_xli_list_t* curlist; | ||||
| 	fqpn_seg_t seg; | ||||
|  | ||||
| 	curlist = list? list: &xli->root; | ||||
| 	curlist = list? list: &xli->root->list; | ||||
|  | ||||
| 	ptr = fqpn; | ||||
| 	while (1) | ||||
| @ -705,7 +731,7 @@ qse_size_t qse_xli_countpairs (qse_xli_t* xli, const qse_xli_list_t* list, const | ||||
| 	const qse_xli_list_t* curlist; | ||||
| 	fqpn_seg_t seg; | ||||
|  | ||||
| 	curlist = list? list: &xli->root; | ||||
| 	curlist = list? list: &xli->root->list; | ||||
|  | ||||
| 	ptr = fqpn; | ||||
| 	while (1) | ||||
| @ -862,7 +888,7 @@ void qse_xli_undefinepairs (qse_xli_t* xli) | ||||
| #if 0 | ||||
| qse_xli_pair_t* qse_xli_getpair (qse_xli_t* xli, const qse_char_t* fqpn) | ||||
| { | ||||
| 	return qse_xli_findpair (xli, &xli->root, fqpn); | ||||
| 	return qse_xli_findpair (xli, &xli->root->list, fqpn); | ||||
| } | ||||
|  | ||||
| qse_xli_pair_t* qse_xli_setpair (qse_xli_t* xli, const qse_char_t* fqpn, const qse_xli_val_t* val) -> str, val, nil | ||||
| @ -871,7 +897,7 @@ qse_xli_pair_t* qse_xli_setpair (qse_xli_t* xli, const qse_char_t* fqpn, const q | ||||
| 	const qse_xli_list_t* curlist; | ||||
| 	fqpn_seg_t seg; | ||||
|  | ||||
| 	curlist = list? list: &xli->root; | ||||
| 	curlist = list? list: &xli->root->list; | ||||
|  | ||||
| 	ptr = fqpn; | ||||
| 	while (1) | ||||
| @ -947,3 +973,15 @@ noent: | ||||
| 	return QSE_NULL; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void* qse_getxlipairxtn (qse_xli_pair_t* pair) | ||||
| { | ||||
| 	return (void*)(pair + 1); | ||||
| } | ||||
|  | ||||
| void qse_freexliroot (qse_xli_list_t* root) | ||||
| { | ||||
| 	qse_xli_root_list_t* real_root = (qse_xli_root_list_t*)root; | ||||
| 	free_list (real_root, &real_root->list); | ||||
| 	QSE_MMGR_FREE (real_root->mmgr, root); | ||||
| } | ||||
|  | ||||
| @ -43,6 +43,15 @@ struct qse_xli_list_link_t | ||||
| 	qse_xli_list_t* list; | ||||
| }; | ||||
|  | ||||
| typedef struct qse_xli_root_list_t qse_xli_root_list_t; | ||||
|  | ||||
| struct qse_xli_root_list_t | ||||
| { | ||||
| 	qse_xli_list_t list; | ||||
| 	qse_xli_nil_t xnil; | ||||
| 	qse_mmgr_t* mmgr; | ||||
| }; | ||||
|  | ||||
| struct qse_xli_t | ||||
| { | ||||
| 	qse_mmgr_t* mmgr; | ||||
| @ -60,9 +69,7 @@ struct qse_xli_t | ||||
|  | ||||
| 	qse_xli_ecb_t* ecb; | ||||
|  | ||||
| 	qse_xli_nil_t xnil; | ||||
| 	qse_xli_list_t root; | ||||
|  | ||||
| 	qse_xli_root_list_t* root; | ||||
| 	qse_xli_list_link_t* parlink; /* link that points to the list being read currently */ | ||||
|  | ||||
| 	qse_str_t* dotted_curkey; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user