Cod sursa(job #1341340)

Utilizator relu.draganDragan Relu relu.dragan Data 12 februarie 2015 17:22:56
Problema Convertor Scor 70
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 3.03 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXKEYLENGTH 150
#define MAXNRVALUES 2000
#define MAXVALUELENGTH 150
int isDigit(char c)
{
  if ((int)c >= 48 && (int)c <= 57)
    return 1;
  else 
    return 0;
}
int get_keys_number(FILE* f, int pos)
{
  int nr = 0;
  char c;
  do
  {
    c = getc(f);
    if (c == ':')
      nr++;
  }
  while (c != '}');
  return nr;

}  
int* get_dots_positions(FILE* f, int pos)
{
  int i = 1;
  int* positions;
  char c;
  positions = (int*)malloc(MAXNRVALUES*sizeof(int));
  fseek(f, pos, SEEK_SET);
  do
  {
    c = getc(f);
    if (c == ':')
    {
      positions[i] = ftell(f);
      i++;
    }
  }
  while (c != ']');
  positions[i] = '\0';
  positions[0] = i;

  return positions;
}
char* get_key(FILE* f, int dotpos)
{

  int i = 1;
  char c;
  char* key;

  key = (char*)malloc(MAXKEYLENGTH*sizeof(char));
  fseek(f, dotpos - i, SEEK_SET);
  c = getc(f);

  //gaseste primele ghilimele (cele care inchid key-ul)
  while (c != '"')
    {
      i++;
      fseek(f, dotpos-i, SEEK_SET);
      c = getc(f);
    }

  i++;
  fseek(f, dotpos-i, SEEK_SET);
  c = getc(f);

  //gaseste cel de-al doilea caracter ghilimele (cele care deschid key-ul)
  while (c != '"')
  {
    i++;
    fseek(f, dotpos-i, SEEK_SET);
    c = getc(f); 
  }

  //citeste key-ul
  c = getc(f);
  i = 0;
  while (c != '"')
  {
    key[i] = c;
    i++;
    c = getc(f);
  }
  key[i] = '\0';

  return key;
}
char* get_value(FILE* f, int dotpos)
{

  char c;
  int i = 1;
  char* value;

  value = (char*)malloc(MAXVALUELENGTH*sizeof(char));

  fseek(f, dotpos + 1, SEEK_SET);

  while (1)
  {
    c = getc(f);

    if (c == '"')
    {
      //string
      do
      {
        c = getc(f);
        value[i] = c;
        i++;
      }
      while (c != '"');
      value[i - 1] = '\0';
      value[0] = i - 1;
      break;
    }

    else
      if (isDigit(c))
      {
        //number
        while (isDigit(c))
        {
          value[i] = c;
          i++;
          c = getc(f);
        } 
        value[i] = '\0';
        value[0] = i;
        break;
      }

  }
  
  return value;  
}
int main(void)
{
    FILE *f, *g;
    
    char* currkey;
    char* currvalue;
    int nr_keys, i, j;
    int* dotspositions;
    f = fopen("convertor.in", "rt");
    g = fopen("convertor.out", "wt");
    
    
    
    nr_keys = get_keys_number(f, 0);
   
    dotspositions = get_dots_positions(f, 0);
    for (i = 1; i <= nr_keys; i++)
    {
      currkey = get_key(f, dotspositions[i]);
      fprintf(g, "%s,", currkey);
      free(currkey);
     // fprintf(g, "%d ", dotspositions[i]);
    }
    fprintf(g, "\n");

    for (i = 1; i < dotspositions[0]; i++)
    {
      currvalue = get_value(f, dotspositions[i]);
      for (j = 1; j < currvalue[0]; j++)
        fprintf(g, "%c", currvalue[j]);
      fprintf(g, ",");
      if (i % nr_keys == 0)
        fprintf(g, "\n");
      free(currvalue);  
    }
    //currvalue = get_value(f, dotspositions[3]);
    //fprintf(g, "\n%c\n", currvalue[1]);
    free(dotspositions);
    fclose(f);
    fclose(g);
    return 0;
    
}