mirror of
https://github.com/SDL-Hercules-390/hyperion.git
synced 2026-04-11 14:44:35 +02:00
179 lines
6.1 KiB
C
179 lines
6.1 KiB
C
/* EXTSTRING.H (c) Copyright Mark L. Gaubatz, 1985-2012 */
|
|
/* Adapted for use by Hercules */
|
|
/* Extended string handling routines */
|
|
/* */
|
|
/* Released under "The Q Public License Version 1" */
|
|
/* (http://www.hercules-390.org/herclic.html) */
|
|
/* as modifications to Hercules. */
|
|
/* */
|
|
/*********************************************************************/
|
|
|
|
#ifndef _EXTSTRING_H_
|
|
#define _EXTSTRING_H_
|
|
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* */
|
|
/* char asciitoupper(c) - local ASCII toupper routine */
|
|
/* char asciitolower(c) - local ASCII tolower routine */
|
|
/* */
|
|
/* Returns: */
|
|
/* */
|
|
/* char in uppercase, if asciitoupper specified, else in */
|
|
/* lowercase, if asciitolower specified. */
|
|
/* */
|
|
/*-------------------------------------------------------------------*/
|
|
|
|
|
|
static INLINE char asciitoupper(char c)
|
|
{
|
|
if (c < 'a' || c > 'z')
|
|
return c;
|
|
return (c - 32);
|
|
}
|
|
|
|
static INLINE char asciitolower(char c)
|
|
{
|
|
if (c < 'A' || c > 'Z')
|
|
return c;
|
|
return (c + 32);
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* u_int strabbrev(&string,&abbrev,n) - Check for abbreviation */
|
|
/* u_int strcaseabbrev(&string,&abbrev,n) - (caseless) */
|
|
/* */
|
|
/* Returns: */
|
|
/* */
|
|
/* 1 if abbrev is a truncation of string of at least n */
|
|
/* characters. For example, strabbrev("hercules", "herc", */
|
|
/* 2) returns 1. */
|
|
/* */
|
|
/* 0 if abbrev is not a trunction of string of at least */
|
|
/* n characters. For example, strabbrev("hercules", */
|
|
/* "herculean", 2) returns 0. */
|
|
/* */
|
|
/* Note: Optimization based on current C99 compatible compilers, */
|
|
/* and updating pointers is faster than using indexes on */
|
|
/* most platforms in use. */
|
|
/* */
|
|
/* Sidebar: s390 is not optimized at present; use of index can */
|
|
/* generate faster code. However, the code generated */
|
|
/* here takes less than 5-10 additional machine */
|
|
/* instructions. */
|
|
/* */
|
|
/*-------------------------------------------------------------------*/
|
|
|
|
static INLINE u_int strabbrev(char *string, char *abbrev, const u_int n)
|
|
{
|
|
register char *s = string;
|
|
register char *a = abbrev;
|
|
if (*a &&
|
|
*s &&
|
|
*a == *s)
|
|
{
|
|
for (;;)
|
|
{
|
|
a++;
|
|
if (!*a)
|
|
return (((uintptr_t)a - (uintptr_t)abbrev) >= n);
|
|
s++;
|
|
if (!*s ||
|
|
*a != *s)
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static INLINE u_int strcaseabbrev(const char *string, const char *abbrev, const u_int n)
|
|
{
|
|
register const char *s = string;
|
|
register const char *a = abbrev;
|
|
if (*a &&
|
|
*s &&
|
|
(*a == *s ||
|
|
asciitoupper(*a) == asciitoupper(*s)))
|
|
{
|
|
for (;;)
|
|
{
|
|
a++;
|
|
if (!*a)
|
|
return (((uintptr_t)a - (uintptr_t)abbrev) >= n);
|
|
s++;
|
|
if (!*s)
|
|
break;
|
|
if (*a == *s)
|
|
continue;
|
|
if (asciitoupper(*a) != asciitoupper(*s))
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
/* void strlower(&result,&string) - Translate to lowercase */
|
|
/* void strnlower(&result,&string,n) - ... */
|
|
/* void strupper(&result,&string) - Translate to uppercase */
|
|
/* void strnupper(&result,&string,n) - ... */
|
|
/* */
|
|
/* Translates strings to lower or uppercase; optionally limited by */
|
|
/* n in strnlower and strnupper. */
|
|
/* */
|
|
/*-------------------------------------------------------------------*/
|
|
|
|
static INLINE void strlower(char *result, char *string)
|
|
{
|
|
register char *r = result;
|
|
register char *s = string;
|
|
for (; *s; r++, s++)
|
|
{
|
|
*r = asciitolower(*s);
|
|
}
|
|
*r = 0;
|
|
return;
|
|
}
|
|
|
|
static INLINE void strnlower(char *result, char *string, const u_int n)
|
|
{
|
|
register char *r = result;
|
|
register char *s = string;
|
|
register char *limit = s + n - 1;
|
|
for (; s < limit && *s; r++, s++)
|
|
{
|
|
*r = asciitolower(*s);
|
|
}
|
|
*r = 0;
|
|
return;
|
|
}
|
|
|
|
static INLINE void strupper(char *result, char *string)
|
|
{
|
|
register char *r = result;
|
|
register char *s = string;
|
|
for (; *s; r++, s++)
|
|
{
|
|
*r = asciitoupper(*s);
|
|
}
|
|
*r = 0;
|
|
return;
|
|
}
|
|
|
|
static INLINE void strnupper(char *result, char *string, const u_int n)
|
|
{
|
|
register char *r = result;
|
|
register char *s = string;
|
|
register char *limit = s + n - 1;
|
|
for (; s < limit && *s; r++, s++)
|
|
{
|
|
*r = asciitoupper(*s);
|
|
}
|
|
*r = 0;
|
|
return;
|
|
}
|
|
|
|
|
|
#endif /* _EXTSTRING_H_ */
|