Annotation of 43BSDReno/contrib/mh/sbr/path.c, revision 1.1.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.