All pastes #2004096 Raw Edit

prod_sort.c adv prog hw 3

public c v1 · immutable
#2004096 ·published 2010-11-27 21:18 UTC
rendered paste body
/**	Programmed By :	m1o2*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include <sys/types.h>#define WaitForEnter { fprintf(stderr,"\n\n Press the 'Enter' key to continue..."); fflush(stdout); fflush(stdin); getchar(); putchar('\n'); }#define SystemError( msg ) { fprintf(stderr,"\n\n Error: "); fflush(stderr); perror(msg); exit( 1 ); }#define Plumber( stream ) { if( pipe(stream) == FAIL ) SystemError( "Cannot open pipes." ); } #define Close( stream ) { if( close(stream) == FAIL ) SystemError( "Cannot close stream." ); }#define dup3( stream ) { if( dup( stream ) == FAIL ) SystemError( "Cannot duplicate stream." ); }typedef enum { FAIL = -1, CHILD,EMPTY = 0, SUCCESS } RESULT;typedef enum { INPUT, OUTPUT } STREAM_INDEX;typedef enum { False, True } Bool;typedef int _stream;typedef char* _string,_path;typedef const char _letter;/* the child process execution code(callin the sort function) */void child( _stream in, _stream out, _string column );/*  reading numbers from the file, multiply the number with the 'column' column, and send it throw pipe. */int numbersWriter( _string path,  _stream out , size_t column, size_t mul );/* reading Integers from files using row function and system calls */Bool getInt( _stream in, int* var );int main(int length, char *params[]){		_stream pipeStream1[2], pipeStream2[2];	int mul,number,counter;			if( length < 4 || ( (((*params[2])-'0') < 1) || (((*params[2])-'0') > 3) ) )		SystemError( "Not Enough Parameters Or Illegal Parameters." );		/* opening two pipes. */	Plumber( pipeStream1 );	Plumber( pipeStream2 );	if( fork() == CHILD ){  /* child process - calling the sort function */		Close( pipeStream2[OUTPUT] );		Close( pipeStream1[INPUT] );		child( pipeStream2[INPUT], pipeStream1[OUTPUT], params[2] );	}	else{ /* father process */		Close( pipeStream2[INPUT] );		Close( pipeStream1[OUTPUT] );		sscanf(params[3],"%d",&mul);		/* multipying the currect column and sending the result to the sort process with a pipe */		numbersWriter( params[1], pipeStream2[OUTPUT],((*params[2])-'0'),mul);		Close( pipeStream2[OUTPUT] );		Close( INPUT );		dup3( pipeStream1[INPUT] );			/* printing the result , which we got from the pipe of the sort process */		printf("\n\n Factored, Sorted File : \n");		fflush(stdout);		for( counter = 1; getInt( INPUT,&number) == True; ++counter ){			printf("%3d\t",number);			fflush(stdout);			if( (counter%3) == 0 )				putchar('\n');		}	}		wait();	WaitForEnter;return 0;}/* reading the next Integer from a stream using row functions and system calls */Bool getInt( _stream in, int* var ){	char input;	ssize_t got = 0;	Bool result = False, negative = False,toContinue = True;	(*var) = 0;			while( toContinue && read(in, &input, 1) > EMPTY ){		if( ((input >= '0' && input <='9') || input == '-' ) ){			result = True;			if( input == '-' )				negative = True;			else				(*var) = (((*var) * 10)+(input-'0'));		}		else if( result )			toContinue = False;	}	if( negative )		(*var) = 0 - (*var);	return result;}/* multiplying the currect column and sending the result to sort */int numbersWriter( _string path, _stream out , size_t column, size_t mul ){	_stream input_file;	size_t index = 1,counter = 0;	int result;	Bool flag = True;	int written;	char s_result[17];		if( ( input_file = open( path, O_RDONLY, 0644 ) ) == FAIL )		SystemError( "Cannot open file." );	while( getInt( input_file, &result ) ){						++counter;							if ( index == column )				result *= mul;			sprintf(s_result,"%3d        ",result);						if( write( out, s_result, strlen(s_result) ) < strlen(s_result) )				SystemError( "Cannot write to a stream." );						if( ++index > 3 ){				index = 1;				strcpy(s_result,"\r\n");			}			else				strcpy(s_result," ");			if( write( out, s_result, strlen(s_result) ) < strlen(s_result) )				SystemError( "Cannot write to a stream." );	}	fsync( out );	Close( input_file );		return counter;}/* calling the sort function using execlp */void child( _stream in, _stream out, _string column ){		Close( INPUT )	dup3( in );		Close( OUTPUT );	dup3( out );		if( execlp( "sort","sort","-n","-k",column,NULL) == FAIL )		SystemError ("Cannot execute /usr/bin/sort" );}