Files
org-hyperion-cules/extstring.h

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_ */