added more ini-format reader code into xli
This commit is contained in:
		| @ -66,6 +66,7 @@ enum qse_xli_errnum_t | ||||
|  | ||||
| 	QSE_XLI_ESYNTAX,  /**< syntax error */ | ||||
| 	QSE_XLI_ESCOLON,  /**< semicolon expected in place of '${0}' */ | ||||
| 	QSE_XLI_EEQ,      /**< = expected in place of '${0}' */ | ||||
| 	QSE_XLI_ELBREQ,   /**< { or = expected in place of '${0}' */ | ||||
| 	QSE_XLI_ERBRCE,   /**< } expected in place of '${0}' */ | ||||
| 	QSE_XLI_EPAVAL,   /**< pair value expected in place of '${0}' */ | ||||
| @ -77,12 +78,15 @@ enum qse_xli_errnum_t | ||||
| 	QSE_XLI_EXKWNR,   /**< @word '${0}' not recognized */ | ||||
| 	QSE_XLI_EXKWEM,   /**< @ not followed by a valid word  */ | ||||
| 	QSE_XLI_EIDENT,   /**< invalid identifier '${0}' */ | ||||
| 	QSE_XLI_EKEY,     /**< key expected in place of '${0}' */ | ||||
| 	QSE_XLI_ENOKEY,   /**< missing key after key tag */ | ||||
| 	QSE_XLI_EUDKEY,   /**< undefined key '${0}' */ | ||||
| 	QSE_XLI_ENOALI,   /**< no alias for '${0}' */ | ||||
| 	QSE_XLI_EVAL,     /**< value expected in place of '${0}' */ | ||||
| 	QSE_XLI_EILVAL,   /**< illegal value for '${0}' */ | ||||
| 	QSE_XLI_ENOVAL,   /**< no value for '${0}' */ | ||||
| 	QSE_XLI_ESTRSEG   /**< too many string segments for '${0}' */ | ||||
| 	QSE_XLI_ESTRSEG,  /**< too many string segments for '${0}' */ | ||||
| 	QSE_XLI_ESECTAG,  /**< section tag expected in place of '${0}' */ | ||||
| }; | ||||
| typedef enum qse_xli_errnum_t qse_xli_errnum_t; | ||||
|  | ||||
|  | ||||
| @ -47,6 +47,7 @@ const qse_char_t* qse_xli_dflerrstr ( | ||||
|  | ||||
| 		QSE_T("syntax error"), | ||||
| 		QSE_T("semicolon expected in place of '${0}'"), | ||||
| 		QSE_T("equal-sign expected in place of '${0}'"), | ||||
| 		QSE_T("left-brace or equal-sign expected in place of '${0}'"), | ||||
| 		QSE_T("right-brace expected in place of '${0}'"), | ||||
| 		QSE_T("pair value expected in place of '${0}'"), | ||||
| @ -58,12 +59,15 @@ const qse_char_t* qse_xli_dflerrstr ( | ||||
| 		QSE_T("'${0}' not recognized"), | ||||
| 		QSE_T("@ not followed by a valid word"), | ||||
| 		QSE_T("invalid identifier '${0}'"), | ||||
| 		QSE_T("key expected in place of '${0}'"), | ||||
| 		QSE_T("missing key after key tag"), | ||||
| 		QSE_T("undefined key '${0}'"), | ||||
| 		QSE_T("no alias for '${0}'"), | ||||
| 		QSE_T("value expected in place of '${0}'"), | ||||
| 		QSE_T("illegal value for '${0}'"), | ||||
| 		QSE_T("no value for '${0}'"), | ||||
| 		QSE_T("uncomplying number of string segments for '${0}'") | ||||
| 		QSE_T("uncomplying number of string segments for '${0}'"), | ||||
| 		QSE_T("section tag expected in place of '${0}'"), | ||||
| 	}; | ||||
|  | ||||
| 	return (errnum >= 0 && errnum < QSE_COUNTOF(errstr))? | ||||
|  | ||||
| @ -46,7 +46,8 @@ | ||||
|  | ||||
| enum | ||||
| { | ||||
| 	TOK_STATUS_UPTO_EOL = (1 << 0)  | ||||
| 	TOK_STATUS_SAME_LINE = (1 << 0), | ||||
| 	TOK_STATUS_UPTO_EOL = (1 << 1) | ||||
| }; | ||||
|  | ||||
| #define GET_CHAR(xli) \ | ||||
| @ -267,8 +268,60 @@ static int get_token (qse_xli_t* xli) | ||||
| 	return get_token_into (xli, &xli->tok); | ||||
| } | ||||
|  | ||||
| static int __read_list (qse_xli_t* xli, const qse_xli_scm_t* override) | ||||
| static int read_list (qse_xli_t* xli) | ||||
| { | ||||
|  | ||||
| 	while (1) | ||||
| 	{ | ||||
| 		if (MATCH(xli, QSE_XLI_TOK_EOF)) break; | ||||
|  | ||||
| 		if (MATCH(xli, QSE_XLI_TOK_TAG)) | ||||
| 		{ | ||||
| 			if (get_token(xli) <= -1) return -1; | ||||
|  | ||||
| 			if (MATCH(xli, QSE_XLI_TOK_EOF)) break; | ||||
| 			if (MATCH(xli, QSE_XLI_TOK_TAG)) continue; | ||||
|  | ||||
| 			if (!MATCH(xli, QSE_XLI_TOK_IDENT)) | ||||
| 			{ | ||||
| 				qse_xli_seterror (xli, QSE_XLI_EKEY, QSE_STR_XSTR(xli->tok.name), &xli->tok.loc); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| /* key is the token... */ | ||||
| 			xli->tok_status |= TOK_STATUS_SAME_LINE; | ||||
| 			if (get_token (xli) <= -1) return -1; | ||||
|  | ||||
| 			if (!MATCH(xli, QSE_XLI_TOK_EQ)) | ||||
| 			{ | ||||
| 				qse_xli_seterror (xli, QSE_XLI_EEQ,  QSE_STR_XSTR(xli->tok.name), &xli->tok.loc); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			xli->tok_status |= TOK_STATUS_UPTO_EOL; | ||||
| 			if (get_token (xli) <= -1) return -1; | ||||
|  | ||||
| 			xli->tok_status &= ~(TOK_STATUS_SAME_LINE | TOK_STATUS_UPTO_EOL); | ||||
|  | ||||
| 			if (MATCH(xli, QSE_XLI_TOK_EOF)) | ||||
| 			{ | ||||
| 				/* empty value */ | ||||
| 				break; | ||||
| 			} | ||||
|  | ||||
| 			if (!MATCH(xli, QSE_XLI_TOK_SQSTR)) | ||||
| 			{ | ||||
| 				qse_xli_seterror (xli, QSE_XLI_EVAL, QSE_STR_XSTR(xli->tok.name), &xli->tok.loc); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			qse_xli_seterror (xli, QSE_XLI_ESECTAG, QSE_STR_XSTR(xli->tok.name), &xli->tok.loc); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -279,7 +332,7 @@ static int read_root_list (qse_xli_t* xli) | ||||
| 	link = qse_xli_makelistlink (xli, &xli->root->list); | ||||
| 	if (!link) return -1; | ||||
|  | ||||
| 	if (qse_xli_getchar (xli) <= -1 || __read_list (xli, QSE_NULL) <= -1) | ||||
| 	if (qse_xli_getchar (xli) <= -1 || get_token (xli) <= -1 || read_list (xli) <= -1) | ||||
| 	{ | ||||
| 		qse_xli_freelistlink (xli, link); | ||||
| 		return -1; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user