Cod sursa(job #1346946)

Utilizator remus.ionitaIonita Remus remus.ionita Data 18 februarie 2015 18:06:52
Problema Convertor Scor 50
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.89 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 )   //afisare anteturi
			fputc(sir[i],f); //printf("%c",sir[i]);
			
		if ( (*nr_cuv) % 2 == 0) {
			if (*first == 1)
				fputc(sir[i],f); //printf("%c",sir[i]);
			if (*first == 0) {                   //linia 2
				line2[*pos] = sir[i];
				(*pos)++;
			}
		}
		i++;
	}
	//  if ( (*nr_cuv) % 2 == 0 ) printf("nr_cuv: %d; ",*nr_cuv);

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

	if ( (*nr_cuv) % 2 == 0 )
		fputc(',',f);//printf(",");
	for(;i<strlen(sir);i++) 
		if(sir[i] == '}') {
			fputs("\n",f);//printf("\n");
			if (*first == 0) {
				strcat(line2,",");
				fputs(line2,f);//printf("%s,\n",line2);
				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;
	 // if ( (*nr_cuv) % 2 == 0 )     printf("nr_cuv: %d; ",*nr_cuv);

	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);//printf("%c",sir[i]);
		}
			else
			if (sir[i] == '}') {
				fputs("\n",f);//printf("\n");
				sf_linie = 1;
				if (*first == 0) {
					strcat(line2,",");
                                	fputs(line2,f);//printf("%s,\n",line2);
                                	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);//printf(",");	
}

void prelucrare(char *namein,FILE *f) {
        FILE *f1 = fopen(namein, "r");
	char line[10130], *cuv, line2[10000];
	int nr_cuv = 1, first = 0;
	int pos = 0;
	while (fgets(line,10000,f1) != NULL) {
                cuv = next(line,cuv);
                while (cuv != NULL) {
			if (strcmp(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 namein[] = "c.in";
	char nameout[] = "convertor.out";
	FILE *f = fopen(nameout, "w");
	prelucrare(namein,f);
	fclose(f);
	return 0;
}