/****keyword-flag*** "%v %f %n" */
/* "3 30-May-94,9:27:16 GETSTAT.C" */

/****revision-history****/
/*1 GETSTAT.C 4-Feb-91,19:20:04 Gets statistics for use in constructing       */
/*       a more efficient organization of the symbol table.                   */
/*2 GETSTAT.C 12-May-91,9:06:00 Changed MAX_CHAR to No_of_chars.              */
/*3 GETSTAT.C 30-May-94,9:27:16 Changed "  " to tabs for listings.            */
/****revision-history****/

#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include "model.h"

#define MAX_CHAR No_of_chars
#define CR 13
#define LF 10

unsigned translate[TRANSLATE_SIZE] = TRANSLATE_TABLE;

void MegasortL(long *LongArray, unsigned *RecNums, unsigned ArraySize);
int setbit(char *bitmap,unsigned long element);
int clearbit(char *bitmap,unsigned long element);
int testbit(char *bitmap,unsigned long element);

main(int argc, char *argv[])
{
	int i;
	int j;
	unsigned ch;
	long cr_lf_count;
	long *char_count;
	unsigned *char_index;
	FILE *infile;
	char temp[100];

	infile = fopen(argv[1],"rb");

	char_count = (long *)calloc((long)MAX_CHAR,sizeof(long));
	char_index = (unsigned *)calloc(MAX_CHAR,sizeof(unsigned));

	for (i = 0; i < MAX_CHAR; i ++)
		char_index[i] = i;
		
	for (;;)
		{
		ch = fgetc(infile);
		if (ch == (unsigned)EOF)
			break;
		else
			char_count[ch] ++;
		}

	MegasortL(char_count,char_index,MAX_CHAR);

	for (i = MAX_CHAR-1; i >= 0; i --)
		{
		printf("%d,",char_index[i]);
		if (i % 16 == 0)
			printf("\n");
		}

}



void MegasortL(long *LongArray, unsigned *RecNums, unsigned ArraySize)
	{
	long *TempLongArray;
	unsigned *TempRecNums;
	int BucketCount[256];
	int BucketPosition[256];
	int KeyLength;
	int j;
	int m;
	int i;
	char *char_address;
	
	KeyLength = sizeof(long);
	TempLongArray = (long *)calloc(ArraySize,KeyLength);
	TempRecNums = (unsigned *) calloc ( sizeof(unsigned), ArraySize );

	if (TempRecNums  == NULL )
		{
		printf( "out of memory\n" );
		exit( 1 );
		}

	for (i = 0; i < KeyLength; i ++)
		{
		for (j = 0; j < 256; j ++)
			BucketCount[j] = 0;
			
		for (j = 0; j < ArraySize; j ++)
			{
			char_address = (char *)(LongArray+j);
			m = 0xff & *(char_address+i);
			BucketCount[m] ++;
			}

		BucketPosition[0] = 0;
		
		for (j = 1; j < 256; j ++)
			BucketPosition[j] = BucketCount[j-1] + BucketPosition[j-1];

		for (j = 0; j < ArraySize; j ++)
			{
			char_address = (char *)(LongArray+j);
			m = 0xff & *(char_address+i);
			TempLongArray[BucketPosition[m]] = LongArray[j];
			TempRecNums[BucketPosition[m]] = RecNums[j];
			BucketPosition[m] ++;
			}

		memcpy(LongArray,TempLongArray,ArraySize*sizeof(long));
		memcpy(RecNums,TempRecNums,(long)ArraySize*sizeof(unsigned));
		}
	
	free(TempLongArray);
	free(TempRecNums);
}


	

int setbit(char *bitmap,unsigned long element)
{
	unsigned bytenumber;
	int bitnumber;
	int byte;
	int mask;
	int result;

	bytenumber = element / 8;

	bitnumber = element % 8;

	byte = bitmap[bytenumber];

	mask = 1 << bitnumber;

	bitmap[bytenumber] |= mask;

	if (mask & byte)
		return(1);
	else
		return(0);
}


int clearbit(char *bitmap,unsigned long element)
{
	unsigned bytenumber;
	int bitnumber;
	int byte;
	int mask;
	int result;

	bytenumber = element / 8;

	bitnumber = element % 8;

	byte = bitmap[bytenumber];

	mask = 1 << bitnumber;

	bitmap[bytenumber] &= ~mask;

	if (mask & byte)
		return(1);
	else
		return(0);
}


int testbit(char *bitmap,unsigned long element)
{
	unsigned bytenumber;
	int bitnumber;
	int byte;
	int mask;
	int result;

	bytenumber = element / 8;

	bitnumber = element % 8;

	byte = bitmap[bytenumber];

	mask = 1 << bitnumber;

	if (mask & byte)
		return(1);
	else
		return(0);
}

