Pagini recente » Cod sursa (job #1772557) | Cod sursa (job #2095673) | Cod sursa (job #1922945) | Cod sursa (job #2713731) | Cod sursa (job #1341318)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXKEYLENGTH 65
#define TOKNRKEYS 15
#define MAXNRVALUES 1000
#define MAXVALUELENGTH 30
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("date.in", "rt");
g = fopen("date.out", "wt");
/*do
{
c = getc(f);
fprintf(g, "%c", c);
}
while (c!=EOF);
fprintf(g, "\n");*/
nr_keys = get_keys_number(f, 0);
// fprintf(g, "%d\n", nr_keys);
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]);
fclose(f);
fclose(g);
return 0;
}