/*
	MODULE:	rot13.c  (SAS/C Lattice C source!)

	AUTHOR:	Ralph Seichter.  This source is declared public domain!

	ABSTRACT:	Perform a 'rotate 13' on a given text file.
*/



/* function prototypes (imported) */

extern VOID FMBDiscardFile (FILEMEMBLOCK *fmb);
extern SHORT FMBLoadFile (UBYTE *filename, FILEMEMBLOCK *fmb);
extern SHORT FMBWriteFile (UBYTE *filename, FILEMEMBLOCK *fmb);

/* function prototypes defined here */

VOID main (UBYTE argc, UBYTE **argv);
VOID rot13 (FILEMEMBLOCK *fmb);



/*
	FUNCTION:	VOID rot13 (FILEMEMBLOCK *fmb)

	ABSTRACT:	Rotate text in a previously loaded file.

	RETURNS:	NONE!
*/

VOID rot13 (FILEMEMBLOCK *fmb)
{
	register UBYTE c;
	register UBYTE *s = fmb->fmb_Data;
	register UBYTE *limit = (UBYTE *)((LONG)(fmb->fmb_Data) + (LONG)(fmb->fmb_Size));
	register UBYTE upper[27] = "NOPQRSTUVWXYZABCDEFGHIJKLM";
	register UBYTE lower[27] = "nopqrstuvwxyzabcdefghijklm";

	do {
		c = *s;
		if (c >= 'a' && c <= 'z')
			*s = lower[(c - 'a')];
		else {
			if (c >= 'A' && c <= 'Z')
				*s = upper[(c - 'A')];
		}
		++s;
	} while (s < limit);
}



/*
	FUNCTION:	VOID main (UBYTE argc, UBYTE **argv)

	ABSTRACT:	Main function.

	RETURNS:	NONE!
*/

VOID main (UBYTE argc, UBYTE **argv)
{
	FILEMEMBLOCK fmb;
	UBYTE *destName, *ver = "$VER: rot13 1.0 (19-Jun-92) by Ralph Seichter";
	UBYTE *usage = "Usage: %s <file> [<outfile>].\nIf <outfile> is not specified, <file> will be overwritten!";
	UBYTE *error = "Error %sing file \"%s\".";

	if (argc > 0) {
		fprintf (stderr, "\n%s\n\n", &ver[6]);
		if (argc < 2 || argc > 3 || argv[1][0] == '?')
			fprintf (stderr, usage, argv[0]);
		else {
			if (0 == FMBLoadFile (argv[1], &fmb)) {
				rot13 (&fmb);
				if (argc == 3)
					destName = argv[2];
				else
					destName = argv[1];
				if (0 == FMBWriteFile (destName, &fmb))
					fprintf (stderr, "%ld bytes written to file \"%s\".", fmb.fmb_Size, destName);
				else
					fprintf (stderr, error, "writ", destName);
				FMBDiscardFile (&fmb);
			} else
				fprintf (stderr, error, "read", argv[1]);
		}
		fprintf (stderr, "\n\n");
	}
}
