Cod sursa(job #1341507)

Utilizator sorinos1357FMI Siman Marius Sorin sorinos1357 Data 12 februarie 2015 20:00:26
Problema Convertor Scor 100
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 5.69 kb
#include <fstream>
#include <string>

using namespace std;

enum Expectation{   // care e urmatorul eveniment pe care il astept
	KEY,                // inceputul unei chei (")
    KEY_END,            // sfarsitul unei chei (")
    VALUE_START,        // inceputul unei valori (numar sau ")
    VALUE_END_STRING,   // sfarsitul unei valori string (")
    VALUE_END_INT,      // sfarsitul unei valori int (blank sau , sau })
    COLON,              // :
    BRACE_OPEN,         // inceputul unei entitati din "tabel"
    BRACKET_OPEN        // inceputul fisierului
};

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

// se presupune ca fisierul e scris in formatul dat

int main(){
	ifstream scan("convertor.in");
    ofstream print("convertor.out");

    string buffer = "",firstLine = "",currentLine = "";
    Expectation expected = BRACKET_OPEN;    // astept inceputul "documentului"
    bool first = true;       // false cand termin de citit prima entitate si stiu sa scriu in fisierul destinatie prima linie
    bool openFile = true;    // false cand intalnesc caracterul "]" deci se termina "documentul"

    expected = BRACKET_OPEN; // astept inceputul "documentului"

    while(getline(scan,buffer) && openFile){
        // pentru fiecare linie din fisier
        for(unsigned int current = 0; current < buffer.length() ; ++current){
            // pentru fiecare caracter din linie
            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;
}