Cod sursa(job #1360980)

Utilizator TwistedFaithStanescu Jean Alexandru TwistedFaith Data 25 februarie 2015 19:03:18
Problema Convertor Scor 80
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.28 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

void nfprint(char *ptr, int len);
//void parse(char **ptr1, char **ptr2);
//char * otherParse(char **ptr1);
void solveKeys(FILE *pFile);
void solveValues(FILE *pFile);

void fie(){
	int i;

	for (i = 0; i < 10; ++i)
		printf("%d", i);
}

int main(){
	/* Open input file */
	FILE *pFile = fopen("convertor.in", "rt");

	/* Redirect output from stdout to convertor.out */
	freopen("convertor.out", "wt", stdout);

	assert (pFile != NULL);

	solveKeys(pFile);
	rewind(pFile);
	solveValues(pFile);

	fclose(pFile);
	return 0;
}

void nfprint(char *ptr, int len){
	int i;

	for (i = 0; i < len; ++i)
		printf("%c", ptr[i]);

	printf(",");
}

void solveKeys(FILE *pFile){
	char *ptr1, *ptr2, *str, *aux;
	register short int i;
	short int len, quote;

	str = (char*) malloc (1025);
	aux = (char*) malloc (512);

	do{
		fgets(str, 1025, pFile);
		len = strlen(str);
		quote = 0;

		for(i = 0; i < len; ++i){
			if(*(str+i) == '"'){
				if(quote % 2 != 0){
					strncpy(aux, ptr1 + 1, str + i - ptr1 - 1);
					aux[str + i - ptr1 - 1] = '\0';
				}
				else ptr1 = str+i;

				quote++;
			}
			else if(*(str+i) == ':'){
				printf("%s,", aux);

				quote = 0;
			}
			else if(*(str+i) == '}'){
				quote = -1;
				break;
			}
		}
	}
	while(quote != -1);

	printf("\n");

	free(str); 
}

void solveValues(FILE *pFile){
	char *ptr1, *ptr2, *str;
	register short int i;
	short int len, quote = 0, dots = 0, nr = 0;

	str = (char*) malloc (1025);

	do{
		fgets(str, 1025, pFile);
		len = strlen(str);

		for(i = 0; i < len; ++i){
			if(*(str+i) == ':'){
				dots = 1;
				quote = 0;
				nr = 0;
			}
			else if ((*(str+i) == '"') && (dots)){
				if(quote % 2 != 0)
					ptr2 = str+i;
				else ptr1 = str+i+1;

				quote++;
			}
			else if (*(str+i) == '}'){
				printf("\n");
				dots = 0;
				quote = 0;
				nr = 0;
			}
			else if ( (*(str+i) >= 48) && (*(str+i) <= 57) && (!nr)  && (dots) && (!quote) ){
				ptr1 = str+i;
				nr++;
			}
			else if ((nr == 1) && !( (*(str+i) >= 48) && (*(str+i) <= 57) ) && (dots) && (!quote) ){
				ptr2 = str+i;
				nr = 2;
			}

			if ( ( ((quote) && (quote % 2 == 0)) || (nr == 2) ) && (dots == 1) ){
				nfprint(ptr1, ptr2 - ptr1);

				quote = 0;
				nr = 0;
				dots = 0;
			}
		}
		
	}
	while( !feof(pFile) );

	free(str);
}