Cod sursa(job #1341490)

Utilizator sorinos1357FMI Siman Marius Sorin sorinos1357 Data 12 februarie 2015 19:44:47
Problema Convertor Scor 100
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 4.9 kb
#include <fstream>
#include <string>

using namespace std;

enum Expectation{
	KEY , KEY_END , VALUE_START , VALUE_END_STRING , VALUE_END_INT , COLON , BRACE_OPEN , BRACKET_OPEN
};

bool isDigit(char c){
    string digits = "0123456789";
    for(unsigned int i=0;i<digits.length();++i){
        if(c == digits[i]){
            return true;
        }
    }
    return false;
}

int main(){
	ifstream _scan("convertor.in");
    ofstream _print("convertor.out");

    string buffer = "",firstLine = "",currentLine = "";
    Expectation expected = BRACKET_OPEN;
    bool first = true;
    bool openFile = true;

    expected = BRACKET_OPEN;

    while(getline(_scan,buffer) && openFile){

        for(unsigned int current = 0; current < buffer.length() ; ++current){

            switch(expected){
                case BRACKET_OPEN:{
                    if(buffer[current] == '['){
                        expected = BRACE_OPEN;
                    }
                    break;
					}
                case BRACE_OPEN:{
                    if(buffer[current] == '{'){
                        expected = KEY;
                    }
                    else{
                        if(buffer[current] == ']'){
                            openFile = false;
                            current = buffer.length() + 2;
                        }
                    }
                break;
                }
                case KEY:{
                    if(buffer[current] == '"'){
                        expected = KEY_END;
                    }
                    if(buffer[current] == '}'){
                        expected = BRACE_OPEN;
                        if(first){
                            first = false;
                            _print<<(firstLine + "\n");
                            _print<<(currentLine + "\n");
                            currentLine = "";
                        }
                        else{
                            _print<<(currentLine + "\n");
                            currentLine = "";
                        }
                    }
                    break;
                }
                case KEY_END:{
                    if(first){
                        if(buffer[current] == '"'){
                            firstLine += ',';
                            expected = COLON;
                        }
                        else{
                            firstLine += buffer[current];
                        }
                    }
                    else{
                        if(buffer[current] == '"'){
                            expected = COLON;
                        }
                    }
                    break;
                }
                case COLON:{
                    if(buffer[current] == ':'){
                        expected = VALUE_START;
                    }
                    break;
                }
                case VALUE_START:{
                    if(buffer[current] == '"'){
                        expected = VALUE_END_STRING;
                    }
                    else{
                        if(isDigit(buffer[current])){
                            expected = VALUE_END_INT;
                            currentLine += buffer[current];
                        }
                    }
                    break;
                }
                case VALUE_END_STRING:{
                    if(buffer[current] == '"'){
                        currentLine += ',';
                        expected = KEY;
                    }
                    else{
                        currentLine += buffer[current];
                    }
                    break;
                }
                case VALUE_END_INT:{
                    if(buffer[current] == ' ' || buffer[current] ==  ','){
                        currentLine += ',';
                        expected = KEY;
                    }
                    else{
                        if(buffer[current] == '}'){
                            currentLine += ',';
                            expected = BRACE_OPEN;
                            if(first){
                                first = false;
                                _print<<(firstLine + "\n");
                                _print<<(currentLine + "\n");
                                currentLine = "";
                            }
                            else{
                                _print<<(currentLine + "\n");
                                currentLine = "";
                            }
                        }
                        else{
                            currentLine += buffer[current];
                        }
                    }
                    break;
                }
            } // switch
        } // for
    } // while

    _scan.close();
    _print.close();
	return 0;
}