Cod sursa(job #1358762)

Utilizator MrWhiteDELETEME MrWhite Data 24 februarie 2015 19:46:06
Problema Convertor Scor 100
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.97 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, *value;
} json_var_t;

typedef struct {
	int len, cap;
	json_var_t **data;
} json_dictinoary_t;

json_var_t* var_new(char *key, char *value)
{
	json_var_t *var = malloc(sizeof(json_var_t));
	var->key = strdup(key);
	var->value = strdup(value);
	return var;
}

json_dictinoary_t* dictionary_new(int cap)
{
	json_dictinoary_t *dict = malloc(sizeof(json_dictinoary_t));
	dict->len = 0;
	dict->cap = cap;
	dict->data = malloc(dict->cap * sizeof(json_var_t*));
	return dict;
}

void dictionary_delete(json_dictinoary_t *dict)
{
	for (int i = 0; i < dict->len; ++i) {
		free(dict->data[i]);
	}
	free(dict);
}

void dictionary_add(json_dictinoary_t *dict, json_var_t *value)
{
	if (dict->len == dict->cap) {
		dict->cap *= 2;
		dict->data = realloc(dict->data, dict->cap * sizeof(json_var_t*));
	}
	dict->data[dict->len++] = value;
}

void dictionary_dump(json_dictinoary_t *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)
{
	char key[1024], value[1024];
	int key_pos, value_pos;
	json_dictinoary_t *dict = dictionary_new(512);
	while (1) {
		char ch = fgetc(file);
		if (ch == '"') {
			// Reading key.
			key[0] = fgetc(file);
			for (key_pos = 1; key[key_pos - 1] != '"'; ++key_pos) {
				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.
			if (is_str) {
				value[0] = fgetc(file);
				for (value_pos = 1; value[value_pos - 1] != '"'; ++value_pos) {
					value[value_pos] = fgetc(file);
				}
			} else {
				value[0] = ch;
				for (value_pos = 1; is_digit(value[value_pos - 1]); ++value_pos) {
					value[value_pos] = fgetc(file);
				}
			}
			// Finishing the strings.
			if (value[value_pos - 1] == '}') {
				key[key_pos - 1] = value[value_pos - 1] = 0;
				dictionary_add(dict, var_new(key, value));
				dictionary_dump(dict);
			} else {
				key[key_pos - 1] = value[value_pos - 1] = 0;
				dictionary_add(dict, var_new(key, value));
			}
		} else if (ch == '{') {
			dictionary_delete(dict);
			dict = dictionary_new(512);
		} else if (ch == '}') {
			dictionary_dump(dict);
		} else if (ch == ']') {
			break;
		}
	}
}

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