Annotation of 43BSDReno/contrib/mh/sbr/path.c, revision 1.1

1.1     ! root        1: /* path.c - return a pathname */
        !             2: 
        !             3: #include "../h/mh.h"
        !             4: #include <stdio.h>
        !             5: 
        !             6: #define        CWD     "./"
        !             7: #define        NCWD    (sizeof CWD - 1)
        !             8: #define        DOT     "."
        !             9: #define        DOTDOT  ".."
        !            10: #define        PWD     "../"
        !            11: #define        NPWD    (sizeof PWD - 1)
        !            12: 
        !            13: 
        !            14: static char *pwds;
        !            15: 
        !            16: static char *expath();
        !            17: static compath();
        !            18: 
        !            19: 
        !            20: char *
        !            21: path(name, flag)
        !            22:        register char *name;
        !            23:        register int flag;
        !            24: {
        !            25:     register char  *cp,
        !            26:                    *ep;
        !            27: 
        !            28:     if ((cp = expath (name, flag))
        !            29:            && (ep = cp + strlen (cp) - 1) > cp
        !            30:            && *ep == '/')
        !            31:        *ep = NULL;
        !            32: 
        !            33:     return cp;
        !            34: }
        !            35: 
        !            36: /*  */
        !            37: 
        !            38: static char *
        !            39: expath(name, flag)
        !            40:        register char *name;
        !            41:        register int flag;
        !            42: {
        !            43:     register char  *cp,
        !            44:                    *ep;
        !            45:     char    buffer[BUFSIZ];
        !            46: 
        !            47:     if (flag == TSUBCWF) {
        !            48:        (void) sprintf (buffer, "%s/%s", m_getfolder (), name);
        !            49:        name = m_mailpath (buffer);
        !            50:        compath (name);
        !            51:        (void) sprintf (buffer, "%s/", m_maildir (""));
        !            52:        if (ssequal (buffer, name)) {
        !            53:            cp = name;
        !            54:            name = getcpy (name + strlen (buffer));
        !            55:            free (cp);
        !            56:        }
        !            57:        flag = TFOLDER;
        !            58:     }
        !            59: 
        !            60:     if (*name == '/'
        !            61:            || (flag == TFOLDER
        !            62:                && (strncmp (name, CWD, NCWD)
        !            63:                    && strcmp (name, DOT)
        !            64:                    && strcmp (name, DOTDOT)
        !            65:                    && strncmp (name, PWD, NPWD))))
        !            66:        return getcpy (name);
        !            67: 
        !            68:     if (pwds == NULL)
        !            69:        pwds = pwd ();
        !            70: 
        !            71:     if (strcmp (name, DOT) == 0 || strcmp (name, CWD) == 0)
        !            72:        return getcpy (pwds);
        !            73: 
        !            74:     ep = pwds + strlen (pwds);
        !            75:     if ((cp = rindex (pwds, '/')) == NULL)
        !            76:        cp = ep;
        !            77:     else
        !            78:        if (cp == pwds)
        !            79:            cp++;
        !            80: 
        !            81:     if (strncmp (name, CWD, NCWD) == 0)
        !            82:        name += NCWD;
        !            83: 
        !            84:     if (strcmp (name, DOTDOT) == 0 || strcmp (name, PWD) == 0) {
        !            85:        (void) sprintf (buffer, "%.*s", cp - pwds, pwds);
        !            86:        return getcpy (buffer);
        !            87:     }
        !            88: 
        !            89:     if (strncmp (name, PWD, NPWD) == 0)
        !            90:        name += NPWD;
        !            91:     else
        !            92:        cp = ep;
        !            93: 
        !            94:     (void) sprintf (buffer, "%.*s/%s", cp - pwds, pwds, name);
        !            95:     return getcpy (buffer);
        !            96: }
        !            97: 
        !            98: /*  */
        !            99: 
        !           100: static
        !           101: compath(f)
        !           102:        register char *f;
        !           103: {
        !           104:     register char  *cp,
        !           105:                    *dp;
        !           106: 
        !           107:     if (*f != '/')
        !           108:        return;
        !           109: 
        !           110:     for (cp = f; *cp;)
        !           111:        if (*cp == '/') {
        !           112:            switch (*++cp) {
        !           113:                case NULL:
        !           114:                    if (--cp > f)
        !           115:                        *cp = NULL;
        !           116:                    break;
        !           117: 
        !           118:                case '/':
        !           119:                    for (dp = cp; *dp == '/'; dp++)
        !           120:                        continue;
        !           121:                    (void) strcpy (cp--, dp);
        !           122:                    continue;
        !           123: 
        !           124:                case '.':
        !           125:                    if (strcmp (cp, DOT) == 0) {
        !           126:                        if (cp > f + 1)
        !           127:                            cp--;
        !           128:                        *cp = NULL;
        !           129:                        break;
        !           130:                    }
        !           131:                    if (strcmp (cp, DOTDOT) == 0) {
        !           132:                        for (cp -= 2; cp > f; cp--)
        !           133:                            if (*cp == '/')
        !           134:                                break;
        !           135:                        if (cp <= f)
        !           136:                            cp = f + 1;
        !           137:                        *cp = NULL;
        !           138:                        break;
        !           139:                    }
        !           140:                    if (strncmp (cp, PWD, NPWD) == 0) {
        !           141:                        for (dp = cp - 2; dp > f; dp--)
        !           142:                            if (*dp == '/')
        !           143:                                break;
        !           144:                        if (dp <= f)
        !           145:                            dp = f;
        !           146:                        (void) strcpy (dp, cp + NPWD - 1);
        !           147:                        cp = dp;
        !           148:                        continue;
        !           149:                    }
        !           150:                    if (strncmp (cp, CWD, NCWD) == 0) {
        !           151:                        (void) strcpy (cp - 1, cp + NCWD - 1);
        !           152:                        cp--;
        !           153:                        continue;
        !           154:                    }
        !           155:                    continue;
        !           156: 
        !           157:                default:
        !           158:                    cp++;
        !           159:                    continue;
        !           160:            }
        !           161:            break;
        !           162:        }
        !           163:        else
        !           164:            cp++;
        !           165: }

unix.superglobalmegacorp.com

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