Cod sursa(job #1360957)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 25 februarie 2015 18:57:15
Problema Convertor Scor 60
Compilator c Status done
Runda rosedu_cdl_2015 Marime 3.3 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define DIM 3000


void strdel(char *p, int n){//sterge n caractere de la adresa p
	char *a;
	a=p+n;
	strcpy(p,a);
	p[strlen(p)]='\0';

}
char * element(char *element){//returneaza elementul dintre adresa a si b fara spatii in afara ghilimelelor

	//elinam spatiile idn afara ghilimelelor

	int ghm=0;//verificam daca avem nr par sau impar de ghilimele
				//daca e par eliminam spatiile 
				//daca e impar le lasam in pace
	
	int j=0,i,naux=1;//naux ne va ajuta sa alocam si realocam aux

	char *aux;//returnam aux la final
	aux=(char*)malloc(naux*DIM*sizeof(char));

	for(i=0;i<strlen(element);i++){

		if(ghm%2==0 && isspace(element[i]))
			continue;

		//realocam in caz de nevoie
		if(strlen(aux)+1==naux*DIM){
			naux++;
			aux=(char*)realloc(aux,naux*DIM*sizeof(char));
		}

		aux[j]=element[i];
		j++;
		if(element[i]=='\"')
			ghm++;

	}
		
	aux[j]='\0';
		
	return aux;				

}

void write(char *s,FILE *f){//s -> elementul din care extragem atributele  f fisierul in care scriem
	int i , j;
	char *a;
	a=strchr(s,':');

		while(a!=NULL ){
		
			a=a+1;
			j=0;
		
		
			while(a[j]!=',' && a[j] !='}'){
				if(a[j]=='\"'){
					j++;
					continue;
				}
			
				fputc(a[j],f);
				j++;
				
			}
			fputc(',',f);

			a=strchr(a,':');

		}
		fputc('\n',f);
}		

int main(){
	FILE *in=fopen("convertor.in","r");
	FILE *out=fopen("convertor.out","w");
	
	char *first;//in el retinem  categoriile
	int nfirst=1;
	char **categ;
	char *fin,c=' ';
	int nfin=1;
	categ=(char**)malloc(100*sizeof(char*));//in el tinem minte categoriile
	
	first=(char*)malloc(nfirst*DIM*sizeof(char));
	fin=(char*)malloc(nfin*DIM*sizeof(char));


	if (in==NULL){
		fprintf(stderr, "err\n");
		exit(1);
	}

		//char s[1025];

		int i;
		//OBTINEM CATEGORIILE
		i=0;
	while(c!='}'){
		c=fgetc(in);
		if(strlen(fin)+1==nfin*DIM){//in cazul in care lungimea sirului e mai mare decat nfin*dim , realocam
			nfin++;
			fin=(char*)realloc(fin,nfin*DIM*sizeof(char));
		}
		fin[i]=c;
		i++;
	}
	fin[i]='\0';
			
	fclose(in);//pentru a pune cursorul inapoi la inceputul fisierului

	in=fopen("convertor.in","r");
	

				char *a;
				a=strtok(fin,",:");
				 i=0;
				while(a!=NULL){
					if(i%2==0){
					
						strcat(first,a);
						
					}
					a=strtok(NULL,",:");
					i++;
				}


				char *b;
				char tst[]=" ";
				b=tst;//am facut asta pentru a putea intra in while(!=NULL)
				a=strchr(first,'"');
				
				int n=0 ;
				
				char *aux;
				while(a!=NULL && b!=NULL){
						b=strchr(a+1,'"');
						aux=(char*)malloc((b-a)*sizeof(char));

					strncpy(aux,a+1, (int)(b-a-1));
					aux[b-a-1]='\0';
					
					categ[n]=strdup(aux);

					fprintf(out,"%s,",categ[n]);
					n++;
					a=strchr(b+1,'"');
				}
				fprintf(out,"\n");

		
		c=' ';//pur si simplu e initializat ai sa poata intra in while

	while(c!=EOF){
		strcpy(fin,"");//eliberam vectorul ce urmeaza a fi prelucrat
		c=fgetc(in);
		if(c=='{'){
			i=0;
			while(c!='}'){
				c=fgetc(in);

				if(strlen(fin)+1==nfin*DIM){//in cazul in care lungimea sirului e mai mare decat nfin*dim , realocam
					nfin++;
					fin=(char*)realloc(fin,nfin*DIM*sizeof(char));
				}

				fin[i]=c;
				i++;
			}
			fin[i]='\0';
			
			char *no_spaces;
			no_spaces=element(fin);
			write(no_spaces,out);
			free(no_spaces);

		}
	}	

	fclose(out);
	
	
	return 0;
		

}