Cod sursa(job #1338287)

Utilizator alexmoregaAlex Morega alexmorega Data 9 februarie 2015 22:16:36
Problema Convertor Scor 90
Compilator c Status done
Runda rosedu_cdl_2015 Marime 3.03 kb
#include "stdio.h"
#include "stdlib.h"


#define STATE_NEW 0
#define STATE_KEY 1
#define STATE_COLON 2
#define STATE_VALUE_INT 3
#define STATE_VALUE_STR 4


int main() {
  FILE *in = fopen("convertor.in", "r");
  FILE *out = fopen("convertor.out", "w");
  int state = STATE_NEW;
  int header = 1;
  int escape = 0;
  char ch;

  int linebuffersize = 1 * sizeof(char);
  char *line = malloc(linebuffersize);
  int linesize = 0;

  void put(char ch) {
    if(linesize == linebuffersize) {
      line = realloc(line, (linebuffersize += 1 * sizeof(char)));
    }
    line[linesize++] = ch;
  }

  void flush() {
    put('\0');
    fputs(line, out);
    linesize = 0;
  }

  while((ch = fgetc(in)) != EOF) {
    switch(state) {
      case STATE_NEW: {
        switch(ch) {
          case '[': break;
          case ']': break;
          case ',': break;
          case '{': break;
          case '}':
            if(header) {
              fputc('\n', out);
            }
            put('\n');
            flush();
            header = 0;
            break;
          case '"':
            state = STATE_KEY;
            break;
        }
        continue;
      }

      case STATE_KEY: {
        switch(ch) {
          case '"':
            if(! escape) {
              if(header) {
                fputc(',', out);
              }
              state = STATE_COLON;
              break;
            }
          case '\\':
            if(! escape) {
              escape = 1;
              break;
            }
          default:
            if(header) {
              fputc(ch, out);
            }
            escape = 0;
        }
        continue;
      }

      case STATE_COLON: {
        switch(ch) {
          case ':': break;
          case '"':
            state = STATE_VALUE_STR;
            break;
          case '-':
          case '0':
          case '1':
          case '2':
          case '3':
          case '4':
          case '5':
          case '6':
          case '7':
          case '8':
          case '9':
            state = STATE_VALUE_INT;
            break;
        }
        if(state != STATE_VALUE_INT) continue;
      }

      case STATE_VALUE_INT: {
        switch(ch) {
          case '-':
          case '.':
          case 'e':
          case 'E':
          case '0':
          case '1':
          case '2':
          case '3':
          case '4':
          case '5':
          case '6':
          case '7':
          case '8':
          case '9':
            put(ch);
            break;
          default:
            state = STATE_NEW;
            put(',');
            break;
        }
        continue;
      }

      case STATE_VALUE_STR: {
        switch(ch) {
          case '"':
            if(! escape) {
              state = STATE_NEW;
              put(',');
              break;
            }
          case '\\':
            if(! escape) {
              escape = 1;
              break;
            }
          default:
            put(ch);
            escape = 0;
        }
        continue;
      }
    }
  }

  fclose(out);
  fclose(in);
  return 0;
}