/*
	rot13.c 36.1 (28.10.95) by Ralph Seichter

	Small 'Rotate-13' tool for OS 2.x or better. Uses 'dos.library'
	functions and standard I/O streams for minimal size (which was
	the goal I had in mind). Call it with "rot13 <foo >bar" or in a
	similar way. Please note that 'rot13' is pure, you can make it
	resident.
*/

#include <proto/dos.h>
#include <proto/exec.h>

LONG __saveds rot13(VOID)
{
	LONG rc = RETURN_FAIL;
	struct DosLibrary *DOSBase;

	if (DOSBase = (struct DosLibrary *)OpenLibrary(DOSNAME, 36))
	{
		BPTR in, out;

		if ((in = Input()) && (out = Output()))
		{
			LONG ch;
			static UBYTE verTag[] = "$VER: rot13 36.1 " __AMIGADATE__ " by Ralph Seichter";
			static UBYTE table[256] =
			{
				0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
				0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
				0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
				0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
				0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
				0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
				0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
				0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
				0x40, 'N',  'O',  'P',  'Q',  'R',  'S',  'T',
				'U',  'V',  'W',  'X',  'Y',  'Z',  'A',  'B',
				'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',
				'K',  'L',  'M',  0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
				0x60, 'n',  'o',  'p',  'q',  'r',  's',  't',
				'u',  'v',  'w',  'x',  'y',  'z',  'a',  'b',
				'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',
				'k',  'l',  'm',  0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
				0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
				0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
				0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
				0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
				0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
				0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
				0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
				0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
				0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
				0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
				0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
				0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
				0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
				0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
				0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
				0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
			};

			rc = RETURN_OK;
			Flush(in);
			while ((ch = FGetC(in)) >= 0)
			{
				ch = table[ch];
				if (FPutC(out, ch) != ch)
				{
					rc = RETURN_WARN;
					break;
				}
			}
		}
		CloseLibrary((struct Library *)DOSBase);
	}
	return(rc);
}

/* EOF */
