Cod sursa(job #1344111)

Utilizator razvan3895Razvan-Mihai Chitu razvan3895 Data 16 februarie 2015 13:18:48
Problema Convertor Scor 10
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.13 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TTL	1024	//Total
#define HLF	512	//Half

int blk_read(char*, FILE*);

int main() {
	FILE *f = fopen("convertor.in", "r"), *g = fopen("convertor.out", "w");
	char *line1, *c, a[100], b[100], *p;
	int i, ok = 0, nr = 0, k, test = 0;
	line1 = calloc(TTL, 1);
	memset(a, 0, 100);
	memset(b, 0, 100);
	ok = fread(line1, 1, TTL, f);
	while(ok) {
		c = strchr(line1, '"');
		while(c && c < line1 + HLF) {
			p = strchr(c + 1, '"');
			if(!nr) {
				strncpy(a, c + 1, p - c - 1);
				nr ++;
				fprintf(g, "%s,", a);
			}
			else {
				strncpy(b, c + 1, p - c - 1);
				if(strcmp(a, b) == 0) {
					ok = -1;
					break;
				}
				nr ++;
				fprintf(g, "%s,", b);
				memset(b, 0, 100);
			}
			c = p + 1;
			
			while(*c < 33 || *c == ':') {
				c++;
				if(c - line1 >= TTL) {
					ok = blk_read(line1, f);
					c = line1;
				}
			}
			if(*c == '"')
				c = strchr(c + 1, '"') + 1;
			c = strchr(c + 1, '"');			
		}
		ok = blk_read(line1, f);
		if(ok == -1)
			break;
	}
	fprintf(g, "\n");
	fseek(f, 0, 0);
	nr = 4;
	k = 0;
	ok = fread(line1, 1, TTL, f);
	while(ok || test) {
		c = strchr(line1, ':');
		while(c && c < line1 + HLF) {
			for(i = 1; c[i] < 33; i++) {
				if(c + i - line1 >= TTL) {
					ok = blk_read(line1, f);
					c = line1 + HLF;
					i = -1;
				}
			}
			if(c[i] == '"') {
				i++;
				while(c[i] != '"') {
					fprintf(g, "%c", c[i]);				
					i++;
					if(c + i - line1 >= TTL) {
						ok = blk_read(line1, f);
						c = line1 + HLF;
						i = 0;
					}
				}
			}	
			else
				while(strchr("0123456789-", c[i])) {
					fprintf(g, "%c", c[i]);				
					i++;
					if(c + i - line1 >= TTL) {
						ok = blk_read(line1, f);
						c = line1 + HLF;
						i = 0;
					}
				}
			k++;
			fprintf(g, ",");
			if(k == nr) {
				k = 0;
				fprintf(g, "\n");
			}
			c = strchr(c + i, ':');
		}
		ok = blk_read(line1, f);
		if(test)
			break;
		if(!ok) {
			test = 1;
			memcpy(line1 + HLF, line1, HLF);
		}
	}	
	free(line1);
	fclose(f);
	fclose(g);				
	return 0;
}

int blk_read(char *line, FILE *f) {
	memcpy(line, line + HLF, HLF);
	memset(line + HLF, 0, HLF);
	return fread(line + HLF, 1, HLF, f);
}