/****** rsbx.lib/EscapeAdditions() *******************************************
*
*   NAME
*	EscapeAdditions -- Return number of characters to escape an argument.
*
*   SYNOPSIS
*	escapes = EscapeAdditions(argv)
*
*	int EscapeAdditions(char *);
*
*   FUNCTION
*	Determines the number of extra characters that are needed to escape
*	    a command argument for AmigaDos command parsing.
*
*   INPUTS
*	argv          - Argument to check.
*
*   RESULT
*	escapes       - The number of characters that need to be added to the
*	                argument to escape the characters special to AmigaDos.
*
*   NOTES
*	Characters special to AmigaDos are " [0x22], * [0x2a], ESC [0x1b],
*	    LF [0x0a], SP [0x20].
*
*   SEE ALSO
*	EscapeAdditions(), EscapeString().
*
*   BUGS
*	Thinks spaces need an AmigaDos escape character preceeding them.
*
******************************************************************************
*
*/

#include <stdio.h>
#include <string.h>


#define QUOTE '\"'
#define ESCAPE '*'
#define ESC '\033'
#define NL '\n'
#define SPACE ' '

#define SPECIAL "\"*\033\n "


int EscapeAdditions(char *argv);
char *EscapeString(char *buff, char *argv);


int EscapeAdditions(char *argv)
	{
	int count = 0;
	char *pos = argv;

	while (pos = strpbrk(pos, SPECIAL))
		{
		count++;
		pos++;
		}

	if (count)
		{
		count += 2;
		}

	return count;
	}


/****** rsbx.lib/EscapeString() **********************************************
*
*   NAME
*	EscapeString -- Copy argument to buffer escaping as needed.
*
*   SYNOPSIS
*	dest = EscapeString(buffer, argv)
*
*	char *EscapeAdditions(char *, char *);
*
*   FUNCTION
*	Copies a string containing a single argument to a buffer, escaping
*	    characters special to AmigaDos.
*
*   INPUTS
*	buffer        - Buffer for escaped argument string.
*	argv          - Argument string to escape.
*
*   RESULT
*	dest          - The same as buffer.
*
*   NOTES
*	Characters special to AmigaDos are " [0x22], * [0x2a], ESC [0x1b],
*	    LF [0x0a], SP [0x20].
*
*   SEE ALSO
*	EscapeAdditions(), EscapeString().
*
*   BUGS
*	Thinks spaces need an AmigaDos escape character preceeding them.
*
******************************************************************************
*
*/

char *EscapeString(char *buff, char *argv)
	{
	char *pos;

	pos = buff;
	*pos++ = '\"';
	while (*argv)
		{
		switch (*argv)
			{
			case ESC:
				*pos++ = ESCAPE;
				*pos++ = 'E';
				break;
			case NL:
				*pos++ = ESCAPE;
				*pos++ = 'N';
				break;
			case QUOTE:
			case SPACE:
			case ESCAPE:
				*pos++ = ESCAPE;
			default:
				*pos++ = *argv;
			}
		argv++;
		}
	*pos++ = '\"';
	*pos = '\0';

	return buff;
	}
