#include <xterm.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <xstrings.h>
char *
x_basename(char *name)
{
char *cp;
cp = strrchr(name, '/');
#ifdef __UNIXOS2__
if (cp == 0)
cp = strrchr(name, '\\');
#endif
return (cp ? cp + 1 : name);
}
char *
x_decode_hex(const char *source, const char **next)
{
char *result = 0;
int pass;
size_t j, k;
for (pass = 0; pass < 2; ++pass) {
for (j = k = 0; isxdigit(CharOf(source[j])); ++j) {
if ((pass != 0) && (j & 1) != 0) {
result[k++] = (char) ((x_hex2int(source[j - 1]) << 4)
| x_hex2int(source[j]));
}
}
*next = (source + j);
if ((j & 1) == 0) {
if (pass) {
result[k] = '\0';
} else {
result = malloc(++j);
if (result == 0)
break;
}
} else {
break;
}
}
return result;
}
char *
x_encode_hex(const char *source)
{
size_t need = (strlen(source) * 2) + 1;
char *result = malloc(need);
if (result != 0) {
unsigned j, k;
for (j = k = 0; source[j] != '\0'; ++j) {
sprintf(result + k, "%02X", CharOf(source[j]));
k += 2;
}
}
return result;
}
char *
x_getenv(const char *name)
{
return x_strdup(x_nonempty(getenv(name)));
}
int
x_hex2int(int c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
String
x_nonempty(String s)
{
if (s != 0) {
if (*s == '\0') {
s = 0;
} else {
s = x_skip_blanks(s);
if (*s == '\0')
s = 0;
}
}
return s;
}
String
x_skip_blanks(String s)
{
while (isspace(CharOf(*s)))
++s;
return s;
}
String
x_skip_nonblanks(String s)
{
while (*s != '\0' && !isspace(CharOf(*s)))
++s;
return s;
}
int
x_strcasecmp(const char *s1, const char *s2)
{
size_t len = strlen(s1);
if (len != strlen(s2))
return 1;
return x_strncasecmp(s1, s2, (unsigned) len);
}
int
x_strncasecmp(const char *s1, const char *s2, unsigned n)
{
while (n-- != 0) {
char c1 = x_toupper(*s1);
char c2 = x_toupper(*s2);
if (c1 != c2)
return 1;
if (c1 == 0)
break;
s1++, s2++;
}
return 0;
}
char *
x_strdup(const char *s)
{
char *result = 0;
if (s != 0) {
char *t = CastMallocN(char, strlen(s));
if (t != 0) {
strcpy(t, s);
}
result = t;
}
return result;
}
char *
x_strindex(char *s1, const char *s2)
{
char *s3;
size_t s2len = strlen(s2);
while ((s3 = strchr(s1, *s2)) != NULL) {
if (strncmp(s3, s2, s2len) == 0)
return (s3);
s1 = ++s3;
}
return (NULL);
}
char *
x_strtrim(const char *source)
{
char *result;
char *s;
char *d;
if (source != 0 && *source != '\0') {
char *t = x_strdup(source);
s = t;
d = s;
while (isspace(CharOf(*s)))
++s;
while ((*d++ = *s++) != '\0') {
;
}
if (*t != '\0') {
s = t + strlen(t);
while (s != t && isspace(CharOf(s[-1]))) {
*--s = '\0';
}
}
result = t;
} else {
result = x_strdup("");
}
return result;
}
char
x_toupper(int ch)
{
static char table[256];
char result = table[CharOf(ch)];
if (result == '\0') {
unsigned n;
const char *s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for (n = 0; n < sizeof(table); ++n) {
table[n] = (char) n;
}
for (n = 0; s[n] != '\0'; ++n) {
table[CharOf(s[n])] = s[n % 26];
}
result = table[CharOf(ch)];
}
return result;
}