Commit 58c14c56 authored by jan.koester's avatar jan.koester
Browse files

yeeeeeeeeeeeeehaaaaaaaaaaaaaaaaaa

parent 26eadc7c
Loading
Loading
Loading
Loading
+71 −14
Original line number Diff line number Diff line
@@ -25,11 +25,20 @@
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

#include <iostream>

#include <string>

#include "conf.h"
#include "yaml.h"

namespace confplus {
    struct YamlStack {
        std::string   anchor;
        YamlStack    *prevel;
    };
};

confplus::Yaml::Yaml(){

}
@@ -55,37 +64,85 @@ void confplus::Yaml::saveConfig(const char *path,const Config *conf){


void confplus::Yaml::loadConfig(const char *path,Config *conf){
    FILE *fh = fopen(path,"r");
    yaml_token_t  token;
    yaml_event_t event;
    yaml_event_type_t event_type;

    int curlevel=0;
    FILE *fh = fopen(path,"rb");
    yaml_event_type_t type;
    yaml_parser_t parse;

     /* Initialize parser */
    if(!yaml_parser_initialize(&_Parser))
    if(!yaml_parser_initialize(&parse))
        throw "Failed to initialize parser!";
    if(fh == nullptr)
        throw "Failed to open file!";

    /* Set input file */
    yaml_parser_set_input_file(&_Parser, fh);
    yaml_parser_set_input_file(&parse, fh);

    YamlStack *ystack=nullptr;

    bool seq=false;
    std::string key,value;

    do {
        if (!yaml_parser_parse(&_Parser, &event))
        yaml_event_t event;
        if (!yaml_parser_parse(&parse, &event))
            break;

        switch (event.type) {
            case YAML_MAPPING_START_EVENT: {
                    YamlStack *cystack=new YamlStack;
                    cystack->prevel=ystack;
                    ystack=cystack;
                    ystack->anchor=key;
                    key.clear();
            }break;

            case YAML_MAPPING_END_EVENT:{
                if(ystack->prevel){
                    YamlStack *pystack=ystack->prevel;
                    delete ystack;
                    ystack=pystack;
                }
            }break;


            case YAML_SCALAR_EVENT:{
                if(key.empty())
                    std::copy(event.data.scalar.value,event.data.scalar.value+event.data.scalar.length,std::inserter<std::string>(key,std::begin(key)));
                else
                    std::copy(event.data.scalar.value,event.data.scalar.value+event.data.scalar.length,std::inserter<std::string>(value,std::begin(value)));
            }break;

            case YAML_SEQUENCE_START_EVENT:{
                seq=true;
            }break;

            case YAML_SEQUENCE_END_EVENT:{
                seq=false;
                key.clear();
            }break;

            default:
                break;
        }
        event_type=event.type;
        yaml_event_delete(&event);

    } while (event_type!= YAML_STREAM_END_EVENT);
        if(!key.empty() && !value.empty()){
            std::string cname;
            for(YamlStack *curst=ystack; curst; curst=curst->prevel){
                std::string pp=curst->anchor; pp+='/';
                std::copy(pp.begin(),pp.end(),std::inserter<std::string>(cname,std::begin(cname)));
            }
            cname+=key;
            std::cerr << cname << ": " << value  << std::endl;
            value.clear();
            if(!seq)
                key.clear();
                    // Config::ConfigData *ckey=conf->setKey(cname.c_str());
                    // conf->setValue(ckey,0,value.c_str());
        }
        type=event.type;
        yaml_event_delete(&event);
    } while (type!= YAML_STREAM_END_EVENT);

    yaml_token_delete(&token);
    yaml_parser_delete(&_Parser);
    yaml_parser_delete(&parse);
    fclose(fh);
}
+0 −2
Original line number Diff line number Diff line
@@ -43,8 +43,6 @@ namespace confplus {

        Yaml();
        virtual ~Yaml();
    private:
        yaml_parser_t  _Parser;
    };
};

+3 −0
Original line number Diff line number Diff line
@@ -33,6 +33,9 @@
int main(int argc,char *argv[]){
    try{
        confplus::Config conf(argv[1]);
        if(conf.getKey("HTTP")){
            std::cout << "success" << std::endl;
        }
    }catch(confplus::ConfException &e){
        std::cerr << e.what() << std::endl;
    }