All pastes #11918 Raw Edit

C The Ass

public c v1 · immutable
#11918 ·published 2005-05-16 19:56 UTC
rendered paste body
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>#include <limits.h>#define LINE_LEN 1024typedef struct {	long a;	long n;} sum_t;typedef struct {	/* stores all results */	long * s_result;	/* stores the sum of all */	long sum;} sum_result_t;int readSumParams(sum_t * sum, char * line);void __shutdown();/* store program name */char * program = NULL;/* storage for file-handle */FILE * fh = NULL;int main (int argc, char * argv[]) {    int i = 0;	/* storage for the x's	 * as count of x's is not yet known	 * we're going to allocate on demand	 */	long * x;	/* storage for file line */	char line[LINE_LEN+1];	/* stores a and n */	sum_t sum_params;	/* stores all single results */	sum_result_t sum_result;	/* stores time needed for execution */	clock_t start, stop;		/* storing program name used for error output */	program = argv[0];		/* checking if required arguments were passed */	if(argc < 2) {		fprintf(stderr, "%s: You must pass a file containing, a,n and x's\n", program); 		__shutdown();		return EXIT_FAILURE;	}		/* if file was passed content is opened and read */	fh = fopen(argv[1], "r");	if(fh == NULL) {		fprintf(stderr, "%s: Couldn't open file '%s'", program, argv[1]);		__shutdown();		return EXIT_FAILURE;	}	if(fgets(line, LINE_LEN, fh) == NULL) {		fprintf(stderr, "%s: Couldn't read first line!\n", program);		__shutdown();		return EXIT_FAILURE;	}		/* get a and n in a structure */	if(!readSumParams(& sum_params, line)) {		__shutdown();		return EXIT_FAILURE;	}		x = (long *)calloc(1,sizeof(long));	if(fgets(line, LINE_LEN, fh) == NULL) {		fprintf(stderr, "%s: No values given for x. Check syntax please!\n", program);		__shutdown();		return EXIT_FAILURE;	}	x[i] = strtol(line, NULL, 10);		/* store all x's */	while(fgets(line, LINE_LEN, fh) != NULL) {		x = (long *)realloc(x, sizeof(long));		x[i] = strtol(line, NULL, 10);		i++;	}		/* check whether less values are given */	if((i+1) < sum_params.n) {		fprintf(stderr, "%s: Not enough values for x are given!. Check n!\n");		__shutdown();		return EXIT_FAILURE;	}		/* check whether more values for x are given than n */	if((i+1) > sum_params.n) {		fprintf(stderr, "%s: More values for x than given by n! These are gonna be ignored!\n", program);	}		start = clock();		i = 0;	/* doing the calculation for each x */	sum_result.s_result = (long *)calloc(1, sizeof(long));	sum_result.sum = 0;	for(i = 0; i < sum_params.n; i++) {		sum_result.s_result = (long *)realloc(sum_result.s_result, sizeof(long));		sum_result.s_result[i] = sum_params.a*x[i];		if(LONG_MAX - (sum_result.sum + sum_result.s_result[i]) < 0) {			fprintf(stderr, "%s: Sorry, Sum is already bigger than %ld\n", program, LONG_MAX);			__shutdown();			return EXIT_FAILURE;		}		/*printf("Sum x%d: %d\n", i,sum_result.s_result[i]); */		sum_result.sum += sum_result.s_result[i];	}		stop = clock();		printf("Start: %ld\nStop: %ld: %d\n", start, stop, CLOCKS_PER_SEC);			fprintf(stdout, "Result for Calculation: %ld\n", sum_result.sum);	fprintf(stdout, "Time for Caluclation: %ld\n", (double)((clock() - start)/CLOCKS_PER_SEC));	__shutdown();	    return 0;}int readSumParams(sum_t * sum, char * line) {	/* token for splitting */	char token[] = " ";	char * buffer;		buffer = strtok(line, token);	if(buffer != NULL) {		sum->a = strtol(buffer, NULL, 10);	}	else {		fprintf(stderr, "%s: Couldn't read value for a. Please check your file syntax!\n", program);		return 0;	}		buffer = strtok(NULL, token);	if(buffer != NULL) {		sum->n = strtol(buffer, NULL, 10);	}	else {		fprintf(stderr, "%s: Couldn't read value for n. Check file syntax!\n", program);		return 0;	}		return 1;}void __shutdown() {	/* close file */	if(fh != NULL) fclose(fh);}