mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-09 17:18:18 +00:00
147 lines
4.0 KiB
C
147 lines
4.0 KiB
C
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing#kwsys for details. */
|
|
#ifdef KWSYS_STRING_C
|
|
/*
|
|
All code in this source file is conditionally compiled to work-around
|
|
template definition auto-search on VMS. Other source files in this
|
|
directory that use the stl string cause the compiler to load this
|
|
source to try to get the definition of the string template. This
|
|
condition blocks the compiler from seeing the symbols defined here.
|
|
*/
|
|
# include "kwsysPrivate.h"
|
|
# include KWSYS_HEADER(String.h)
|
|
|
|
/* Work-around CMake dependency scanning limitation. This must
|
|
duplicate the above list of headers. */
|
|
# if 0
|
|
# include "String.h.in"
|
|
# endif
|
|
|
|
# include <ctype.h>
|
|
|
|
int kwsysString_isalnum(char c)
|
|
{
|
|
return (kwsysString_isalpha(c) | /* bitwise-or to avoid branching. */
|
|
kwsysString_isdigit(c));
|
|
}
|
|
|
|
int kwsysString_isalpha(char c)
|
|
{
|
|
return (kwsysString_islower(c) | /* bitwise-or to avoid branching. */
|
|
kwsysString_isupper(c));
|
|
}
|
|
|
|
int kwsysString_isascii(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
return (uc & 0x80) ^ 0x80;
|
|
}
|
|
|
|
int kwsysString_isblank(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
return uc < 0x80 && isblank(uc);
|
|
}
|
|
|
|
int kwsysString_iscntrl(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
return uc < 0x80 && iscntrl(uc);
|
|
}
|
|
|
|
int kwsysString_isdigit(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
/* Push '0-9' to 246-255 so integer division by 246 is 1 only for them. */
|
|
return ((uc + 246 - '0') & 0xFF) / 246;
|
|
}
|
|
|
|
int kwsysString_isgraph(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
return uc < 0x80 && isgraph(uc);
|
|
}
|
|
|
|
int kwsysString_islower(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
/* Push 'a-z' to 230-255 so integer division by 230 is 1 only for them. */
|
|
return ((uc + 230 - 'a') & 0xFF) / 230;
|
|
}
|
|
|
|
int kwsysString_isprint(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
/* Push 32-126 to 161-255 so integer division by 161 is 1 only for them. */
|
|
return ((uc + 161 - ' ') & 0xFF) / 161;
|
|
}
|
|
|
|
int kwsysString_ispunct(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
return uc < 0x80 && ispunct(uc);
|
|
}
|
|
|
|
int kwsysString_isspace(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
return uc < 0x80 && isspace(uc);
|
|
}
|
|
|
|
int kwsysString_isupper(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
/* Push 'A-Z' to 230-255 so integer division by 230 is 1 only for them. */
|
|
return ((uc + 230 - 'A') & 0xFF) / 230;
|
|
}
|
|
|
|
int kwsysString_isxdigit(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
return (
|
|
/* Push '0-9' to 246-255 so integer division by 246 is 1 only for them. */
|
|
(((uc + 246 - '0') & 0xFF) / 246) | /* bitwise-or to avoid branching. */
|
|
/* Push 'A-F' to 250-255 so integer division by 250 is 1 only for them. */
|
|
(((uc + 250 - 'A') & 0xFF) / 250) | /* bitwise-or to avoid branching. */
|
|
/* Push 'a-f' to 250-255 so integer division by 250 is 1 only for them. */
|
|
(((uc + 250 - 'a') & 0xFF) / 250));
|
|
}
|
|
|
|
unsigned char kwsysString_tolower(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
/* Push 'A-Z' to 230-255 so integer division by 230 is 1 only for them. */
|
|
return (unsigned char)(uc ^ ((((uc + 230 - 'A') & 0xFF) / 230) << 5));
|
|
}
|
|
|
|
unsigned char kwsysString_toupper(char c)
|
|
{
|
|
unsigned char const uc = (unsigned char)c;
|
|
/* Push 'a-z' to 230-255 so integer division by 230 is 1 only for them. */
|
|
return (unsigned char)(uc ^ ((((uc + 230 - 'a') & 0xFF) / 230) << 5));
|
|
}
|
|
|
|
int kwsysString_strcasecmp(char const* lhs, char const* rhs)
|
|
{
|
|
int result;
|
|
while ((result = kwsysString_tolower(*lhs) - kwsysString_tolower(*rhs++)) ==
|
|
0 &&
|
|
*lhs++) {
|
|
}
|
|
return result;
|
|
}
|
|
|
|
int kwsysString_strncasecmp(char const* lhs, char const* rhs, size_t n)
|
|
{
|
|
int result = 0;
|
|
while (n &&
|
|
(result = kwsysString_tolower(*lhs) - kwsysString_tolower(*rhs++)) ==
|
|
0 &&
|
|
*lhs++) {
|
|
--n;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
#endif /* KWSYS_STRING_C */
|