Annotation of 43BSD/contrib/icon/functions/map.c, revision 1.1

1.1     ! root        1: #include "../h/rt.h"
        !             2: 
        !             3: /*
        !             4:  * map(s1,s2,s3) - map s1, using s2 and s3.
        !             5:  */
        !             6: Xmap(nargs, arg3, arg2, arg1, arg0)
        !             7: int nargs;
        !             8: struct descrip arg3, arg2, arg1, arg0;
        !             9:    {
        !            10:    register int i;
        !            11:    register char *s1, *s2, *s3;
        !            12:    char sbuf1[MAXSTRING], sbuf2[MAXSTRING], sbuf3[MAXSTRING];
        !            13:    static char maptab[MAXSTRING];
        !            14:    extern char *alcstr();
        !            15: 
        !            16:    /*
        !            17:     * s1 must be a string; s2 and s3 default to &ucase and &lcase,
        !            18:     *  respectively.
        !            19:     */
        !            20:    if (cvstr(&arg1, sbuf1) == NULL)
        !            21:       runerr(103, &arg1);
        !            22:    defany(&arg2, &ucase);
        !            23:    defany(&arg3, &lcase);
        !            24: 
        !            25:    /*
        !            26:     * If s2 and s3 are the same as for the last call of map,
        !            27:     *  the some old values, namely maps2, maps3, and maptab
        !            28:     *  can be reused.  Otherwise, the information must be
        !            29:     *  recomputed.
        !            30:     */
        !            31:    if (maps2.type != arg2.type || maps3.type != arg3.type ||
        !            32:        BLKLOC(maps2) != BLKLOC(arg2) || BLKLOC(maps3) != BLKLOC(arg3)) {
        !            33:       maps2 = arg2;
        !            34:       maps3 = arg3;
        !            35:       /*
        !            36:        * s2 and s3 must be strings and of the same length.
        !            37:        */
        !            38:       if (cvstr(&arg2, sbuf2) == NULL)
        !            39:          runerr(103, &arg2);
        !            40:       if (cvstr(&arg3, sbuf3) == NULL)
        !            41:          runerr(103, &arg3);
        !            42:       if (STRLEN(arg2) != STRLEN(arg3))
        !            43:          runerr(208, NULL);
        !            44:       /*
        !            45:        * The array maptab is used to perform the mapping.  First, maptab[i]
        !            46:        *  is initialized with i for i from 0 to MAXSTRING-1 (256).  Then,
        !            47:        *  the for each character in s2, the position in maptab corresponding
        !            48:        *  the value of the character is assigned the value of the character
        !            49:        *  in s3 that is in the same ordinal position as the character from s2.
        !            50:        *  For example, if s2 is "abc", and s3 is "123", the assignments are:
        !            51:        *   maptab['a'] = '1'
        !            52:        *   maptab['b'] = '2'
        !            53:        *   maptab['c'] = '3'
        !            54:        *  Note that the 0..256 (really should be 0..255!) initialization
        !            55:        *   causes unmapped characters to be themselves, for example,
        !            56:        *   maptab['d'] == 'd'.
        !            57:        */
        !            58:       s2 = STRLOC(arg2);
        !            59:       s3 = STRLOC(arg3);
        !            60:       for (i = MAXSTRING - 1; i >= 0; i--)
        !            61:          maptab[i] = i;
        !            62:       for (i = 0; i < STRLEN(arg2); i++)
        !            63:          maptab[s2[i]&0377] = s3[i];
        !            64:       }
        !            65: 
        !            66:    if (STRLEN(arg1) == 0) {
        !            67:       arg0.type = D_NULL;
        !            68:       INTVAL(arg0) = 1;
        !            69:       return;
        !            70:       }
        !            71: 
        !            72:    /*
        !            73:     * The result is a string the size of s1, so ensure that much space.
        !            74:     */
        !            75:    i = STRLEN(arg1);
        !            76:    sneed(i);
        !            77:    s1 = STRLOC(arg1);
        !            78: 
        !            79:    /*
        !            80:     * Create the result string, but specify no value for it.
        !            81:     */
        !            82:    STRLEN(arg0) = i;
        !            83:    STRLOC(arg0) = s2 = alcstr(NULL, i);
        !            84:    /*
        !            85:     * Buzz through the string using values in maptab to do the mapping.
        !            86:     */
        !            87:    while (i-- > 0)
        !            88:       *s2++ = maptab[(*s1++)&0377];
        !            89:    }
        !            90: 
        !            91: Procblock(map,3)

unix.superglobalmegacorp.com

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