Cod sursa(job #1358694)

Utilizator MrWhiteDELETEME MrWhite Data 24 februarie 2015 19:13:54
Problema Convertor Scor 0
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.24 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_JSON_VARIABLES						1536

#define MAX_KEY_LEN								1152
#define MAX_VALUE_LEN							1152

typedef struct {
	char key[MAX_KEY_LEN], value[MAX_VALUE_LEN];
} json_var_t;

typedef struct {
	int len;
	json_var_t data[MAX_JSON_VARIABLES];
} json_dictinoary;

json_dictinoary dict;

void dump_dictionary(json_dictinoary *dict)
{
	static int isFirst = 1;
	if (isFirst) {
		for (int i = 0; i < dict->len; ++i) {
			printf("%s,", (char *) dict->data[i].key);
		}
		printf("\n");
		isFirst = 0;
	}
	for (int i = 0; i < dict->len; ++i) {
		printf("%s,", (char *) dict->data[i].value);
	}
	printf("\n");
}

int is_digit(char ch)
{
	return ((ch >= '0') && (ch <= '9'));
}

void parse(FILE *file)
{
	while (1) {
		char ch = fgetc(file);
		if (feof(file)) {
			break;
		}
		continue;
		if (ch == '"') {
			json_var_t *var = &dict.data[dict.len++];
			// Reading key.
			int key_pos;
			var->key[0] = fgetc(file);
			for (key_pos = 1; var->key[key_pos - 1] != '"'; ++key_pos) {
				var->key[key_pos] = fgetc(file);
			}
			// Reading ':'.
			while (fgetc(file) != ':');
			int is_str = 0;
			// Determining value type.
			while ((ch = fgetc(file))) {
				if (ch == '"') {
					is_str = 1;
					break;
				} else if (is_digit(ch)) {
					break;
				}
			}
			// Reading value.
			int value_pos;
			if (is_str) {
				var->value[0] = fgetc(file);
				for (value_pos = 1; var->value[value_pos - 1] != '"'; ++value_pos) {
					var->value[value_pos] = fgetc(file);
				}
			} else {
				var->value[0] = ch;
				for (value_pos = 1; is_digit(var->value[value_pos - 1]); ++value_pos) {
					var->value[value_pos] = fgetc(file);
				}
			}
			// Finishing the strings.
			if (var->value[value_pos - 1] == '}') {
				var->key[key_pos - 1] = var->value[value_pos - 1] = 0;
				dump_dictionary(&dict);
			} else {
				var->key[key_pos - 1] = var->value[value_pos - 1] = 0;
			}
		} else if (ch == '{') {
			dict.len = 0;
		} else if (ch == '}') {
			dump_dictionary(&dict);
		} else if (ch == ']') {
			break;
		}
	}
}

int main()
{
	FILE *fin = fopen("convertor.in", "r");
	freopen("convertor.out", "w", stdout);
	parse(fin);
	return 0;
}