Cod sursa(job #1346123)

Utilizator mihneadbDobrescu-Balaur Mihnea mihneadb Data 18 februarie 2015 01:16:30
Problema Convertor Scor 90
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.21 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define APPEND 0
#define IGNORE 1

/* Patch and go style code, it's late, just wanted to try it out. */

int main() {
    freopen("convertor.in", "r", stdin);
    freopen("convertor.out", "w", stdout);

    char *whitespace = "{[] \t\n";
    int curr;
    char buff[10000];
    int i = 0, first = 1;
    int state = IGNORE;
    int quote_count = 0;
    int printed = 0;

    while (curr != EOF) {
        curr = getchar();
        /*printf("%c: %d, %d, %d\n", curr, state, first, quote_count);*/
        if (state == IGNORE && strchr(whitespace, curr)) {
            continue;
        }

        if (state == APPEND && quote_count == 2 && strchr(whitespace, curr)) {
            buff[i] = '\0';
            printf("%s,", buff);
            printed = 1;
            state = IGNORE;
            i = 0;
        }

        if (curr == '}' && state == IGNORE) {
            if (first) {
                first = 0;
                rewind(stdin);
            }

            quote_count = 0;
            if (printed) {
                printf("\n");
            }
            continue;
        }

        if (curr == '"') {
            ++quote_count;
        }

        if (quote_count == 4) {
            quote_count = 0;
        }

        if ((curr == '"' || curr == ',') && state == APPEND) {
            /* Word end. */
            buff[i] = '\0';
            printf("%s,", buff);
            printed = 1;
            state = IGNORE;
            i = 0;

            if (curr == ',') {
                quote_count = 0;
            }

            continue;
        }

        if (curr == '"' && state == IGNORE) {
            /* Word begin. */
            if ((first && quote_count == 1) ||
                    (!first && quote_count == 3)) {
                state = APPEND;
            }
            continue;
        }

        if (isdigit(curr) && state == IGNORE && quote_count % 2 == 0) {
            /* Number begin. */
            if (!first) {
                state = APPEND;
            }
        }

        if (curr == ',' && state == IGNORE) {
            quote_count = 0;
        }

        if (state == APPEND) {
            buff[i] = curr;
            ++i;
        }

    }

    return 0;
}