	[[case_eq]] compares two strings independent of case. [[eq]]
	compares two strings case-dependently. Both return [[FALSE]]
	if the strings are not equal and [[TRUE]] if they are equal.

	The array [[upcase]] is used to make comparing strings
	case-independently easier. It only works for the ASCII
	charset, though.

<<*>>=
#include <config.h>

#define eq(s, t) (strcmp(s, t) == 0)
EXPORTDEF(eq(s,t))

#define n_eq(s, t, n) (strncmp(s, t, n) == 0)
EXPORTDEF(n_eq(s,t,n))

EXPORT unsigned char upcase[256] = {
    '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
    '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
    '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
    '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
    '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
    '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
    '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
    '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
    '\100',    'A',    'B',    'C',    'D',    'E',    'F',    'G',
       'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
       'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
       'X',    'Y',    'Z', '\133', '\134', '\135', '\136', '\137',
    '\140',    'A',    'B',    'C',    'D',    'E',    'F',    'G',
       'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
       'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
       'X',    'Y',    'Z', '\173', '\174', '\175', '\176', '\177',
    '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
    '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
    '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
    '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
    '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
    '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
    '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
    '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
    '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
    '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
    '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
    '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
    '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
    '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
    '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
    '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377'
};

EXPORT unsigned char downcase[256] = {
    '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
    '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
    '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
    '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
    '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
    '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
    '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
    '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
    '\100',    'a',    'b',    'c',    'd',    'e',    'f',    'g',
       'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
       'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
       'x',    'y',    'z', '\133', '\134', '\135', '\136', '\137',
    '\140',    'a',    'b',    'c',    'd',    'e',    'f',    'g',
       'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
       'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
       'x',    'y',    'z', '\173', '\174', '\175', '\176', '\177',
    '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
    '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
    '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
    '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
    '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
    '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
    '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
    '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
    '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
    '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
    '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
    '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
    '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
    '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
    '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
    '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377'
};

EXPORT Bool case_eq(const char *s, const char *t)
{
    if (!s) return (!t || *t == '\0');
    if (!t) return *s == '\0';
    while (*s && upcase[*s] == upcase[*t]) s++, t++ ;
    return *s == *t;				/* == '\0' */
}

EXPORT Bool case_n_eq(const char *s, const char *t, const int n)
{
    int i = n;

    if (i == 0) return TRUE;
    if (!s) return !t || !*t;
    if (!t) return !*s;
    while (i > 0 && *s && upcase[*s] == upcase[*t]) s++, t++, i--;
    return i == 0 || *s == *t;			/* == '\0' */
}
