Pagini recente » Cod sursa (job #1612513) | Cod sursa (job #212244) | Cod sursa (job #987358) | Cod sursa (job #2956193) | Cod sursa (job #1354618)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define PRINT 0
#define RHS 1
#define HEAD 2
void skipBlanksAndCommas(char **target)
{
while( **target == ' ' || **target == ',' )
(*target)++;
}
void getWord(char **target, char **result, int *flags)
{
char *start, *end;
//skipping stage
SKIP:
if( **target == '[' )
{
(*target)++;
skipBlanksAndCommas(target);
goto SKIP;
}
if( **target == ']' )
{
(*target)++;
skipBlanksAndCommas(target);
goto EXIT;
}
if( **target == '{' )
{
(*target)++;
skipBlanksAndCommas(target);
goto SKIP;
}
if( **target == '}' )
{
(*target)++;
skipBlanksAndCommas(target);
goto FORCE_PRINT;
}
if( **target == ':' )
{
(*target)++;
skipBlanksAndCommas(target);
flags[RHS] = 1;
}
//initialization stage
start = *target;
end = start;
*result = NULL;
//formating stage
if( **target == '"' )
{
(*target)++;
start++;
while( **target != '"' && **target != '\n' && **target != '\0' )
{
(*target)++;
end = *target;
}
(*target)++;
}
else
while( **target != ' ' && **target != '\n' && **target != '\0' && **target != ',')
{
(*target)++;
end = *target;
}
//returning stage
int size = end - start + 1;
*result = (char*)malloc(size);
strncpy(*result,start,size);
(*result)[size - 1] = '\0';
return;
EXIT:
return;
FORCE_PRINT:
flags[PRINT] = 1;
return;
}
int main()
{
FILE *in, *out;
int flags[3] = { 0, 0, 1 };
in = fopen("convertor.in", "r" );
out = fopen("convertor.out", "w" );
char *source, *disp, right[1100][1100];
int memberCount = 0, i;
source = (char*) malloc(1100);
while (fgets(source,1100,in))
{
skipBlanksAndCommas(&source);
while(*source != '\n' && *source != '\0')
{
getWord(&source,&disp,flags);
if( flags[PRINT] == 0 )
{
if( flags[RHS] == 0 )
{
if( flags[HEAD] == 1 && strlen(disp) != 0 )
fprintf(out, "%s,", disp);
}
else
{
strcpy(right[memberCount],disp);
if(strlen(disp) != 0 )
{
memberCount++;
flags[RHS] = 0;
}
}
}
else
{
flags[HEAD] = 0;
fprintf(out, "\n");
for( i = 0 ; i < memberCount; i++ )
fprintf(out, "%s,", right[i]);
memberCount = 0;
flags[PRINT] = 0;
}
skipBlanksAndCommas(&source);
}
}
return 0;
}