added qse_xli_definepair() and qse_xli_undefinepair().
renamed some xli functions. updated cmd/httpd to utilize qse_xli_definepair()
This commit is contained in:
		| @ -49,8 +49,10 @@ const qse_char_t* qse_xli_dflerrstr ( | ||||
| 		QSE_T("invalid character '${0}'"), | ||||
| 		QSE_T("'${0}' not recognized"), | ||||
| 		QSE_T("@ not followed by a valid word"), | ||||
| 		QSE_T("illegal key '${0}'"), | ||||
| 		QSE_T("undefined key '${0}'"), | ||||
| 		QSE_T("no alias for '${0}'"), | ||||
| 		QSE_T("illegal value for '${0}'"), | ||||
| 		QSE_T("no value for '${0}'"), | ||||
| 		QSE_T("too many string segments for '${0}'") | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| @ -600,7 +600,9 @@ static int read_pair (qse_xli_t* xli) | ||||
| 	qse_xli_pair_t* pair; | ||||
| 	qse_xli_list_t* parlist; | ||||
| 	qse_size_t dotted_curkey_len; | ||||
|  | ||||
| 	qse_xli_scm_t* scm = QSE_NULL; | ||||
| 	int key_nodup = 0, key_alias = 0; | ||||
|  | ||||
| 	key.ptr = QSE_NULL; | ||||
| 	name = QSE_NULL; | ||||
| @ -608,7 +610,44 @@ static int read_pair (qse_xli_t* xli) | ||||
|  | ||||
| 	parlist = xli->parlink->list; | ||||
|  | ||||
| 	if (xli->opt.trait & QSE_XLI_KEYNODUP) | ||||
| 	if (xli->opt.trait & QSE_XLI_KEYNODUP) key_nodup = 1; | ||||
| 	if (xli->opt.trait & QSE_XLI_KEYALIAS) key_alias = 1; | ||||
| 		 | ||||
| 	kloc = xli->tok.loc; | ||||
| 	key.len = QSE_STR_LEN(xli->tok.name); | ||||
| 	key.ptr = qse_strdup (QSE_STR_PTR(xli->tok.name), xli->mmgr); | ||||
| 	if (key.ptr == QSE_NULL)  | ||||
| 	{ | ||||
| 		qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);  | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| 	dotted_curkey_len = QSE_STR_LEN (xli->dotted_curkey); | ||||
| 	if ((dotted_curkey_len > 0 && qse_str_cat (xli->dotted_curkey, QSE_T(".")) == (qse_size_t)-1) || | ||||
| 	    qse_str_cat (xli->dotted_curkey, key.ptr) == (qse_size_t)-1) | ||||
| 	{ | ||||
| 		qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);  | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| 	if (xli->opt.trait & QSE_XLI_VALIDATE)  | ||||
| 	{ | ||||
| 		qse_rbt_pair_t* pair; | ||||
|  | ||||
| 		pair = qse_rbt_search (xli->schema, QSE_STR_PTR(xli->dotted_curkey), QSE_STR_LEN(xli->dotted_curkey)); | ||||
| 		if (pair == QSE_NULL) | ||||
| 		{ | ||||
| 			qse_xli_seterror (xli, QSE_XLI_EUDKEY, (const qse_cstr_t*)&key, &kloc); | ||||
| 			goto oops;	 | ||||
| 		} | ||||
|  | ||||
| 		scm = (qse_xli_scm_t*)QSE_RBT_VPTR(pair); | ||||
|  | ||||
| 		if (scm->flags & QSE_XLI_SCM_KEYNODUP) key_nodup = 2; | ||||
| 		if (scm->flags & QSE_XLI_SCM_KEYALIAS) key_alias = 2; | ||||
| 	} | ||||
|  | ||||
| 	if (key_nodup) | ||||
| 	{ | ||||
| 		qse_xli_atom_t* atom; | ||||
|  | ||||
| @ -628,47 +667,11 @@ static int read_pair (qse_xli_t* xli) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	kloc = xli->tok.loc; | ||||
| 	key.len = QSE_STR_LEN(xli->tok.name); | ||||
| 	key.ptr = qse_strdup (QSE_STR_PTR(xli->tok.name), xli->mmgr); | ||||
| 	if (key.ptr == QSE_NULL)  | ||||
| 	{ | ||||
| 		qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);  | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| 	dotted_curkey_len = QSE_STR_LEN (xli->dotted_curkey); | ||||
| 	if ((dotted_curkey_len > 0 && qse_str_cat (xli->dotted_curkey, QSE_T(".")) == (qse_size_t)-1) || | ||||
| 	    qse_str_cat (xli->dotted_curkey, key.ptr) == (qse_size_t)-1) | ||||
| 	{ | ||||
| 		qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);  | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	if (xli->opt.trait & QSE_XLI_VALIDATE)  | ||||
| 	{ | ||||
| 		qse_rbt_pair_t* pair; | ||||
|  | ||||
| 		pair = qse_rbt_search (xli->schema, QSE_STR_PTR(xli->dotted_curkey), QSE_STR_LEN(xli->dotted_curkey)); | ||||
| 		if (pair == QSE_NULL) | ||||
| 		{ | ||||
| 			qse_xli_seterror (xli, QSE_XLI_EILKEY, (const qse_cstr_t*)&key, &kloc); | ||||
| 			goto oops;	 | ||||
| 		} | ||||
|  | ||||
| 		scm = (qse_xli_scm_t*)QSE_RBT_VPTR(pair); | ||||
|  | ||||
| 		if (scm->flags & QSE_XLI_SCM_KEY_NODUP) | ||||
| 		{ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	xli->tok_status |= TOK_STATUS_ENABLE_NSTR; | ||||
|  | ||||
| 	if (get_token (xli) <= -1) goto oops; | ||||
|  | ||||
| 	if (xli->opt.trait & QSE_XLI_KEYALIAS) | ||||
| 	if (key_alias) | ||||
| 	{ | ||||
| 		/* the name part must be unique for the same key(s) */ | ||||
| 		if (MATCH (xli, TOK_IDENT) || MATCH (xli, TOK_DQSTR) || MATCH (xli, TOK_SQSTR) || MATCH(xli, TOK_NSTR)) | ||||
| @ -698,6 +701,13 @@ static int read_pair (qse_xli_t* xli) | ||||
|  | ||||
| 			if (get_token (xli) <= -1) goto oops; | ||||
| 		} | ||||
| 		else if (key_alias == 2) | ||||
| 		{ | ||||
| 			/* SCM_KEYALIAS is specified for this particular item. Let the alias be required.  | ||||
| 			 * If KEYALIAS is globally specified with the specific one, it's optional. */ | ||||
| 			qse_xli_seterrnum (xli, QSE_XLI_ENOALI, &key);  | ||||
| 			goto oops; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (MATCH (xli, TOK_EQ)) | ||||
| @ -709,7 +719,7 @@ static int read_pair (qse_xli_t* xli) | ||||
| 			qse_xli_str_t* curstrseg; | ||||
| 			qse_size_t segcount = 0; | ||||
|  | ||||
| 			if (scm && !(scm->flags & QSE_XLI_SCM_VAL_STR)) | ||||
| 			if (scm && !(scm->flags & QSE_XLI_SCM_VALSTR)) | ||||
| 			{ | ||||
| 				/* check the value type */ | ||||
| 				qse_xli_seterror (xli, QSE_XLI_EILVAL, (const qse_cstr_t*)&key, &kloc); | ||||
| @ -775,7 +785,7 @@ static int read_pair (qse_xli_t* xli) | ||||
| 	} | ||||
| 	else if (MATCH (xli, TOK_LBRACE)) | ||||
| 	{ | ||||
| 		if (scm && !(scm->flags & QSE_XLI_SCM_VAL_LIST)) | ||||
| 		if (scm && !(scm->flags & QSE_XLI_SCM_VALLIST)) | ||||
| 		{ | ||||
| 			/* check the value type */ | ||||
| 			qse_xli_seterror (xli, QSE_XLI_EILVAL, (const qse_cstr_t*)&key, &kloc); | ||||
| @ -809,10 +819,11 @@ static int read_pair (qse_xli_t* xli) | ||||
| 	} | ||||
| 	else if (MATCH (xli, TOK_SEMICOLON)) | ||||
| 	{ | ||||
| 		if (scm && !(scm->flags & QSE_XLI_SCM_VAL_NIL)) | ||||
| 		if (scm && !(scm->flags & QSE_XLI_SCM_VALNIL) && | ||||
| 		           !((scm->flags & QSE_XLI_SCM_VALSTR) && scm->str_minseg <= 0)) | ||||
| 		{ | ||||
| 			/* check the value type */ | ||||
| 			qse_xli_seterror (xli, QSE_XLI_EILVAL, (const qse_cstr_t*)&key, &kloc); | ||||
| 			qse_xli_seterror (xli, QSE_XLI_ENOVAL, (const qse_cstr_t*)&key, &kloc); | ||||
| 			goto oops;	 | ||||
| 		} | ||||
|  | ||||
|  | ||||
| @ -64,6 +64,7 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr) | ||||
|  | ||||
| 	xli->schema = qse_rbt_open (mmgr, 0, QSE_SIZEOF(qse_char_t), 1); | ||||
| 	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; | ||||
| @ -394,10 +395,6 @@ void qse_xli_clearroot (qse_xli_t* xli) | ||||
| 	free_list (xli, &xli->root); | ||||
| } | ||||
|  | ||||
| void qse_xli_clearschema (qse_xli_t* xli) | ||||
| { | ||||
| 	qse_rbt_clear (xli->schema); | ||||
| } | ||||
|  | ||||
| /* ------------------------------------------------------ */ | ||||
|  | ||||
| @ -481,7 +478,7 @@ static qse_xli_pair_t* find_pair_by_key_and_index ( | ||||
| 	return QSE_NULL; | ||||
| } | ||||
|  | ||||
| qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* dotted_name) | ||||
| qse_xli_pair_t* qse_xli_findpair (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* pair_name) | ||||
| { | ||||
| 	const qse_char_t* ptr; | ||||
| 	const qse_xli_list_t* curlist; | ||||
| @ -490,7 +487,7 @@ qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* li | ||||
|  | ||||
| 	curlist = list? list: &xli->root; | ||||
|  | ||||
| 	ptr = dotted_name; | ||||
| 	ptr = pair_name; | ||||
| 	while (1) | ||||
| 	{ | ||||
| 		seg.ptr = ptr; | ||||
| @ -596,7 +593,7 @@ noent: | ||||
| 	return QSE_NULL; | ||||
| } | ||||
|  | ||||
| qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* dotted_name) | ||||
| qse_size_t qse_xli_getnumpairs (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* pair_name) | ||||
| { | ||||
| 	const qse_char_t* ptr; | ||||
| 	const qse_xli_list_t* curlist; | ||||
| @ -605,7 +602,7 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list | ||||
|  | ||||
| 	curlist = list? list: &xli->root; | ||||
|  | ||||
| 	ptr = dotted_name; | ||||
| 	ptr = pair_name; | ||||
| 	while (1) | ||||
| 	{ | ||||
| 		seg.ptr = ptr; | ||||
| @ -768,20 +765,21 @@ qse_char_t* qse_xli_dupflatstr (qse_xli_t* xli, qse_xli_str_t* str, qse_size_t* | ||||
| 	return tmp; | ||||
| } | ||||
|  | ||||
| /* ------------------------------------------------------ */ | ||||
|  | ||||
| int qse_xli_setschema (qse_xli_t* xli, const qse_char_t* dotted_name, const qse_xli_scm_t* scm) | ||||
| int qse_xli_definepair (qse_xli_t* xli, const qse_char_t* pair_name, const qse_xli_scm_t* scm) | ||||
| { | ||||
| 	int tmp; | ||||
|  | ||||
| 	tmp = scm->flags & (QSE_XLI_SCM_VAL_LIST | QSE_XLI_SCM_VAL_STR | QSE_XLI_SCM_VAL_NIL); | ||||
| 	if (tmp != QSE_XLI_SCM_VAL_LIST && tmp != QSE_XLI_SCM_VAL_STR && tmp != QSE_XLI_SCM_VAL_NIL) | ||||
| 	tmp = scm->flags & (QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_VALNIL); | ||||
| 	if (tmp != QSE_XLI_SCM_VALLIST && tmp != QSE_XLI_SCM_VALSTR && tmp != QSE_XLI_SCM_VALNIL) | ||||
| 	{ | ||||
| 		/* VAL_LIST, VAL_STR, VAL_NIL can't co-exist */ | ||||
| 		qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (qse_rbt_upsert (xli->schema, dotted_name, qse_strlen(dotted_name), scm, QSE_SIZEOF(scm)) == QSE_NULL) | ||||
| 	if (qse_rbt_upsert (xli->schema, pair_name, qse_strlen(pair_name), scm, QSE_SIZEOF(*scm)) == QSE_NULL) | ||||
| 	{ | ||||
| 		qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); | ||||
| 		return -1; | ||||
| @ -789,3 +787,22 @@ int qse_xli_setschema (qse_xli_t* xli, const qse_char_t* dotted_name, const qse_ | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int qse_xli_undefinepair (qse_xli_t* xli, const qse_char_t* pair_name) | ||||
| { | ||||
| 	if (qse_rbt_delete (xli->schema, pair_name, qse_strlen(pair_name)) <= -1) | ||||
| 	{ | ||||
| 		qse_cstr_t ea; | ||||
| 		ea.ptr = pair_name; | ||||
| 		ea.len = qse_strlen (ea.ptr); | ||||
| 		qse_xli_seterrnum (xli, QSE_XLI_ENOENT, &ea); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void qse_xli_undefinepairs (qse_xli_t* xli) | ||||
| { | ||||
| 	qse_rbt_clear (xli->schema); | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user