/******************************************************************************
**	Filename:    name2char.c
**	Purpose:     Routines to convert between classes and class names.
**	Author:      Dan Johnson
**	History:     Fri Feb 23 08:03:09 1990, DSJ, Created.
**
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
******************************************************************************/
/**----------------------------------------------------------------------------
					Include Files and Type Defines
----------------------------------------------------------------------------**/
#include "name2char.h"
#include "matchdefs.h"
#include "danerror.h"
#include <string.h>

#define ILLEGALCHARNAME		6001

/**----------------------------------------------------------------------------
		  		Global Data Definitions and Declarations
----------------------------------------------------------------------------**/
/* character ID (ascii code) to character name mapping */
static const char	*NameList[]={
	"!bang",
	  "\"doubleq",
	  "#hash",
	  "$dollar",
	  "%percent",
	  "&and",
	  "'quote",
	  "(lround",
	  ")rround",
	  "*asterisk",
	  "+plus",
	  ",comma",
	  "-minus",
	  ".dot",
	  "/slash",
	  ":colon",
	  ";semic",
	  "<less",
	  "=equal",
	  ">greater",
	  "?question",
	  "@at",
	  "[lsquare",
	  "\\backsl",
	  "]rsquare",
	  "^uparr",
	  "_unders",
	  "`grave",
	  "{lbrace",
	  "|bar",
	  "}rbrace",
	  "~tilde",
	  "AcA",
	  "BcB",
	  "CcC",
	  "DcD",
	  "EcE",
	  "FcF",
	  "GcG",
	  "HcH",
	  "IcI",
	  "JcJ",
	  "KcK",
	  "LcL",
	  "McM",
	  "NcN",
	  "OcO",
	  "PcP",
	  "QcQ",
	  "RcR",
	  "ScS",
	  "TcT",
	  "UcU",
	  "VcV",
	  "WcW",
	  "XcX",
	  "YcY",
	  "ZcZ",
	  NULL
  };


/**----------------------------------------------------------------------------
							Public Code
----------------------------------------------------------------------------**/
/*---------------------------------------------------------------------------*/
CLASS_ID NameToChar (
     char	CharName[])

/*
**	Parameters:
**		CharName	character name to convert to a character
**	Globals:
**		NameList	lookup table for name to char mapping
**	Operation:
**		This routine converts the specified character name to
**		an ascii character.
**	Return: Ascii character that corresponds to the character name.
**	Exceptions: ILLEGALCHARNAME
**	History: Sat Aug 26 12:26:54 1989, DSJ, Created.
*/

{
	int	i;

	// look for name in table and return character if found
	for ( i = 0; NameList[i] != NULL; i++ )
		if ( strcmp (CharName, &NameList[i][1]) == 0)
			return (NameList[i][0]);
	if ( strlen (CharName) == 1 )
		return (CharName[0]);	//name is not in table but is a single character
	else	//illegal character
	{
		DoError (ILLEGALCHARNAME, "Illegal character name");
		return 0;
	}
}	/* NameToChar */

/*---------------------------------------------------------------------------*/
void CharToName (
     CLASS_ID	Char,
     char	CharName[])

/*
**	Parameters:
**		Char		character to map to a character name
**		CharName	string to copy character name into
**	Globals:
**		NameList	lookup table for char to name mapping
**	Operation:
**		This routine converts the specified ascii character to a
**		character name.  This is convenient for representing
**		characters which might have special meaning to operating
**		system shells or other programs (e.g. "*?&><" etc.).
**	Return: none
**	Exceptions: none
**	History: Sat Aug 26 12:51:02 1989, DSJ, Created.
*/

{
	int	i;

	/* look for character in table and return a copy of its name if found */
	for ( i = 0; NameList[i] != NULL; i++ )
		if ( Char == NameList[i][0] )
		{
			strcpy ( CharName, &NameList[i][1] );
			return;
		}

		/* if the character is not in the table, then use it as the name */
		CharName[0] = Char;
		CharName[1] = 0;

}	/* CharToName */
