]>
diplodocus.org Git - nmh/blob - docs/historical/mh-nov-1983/cmds/replsubs.c
6 /* Return pointer to 1st non-blank char in string;
7 * If ptr ==> 0 or ptr ==> '\n'0, return NUL;
13 while((*cp1
== ' ') || (*cp1
== '\t')) cp1
++;
14 if((*cp1
== 0) || (*cp1
== '\n' && cp1
[1] == 0))
22 /* trim newline and blanks from the right */
26 cp1
= cp
+strlen(cp
)-1;
27 if(*cp1
== '\n') *cp1
= 0;
28 while(*--cp1
== ' ') ;
33 char *niceadd(this, that
)
36 register char *from
, *to
;
38 if(!(from
= ltrim(this))) /* nothing to add */
42 to
= add(",\n ", rtrim(to
)); /* enuf blanks for "cc: " */
43 return(add(from
, to
));
46 #define ADDRLEN (needadr ? addrlen : 0)
48 char *fix(field
, address
)
49 char *field
, *address
;
51 /* Appends address to each needy addressee in "field".
52 * Returns pointer to copy of new string. (HUH?)
53 * "field" should never be 0
63 addrlen
= strlen(address
);
67 for(cp
= field
; ;cp
+= fieldlen
+ 1) {
68 needadr
= needsaddr(&cp
, &fieldlen
); /* cp may be changed */
71 newp
= add("\n", newp
);
74 if((len
+ fieldlen
+ ADDRLEN
) > 70) {
75 newp
= add(",\n ", newp
);
78 newp
= add(", ", newp
);
84 newp
= add(address
, newp
);
85 len
+= fieldlen
+ ADDRLEN
;
89 anychar(fchars
, field
)
92 /* Returns 1 if any fancy char appears in "field"
93 * Returns 0 if either "field" is nul or contains no fancy chars
100 for(fp
= fchars
; *fp
; fp
++)
101 if(r_any(*fp
, field
))
113 for (s
= stg
; (*s
) && (*s
!= ',') && (*s
!= '\n');)
114 if (*s
++ == c
) return (1);
121 static char buf
[128];
122 register char *cp
, *bufp
;
123 int textseen
, blankseen
;
126 textseen
= blankseen
= 0;
130 for(cp
= text
; (*cp
== ' ' || *cp
== '\t'); cp
++);
140 if(!blankseen
|| !textseen
|| !ssequal("at ",cp
)){
144 bufp
= copy(" at ", buf
);
145 copyaddr(cp
+3, bufp
);
150 bufp
= copy(" @ ", buf
);
151 copyaddr(cp
+1, bufp
);
153 case ',': case '\n': case 0:
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
164 char *copyaddr(from
, to
)
167 /* Copies left-trimmed "from" to "to".
168 * Copy terminates on any delimiter.
169 * Returns pointer to NUL terminator in destination string
172 register char *fp
, *tp
;
174 for(fp
= from
; (*fp
== ' ') && (*fp
== '\t'); fp
++) ;
175 for( ; NOTDELIM
; *tp
++ = *fp
++);
179 #define NOTRELEVANT (*cp == ' ' || *cp == '\t' || *cp == '\n'|| *cp == ',')
181 needsaddr(field
, fieldlen
)
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)
195 int textseen
, blankseen
;
197 /* find 1st relevant char in field */
198 for(cp
= *field
; NOTRELEVANT
; cp
++);
200 *field
= cp
; /* return it to caller */
201 if(anychar("(<:", cp
)) {
214 if(!blankseen
|| !textseen
|| !ssequal("at ",cp
)){
221 case ',': case '\n': case 0:
228 for(; (*cp
) && (*cp
!= ',') && (*cp
!= '\n'); cp
++) ;
229 *fieldlen
= cp
- *field
;