/* %Z%%M% %I% %E% */

/*
 * Copyright (c) 1991-2005 by Wayne C. Gramlich.
 * All rights reserved.
 */

/*
 * This file implements the character base type operations in ANSI-C.
 */

#ifndef STHEADERS_H
#include "stheaders.h"
#endif

#ifndef STR_EXPORTS_H
#include "str_exports.h"
#endif

#ifndef UNIX_CTYPE_H
#include "unix_ctype.h"
#endif

#ifndef UNIX_STDIO_H
#include "unix_stdio.h"
#endif

typedef void *String;

extern module___object character__module__object;
extern type___reference character_type_ref;

extern String string__unix_create(char *);


unsigned character___initial = '\0';

unsigned character__first = '\0';

unsigned character__last = (unsigned)'\377';

static object___object character_initial_object = {
	"",				/* Package name */
	"character",			/* Type name */
	"??",				/* Object name */
	(type___reference *)0,		/*XXX: Fix me */
	(int *)0,			/* Size of character object */
	0,				/* Static needs count */
	(need___entry *)0, 		/*XXX: Fix me Static needs */
	0,				/* Parameter needs count */
	(need___entry *)0, 		/* Parameter needs */
	(void **)&character___initial,	/* Object pointer */
	(instantiation___object *)0	/* Instantiation list */
};
static object___object *object_list[1] = {
	&character_initial_object,
};

void
character__external__initialize(void)
{
	character__module__object.object_count = 1;
	character__module__object.objects = object_list;
}

int
character__is_alpha_numeric(
	unsigned	character)
{
	return isalnum(character);
}

int
character__is_digit(
	unsigned	character)
{
	return isdigit(character);
}

int
character__equal(
	unsigned	character1,
	unsigned	character2)
{
	return character1 == character2;
}

int
character__greater_than(
	unsigned	character1,
	unsigned	character2)
{
	return character1 > character2;
}

unsigned
character__hash(
	unsigned	character)
{
	return character;
}

int
character__is_hex_digit(
	unsigned	character)
{
	return isxdigit(character);
}

int
character__is_letter(
	unsigned	character)
{
	return isalpha(character);
}

int
character__is_lower_case(
	unsigned	character)
{
	return islower(character);
}

int
character__is_octal_digit(
	unsigned	character)
{
	return (('0' <= character) && (character <= '7'));
}

int
character__is_white_space(
	unsigned	character)
{
	return isspace(character);
}

int
character__is_printing(
	unsigned	character)
{
	return isprint(character);
}

int
character__is_upper_case(
	unsigned	character)
{
	return isupper(character);
}

int
character__less_than(
	unsigned	character1,
	unsigned	character2)
{
	return character1 < character2;
}

/*
 * character__lower_case_convert(character)
 *	This routine will return an upper case version of {chracter}.
 */
unsigned
character__lower_case_convert(
	unsigned	character)
{
	/* This only works for ASCII: */
	return isupper(character) ? character + ('a' - 'A') : character;
}

/*
 * character__integer_convert(character)
 *	This routine will convert {character} to a signed integer and
 *	return the result.
 */
int
character__integer_convert(
	unsigned	character)
{
	return (int)character;
}

/*
 * character__string_printing_convert(character)
 *	This routine will return a permanent read only string containing
 *	a printing version of "character".
 */
String
character__string_printing_convert(
	unsigned	character)
{
	char		buffer[10];
	int		size;

	if (isprint(character)) {
		(void)sprintf(buffer, "%c", character);
	} else {
		(void)sprintf(buffer, "\\%d", character);
	}
	return string__unix_create(buffer);
}

/*
 * character__unsigned_convert(character)
 *	This routine will convert {character} to an unsigned integer and
 *	return the result.
 */
unsigned
character__unsigned_convert(
	unsigned	character)
{
	return character;
}

/*
 * character__upper_case_convert(character)
 *	This routine will return an upper case version of {chracter}.
 */
unsigned
character__upper_case_convert(
	unsigned	character)
{
	/* This only works for ASCII: */
	return islower(character) ? character + ('A' - 'a') : character;
}

