|
|
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: static int process();
45:
46: /* */
47:
48: /* ARGSUSED */
49:
50: main(argc, argv)
51: int argc;
52: char **argv;
53: {
54: int addrp = 0,
55: normalize = AD_HOST,
56: width = 0,
57: status = 0;
58: char *cp,
59: *form = NULL,
60: *format = NULL,
61: *nfs,
62: buf[80],
63: **ap,
64: **argp,
65: *arguments[MAXARGS],
66: *addrs[NADDRS];
67:
68: invo_name = r1bindex (argv[0], '/');
69: mts_init (invo_name);
70: if ((cp = m_find (invo_name)) != NULL) {
71: ap = brkstring (cp = getcpy (cp), " ", "\n");
72: ap = copyip (ap, arguments);
73: }
74: else
75: ap = arguments;
76: (void) copyip (argv + 1, ap);
77: argp = arguments;
78:
79: /* */
80:
81: while (cp = *argp++) {
82: if (*cp == '-')
83: switch (smatch (++cp, switches)) {
84: case AMBIGSW:
85: ambigsw (cp, switches);
86: done (1);
87:
88: case UNKWNSW:
89: adios (NULLCP, "-%s unknown", cp);
90:
91: case HELPSW:
92: (void) sprintf (buf, "%s [switches] addrs ...", invo_name);
93: help (buf, switches);
94: done (1);
95:
96: case FORMSW:
97: if (!(form = *argp++) || *form == '-')
98: adios (NULLCP, "missing argument to %s", argp[-2]);
99: format = NULL;
100: continue;
101: case FMTSW:
102: if (!(format = *argp++) || *format == '-')
103: adios (NULLCP, "missing argument to %s", argp[-2]);
104: form = NULL;
105: continue;
106:
107: case WIDSW:
108: if (!(cp = *argp++) || *cp == '-')
109: adios (NULLCP, "missing argument to %s", argp[-2]);
110: width = atoi (cp);
111: continue;
112:
113: case NORMSW:
114: normalize = AD_HOST;
115: continue;
116: case NNORMSW:
117: normalize = AD_NHST;
118: continue;
119: }
120: if (addrp > NADDRS)
121: adios (NULLCP, "more than %d addresses", NADDRS);
122: else
123: addrs[addrp++] = cp;
124: }
125: addrs[addrp] = NULL;
126:
127: /* */
128:
129: if (addrp == 0)
130: adios (NULLCP, "usage: %s [switches] addrs ...", invo_name);
131:
132: nfs = new_fs (form, format, FORMAT);
133: if (width == 0) {
134: if ((width = sc_width ()) < WIDTH / 2)
135: width = WIDTH / 2;
136: width -= 2;
137: }
138: if (width > WBUFSIZ)
139: width = WBUFSIZ;
140: fmt_norm = normalize;
141: (void) fmt_compile (nfs, &fmt);
142: dat[0] = dat[1] = dat[2] = 0;
143: dat[3] = width;
144:
145: for (addrp = 0; addrs[addrp]; addrp++)
146: status += process (addrs[addrp], width, normalize);
147:
148: done (status);
149: }
150:
151: /* */
152:
153: struct pqpair {
154: char *pq_text;
155: char *pq_error;
156: struct pqpair *pq_next;
157: };
158:
159:
160: static int
161: process(arg, length, norm)
162: register char *arg;
163: int length, norm;
164: {
165: int status = 0;
166: register char *cp;
167: char buffer[WBUFSIZ + 1],
168: error[BUFSIZ];
169: register struct comp *cptr;
170: register struct pqpair *p,
171: *q;
172: struct pqpair pq;
173: register struct mailname *mp;
174:
175: (q = &pq) -> pq_next = NULL;
176: while (cp = getname (arg)) {
177: if ((p = (struct pqpair *) calloc ((unsigned) 1, sizeof *p)) == NULL)
178: adios (NULLCP, "unable to allocate pqpair memory");
179: if ((mp = getm (cp, NULLCP, 0, norm, error)) == NULL) {
180: p -> pq_text = getcpy (cp);
181: p -> pq_error = getcpy (error);
182: status++;
183: }
184: else {
185: p -> pq_text = getcpy (mp -> m_text);
186: mnfree (mp);
187: }
188: q = (q -> pq_next = p);
189: }
190:
191: for (p = pq.pq_next; p; p = q) {
192: FINDCOMP (cptr, "text");
193: if (cptr)
194: cptr -> c_text = p -> pq_text;
195: FINDCOMP (cptr, "error");
196: if (cptr)
197: cptr -> c_text = p -> pq_error;
198:
199: (void) fmtscan (fmt, buffer, length, dat);
200: (void) fputs (buffer, stdout);
201:
202: free (p -> pq_text);
203: if (p -> pq_error)
204: free (p -> pq_error);
205: q = p -> pq_next;
206: free ((char *) p);
207: }
208:
209: return status;
210: }
211:
212: /*
213: * XXX We need to force config.o to be linked in to get around
214: * library order problems
215: */
216: /* XXX don't bother if linking with the shared library */
217: #ifndef SHARED
218: static void
219: kludge()
220: {
221: (void)libpath((char *)0);
222: }
223: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.