Annotation of 43BSDReno/contrib/isode-beta/dsap/common/post.c, revision 1.1

1.1     ! root        1: /* post.c - postal address handling */
        !             2: 
        !             3: #ifndef lint
        !             4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/post.c,v 7.0 89/11/23 21:44:22 mrose Rel $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/dsap/common/RCS/post.c,v 7.0 89/11/23 21:44:22 mrose Rel $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       post.c,v $
        !            12:  * Revision 7.0  89/11/23  21:44:22  mrose
        !            13:  * Release 6.0
        !            14:  * 
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  *                                NOTICE
        !            19:  *
        !            20:  *    Acquisition, use, and distribution of this module and related
        !            21:  *    materials are subject to the restrictions of a license agreement.
        !            22:  *    Consult the Preface in the User's Manual for the full terms of
        !            23:  *    this agreement.
        !            24:  *
        !            25:  */
        !            26: 
        !            27: /*
        !            28:        SYNTAX:
        !            29:        address = <address_component> | <address_component> '$' <address>
        !            30:        address_component = [ '{T61}' ] <string>
        !            31: 
        !            32:        EXAMPLE:
        !            33:                UCL $ Gower Street $ London
        !            34: 
        !            35:        Maximum of 6 (UB_POSTAL_LINE) <address_component>'s
        !            36: 
        !            37: */
        !            38: 
        !            39: /* LINTLIBRARY */
        !            40: 
        !            41: #include "quipu/util.h"
        !            42: #include "quipu/attrvalue.h"
        !            43: 
        !            44: static addrfree (addr)
        !            45: struct postaddr * addr;
        !            46: {
        !            47:        struct postaddr * next;
        !            48:        for (; addr != (struct postaddr *) NULL; addr = next) {
        !            49:                next = addr->pa_next;
        !            50:                free (addr->addrcomp);
        !            51:                free ( (char *)addr);
        !            52:        }
        !            53: }
        !            54: 
        !            55: static addrcmp (a,b)
        !            56: struct postaddr * a, *b;
        !            57: {
        !            58: int res;
        !            59:         for (; (a != (struct postaddr *) NULL) && (b != (struct postaddr *) NULL) ;
        !            60:                        a = a->pa_next, b=b->pa_next) 
        !            61:                if ((res = lexequ (a->addrcomp, b->addrcomp)) != 0)
        !            62:                        return (res);
        !            63: 
        !            64:        if ( a != b)
        !            65:                return ( a > b ? 1 : -1 );
        !            66:        else
        !            67:                return (0);
        !            68:        
        !            69: }
        !            70: 
        !            71: static struct postaddr * addrcpy (a)
        !            72: struct postaddr * a;
        !            73: {
        !            74: struct postaddr * b, *c, *result = (struct postaddr *) NULL;
        !            75: 
        !            76:        c = result; /* to keep lint quiet ! */
        !            77: 
        !            78:         for (; a != (struct postaddr *) NULL; a = a->pa_next) {
        !            79:                b = (struct postaddr *) smalloc (sizeof (struct postaddr));
        !            80:                b -> addrtype = a->addrtype;
        !            81:                b -> addrcomp = strdup (a->addrcomp);
        !            82:                
        !            83:                if (result == (struct postaddr *) NULL) 
        !            84:                        result = b;
        !            85:                else 
        !            86:                        c->pa_next = b;
        !            87:                c = b;
        !            88:        }
        !            89: 
        !            90:        b->pa_next = (struct postaddr *) NULL;
        !            91:        return (result);
        !            92: }
        !            93: 
        !            94: static struct postaddr* addrparse (str)
        !            95: char * str;
        !            96: {
        !            97: struct postaddr * result = (struct postaddr *) NULL;
        !            98: struct postaddr * a, *b;
        !            99: char * ptr;
        !           100: char * mark = NULLCP;
        !           101: char t61_str = FALSE;
        !           102: extern char t61_flag;
        !           103: int i;
        !           104: char * octparse ();
        !           105: char * prtparse ();
        !           106: 
        !           107:    b = result; /* to keep lint quiet */
        !           108: 
        !           109:    if (t61_flag) {
        !           110:        t61_str = TRUE;
        !           111:        t61_flag = FALSE;  /* indicate recognition */
        !           112:    }
        !           113: 
        !           114:    str = SkipSpace(str);
        !           115: 
        !           116:    for (i=0; i < UB_POSTAL_LINE; i++) {
        !           117:        mark = NULLCP;
        !           118:        a = (struct postaddr *) smalloc (sizeof (struct postaddr));
        !           119: 
        !           120:        if ( (ptr=index (str,'$')) != NULLCP) {
        !           121:                *ptr-- = 0;
        !           122:                if (isspace (*ptr)) {
        !           123:                        *ptr = 0;
        !           124:                        mark = ptr;
        !           125:                }
        !           126:                ptr++;
        !           127:        }
        !           128: 
        !           129:        if (t61_str) {
        !           130:                a -> addrtype = 1;
        !           131:                if ((a -> addrcomp = octparse (str)) == NULLCP)
        !           132:                        return ((struct postaddr *)NULL);
        !           133:                if (strlen (a->addrcomp) > UB_POSTAL_STRING) {
        !           134:                        parse_error ("address string too long",NULLCP);
        !           135:                        return ((struct postaddr *)NULL);
        !           136:                }
        !           137:        } else {
        !           138:                a -> addrtype = 2;
        !           139:                if ((a -> addrcomp = prtparse (str)) == NULLCP)
        !           140:                        return ((struct postaddr *)NULL);
        !           141:                if (strlen (a->addrcomp) > UB_POSTAL_STRING) {
        !           142:                        parse_error ("address string too long",NULLCP);
        !           143:                        return ((struct postaddr *)NULL);
        !           144:                }
        !           145:        }
        !           146: 
        !           147: 
        !           148:        if (result == (struct postaddr *) NULL) 
        !           149:                result = a;
        !           150:        else 
        !           151:                b->pa_next = a;
        !           152:        b = a;
        !           153: 
        !           154:        t61_str = FALSE;
        !           155: 
        !           156:        if (ptr != NULLCP) {
        !           157:                *ptr++ = '$';
        !           158:                if (mark != NULLCP)
        !           159:                        *mark = ' ';
        !           160:                str = (SkipSpace(ptr)); 
        !           161:                ptr = str;
        !           162: 
        !           163:                if (*ptr++ == '{') {
        !           164:                        if (( str = index (ptr,'}')) == 0) {
        !           165:                                parse_error ("close bracket missing '%s'",--ptr);
        !           166:                                return ((struct postaddr *) NULL);
        !           167:                        }
        !           168:                        *str = 0;
        !           169:                        if (lexequ ("T.61",ptr) != 0) {
        !           170:                                *str = '}';
        !           171:                                 parse_error ("{T.61} expected '%s'",--ptr);
        !           172:                                 return ((struct postaddr *) NULL);
        !           173:                         }
        !           174:                        *str++ = '}';
        !           175:                        str = (SkipSpace(str));
        !           176:                        t61_str = TRUE;
        !           177:                }
        !           178:        } else
        !           179:                break;
        !           180:    }
        !           181: 
        !           182:    if (ptr != NULLCP) {
        !           183:        parse_error ("Too many address components",NULLCP);
        !           184:        return ((struct postaddr *) NULL);
        !           185:    }
        !           186:    a -> pa_next = (struct postaddr *) NULL ;
        !           187: 
        !           188:    return (result);
        !           189: }
        !           190: 
        !           191: 
        !           192: int    postal_indent = -1;
        !           193: 
        !           194: static addrprint (ps,addr,format)
        !           195: PS ps;
        !           196: struct postaddr * addr;
        !           197: int format;
        !           198: {
        !           199: char * prefix = NULLCP;
        !           200: 
        !           201:        for (; addr != (struct postaddr *) NULL; addr = addr->pa_next) {
        !           202:                if (prefix != NULLCP)
        !           203:                        if (format != READOUT || postal_indent < 0)
        !           204:                            ps_print (ps,prefix);
        !           205:                        else {
        !           206:                            ps_print (ps, "\n");
        !           207:                            if (postal_indent > 0)
        !           208:                                ps_printf (ps, "%*s", postal_indent, "");
        !           209:                        }
        !           210: 
        !           211:                if (addr->addrtype == 1) {
        !           212:                        if (format != READOUT)
        !           213:                                ps_print (ps,"{T.61}");
        !           214:                        octprint (ps,addr->addrcomp,format);
        !           215:                } else
        !           216:                        ps_print (ps,addr->addrcomp);
        !           217:                if (format == READOUT) {
        !           218:                        prefix = "\n\t\t\t";
        !           219:                        if (postal_indent == 0)
        !           220:                            postal_indent = 2;
        !           221:                }
        !           222:                else
        !           223:                        prefix = " $ ";
        !           224:        }
        !           225: }
        !           226: 
        !           227: 
        !           228: static PE addrenc (m)
        !           229: struct postaddr * m;
        !           230: {
        !           231: PE ret_pe;
        !           232: 
        !           233:         (void) encode_SA_PostalAddress (&ret_pe,0,0,NULLCP,m);
        !           234: 
        !           235:        return (ret_pe);
        !           236: }
        !           237: 
        !           238: static struct postaddr * addrdec (pe)
        !           239: PE pe;
        !           240: {
        !           241: struct postaddr * m;
        !           242: 
        !           243:        if (decode_SA_PostalAddress (pe,1,NULLIP,NULLVP,&m) == NOTOK)
        !           244:                return ((struct postaddr *) NULL);
        !           245:        return (m);
        !           246: }
        !           247: 
        !           248: post_syntax ()
        !           249: {
        !           250:        (void) add_attribute_syntax ("PostalAddress",
        !           251:                (IFP) addrenc,  (IFP) addrdec,
        !           252:                (IFP) addrparse,addrprint,
        !           253:                (IFP) addrcpy,  addrcmp,
        !           254:                addrfree,       NULLCP,
        !           255:                NULLIFP,        TRUE);
        !           256: 
        !           257: }
        !           258: 

unix.superglobalmegacorp.com

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