#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),
+ values(NULL), valuesCount(0),
name(NULL), lineNum(0), fileName(NULL), closed(true)
{
}
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);
*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
continue;
}
*bg++ = *line++;
- }
+ }
if(quoted && !multiline){
error(curLine, fileName, "unterminated quote");
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 == '<'){
} 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;
tagNode->pushValue(nodeValue);
}
}
-
+
return 0;
}
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");
}
if(ret == -1){
break;
}
- }
+ }
}
}
{
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], '}') ){
}
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;
}
}
ret = parseFile();
-
+
(void) fclose(file);
if(!ret){
-
+
if( (ret = checkConfig(nodeTree.begin())) == -1){
return -1;
}
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;
}
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;
}
//free(fileName);
fileName = strdup(realpathBuf);
- from = nodeTree.end(); from--;
-
+ from = nodeTree.end(); --from;
+
if(tagNode->parentNode){
DOTCONFDocumentNode * nd = tagNode->parentNode->childNode;
while(nd){
curPrev = nd;
}
ret = parseFile(tagNode->parentNode);
-
+
//ret = parseFile(tagNode->parentNode);
(void) fclose(file);
if(ret == -1)
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;
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);
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]);
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<DOTCONFDocumentNode*>::const_iterator i = nodeTree.begin();
if(startNode == NULL)
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;