Cod sursa(job #1348694)

Utilizator remus.ionitaIonita Remus remus.ionita Data 19 februarie 2015 20:25:09
Problema Convertor Scor 80
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.66 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *next(char *from, char *word) {
        char sep[] = "{[]:,\n";
        word = strtok(from, sep);
        return word;
}
void afis_cuv(FILE *f, char *sir, int *nr_cuv, int *first, char *line2, int *pos) {
	int i = 1;
	while (sir[i] != '"' ) {
		if ( *first == 0 && (*nr_cuv) % 2 == 1 )  
			fputc(sir[i],f); 

		if ( (*nr_cuv) % 2 == 0) {
			if (*first == 1)
				fputc(sir[i],f); 
			if (*first == 0) {                  
				line2[*pos] = sir[i];
				(*pos)++;
			}
		}
		i++;
	}

	if ( (*nr_cuv) % 2 == 1 && *first == 0 && (*nr_cuv) != 1 ) {
		strcat(line2,",");
		*pos = *pos + 1;
	}

	if ( (*nr_cuv) % 2 == 0 )
		fputc(',',f);
	for(;i<strlen(sir);i++) 
		if(sir[i] == '}') {
			fputs("\n",f);
			if (*first == 0) {
				strcat(line2,",");
				fputs(line2,f);
				fputs("\n",f);
			}
			*first = 1;
			*nr_cuv = 0;
		}

}
void afis_num(FILE *f, char *sir, int *nr_cuv, int *first, char *line2, int *pos) {
	int i = 0, sf_linie = 0;

	while ( i < strlen(sir)) {
		if( (sir[i] - '0') >= 0 && (sir[i] - '0') <= 9 ) {
			if ( (*nr_cuv) % 2 == 0 && *first == 0) {
                                line2[*pos] = sir[i];
                                (*pos)++;
                        }	
			if ( (*nr_cuv) % 2 == 0 && *first == 1)
				fputc(sir[i],f);
		}
			else
			if (sir[i] == '}') {
				fputs("\n",f);
				sf_linie = 1;
				if (*first == 0) {
					strcat(line2,",");
                                	fputs(line2,f);
                                	fputs("\n",f);
                        	}
				*first = 1;
				*nr_cuv = 0;
			}
		i++;

	}
	
	if ( (*nr_cuv) % 2 == 1 && *first == 0 && (*nr_cuv) != 1) {     
                strcat(line2,",");
                *pos = *pos + 1;
        }

	if(!sf_linie)
		if ( (*nr_cuv) % 2 == 0 )
			fputc(',',f);	
}
int empty(char *cuv) {
	int i = 0;
	for (i = 0; i < strlen(cuv); i++)
		if (cuv[i] != ' ' && cuv[i] != '\t')
			return 1;
	return 0;
}
void prelucrare(char *namein,FILE *f) {
        FILE *f1 = fopen(namein, "r");
	char line[1025], *cuv, line2[300000];
	int nr_cuv = 1, first = 0;
	int pos = 0;
	while (fgets(line,1025,f1) != NULL) {
                cuv = next(line,cuv);
                while (cuv != NULL) {
			if ( empty(cuv) ) {
				char *aux = cuv;
                                char *t = (char *) strstr(aux,"\"");
                                if (t) {
					afis_cuv(f, t, &nr_cuv, &first, line2, &pos);
				}
				else   {
					afis_num(f, aux, &nr_cuv, &first, line2, &pos);	
				}
				nr_cuv++;
				
			}
			cuv=next(NULL,cuv);
		}
	}
}
int main(void) 
{
	char namein[] = "convertor.in";
	char nameout[] = "convertor.out";
	FILE *f = fopen(nameout, "w");
	prelucrare(namein,f);
	fclose(f);
	return 0;
}