X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/56ffdca636bfde338300a1ef6e0114ae1fc0373b..da585bb94c437f06762a2042ef4c52166b8aafce:/stglibs/dotconfpp.lib/dotconfpp.cpp diff --git a/stglibs/dotconfpp.lib/dotconfpp.cpp b/stglibs/dotconfpp.lib/dotconfpp.cpp index 16bea3b1..391656a6 100644 --- a/stglibs/dotconfpp.lib/dotconfpp.cpp +++ b/stglibs/dotconfpp.lib/dotconfpp.cpp @@ -19,10 +19,11 @@ #include // glob #include -#include "dotconfpp.h" +#include "stg/dotconfpp.h" +#include "mempool.h" DOTCONFDocumentNode::DOTCONFDocumentNode():previousNode(NULL), nextNode(NULL), parentNode(NULL), childNode(NULL), - values(NULL), valuesCount(0), + values(NULL), valuesCount(0), name(NULL), lineNum(0), fileName(NULL), closed(true) { } @@ -70,13 +71,13 @@ DOTCONFDocument::DOTCONFDocument(DOTCONFDocument::CaseSensitive caseSensitivity) DOTCONFDocument::~DOTCONFDocument() { - for(std::list::iterator i = nodeTree.begin(); i != nodeTree.end(); i++){ + for(std::list::iterator i = nodeTree.begin(); i != nodeTree.end(); ++i){ delete(*i); } - for(std::list::iterator i = requiredOptions.begin(); i != requiredOptions.end(); i++){ + for(std::list::iterator i = requiredOptions.begin(); i != requiredOptions.end(); ++i){ free(*i); } - for(std::list::iterator i = processedFiles.begin(); i != processedFiles.end(); i++){ + for(std::list::iterator i = processedFiles.begin(); i != processedFiles.end(); ++i){ free(*i); } free(fileName); @@ -116,15 +117,15 @@ int DOTCONFDocument::cleanupLine(char * line) *line = ' ';continue; } if(*line == '\\' && (*(line+1) == '"' || *(line+1) == '\'')){ - *bg++ = *(line+1); + *bg++ = *(line+1); line+=2; continue; } if(*line == '\\' && *(line+1) == 'n'){ - *bg++ = '\n'; + *bg++ = '\n'; line+=2; continue; } if(*line == '\\' && *(line+1) == 'r'){ - *bg++ = '\r'; + *bg++ = '\r'; line+=2; continue; } if(*line == '\\' && (*(line+1) == '\n' || *(line+1) == '\r')){ //multiline @@ -169,7 +170,7 @@ int DOTCONFDocument::cleanupLine(char * line) continue; } *bg++ = *line++; - } + } if(quoted && !multiline){ error(curLine, fileName, "unterminated quote"); @@ -187,7 +188,7 @@ int DOTCONFDocument::parseLine() DOTCONFDocumentNode * tagNode = NULL; bool newNode = false; - for(std::list::iterator i = words.begin(); i != words.end(); i++) { + for(std::list::iterator i = words.begin(); i != words.end(); ++i) { word = *i; if(*word == '<'){ @@ -216,7 +217,7 @@ int DOTCONFDocument::parseLine() } else { //closing tag nodeName+=2; std::list::reverse_iterator i=nodeTree.rbegin(); - for(; i!=nodeTree.rend(); i++){ + for(; i!=nodeTree.rend(); ++i){ if(!cmp_func(nodeName, (*i)->name) && !(*i)->closed){ (*i)->closed = true; curParent = (*i)->parentNode; @@ -258,7 +259,7 @@ int DOTCONFDocument::parseLine() tagNode->pushValue(nodeValue); } } - + return 0; } int DOTCONFDocument::parseFile(DOTCONFDocumentNode * _parent) @@ -269,11 +270,10 @@ int DOTCONFDocument::parseFile(DOTCONFDocumentNode * _parent) curParent = _parent; quoted = false; - size_t slen = 0; while(fgets(str, 511, file)){ curLine++; - slen = strlen(str); + size_t slen = strlen(str); if( slen >= 510 ){ error(curLine, fileName, "warning: line too long"); } @@ -292,7 +292,7 @@ int DOTCONFDocument::parseFile(DOTCONFDocumentNode * _parent) if(ret == -1){ break; } - } + } } } @@ -303,16 +303,14 @@ int DOTCONFDocument::checkConfig(const std::list::iterator { int ret = 0; - DOTCONFDocumentNode * tagNode = NULL; - int vi = 0; - for(std::list::iterator i = from; i != nodeTree.end(); i++){ - tagNode = *i; + for(std::list::iterator i = from; i != nodeTree.end(); ++i){ + DOTCONFDocumentNode * tagNode = *i; if(!tagNode->closed){ error(tagNode->lineNum, tagNode->fileName, "unclosed tag %s", tagNode->name); ret = -1; break; } - vi = 0; + int vi = 0; while( vi < tagNode->valuesCount ){ //if((tagNode->values[vi])[0] == '$' && (tagNode->values[vi])[1] == '{' && strchr(tagNode->values[vi], '}') ){ if(strstr(tagNode->values[vi], "${") && strchr(tagNode->values[vi], '}') ){ @@ -333,12 +331,12 @@ int DOTCONFDocument::checkConfig(const std::list::iterator } int DOTCONFDocument::setContent(const char * _fileName) -{ +{ int ret = 0; char realpathBuf[PATH_MAX]; if(realpath(_fileName, realpathBuf) == NULL){ - error(0, NULL, "realpath(%s) failed: %s", _fileName, strerror(errno)); + error(0, _fileName, "%s", strerror(errno)); return -1; } @@ -365,11 +363,11 @@ int DOTCONFDocument::setContent(const char * _fileName) } ret = parseFile(); - + (void) fclose(file); if(!ret){ - + if( (ret = checkConfig(nodeTree.begin())) == -1){ return -1; } @@ -377,7 +375,7 @@ int DOTCONFDocument::setContent(const char * _fileName) std::list::iterator from; DOTCONFDocumentNode * tagNode = NULL; int vi = 0; - for(std::list::iterator i = nodeTree.begin(); i!=nodeTree.end(); i++){ + for(std::list::iterator i = nodeTree.begin(); i!=nodeTree.end(); ++i){ tagNode = *i; if(!cmp_func("IncludeFile", tagNode->name)){ vi = 0; @@ -425,7 +423,7 @@ int DOTCONFDocument::setContent(const char * _fileName) } bool processed = false; - for(std::list::const_iterator itInode = processedFiles.begin(); itInode != processedFiles.end(); itInode++){ + for(std::list::const_iterator itInode = processedFiles.begin(); itInode != processedFiles.end(); ++itInode){ if(!strcmp(*itInode, realpathBuf)){ processed = true; break; @@ -444,8 +442,8 @@ int DOTCONFDocument::setContent(const char * _fileName) } //free(fileName); fileName = strdup(realpathBuf); - from = nodeTree.end(); from--; - + from = nodeTree.end(); --from; + if(tagNode->parentNode){ DOTCONFDocumentNode * nd = tagNode->parentNode->childNode; while(nd){ @@ -457,7 +455,7 @@ int DOTCONFDocument::setContent(const char * _fileName) curPrev = nd; } ret = parseFile(tagNode->parentNode); - + //ret = parseFile(tagNode->parentNode); (void) fclose(file); if(ret == -1) @@ -487,9 +485,9 @@ int DOTCONFDocument::setContent(const char * _fileName) int DOTCONFDocument::checkRequiredOptions() { - for(std::list::const_iterator ci = requiredOptions.begin(); ci != requiredOptions.end(); ci++){ + for(std::list::const_iterator ci = requiredOptions.begin(); ci != requiredOptions.end(); ++ci){ bool matched = false; - for(std::list::iterator i = nodeTree.begin(); i!=nodeTree.end(); i++){ + for(std::list::iterator i = nodeTree.begin(); i!=nodeTree.end(); ++i){ if(!cmp_func((*i)->name, *ci)){ matched = true; break; @@ -508,13 +506,17 @@ void DOTCONFDocument::error(int lineNum, const char * fileName, const char * fmt va_list args; va_start(args, fmt); - size_t len = (lineNum!=0?strlen(fileName):0) + strlen(fmt) + 50; + char msg[256]; + + vsnprintf(msg, 256, fmt, args); + + size_t len = (lineNum!=0?strlen(fileName):0) + strlen(msg) + 50; char * buf = (char*)mempool->alloc(len); if(lineNum) - (void) snprintf(buf, len, "DOTCONF++: file '%s', line %d: %s\n", fileName, lineNum, fmt); + (void) snprintf(buf, len, "File '%s', line %d: %s\n", fileName, lineNum, msg); else - (void) snprintf(buf, len, "DOTCONF++: %s\n", fmt); + (void) snprintf(buf, len, "File '%s': %s\n", fileName, msg); if (errorCallback) { errorCallback(errorCallbackData, buf); @@ -560,9 +562,8 @@ char * DOTCONFDocument::getSubstitution(char * macro, int lineNum) buf = mempool->strdup(subs); } else { std::list::iterator i = nodeTree.begin(); - DOTCONFDocumentNode * tagNode = NULL; - for(; i!=nodeTree.end(); i++){ - tagNode = *i; + for(; i!=nodeTree.end(); ++i){ + DOTCONFDocumentNode * tagNode = *i; if(!cmp_func(tagNode->name, variable)){ if(tagNode->valuesCount != 0){ buf = mempool->strdup(tagNode->values[0]); @@ -628,7 +629,7 @@ const DOTCONFDocumentNode * DOTCONFDocument::getFirstNode() const const DOTCONFDocumentNode * DOTCONFDocument::findNode(const char * nodeName, const DOTCONFDocumentNode * parentNode, const DOTCONFDocumentNode * startNode) const { //printf("nodeName=%s, cont=%s, start=%s\n", nodeName, containingNode!=NULL?containingNode->name:"NULL", startNode!=NULL?startNode->name:"NULL"); - + std::list::const_iterator i = nodeTree.begin(); if(startNode == NULL) @@ -636,12 +637,12 @@ const DOTCONFDocumentNode * DOTCONFDocument::findNode(const char * nodeName, con if(startNode != NULL){ while( i != nodeTree.end() && (*i) != startNode ){ - i++; + ++i; } - if( i != nodeTree.end() ) i++; + if( i != nodeTree.end() ) ++i; } - for(; i!=nodeTree.end(); i++){ + for(; i!=nodeTree.end(); ++i){ //if(parentNode != NULL && (*i)->parentNode != parentNode){ if((*i)->parentNode != parentNode){ continue;