#include <stdio.h>
#include <stdlib.h>

void writeHeaders();
void writeCFiles( int nIncludes );
void writeExternalGuardFile( int nIncludes );
void writeInternalGuardFile( int nIncludes );
void writeNoGuardFile( int nIncludes );

int main( int argc, char** argv )
{
	if( argc > 1 )
	{
		int i;

		writeHeaders();

		for( i = 1; i < argc; ++i )
			writeCFiles( atoi( argv[ i ] ) );
	}
	else
	{
		printf( "Usage:\n" );
        printf( "makeincl n1 [ n2 n3 n4 ... ]\n\n" );
        printf( "Where n1, n2, n3 etc. are the number of #includes\n" );
        printf( "to be put into the relevant files\n" );
	}
	return 0;
}


void writeHeaders()
{
	FILE* fp;

	fp = fopen( "guard.h", "w" );

	fprintf( fp, "#ifndef GUARD_H\n" );
	fprintf( fp, "#define GUARD_H\n" );
	fprintf( fp, "extern int i;\n" );
	fprintf( fp, "#endif\n" );

	fclose( fp );


	fp = fopen( "noguard.h", "w" );

	fprintf( fp, "extern int i;\n" );

	fclose( fp );
}

void writeCFiles( int nIncludes )
{
	writeExternalGuardFile( nIncludes );
	writeInternalGuardFile( nIncludes );
	writeNoGuardFile( nIncludes );
}

void writeExternalGuardFile( int nIncludes )
{
	char fileName[ 100 ];
	int i;
	FILE* fp;

	sprintf( fileName, "eg%d.c", nIncludes );
	printf( "Writing %s\n", fileName );

	fp = fopen( fileName, "w" );

	for( i = 0; i < nIncludes; ++i )
	{
		fprintf( fp, "#ifndef GUARD_H\n" );
		fprintf( fp, "#include \"guard.h\"\n" );
		fprintf( fp, "#endif\n" );
	}

	fclose( fp );
}

void writeInternalGuardFile( int nIncludes )
{
	char fileName[ 100 ];
	int i;
	FILE* fp;

	sprintf( fileName, "ig%d.c", nIncludes );
	printf( "Writing %s\n", fileName );

	fp = fopen( fileName, "w" );

	for( i = 0; i < nIncludes; ++i )
	{
		fprintf( fp, "#include \"guard.h\"\n" );
	}

	fclose( fp );
}

void writeNoGuardFile( int nIncludes )
{
	char fileName[ 100 ];
	int i;
	FILE* fp;

	sprintf( fileName, "ng%d.c", nIncludes );
	printf( "Writing %s\n", fileName );

	fp = fopen( fileName, "w" );

	for( i = 0; i < nIncludes; ++i )
	{
		fprintf( fp, "#include \"noguard.h\"\n" );
	}

	fclose( fp );
}
