Cod sursa(job #1343233)

Utilizator relu.draganDragan Relu relu.dragan Data 15 februarie 2015 00:21:19
Problema Convertor Scor 100
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.98 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 600000
int isDigit(char c)
{
  if ((int)c >= 48 && (int)c <= 57)
    return 1;
  else 
    return 0;
}

void add_value(FILE* f, char* buffer, int* i, char* c)
{
  //presupunem ca suntem pe pozitia caracterului :
  //char c;
  while (1)
  {
    *c = getc(f);
 
    if (*c == '"')
    {
      //string
      *c = getc(f);
      do
      {
        buffer[(*i)++] = *c;
        *c = getc(f);
      }
      while (*c != '"');
      buffer[(*i)++] = ',';
      break;
    }
    else
      if (isDigit(*c))
      {
        //number
        while (isDigit(*c))
        {
           
          buffer[(*i)++] = *c;
          *c = getc(f);
        }
        buffer[(*i)++] = ',';
        break;
      }
  }
  
}
char* parcurgere(FILE* f, FILE* g)
{
  char c;
  int i = 0;
  char* buffer;
  buffer = (char*)malloc(MAXSIZE*sizeof(char));
  
  //prima cheie
  c = getc(f);
  while (c != '"')
    c = getc(f);
  c = getc(f);
  while (c != '"')
  {
    fprintf(g, "%c", c);
    c = getc(f);
  }
  fprintf(g, ",");
  //prima valoare
  c = getc(f);
  while (c != ':')
    c = getc(f);
  add_value(f, buffer, &i, &c);

  //urmatoarele chei/valori
  while (c != '}')
  {
    
    //cheie
    //c = getc(f);
    while (c != ',')
    {
      if (c == '}')
      {
        buffer[i] = '\0';
        return buffer;
      }
      c = getc(f);
    }
    c = getc(f);
    while (c != '"')
      c = getc(f);
    c = getc(f);
    while (c != '"')
    {
      fprintf(g, "%c", c);
      c = getc(f);
    }
    fprintf(g, ",");
    
    //valoare
    c = getc(f);
    while (c != ':')
      c = getc(f);
    add_value(f, buffer, &i, &c);
  }
  buffer[i] = '\0';
  return buffer;
}
void print_value(FILE* f, FILE* g)
{
  //presupunem ca suntem pe pozitia caracterului :
  char c;
  //fseek(f, dotpos + 1, SEEK_SET);
  while (1)
  {
    c = getc(f);
 
    if (c == '"')
    {
      //string
      c = getc(f);
      do
      {
        fprintf(g, "%c", c);
        c = getc(f);
      }
      while (c != '"');
      fprintf(g, ",");
      break;
    }
    else
      if (isDigit(c))
      {
        //number
        while (isDigit(c))
        {
           
          fprintf(g, "%c", c);
          c = getc(f);
        }
        fprintf(g, ",");
        break;
      }
  }
}  
void get_values(FILE* f, FILE* g)
{
  char c;
   
  c = getc(f);
  while (c != ']')
  {
    if (c == ':')
    {
      
      print_value(f,g);
    }
    if (c == '{') 
      fprintf(g, "\n");    
    c = getc(f);
  }
   
}
int main(void)
{
    FILE *f, *g;
    char *buffer;
        
   // start = clock();
     
    f = fopen("convertor.in", "rt");
    g = fopen("convertor.out", "wt");
    buffer = parcurgere(f,g);
    fprintf(g, "\n%s", buffer);
    //printf("%d\n", get_nrkeys(f));
    //afisare_chei(f,g);

    //fprintf(g, "\n");
    get_values(f,g);
    //get_dots_positions(f,g,0);
     
    fclose(f);
    fclose(g);
    //stop = clock();
    //printf("%.6f\n", (double)(stop - start) / CLOCKS_PER_SEC);
    return 0;
     
}