Annotation of GNUtools/libg++/libio/dbz/case.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * case-mapping stuff
        !             3:  *
        !             4:  * We exploit the fact that we are dealing only with headers here, and
        !             5:  * headers are limited to the ASCII characters by RFC822.  It is barely
        !             6:  * possible that we might be dealing with a translation into another
        !             7:  * character set, but in particular it's very unlikely for a header
        !             8:  * character to be outside -128..255.
        !             9:  *
        !            10:  * Life would be a whole lot simpler if tolower() could safely and portably
        !            11:  * be applied to any char.
        !            12:  */
        !            13: #include <stdio.h>
        !            14: #include "string.h"
        !            15: #include "case.h"
        !            16: 
        !            17: /* note that case.h knows the value of OFFSET */
        !            18: #define        OFFSET  128             /* avoid trouble with negative chars */
        !            19: #define        MAPSIZE (256+OFFSET)
        !            20: char casemap[MAPSIZE];         /* relies on init to '\0' */
        !            21: static int primed = 0;         /* has casemap been set up? */
        !            22: 
        !            23: /*
        !            24:  - prime - set up case-mapping stuff
        !            25:  */
        !            26: static void
        !            27: prime()
        !            28: {
        !            29:        register char *lp;
        !            30:        register char *up;
        !            31:        register int c;
        !            32:        register int i;
        !            33:        static char lower[] = "abcdefghijklmnopqrstuvwxyz";
        !            34:        static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        !            35: 
        !            36:        for (lp = lower, up = upper; *lp != '\0'; lp++, up++) {
        !            37:                c = *lp;
        !            38:                casemap[c+OFFSET] = c;
        !            39:                casemap[*up+OFFSET] = c;
        !            40:        }
        !            41:        for (i = 0; i < MAPSIZE; i++)
        !            42:                if (casemap[i] == '\0')
        !            43:                        casemap[i] = (char)(i-OFFSET);
        !            44:        primed = 1;
        !            45: }
        !            46: 
        !            47: /*
        !            48:  - cistrncmp - case-independent strncmp
        !            49:  */
        !            50: int                            /* < == > 0 */
        !            51: cistrncmp(s1, s2, len)
        !            52: char *s1;
        !            53: char *s2;
        !            54: int len;
        !            55: {
        !            56:        register char *p1;
        !            57:        register char *p2;
        !            58:        register int n;
        !            59: 
        !            60:        if (!primed)
        !            61:                prime();
        !            62: 
        !            63:        p1 = s1;
        !            64:        p2 = s2;
        !            65:        n = len;
        !            66:        while (--n >= 0 && *p1 != '\0' && TOLOW(*p1) == TOLOW(*p2)) {
        !            67:                p1++;
        !            68:                p2++;
        !            69:        }
        !            70:        if (n < 0)
        !            71:                return(0);
        !            72: 
        !            73:        /*
        !            74:         * The following case analysis is necessary so that characters
        !            75:         * which look negative collate low against normal characters but
        !            76:         * high against the end-of-string NUL.
        !            77:         */
        !            78:        if (*p1 == '\0' && *p2 == '\0')
        !            79:                return(0);
        !            80:        else if (*p1 == '\0')
        !            81:                return(-1);
        !            82:        else if (*p2 == '\0')
        !            83:                return(1);
        !            84:        else
        !            85:                return(TOLOW(*p1) - TOLOW(*p2));
        !            86: }
        !            87: 
        !            88: /*
        !            89:  - rfc822ize - do the bizarre case conversion needed for rfc822 message-ids
        !            90:  *
        !            91:  * Actually, this is not quite complete.  Absolute, total, full RFC822
        !            92:  * compliance requires a horrible parsing job, because of the arcane
        !            93:  * quoting conventions -- abc"def"ghi is not equivalent to abc"DEF"ghi,
        !            94:  * for example.  There are three or four things that might occur in the
        !            95:  * domain part of a message-id that are case-sensitive.  They don't seem
        !            96:  * to ever occur in real news, thank Cthulhu.  (What?  You were expecting
        !            97:  * a merciful and forgiving deity to be invoked in connection with RFC822?
        !            98:  * Forget it; none of them would come near it.)
        !            99:  */
        !           100: char *                         /* returns the argument */
        !           101: rfc822ize(s)
        !           102: char *s;
        !           103: {
        !           104:        register char *p;
        !           105:        static char post[] = "postmaster";
        !           106:        static int postlen = sizeof(post)-1;
        !           107: 
        !           108:        if (!primed)
        !           109:                prime();
        !           110: 
        !           111:        p = strrchr(s, '@');
        !           112:        if (p == NULL)                  /* no local/domain split */
        !           113:                p = "";                 /* assume all local */
        !           114:        else if (p - (s+1) == postlen && CISTREQN(s+1, post, postlen)) {
        !           115:                /* crazy special case -- "postmaster" is case-insensitive */
        !           116:                p = s;
        !           117:        }
        !           118: #ifdef NONSTANDARD
        !           119: #ifdef RFCVIOLATION
        !           120: #ifdef B_2_11_MISTAKE
        !           121:        p = s;                          /* all case-insensitive */
        !           122: #endif
        !           123: #endif
        !           124: #endif
        !           125:        for (; *p != '\0'; p++)
        !           126:                *p = TOLOW(*p);
        !           127: 
        !           128:        return(s);
        !           129: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.