Annotation of libaitcfg/src/parse.c, revision 1.1

1.1     ! misho       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>