Cod sursa(job #1343922)

Utilizator rvintilaVintila Ioan-Raul rvintila Data 16 februarie 2015 01:17:41
Problema Convertor Scor 0
Compilator c Status done
Runda rosedu_cdl_2015 Marime 3.41 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define BUFSIZE 1024
 
void get_column(char *columns[3000],FILE *file_json,int *nr_col);
void get_lines(FILE *file_json,FILE *file_out,int *nr_col);
 
int main()
{
    FILE *file_json = fopen("convertor.in","r");
    FILE *file_out = fopen("convertor.out","w");
    int nr_col = 0,i;
    char **columns;
	columns = calloc ( 3000 , sizeof(char *) );
    for(i = 0; i < 3000; i++)
       	columns[i] = calloc ( 3000, 1);
    get_column(columns,file_json,&nr_col);
    for(i = 0; i < nr_col ; i++)
        fprintf(file_out,"%s,",columns[i]);
    fprintf(file_out,"\n");
    get_lines(file_json,file_out,&nr_col);
    fclose(file_json);
    fclose(file_out);
    return 0;
}
 
void get_column(char *columns[3000],FILE *file_json,int *nr_col) {
    int i,j = 0,ok = 0,len;
    char line[BUFSIZE],*sample;

	sample = malloc ( 2000 );
 
    /* Separ continutul primelor acolade */
 
    while(fgets(line,BUFSIZE,file_json)) {
        len = strlen(line);
        for(i = 0; i < len && line[i] != '}'; i++) {
            //printf("%c",line[i]);
            if(ok || line[i] == '{') {             
                ok = 1;
                sample[j++] = line[i];
            }
        }
        if (line[i] == '}')
            break;
    }
    sample[j] = 0;
    j = 0;
    //printf("%s",sample);
    len = strlen(sample);
    for(i = 0; i < len; i++) {
        if (sample[i] == '"') {
            strncpy(columns[j++],sample + i + 1,strchr(sample + i + 1,'"') - sample - i - 1);
            columns[j-1][strlen(columns[j-1])] = 0;
        //  printf("%s,",columns[j-1]);
            (*nr_col)++;
            i = strchr(sample + i + 1,'"') - sample + 1;
            /* sar peste urmatoarele " sau numar */
            for( ; i < len; i++) {
                if(sample[i] == '"') {
                    i = strchr(sample + i + 1,'"') + 1 - sample;
                    break;
                }
                if(isdigit(sample[i])) {
                    while(isdigit(sample[++i]))
                        ;
                    break;
                }  
            }
        }
    }
    //printf("%s",columns[0]);
	free(sample);
    rewind(file_json);
}
 
void get_lines(FILE *file_json,FILE *file_out,int *nr_col) {
    char *c;
    int size,i = 0,k = 0,aux;
 
    fseek(file_json,0,2);
    size = ftell(file_json);
    rewind(file_json);
 
    c = malloc(size + 1);
    fread(c,size,1,file_json);
    c[size] = 0;
 
    point :
    if(k == *nr_col) {
        fwrite("\n",1,1,file_out);
        k = 0;
    }
    while(strchr(c + i,'\"')) {
        i = strchr(c + i,'\"') + 1 - c;
        i = strchr(c + i,'\"') + 1 - c;
        while(i++)
            switch (c[i]) {
                case '\"' :
                    aux = strchr(c + i + 1,'\"') + 1 - c;
                    fwrite(c + i + 1,aux - i - 2,1,file_out);
                    fwrite(",",1,1,file_out);
                    i = aux;
                    k++;
                    goto point;
                default :
                    if(isdigit(c[i])) {
                        aux = i++;
                        while(isdigit(c[i++]))     
                            ;
                        fwrite(c + aux,i - aux - 1,1,file_out);
                        fwrite(",",1,1,file_out);
                        k++;
                        goto point;                                                    
                    }
            }
    }
}