Cod sursa(job #1355132)

Utilizator alin.damainDamian Petrisor Alin alin.damain Data 22 februarie 2015 13:59:31
Problema Convertor Scor 60
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.79 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define PRINT 0
#define RHS 1
#define HEAD 2
#define EXITF 3
#define NLF 4

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;
	}
	if( **target == '\n' )
		goto EXIT;
	
	//initialization stage
	start = *target;
	end = start;
	*result = NULL;
	
	
	//formating stage
	if( **target == '"' )
	{
		(*target)++;
		start++;
		end++;
		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:
		flags[EXITF] = 1;
		return;
	FORCE_PRINT:
		flags[PRINT] = 1;
		return;
	
}

int main()
{
	FILE *in, *out;
	int flags[5] = { 0, 0, 1, 0, 1 };
	in = fopen("convertor.in", "r" );
	out = fopen("convertor.out", "w" );
	char *source, *disp, right[2000][1025];
	int memberCount = 0, i;
	source = (char*) malloc(1100);
	
	while (fgets(source,1100,in))
	{
		//BUCLA:
		skipBlanksAndCommas(&source);
		while(*source != '\n' && *source != '\0') 
		{
			getWord(&source,&disp,flags);
			if( flags[EXITF] == 1 )
			{
				flags[EXITF] = 0;
				continue;
			}
			if( flags[PRINT] == 0 )
			{
				if( flags[RHS] == 0 )
				{
					if( flags[HEAD] == 1  )
						fprintf(out, "%s,", disp);
				}
				else
				{
					if(flags[HEAD] == 1)
					{
						strcpy(right[memberCount],disp);
						memberCount++;
					}
					else
					{
						if( flags[NLF] == 1 )
						{
							fprintf(out, "\n");	
							flags[NLF] = 0;
						}
						fprintf(out, "%s,",disp);
					}
					flags[RHS] = 0;
				}
				
			}
			else
			{
				if(flags[HEAD] == 1 )
				{
					fprintf(out, "\n");
					for( i = 0 ; i < memberCount; i++ )
						fprintf(out, "%s,", right[i]);
				}
				flags[HEAD] = 0;
				memberCount = 0;
				flags[PRINT] = 0;
				flags[NLF] = 1;
			}
			skipBlanksAndCommas(&source);
		}
	}
	return 0;
}