]> git.stg.codes - stg.git/blobdiff - stglibs/dotconfpp.lib/dotconfpp.cpp
Added template specification.
[stg.git] / stglibs / dotconfpp.lib / dotconfpp.cpp
index b82ae8182ec5bc903201fb2087646a9198d2f8a7..8f766f0101bfc63c40ef17867767360d1cebd6ae 100644 (file)
@@ -19,7 +19,8 @@
 #include <glob.h> // glob
 #include <string>
 
-#include "dotconfpp.h"
+#include "stg/dotconfpp.h"
+#include "mempool.h"
 
 DOTCONFDocumentNode::DOTCONFDocumentNode():previousNode(NULL), nextNode(NULL), parentNode(NULL), childNode(NULL),
     values(NULL), valuesCount(0), 
@@ -70,13 +71,13 @@ DOTCONFDocument::DOTCONFDocument(DOTCONFDocument::CaseSensitive caseSensitivity)
 
 DOTCONFDocument::~DOTCONFDocument()
 {
-    for(std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin(); i != nodeTree.end(); i++){
+    for(std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin(); i != nodeTree.end(); ++i){
         delete(*i);
     }
-    for(std::list<char*>::iterator i = requiredOptions.begin(); i != requiredOptions.end(); i++){
+    for(std::list<char*>::iterator i = requiredOptions.begin(); i != requiredOptions.end(); ++i){
         free(*i);
     }
-    for(std::list<char*>::iterator i = processedFiles.begin(); i != processedFiles.end(); i++){
+    for(std::list<char*>::iterator i = processedFiles.begin(); i != processedFiles.end(); ++i){
         free(*i);
     }
     free(fileName);
@@ -187,7 +188,7 @@ int DOTCONFDocument::parseLine()
     DOTCONFDocumentNode * tagNode = NULL;
     bool newNode = false;
 
-    for(std::list<char*>::iterator i = words.begin(); i != words.end(); i++) {
+    for(std::list<char*>::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<DOTCONFDocumentNode*>::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;
@@ -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");
         }
@@ -303,16 +303,14 @@ int DOTCONFDocument::checkConfig(const std::list<DOTCONFDocumentNode*>::iterator
 {
     int ret = 0;
 
-    DOTCONFDocumentNode * tagNode = NULL;
-    int vi = 0;
-    for(std::list<DOTCONFDocumentNode*>::iterator i = from; i != nodeTree.end(); i++){
-        tagNode = *i;
+    for(std::list<DOTCONFDocumentNode*>::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], '}') ){
@@ -338,7 +336,7 @@ int DOTCONFDocument::setContent(const char * _fileName)
     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;
     }
 
@@ -377,7 +375,7 @@ int DOTCONFDocument::setContent(const char * _fileName)
         std::list<DOTCONFDocumentNode*>::iterator from;
         DOTCONFDocumentNode * tagNode = NULL;
         int vi = 0;
-        for(std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin(); i!=nodeTree.end(); i++){
+        for(std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin(); i!=nodeTree.end(); ++i){
             tagNode = *i;
             if(!cmp_func("IncludeFile", tagNode->name)){
                 vi = 0;
@@ -397,6 +395,7 @@ int DOTCONFDocument::setContent(const char * _fileName)
                             case GLOB_NOSPACE:
                                 error(tagNode->lineNum, tagNode->fileName, "glob call failed for '%s': no free space", nodeFilePath.c_str());
                                 return -1;
+#ifndef FREE_BSD
                             case GLOB_ABORTED:
                                 // printf("Read error\n");
                                 // Ignore that error
@@ -405,6 +404,7 @@ int DOTCONFDocument::setContent(const char * _fileName)
                                 // printf("No match\n");
                                 // Ignore that error
                                 break;
+#endif
                             default:
                                 error(tagNode->lineNum, tagNode->fileName, "glob call failed for '%s': unknown error", nodeFilePath.c_str());
                                 return -1;
@@ -423,7 +423,7 @@ int DOTCONFDocument::setContent(const char * _fileName)
                             }
 
                             bool processed = false;
-                            for(std::list<char*>::const_iterator itInode = processedFiles.begin(); itInode != processedFiles.end(); itInode++){
+                            for(std::list<char*>::const_iterator itInode = processedFiles.begin(); itInode != processedFiles.end(); ++itInode){
                                 if(!strcmp(*itInode, realpathBuf)){
                                     processed = true;
                                     break;
@@ -442,7 +442,7 @@ 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;
@@ -485,9 +485,9 @@ int DOTCONFDocument::setContent(const char * _fileName)
 
 int DOTCONFDocument::checkRequiredOptions()
 {
-    for(std::list<char*>::const_iterator ci = requiredOptions.begin(); ci != requiredOptions.end(); ci++){
+    for(std::list<char*>::const_iterator ci = requiredOptions.begin(); ci != requiredOptions.end(); ++ci){
         bool matched = false;
-        for(std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin(); i!=nodeTree.end(); i++){            
+        for(std::list<DOTCONFDocumentNode*>::iterator i = nodeTree.begin(); i!=nodeTree.end(); ++i){            
             if(!cmp_func((*i)->name, *ci)){
                 matched = true;
                 break;
@@ -506,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);
@@ -558,9 +562,8 @@ char * DOTCONFDocument::getSubstitution(char * macro, int lineNum)
         buf = mempool->strdup(subs);
     } else {
         std::list<DOTCONFDocumentNode*>::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]);
@@ -634,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;