File:  [ELWIX - Embedded LightWeight unIX -] / libaitcfg / src / parse.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Thu Aug 28 13:17:41 2008 UTC (15 years, 9 months ago) by misho
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: #include "global.h"
    2: #include "aitcfg.h"
    3: #include "tools.h"
    4: 
    5: 
    6: // cfgDbg() Debug/Log operation
    7: static inline int cfgDbg(FILE *f, char *fmt, ...)
    8: {
    9: 	int ret = 0;
   10: 	va_list lst;
   11: 
   12: 	va_start(lst, fmt);
   13: 	ret = vfprintf(f, fmt, lst);
   14: 	va_end(lst);
   15: 
   16: 	return ret;
   17: }
   18: 
   19: // -----------------------------------------
   20: 
   21: /*
   22:  * ReadConfig() Read from file and add new item to config list
   23:  * @f = file resource
   24:  * @cfg = Head list element
   25:  * return: 0 ok; -1 error:: can`t allocate memory
   26: */
   27: int ReadConfig(FILE *f, sl_config * __restrict cfg)
   28: {
   29: 	u_char szLine[MAX_STR + 1];
   30: 	u_char szSection[MAX_STR + 1], *psAttr, *psVal;
   31: 	int pos;
   32: 	struct tagPair *av;
   33: 
   34: 	memset(szSection, 0, MAX_STR + 1);
   35: 	while (!feof(f)) {
   36: 		memset(szLine, 0, MAX_STR + 1);
   37: 		fgets((char*) szLine, MAX_STR, f);
   38: 		trim(szLine);
   39: #ifdef __DEBUG
   40: 		cfgDbg(stdout, "DEBUG:: RAW |%s|\n", szLine);
   41: #endif
   42: 
   43: 		// End of config
   44: 		if (*szLine == '.')
   45: 			break;
   46: 		// Comment
   47: 		if (*szLine == '#' || *szLine == ';' || !*szLine)
   48: 			continue;
   49: 
   50: #ifdef __DEBUG
   51: 		cfgDbg(stdout, "DEBUG:: Clean |%s|\n", szLine);
   52: #endif
   53: 
   54: 		// Section
   55: 		if (*szLine == '[') {
   56: 			pos = strlen((char*) szLine) - 1;
   57: 			if (szLine[pos] != ']') {
   58: 				cfgDbg(stdout, "WARNING:: Ignore section %s ... not closed breket\n", szLine);
   59: 			} else {
   60: 				szLine[pos] = 0; 
   61: 				strncpy((char*) szSection, (char*) szLine + 1, MAX_STR);
   62: #ifdef __DEBUG
   63: 				cfgDbg(stdout, "DEBUG:: Section %s\n", szSection);
   64: #endif
   65: 			}
   66: 			continue;
   67: 		}
   68: 
   69: 		// Devide pairs
   70: 		pos = strchr((char*) szLine, '=') ? strchr((char*) szLine, '=') - (char*) szLine : 0;
   71: 		if (!pos) {
   72: 			cfgDbg(stdout, "WARNING:: Ignore a/v %s ... format error!\n", szLine);
   73: 			continue;
   74: 		} else {
   75: 			av = malloc(sizeof(struct tagPair));
   76: 			if (!av) {
   77: 				LOGERR;
   78: 				return -1;
   79: 			} else {
   80: 				// added new element
   81: 				av->sle_next = cfg->slh_first;
   82: 				cfg->slh_first = av;
   83: 			}
   84: 			// added section name to element
   85: 			if (*szSection) {
   86: 				av->psSection = malloc(strlen((char*) szSection) + 1);
   87: 				if (!av->psSection) {
   88: 					LOGERR;
   89: 					free(av);
   90: 					return -1;
   91: 				} else
   92: 					strcpy((char*) av->psSection, (char*) szSection);
   93: 			} else
   94: 				av->psSection = NULL;
   95: 
   96: 			psAttr = szLine;
   97: 			psVal = (szLine + pos + 1);
   98: 			szLine[pos] = 0;
   99: 			rtrim(psAttr);
  100: 			ltrim(psVal);
  101: #ifdef __DEBUG
  102: 			cfgDbg(stdout, "DEBUG:: Attr(%p) ->%s size=%d Value(%p) ->%s size=%d\n", 
  103: 					psAttr, psAttr, strlen((char*) psAttr), psVal, psVal, strlen((char*) psVal));
  104: #endif
  105: 			// added attribute to element
  106: 			av->psAttribute = malloc(strlen((char*) psAttr) + 1);
  107: 			if (!av->psAttribute) {
  108: 				LOGERR;
  109: 				free(av->psSection);
  110: 				free(av);
  111: 				return -1;
  112: 			} else
  113: 				strcpy((char*) av->psAttribute, (char*) psAttr);
  114: 			// added value to element
  115: 			av->psValue = malloc(strlen((char*) psVal) + 1);
  116: 			if (!av->psValue) {
  117: 				LOGERR;
  118: 				free(av->psAttribute);
  119: 				free(av->psSection);
  120: 				free(av);
  121: 				return -1;
  122: 			} else
  123: 				strcpy((char*) av->psValue, (char*) psVal);
  124: 		}
  125: 	}
  126: 
  127: 	return 0;
  128: }
  129: 
  130: /*
  131:  * WriteConfig() Write to file from items in config list
  132:  * @f = file resource
  133:  * @cfg = Head list element
  134:  * return: 0 ok; -1 error:: can`t write to file
  135: */
  136: int WriteConfig(FILE *f, sl_config * __restrict cfg)
  137: {
  138: 	struct tagPair *av;
  139: 	time_t tim;
  140: 	char szTime[MAX_STR + 1];
  141: 	u_char szSection[MAX_STR + 1];
  142: 
  143: 	bzero(szSection, MAX_STR + 1);
  144: 
  145: 	bzero(szTime, MAX_STR + 1);
  146: 	time(&tim);
  147: 	strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
  148: 	if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) {
  149: 		LOGERR;
  150: 		return -1;
  151: 	}
  152: 
  153: 	for (av = cfg->slh_first; av; av = av->sle_next) {
  154: 		if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) {
  155: 			bzero(szSection, MAX_STR + 1);
  156: 			strcpy((char*) szSection, (char*) av->psSection);
  157: 			if (!cfgDbg(f, "\n[%s]\n", av->psSection)) {
  158: 				LOGERR;
  159: 				return -1;
  160: 			}
  161: 		}
  162: 		if (!av->psSection && *szSection) {
  163: 			bzero(szSection, MAX_STR + 1);
  164: 			if (!cfgDbg(f, "\n[]\n")) {
  165: 				LOGERR;
  166: 				return -1;
  167: 			}
  168: 		}
  169: 
  170: 		if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) {
  171: 			LOGERR;
  172: 			return -1;
  173: 		}
  174: 	}
  175: 
  176: 	bzero(szTime, MAX_STR + 1);
  177: 	time(&tim);
  178: 	strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim));
  179: 	if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) {
  180: 		LOGERR;
  181: 		return -1;
  182: 	}
  183: 
  184: 	return 0;
  185: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>