]> diplodocus.org Git - nmh/blob - docs/historical/mh-nov-1983/cmds/replsubs.c
Removed --depth 1 from git clone invocation.
[nmh] / docs / historical / mh-nov-1983 / cmds / replsubs.c
1 #include "mh.h"
2
3 char *ltrim(cp)
4 char *cp;
5 {
6 /* Return pointer to 1st non-blank char in string;
7 * If ptr ==> 0 or ptr ==> '\n'0, return NUL;
8 */
9
10 register char *cp1;
11
12 cp1 = cp;
13 while((*cp1 == ' ') || (*cp1 == '\t')) cp1++;
14 if((*cp1 == 0) || (*cp1 == '\n' && cp1[1] == 0))
15 cp1 = 0;
16 return(cp1);
17 }
18
19 char *rtrim(cp)
20 char *cp;
21 {
22 /* trim newline and blanks from the right */
23
24 register char *cp1;
25
26 cp1 = cp+strlen(cp)-1;
27 if(*cp1 == '\n') *cp1 = 0;
28 while(*--cp1 == ' ') ;
29 *++cp1 = 0;
30 return(cp);
31 }
32
33 char *niceadd(this, that)
34 char *this, *that;
35 {
36 register char *from, *to;
37
38 if(!(from = ltrim(this))) /* nothing to add */
39 return(that);
40
41 if(to = that)
42 to = add(",\n ", rtrim(to)); /* enuf blanks for "cc: " */
43 return(add(from, to));
44 }
45
46 #define ADDRLEN (needadr ? addrlen : 0)
47
48 char *fix(field, address)
49 char *field, *address;
50 {
51 /* Appends address to each needy addressee in "field".
52 * Returns pointer to copy of new string. (HUH?)
53 * "field" should never be 0
54 */
55
56 register int len;
57 register char *newp;
58 int addrlen;
59 int needadr;
60 int fieldlen;
61 char *cp;
62
63 addrlen = strlen(address);
64 len = 0;
65 newp = "";
66
67 for(cp = field; ;cp += fieldlen + 1) {
68 needadr = needsaddr(&cp, &fieldlen); /* cp may be changed */
69 if(fieldlen == 0) {
70 cndfree(field);
71 newp = add("\n", newp);
72 return(newp);
73 }
74 if((len + fieldlen + ADDRLEN) > 70) {
75 newp = add(",\n ", newp);
76 len = 4;
77 } else if (*newp) {
78 newp = add(", ", newp);
79 len += 2;
80 }
81 *(cp + fieldlen) = 0;
82 newp = add(cp, newp);
83 if(needadr)
84 newp = add(address, newp);
85 len += fieldlen + ADDRLEN;
86 }
87 }
88
89 anychar(fchars, field)
90 char *fchars, *field;
91 {
92 /* Returns 1 if any fancy char appears in "field"
93 * Returns 0 if either "field" is nul or contains no fancy chars
94 */
95
96 register char *fp;
97
98 if(!field)
99 return(0);
100 for(fp = fchars; *fp; fp++)
101 if(r_any(*fp, field))
102 return(1);
103 return(0);
104 }
105
106
107 r_any(chr,stg)
108 char chr, *stg;
109 {
110 register char c, *s;
111
112 c = chr;
113 for (s = stg; (*s) && (*s != ',') && (*s != '\n');)
114 if (*s++ == c) return (1);
115 return (0);
116 }
117
118 char *addr(text)
119 char *text;
120 {
121 static char buf[128];
122 register char *cp, *bufp;
123 int textseen, blankseen;
124 char *copyaddr();
125
126 textseen = blankseen = 0;
127 bufp = buf;
128 if(!text)
129 return(0);
130 for(cp = text; (*cp == ' ' || *cp == '\t'); cp++);
131 for(;;cp++) {
132 switch(*cp) {
133 default:
134 textseen++;
135 break;
136 case ' ': case '\t':
137 blankseen++;
138 break;
139 case 'a':
140 if(!blankseen || !textseen || !ssequal("at ",cp)){
141 textseen++;
142 break;
143 }
144 bufp = copy(" at ", buf);
145 copyaddr(cp+3, bufp);
146 return(buf);
147 case '@':
148 if(!textseen)
149 return(0);
150 bufp = copy(" @ ", buf);
151 copyaddr(cp+1, bufp);
152 return(buf);
153 case ',': case '\n': case 0:
154 return(0);
155 }
156 }
157 }
158
159 #define ND1 (*fp) && (*fp != ' ') && (*fp != '\t')
160 #define ND2 (*fp != '<') && (*fp != '(') && (*fp != '>') && (*fp != ')')
161 #define ND3 (*fp != '\n') && (*fp!= ',') && (*fp != ':')
162 #define NOTDELIM ND1 && ND2 && ND3
163
164 char *copyaddr(from, to)
165 char *from, *to;
166 {
167 /* Copies left-trimmed "from" to "to".
168 * Copy terminates on any delimiter.
169 * Returns pointer to NUL terminator in destination string
170 */
171
172 register char *fp, *tp;
173
174 for(fp = from; (*fp == ' ') && (*fp == '\t'); fp++) ;
175 for( ; NOTDELIM; *tp++ = *fp++);
176 *tp = 0;
177 return(tp);
178 }
179 #define NOTRELEVANT (*cp == ' ' || *cp == '\t' || *cp == '\n'|| *cp == ',')
180
181 needsaddr(field, fieldlen)
182 char **field;
183 int *fieldlen;
184 {
185 /* Returns 1 if this field needs an address
186 * Returns 0 if field contains any funny chars or has
187 * an address of the form "xxxx at " or "xxxx[<b>]@"
188 * "field": on input -- addr of pointer to start of field
189 * on output -- val of ptr moved to 1st meaty char
190 * "fieldlen" returns the length of the new field
191 * (it terminates on ',' or '\n' or 0)
192 */
193
194 register char *cp;
195 int textseen, blankseen;
196 int retval;
197 /* find 1st relevant char in field */
198 for(cp = *field; NOTRELEVANT ; cp++);
199
200 *field = cp; /* return it to caller */
201 if(anychar("(<:", cp)) {
202 retval = 0;
203 goto leave;
204 }
205 for(;;cp++) {
206 switch(*cp) {
207 default:
208 textseen++;
209 break;
210 case ' ': case '\t':
211 blankseen++;
212 break;
213 case 'a':
214 if(!blankseen || !textseen || !ssequal("at ",cp)){
215 textseen++;
216 break;
217 }
218 case '@':
219 retval = 0;
220 goto leave;
221 case ',': case '\n': case 0:
222 retval = 1;
223 goto leave;
224
225 }
226 }
227 leave:
228 for(; (*cp) && (*cp != ',') && (*cp != '\n'); cp++) ;
229 *fieldlen = cp- *field;
230 return(retval);
231 }
232