/*	date 05/24/1992

								GENERAL INFO
								------------

	tab		-A small program to remove useless spaces in ASCII files.

	USAGE:	tab <tab size> <input file> <output file>


	You can modify the source as you wish, this is freeware.


								Eric Gailloux

lc:lc -d0 -Lncd -v -y tab
*/

#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <pragmas/dos_lib.h>
#include <pragmas/exec_lib.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <stdio.h>

#define		SPACE		32
#define		TAB			9

struct Library	*DOSBase;

UBYTE		tabsize;

void Usage(void)
{
	printf("\n\nUSAGE: tab <tab size> <input file> <output file>\n");
}

UBYTE SpacesCount(UBYTE *string)
{
	UBYTE		count=0;

	while(string[count]==SPACE)		count++;

	return(count);
}

void ReadLine(UBYTE *buffer, BPTR outfh)
{
	UBYTE		count=0, max, spaces, sp=0, final;

	max=strlen(buffer);

	while(count<max)
	{
	if(buffer[count]!=SPACE) { FPutC(outfh, buffer[count++]); sp++; }

	else
	{
		spaces=SpacesCount(&buffer[count]);

		if(spaces<2)	{ FPutC(outfh, SPACE); sp++; }

		else
		{
			final=spaces+count;			// expected position

			while(sp<final)

			{ sp+=(tabsize-(sp%tabsize)); FPutC(outfh,TAB); }
		}

		count+=spaces;
	}

	}

	// done.
}

void RemoveSpaces(UBYTE *infile, UBYTE *outfile)
{
	UBYTE		*buffer;
	BPTR		infh, outfh;

	if(!(buffer=AllocMem(256, 0l)))	printf("\n\nNot enough memory!\n");

	if(!(infh=Open(infile, MODE_OLDFILE)))
	{
		printf("\n\nCannot open %s\n", infile);

		exit(0);
	}

	if(!(outfh=Open(outfile, MODE_NEWFILE)))
	{
		printf("\n\nCannot open output file.\n");

		Flush(infh);
		Close(infh);

		exit(0);
	}

	while(FGets(infh, buffer, 256)!=NULL) ReadLine(buffer, outfh);

	FreeMem(buffer, 256);

	Flush(infh);
	Flush(outfh);

	Close(infh);
	Close(outfh);
}

int main(int argc, char *argv[])
{
	if (argc!=4)		{ Usage(); exit(0);}

	tabsize=atoi(argv[1]);

	RemoveSpaces(argv[2], argv[3]);

	return(0);
}
