Cod sursa(job #1359575)

Utilizator dumytruKana Banana dumytru Data 24 februarie 2015 23:40:22
Problema Convertor Scor 90
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 3.36 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STRING 2
#define INT 1

//I thought I'd try to see how fast can make it run.

int main()
{
    FILE* IN = fopen("convertor.in", "rb");
    FILE* OUT = fopen("convertor.out", "wb");

    char *file_content;
    int file_length, crtObj = 0;
    int i;
    short isReading = 0, isValue = 0, type = 0;

    fseek (IN , 0 , SEEK_END);
    file_length = ftell(IN);
    rewind(IN);

    file_content = (char*)malloc( file_length * sizeof(char) );

    fread(file_content, 1, file_length, IN);

    for( i=0 ; i<file_length ; i++)
    {
        if(file_content[i] == '}')
            break;

        if( isReading )
        {
            if(isValue)
            {
                if(file_content[i] ==',' || file_content[i] =='}')
                    isReading = 0;
                continue;
            }

            //sfarsitul citirii unei chei sau valori
            if( file_content[i] == '"' )
            {
                isReading = 0;
                putc(',', OUT);
                continue;
            }
            fwrite( file_content + i * sizeof(char) , 1, 1 , OUT);
        }
        else
        {
            switch(file_content[i])
            {
                case '"':
                    isReading = 1;
                    isValue = 0;
                    break;
                case ':':
                    isReading = 1;
                    isValue = 1;
                    break;
                default:
                    continue;
            }
        }
    }
    isValue = 0;
    isReading = 0;
    putc('\n', OUT);

    for( i=0 ; i<file_length ; i++)
    {
        if( isReading )
        {
            //get value type, if not done so already
            if(!type)
            {
                if(file_content[i] >= '0' && file_content [i] <= '9')
                    type = INT; //int
                else if(file_content[i] == '"')
                {
                    type = STRING; //string
                    continue; //string-ul incepe de la urmatorul caracter
                }
                else
                    continue;//salt peste caracterele dintre : si value
            }

            //sfarsitul citirii unei chei sau valori
            if(     (type == STRING && file_content[i] == '"') ||
                    (type == INT && !(file_content[i] >= '0' && file_content [i] <= '9') ) )
            {
                isReading = 0;
                type = 0;
                putc(',', OUT);
                continue;
            }

            fwrite( file_content + i * sizeof(char) , 1, 1 , OUT);

        }
        else
        {
            //daca nu citeste (scrie) o cheie sau o valoare
            switch(file_content[i])
            {
                case ':': //valoare
                    isReading = 1;
                    isValue = 1;
                    break;
                case '{': //next object
                    crtObj++;
                    break;
                case '}':
                    putc('\n', OUT);
                    break;
                default: //pentru spatii, tab-uri...
                    continue;
            }
        }
    }

    //free
    free( file_content );

    //close files
    fclose( IN );
    fclose( OUT );

    return 0;
}