|
|
1.1 root 1: /* ap.c - parse addresses 822-style */
2:
3: #include "../h/mh.h"
4: #include "../h/addrsbr.h"
5: #include "../h/formatsbr.h"
6: #include <stdio.h>
7:
8:
9: #define NADDRS 100
10:
11: #define WIDTH 78
12: #define WBUFSIZ BUFSIZ
13:
14: #define FORMAT "%<{error}%{error}: %{text}%|%(putstr(proper{text}))%>"
15:
16: /* */
17:
18: static struct swit switches[] = {
19: #define FORMSW 0
20: "form formatfile", 0,
21: #define FMTSW 1
22: "format string", 5,
23:
24: #define NORMSW 2
25: "normalize", 0,
26: #define NNORMSW 3
27: "nonormalize", 0,
28:
29: #define WIDSW 4
30: "width columns", 0,
31:
32: #define HELPSW 5
33: "help", 4,
34:
35: NULL, NULL
36: };
37:
38: /* */
39:
40: static struct format *fmt;
41:
42: static int dat[4];
43:
44: /* */
45:
46: /* ARGSUSED */
47:
48: main (argc, argv)
49: int argc;
50: char **argv;
51: {
52: int addrp = 0,
53: normalize = AD_HOST,
54: width = 0,
55: status = 0;
56: char *cp,
57: *form = NULL,
58: *format = NULL,
59: *nfs,
60: buf[80],
61: **ap,
62: **argp,
63: *arguments[MAXARGS],
64: *addrs[NADDRS];
65:
66: invo_name = r1bindex (argv[0], '/');
67: mts_init (invo_name);
68: if ((cp = m_find (invo_name)) != NULL) {
69: ap = brkstring (cp = getcpy (cp), " ", "\n");
70: ap = copyip (ap, arguments);
71: }
72: else
73: ap = arguments;
74: (void) copyip (argv + 1, ap);
75: argp = arguments;
76:
77: /* */
78:
79: while (cp = *argp++) {
80: if (*cp == '-')
81: switch (smatch (++cp, switches)) {
82: case AMBIGSW:
83: ambigsw (cp, switches);
84: done (1);
85:
86: case UNKWNSW:
87: adios (NULLCP, "-%s unknown", cp);
88:
89: case HELPSW:
90: (void) sprintf (buf, "%s [switches] addrs ...", invo_name);
91: help (buf, switches);
92: done (1);
93:
94: case FORMSW:
95: if (!(form = *argp++) || *form == '-')
96: adios (NULLCP, "missing argument to %s", argp[-2]);
97: format = NULL;
98: continue;
99: case FMTSW:
100: if (!(format = *argp++) || *format == '-')
101: adios (NULLCP, "missing argument to %s", argp[-2]);
102: form = NULL;
103: continue;
104:
105: case WIDSW:
106: if (!(cp = *argp++) || *cp == '-')
107: adios (NULLCP, "missing argument to %s", argp[-2]);
108: width = atoi (cp);
109: continue;
110:
111: case NORMSW:
112: normalize = AD_HOST;
113: continue;
114: case NNORMSW:
115: normalize = AD_NHST;
116: continue;
117: }
118: if (addrp > NADDRS)
119: adios (NULLCP, "more than %d addresses", NADDRS);
120: else
121: addrs[addrp++] = cp;
122: }
123: addrs[addrp] = NULL;
124:
125: /* */
126:
127: if (addrp == 0)
128: adios (NULLCP, "usage: %s [switches] addrs ...", invo_name);
129:
130: nfs = new_fs (form, format, FORMAT);
131: if (width == 0) {
132: if ((width = sc_width ()) < WIDTH / 2)
133: width = WIDTH / 2;
134: width -= 2;
135: }
136: if (width > WBUFSIZ)
137: width = WBUFSIZ;
138: fmt_norm = normalize;
139: (void) fmt_compile (nfs, &fmt);
140: dat[0] = dat[1] = dat[2] = 0;
141: dat[3] = width;
142:
143: for (addrp = 0; addrs[addrp]; addrp++)
144: status += process (addrs[addrp], width, normalize);
145:
146: done (status);
147: }
148:
149: /* */
150:
151: struct pqpair {
152: char *pq_text;
153: char *pq_error;
154: struct pqpair *pq_next;
155: };
156:
157:
158: static int process (arg, length, norm)
159: register char *arg;
160: int length,
161: norm;
162: {
163: int addrp,
164: status = 0;
165: register char *cp;
166: char buffer[WBUFSIZ + 1],
167: error[BUFSIZ];
168: register struct comp *cptr;
169: register struct pqpair *p,
170: *q;
171: struct pqpair pq;
172: register struct mailname *mp;
173:
174: (q = &pq) -> pq_next = NULL;
175: while (cp = getname (arg)) {
176: if ((p = (struct pqpair *) calloc ((unsigned) 1, sizeof *p)) == NULL)
177: adios (NULLCP, "unable to allocate pqpair memory");
178: if ((mp = getm (cp, NULLCP, 0, norm, error)) == NULL) {
179: p -> pq_text = getcpy (cp);
180: p -> pq_error = getcpy (error);
181: status++;
182: }
183: else {
184: p -> pq_text = getcpy (mp -> m_text);
185: mnfree (mp);
186: }
187: q = (q -> pq_next = p);
188: }
189:
190: for (p = pq.pq_next; p; p = q) {
191: FINDCOMP (cptr, "text");
192: if (cptr)
193: cptr -> c_text = p -> pq_text;
194: FINDCOMP (cptr, "error");
195: if (cptr)
196: cptr -> c_text = p -> pq_error;
197:
198: (void) fmtscan (fmt, buffer, length, dat);
199: (void) fputs (buffer, stdout);
200:
201: free (p -> pq_text);
202: if (p -> pq_error)
203: free (p -> pq_error);
204: q = p -> pq_next;
205: free ((char *) p);
206: }
207:
208: return status;
209: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.