Annotation of 43BSD/contrib/mh/sbr/formataddr.c, revision 1.1.1.1

1.1       root        1: /* formataddr.c - format an address field (from formatsbr) */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include "../h/addrsbr.h"
                      5: #include "../h/formatsbr.h"
                      6: #include <ctype.h>
                      7: #include <stdio.h>
                      8: 
                      9: static char *buf;              /* our current working buffer */
                     10: static char *bufend;           /* end of working buffer */
                     11: static char *last_dst;         /* buf ptr at end of last call */
                     12: static unsigned int bufsiz;    /* current size of buf */
                     13: 
                     14: #define BUFINCR 512            /* how much to expand buf when if fills */
                     15: 
                     16: #define CPY(s) { cp = (s); while (*dst++ = *cp++) ; --dst; }
                     17: 
                     18: /* check if there's enough room in buf for str.  add more mem if needed */
                     19: #define CHECKMEM(str) \
                     20:            if ((len = strlen (str)) >= bufend - dst) {\
                     21:                bufsiz += ((dst + len - bufend) / BUFINCR + 1) * BUFINCR;\
                     22:                buf = realloc (buf, bufsiz);\
                     23:                if (! buf)\
                     24:                    adios (NULLCP, "formataddr: couldn't get buffer space");\
                     25:                bufend = buf + bufsiz;\
                     26:            }
                     27: 
                     28: 
                     29: /* fmtscan will call this routine if the user includes the function
                     30:  * "(formataddr {component})" in a format string.  "orig" is the
                     31:  * original contents of the string register.  "str" is the address
                     32:  * string to be formatted and concatenated onto orig.  This routine
                     33:  * returns a pointer to the concatenated address string.
                     34:  *
                     35:  * We try to not do a lot of malloc/copy/free's (which is why we
                     36:  * don't call "getcpy") but still place no upper limit on the
                     37:  * length of the result string.
                     38:  *
                     39:  * This routine is placed in a separate library so it can be
                     40:  * overridden by particular programs (e.g., "replsbr").
                     41:  */
                     42: char *formataddr (orig, str)
                     43:     char *orig;
                     44:     char *str;
                     45: {
                     46:     register int  len;
                     47:     register int  isgroup;
                     48:     register char  *dst;
                     49:     register char  *cp;
                     50:     register char  *sp;
                     51:     register struct mailname *mp = NULL;
                     52: 
                     53:     /* if we don't have a buffer yet, get one */
                     54:     if (bufsiz == 0) {
                     55:        buf = malloc (BUFINCR);
                     56:        if (! buf)
                     57:            adios (NULLCP, "formataddr: couldn't allocate buffer space");
                     58:        bufsiz = BUFINCR - 6;  /* leave some slop */
                     59:        bufend = buf + bufsiz;
                     60:     }
                     61:     /*
                     62:      * If "orig" points to our buffer we can just pick up where we
                     63:      * left off.  Otherwise we have to copy orig into our buffer.
                     64:      */
                     65:     if (orig == buf)
                     66:        dst = last_dst;
                     67:     else if (!orig || !*orig) {
                     68:        dst = buf;
                     69:        *dst = '\0';
                     70:     } else {
                     71:        CHECKMEM (orig);
                     72:        CPY (orig);
                     73:     }
                     74: 
                     75:     /* concatenate all the new addresses onto 'buf' */
                     76:     for (isgroup = 0; cp = getname (str); ) {
                     77:        if ((mp = getm (cp, NULLCP, 0, fmt_norm, NULLCP)) == NULL)
                     78:            continue;
                     79: 
                     80:        if (isgroup && (mp->m_gname || !mp->m_ingrp)) {
                     81:            *dst++ = ';';
                     82:            isgroup = 0;
                     83:        }
                     84:        /* if we get here we're going to add an address */
                     85:        if (dst != buf) {
                     86:            *dst++ = ',';
                     87:            *dst++ = ' ';
                     88:        }
                     89:        if (mp->m_gname) {
                     90:            CHECKMEM (mp->m_gname);
                     91:            CPY (mp->m_gname);
                     92:            isgroup++;
                     93:        }
                     94:        sp = adrformat (mp);
                     95:        CHECKMEM (sp);
                     96:        CPY (sp);
                     97:        mnfree (mp);
                     98:     }
                     99: 
                    100:     if (isgroup)
                    101:        *dst++ = ';';
                    102: 
                    103:     *dst = '\0';
                    104:     last_dst = dst;
                    105:     return (buf);
                    106: }

unix.superglobalmegacorp.com

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