|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.