Cod sursa(job #1346085)

Utilizator mihneadbDobrescu-Balaur Mihnea mihneadb Data 18 februarie 2015 00:27:42
Problema Convertor Scor 50
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.05 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";
    char curr;
    char buff[100];
    int r = 0, i = 0, first = 1;
    int state = IGNORE;
    int quote_count = 0;

    while (r != EOF) {
        r = scanf("%c", &curr);
        /*printf("%c: %d, %d, %d\n", curr, state, first, quote_count);*/

        if (state == IGNORE && strchr(whitespace, curr)) {
            continue;
        }

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

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

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

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

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

            continue;
        }

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

            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) {
            /* Number begin. */
            if (!first) {
                state = APPEND;
            }
        }

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

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

    }

    return 0;
}