Cod sursa(job #1354618)

Utilizator alin.damainDamian Petrisor Alin alin.damain Data 21 februarie 2015 21:58:53
Problema Convertor Scor 60
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.39 kb
#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;
}