|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 5362 (0x14f2) Types: TextFile Names: »post.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/dsap/common/post.c«
/* post.c - postal address handling */ #ifndef lint static char *rcsid = "$Header: /f/osi/dsap/common/RCS/post.c,v 7.0 89/11/23 21:44:22 mrose Rel $"; #endif /* * $Header: /f/osi/dsap/common/RCS/post.c,v 7.0 89/11/23 21:44:22 mrose Rel $ * * * $Log: post.c,v $ * Revision 7.0 89/11/23 21:44:22 mrose * Release 6.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ /* SYNTAX: address = <address_component> | <address_component> '$' <address> address_component = [ '{T61}' ] <string> EXAMPLE: UCL $ Gower Street $ London Maximum of 6 (UB_POSTAL_LINE) <address_component>'s */ /* LINTLIBRARY */ #include "quipu/util.h" #include "quipu/attrvalue.h" static addrfree (addr) struct postaddr * addr; { struct postaddr * next; for (; addr != (struct postaddr *) NULL; addr = next) { next = addr->pa_next; free (addr->addrcomp); free ( (char *)addr); } } static addrcmp (a,b) struct postaddr * a, *b; { int res; for (; (a != (struct postaddr *) NULL) && (b != (struct postaddr *) NULL) ; a = a->pa_next, b=b->pa_next) if ((res = lexequ (a->addrcomp, b->addrcomp)) != 0) return (res); if ( a != b) return ( a > b ? 1 : -1 ); else return (0); } static struct postaddr * addrcpy (a) struct postaddr * a; { struct postaddr * b, *c, *result = (struct postaddr *) NULL; c = result; /* to keep lint quiet ! */ for (; a != (struct postaddr *) NULL; a = a->pa_next) { b = (struct postaddr *) smalloc (sizeof (struct postaddr)); b -> addrtype = a->addrtype; b -> addrcomp = strdup (a->addrcomp); if (result == (struct postaddr *) NULL) result = b; else c->pa_next = b; c = b; } b->pa_next = (struct postaddr *) NULL; return (result); } static struct postaddr* addrparse (str) char * str; { struct postaddr * result = (struct postaddr *) NULL; struct postaddr * a, *b; char * ptr; char * mark = NULLCP; char t61_str = FALSE; extern char t61_flag; int i; char * octparse (); char * prtparse (); b = result; /* to keep lint quiet */ if (t61_flag) { t61_str = TRUE; t61_flag = FALSE; /* indicate recognition */ } str = SkipSpace(str); for (i=0; i < UB_POSTAL_LINE; i++) { mark = NULLCP; a = (struct postaddr *) smalloc (sizeof (struct postaddr)); if ( (ptr=index (str,'$')) != NULLCP) { *ptr-- = 0; if (isspace (*ptr)) { *ptr = 0; mark = ptr; } ptr++; } if (t61_str) { a -> addrtype = 1; if ((a -> addrcomp = octparse (str)) == NULLCP) return ((struct postaddr *)NULL); if (strlen (a->addrcomp) > UB_POSTAL_STRING) { parse_error ("address string too long",NULLCP); return ((struct postaddr *)NULL); } } else { a -> addrtype = 2; if ((a -> addrcomp = prtparse (str)) == NULLCP) return ((struct postaddr *)NULL); if (strlen (a->addrcomp) > UB_POSTAL_STRING) { parse_error ("address string too long",NULLCP); return ((struct postaddr *)NULL); } } if (result == (struct postaddr *) NULL) result = a; else b->pa_next = a; b = a; t61_str = FALSE; if (ptr != NULLCP) { *ptr++ = '$'; if (mark != NULLCP) *mark = ' '; str = (SkipSpace(ptr)); ptr = str; if (*ptr++ == '{') { if (( str = index (ptr,'}')) == 0) { parse_error ("close bracket missing '%s'",--ptr); return ((struct postaddr *) NULL); } *str = 0; if (lexequ ("T.61",ptr) != 0) { *str = '}'; parse_error ("{T.61} expected '%s'",--ptr); return ((struct postaddr *) NULL); } *str++ = '}'; str = (SkipSpace(str)); t61_str = TRUE; } } else break; } if (ptr != NULLCP) { parse_error ("Too many address components",NULLCP); return ((struct postaddr *) NULL); } a -> pa_next = (struct postaddr *) NULL ; return (result); } int postal_indent = -1; static addrprint (ps,addr,format) PS ps; struct postaddr * addr; int format; { char * prefix = NULLCP; for (; addr != (struct postaddr *) NULL; addr = addr->pa_next) { if (prefix != NULLCP) if (format != READOUT || postal_indent < 0) ps_print (ps,prefix); else { ps_print (ps, "\n"); if (postal_indent > 0) ps_printf (ps, "%*s", postal_indent, ""); } if (addr->addrtype == 1) { if (format != READOUT) ps_print (ps,"{T.61}"); octprint (ps,addr->addrcomp,format); } else ps_print (ps,addr->addrcomp); if (format == READOUT) { prefix = "\n\t\t\t"; if (postal_indent == 0) postal_indent = 2; } else prefix = " $ "; } } static PE addrenc (m) struct postaddr * m; { PE ret_pe; (void) encode_SA_PostalAddress (&ret_pe,0,0,NULLCP,m); return (ret_pe); } static struct postaddr * addrdec (pe) PE pe; { struct postaddr * m; if (decode_SA_PostalAddress (pe,1,NULLIP,NULLVP,&m) == NOTOK) return ((struct postaddr *) NULL); return (m); } post_syntax () { (void) add_attribute_syntax ("PostalAddress", (IFP) addrenc, (IFP) addrdec, (IFP) addrparse,addrprint, (IFP) addrcpy, addrcmp, addrfree, NULLCP, NULLIFP, TRUE); }