Pagini recente » Cod sursa (job #2998366) | Cod sursa (job #1338332)
#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;
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;
}
void putheader(char ch) {
if(header) {
fputc(ch, out);
}
}
void endrecord() {
putheader('\n');
put('\n');
flush();
header = 0;
}
while((ch = fgetc(in)) != EOF) {
switch(state) {
case STATE_NEW: {
switch(ch) {
case '}':
endrecord();
break;
case '"':
state = STATE_KEY;
break;
}
continue;
}
case STATE_KEY: {
switch(ch) {
case '"':
putheader(',');
state = STATE_COLON;
break;
default:
putheader(ch);
}
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 '.':
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;
case '}':
put(',');
endrecord();
state = STATE_NEW;
break;
default:
put(',');
state = STATE_NEW;
break;
}
continue;
}
case STATE_VALUE_STR: {
switch(ch) {
case '"':
state = STATE_NEW;
put(',');
break;
default:
put(ch);
}
continue;
}
}
}
fclose(out);
fclose(in);
return 0;
}