2 Proprietary Rand Corporation
, 1981.
3 Further distribution of
this software
4 subject to the terms of the Rand
13 /* Return pointer to 1st non-blank char in string;
14 * If ptr ==> 0 or ptr ==> '\n'0, return NUL;
20 while((*cp1
== ' ') || (*cp1
== '\t')) cp1
++;
21 if((*cp1
== 0) || (*cp1
== '\n' && cp1
[1] == 0))
29 /* trim newline and blanks from the right */
33 cp1
= cp
+strlen(cp
)-1;
34 if(*cp1
== '\n') *cp1
= 0;
35 while(*--cp1
== ' ') ;
40 char *niceadd(this, that
)
43 register char *from
, *to
;
45 if(!(from
= ltrim(this))) /* nothing to add */
49 to
= add(",\n ", rtrim(to
)); /* enuf blanks for "cc: " */
50 return(add(from
, to
));
53 #define ADDRLEN (needadr ? addrlen : 0)
55 char *fix(field
, address
)
56 char *field
, *address
;
58 /* Appends address to each needy addressee in "field".
59 * Returns pointer to copy of new string. (HUH?)
60 * "field" should never be 0
70 addrlen
= strlen(address
);
74 for(cp
= field
; ;cp
+= fieldlen
+ 1) {
75 needadr
= needsaddr(&cp
, &fieldlen
); /* cp may be changed */
78 newp
= add("\n", newp
);
81 if((len
+ fieldlen
+ ADDRLEN
) > 70) {
82 newp
= add(",\n ", newp
);
85 newp
= add(", ", newp
);
91 newp
= add(address
, newp
);
92 len
+= fieldlen
+ ADDRLEN
;
96 anychar(fchars
, field
)
99 /* Returns 1 if any fancy char appears in "field"
100 * Returns 0 if either "field" is nul or contains no fancy chars
107 for(fp
= fchars
; *fp
; fp
++)
108 if(r_any(*fp
, field
))
120 for (s
= stg
; (*s
) && (*s
!= ',') && (*s
!= '\n');)
121 if (*s
++ == c
) return (1);
129 static char buf
[128];
130 register char *cp
, *bufp
;
131 int textseen
, blankseen
;
134 textseen
= blankseen
= 0;
138 for(cp
= text
; (*cp
== ' ' || *cp
== '\t'); cp
++);
148 if(!blankseen
|| !textseen
|| !ssequal("at ",cp
)){
152 bufp
= copy(" at ", buf
);
153 VOID
copyaddr(cp
+3, bufp
);
158 bufp
= copy(" @ ", buf
);
159 VOID
copyaddr(cp
+1, bufp
);
161 case ',': case '\n': case 0:
167 #define ND1 (*fp) && (*fp != ' ') && (*fp != '\t')
168 #define ND2 (*fp != '<') && (*fp != '(') && (*fp != '>') && (*fp != ')')
169 #define ND3 (*fp != '\n') && (*fp!= ',') && (*fp != ':')
170 #define NOTDELIM ND1 && ND2 && ND3
172 char *copyaddr(fp
, tp
)
173 register char *fp
, *tp
;
175 /* Copies left-trimmed "from" to "to".
176 * Copy terminates on any delimiter.
177 * Returns pointer to NUL terminator in destination string
180 for( ; *fp
== ' ' || *fp
== '\t'; fp
++) ;
181 for( ; NOTDELIM
; *tp
++ = *fp
++);
185 #define NOTRELEVANT (*cp == ' ' || *cp == '\t' || *cp == '\n'|| *cp == ',')
187 needsaddr(field
, fieldlen
)
191 /* Returns 1 if this field needs an address
192 * Returns 0 if field contains any funny chars or has
193 * an address of the form "xxxx at " or "xxxx[<b>]@"
194 * "field": on input -- addr of pointer to start of field
195 * on output -- val of ptr moved to 1st meaty char
196 * "fieldlen" returns the length of the new field
197 * (it terminates on ',' or '\n' or 0)
201 int textseen
= 0, blankseen
= 0;
203 /* find 1st relevant char in field */
204 for(cp
= *field
; NOTRELEVANT
; cp
++);
206 *field
= cp
; /* return it to caller */
207 if(anychar("(<:", cp
)) {
220 if(!blankseen
|| !textseen
|| !ssequal("at ",cp
)){
227 case ',': case '\n': case 0:
234 for(; (*cp
) && (*cp
!= ',') && (*cp
!= '\n'); cp
++) ;
235 *fieldlen
= cp
- *field
;