Mercurial > emacs
annotate lib-src/fakemail.c @ 112119:48f5ac42611a
Reconcile with changes in line movement behavior for long text lines
that cross more than a single physical window line, ie when truncate-lines
is nil.
(allout-next-visible-heading): Provide for change in line-move behavior on
long lines when truncate-lines is nil. In that case, line-move can wind up
on the same textual line when it moves to the next window line, and moving
to the bullet position after the move yields zero advancement. Add logic
to detect and compensate for the lack of progress.
(allout-current-topic-collapsed-p): move-end-of-line respect for field
boundaries is different when operating with body lines shorter than window
width versus ones greater than window width, which can yield false
negatives in this function. Avoid difference by applying move-end-of-line
while field-text-motion is inhibited.
author | Ken Manheimer <ken.manheimer@gmail.com> |
---|---|
date | Tue, 04 Jan 2011 14:44:10 -0500 |
parents | 1f617baf8ae5 |
children | 417b1e4d63cd 7df2e30d72ec |
rev | line source |
---|---|
18 | 1 /* sendmail-like interface to /bin/mail for system V, |
75250
6d19c76d81c5
Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents:
72034
diff
changeset
|
2 Copyright (C) 1985, 1994, 1999, 2001, 2002, 2003, 2004, |
106815 | 3 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
18 | 4 |
101079
0370b7985d6d
Comment (add an author based on ack.texi).
Glenn Morris <rgm@gnu.org>
parents:
100958
diff
changeset
|
5 Author: Bill Rozas <jinx@martigny.ai.mit.edu> |
0370b7985d6d
Comment (add an author based on ack.texi).
Glenn Morris <rgm@gnu.org>
parents:
100958
diff
changeset
|
6 (according to ack.texi) |
0370b7985d6d
Comment (add an author based on ack.texi).
Glenn Morris <rgm@gnu.org>
parents:
100958
diff
changeset
|
7 |
18 | 8 This file is part of GNU Emacs. |
9 | |
94828
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
10 GNU Emacs is free software: you can redistribute it and/or modify |
37 | 11 it under the terms of the GNU General Public License as published by |
94828
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
12 the Free Software Foundation, either version 3 of the License, or |
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
13 (at your option) any later version. |
18 | 14 |
37 | 15 GNU Emacs is distributed in the hope that it will be useful, |
16 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 GNU General Public License for more details. | |
19 | |
20 You should have received a copy of the GNU General Public License | |
94828
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
21 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
3a4bc081639c
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
92159
diff
changeset
|
22 |
18 | 23 |
42134
de525d9743c9
Include "config.h", not <../src/config.h>.
Dave Love <fx@gnu.org>
parents:
34951
diff
changeset
|
24 #define _XOPEN_SOURCE 500 /* for cuserid */ |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
25 |
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
26 #ifdef HAVE_CONFIG_H |
42469 | 27 #include <config.h> |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
28 #endif |
18 | 29 |
96303 | 30 #if defined (BSD_SYSTEM) && !defined (USE_FAKEMAIL) |
18 | 31 /* This program isnot used in BSD, so just avoid loader complaints. */ |
15683 | 32 int |
109744
fdbd24f8d999
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
Jan D <jan.h.d@swipnet.se>
parents:
109511
diff
changeset
|
33 main (void) |
18 | 34 { |
16121 | 35 return 0; |
18 | 36 } |
37 #else /* not BSD 4.2 (or newer) */ | |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
38 #ifdef MSDOS |
15683 | 39 int |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
40 main () |
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
41 { |
16121 | 42 return 0; |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
43 } |
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
44 #else /* not MSDOS */ |
18 | 45 /* This conditional contains all the rest of the file. */ |
46 | |
47 /* These are defined in config in some versions. */ | |
48 | |
49 #ifdef static | |
50 #undef static | |
51 #endif | |
52 | |
15099
857388330750
[WINDOWSNT]: Include ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
53 #ifdef WINDOWSNT |
857388330750
[WINDOWSNT]: Include ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
54 #include "ntlib.h" |
857388330750
[WINDOWSNT]: Include ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
55 #endif |
857388330750
[WINDOWSNT]: Include ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
56 |
18 | 57 #include <stdio.h> |
58 #include <string.h> | |
59 #include <ctype.h> | |
60 #include <time.h> | |
61 #include <pwd.h> | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
62 #include <stdlib.h> |
18841
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
63 |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
64 /* This is to declare cuserid. */ |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
65 #ifdef HAVE_UNISTD_H |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
66 #include <unistd.h> |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
67 #endif |
18 | 68 |
69 /* Type definitions */ | |
70 | |
71 #define boolean int | |
72 #define true 1 | |
73 #define false 0 | |
74 | |
69790
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
75 #define TM_YEAR_BASE 1900 |
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
76 |
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
77 /* Nonzero if TM_YEAR is a struct tm's tm_year value that causes |
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
78 asctime to have well-defined behavior. */ |
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
79 #ifndef TM_YEAR_IN_ASCTIME_RANGE |
69697
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
80 # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \ |
69790
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
81 (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE) |
69697
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
82 #endif |
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
83 |
18 | 84 /* Various lists */ |
85 | |
86 struct line_record | |
87 { | |
88 char *string; | |
89 struct line_record *continuation; | |
90 }; | |
91 typedef struct line_record *line_list; | |
92 | |
93 struct header_record | |
94 { | |
95 line_list text; | |
96 struct header_record *next; | |
97 struct header_record *previous; | |
98 }; | |
99 typedef struct header_record *header; | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
100 |
18 | 101 struct stream_record |
102 { | |
103 FILE *handle; | |
109125
12b02558bf51
* lib-src/fakemail.c (action): Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109111
diff
changeset
|
104 int (*action)(FILE *); |
18 | 105 struct stream_record *rest_streams; |
106 }; | |
107 typedef struct stream_record *stream_list; | |
108 | |
109 /* A `struct linebuffer' is a structure which holds a line of text. | |
110 * `readline' reads a line from a stream into a linebuffer | |
111 * and works regardless of the length of the line. | |
112 */ | |
113 | |
114 struct linebuffer | |
115 { | |
116 long size; | |
117 char *buffer; | |
118 }; | |
119 | |
120 struct linebuffer lb; | |
121 | |
122 #define new_list() \ | |
123 ((line_list) xmalloc (sizeof (struct line_record))) | |
124 #define new_header() \ | |
125 ((header) xmalloc (sizeof (struct header_record))) | |
126 #define new_stream() \ | |
127 ((stream_list) xmalloc (sizeof (struct stream_record))) | |
128 #define alloc_string(nchars) \ | |
129 ((char *) xmalloc ((nchars) + 1)) | |
130 | |
131 /* Global declarations */ | |
132 | |
133 #define BUFLEN 1024 | |
134 #define KEYWORD_SIZE 256 | |
135 #define FROM_PREFIX "From" | |
136 #define MY_NAME "fakemail" | |
137 #define NIL ((line_list) NULL) | |
138 #define INITIAL_LINE_SIZE 200 | |
139 | |
91725 | 140 #ifndef MAIL_PROGRAM_NAME |
141 #define MAIL_PROGRAM_NAME "/bin/mail" | |
142 #endif | |
143 | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
144 static const char *my_name; |
18 | 145 static char *the_date; |
146 static char *the_user; | |
147 static line_list file_preface; | |
148 static stream_list the_streams; | |
149 static boolean no_problems = true; | |
150 | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
151 static void fatal (const char *s1) NO_RETURN; |
18 | 152 |
153 #ifdef CURRENT_USER | |
154 static struct passwd *my_entry; | |
155 #define cuserid(s) \ | |
156 (my_entry = getpwuid (((int) geteuid ())), \ | |
157 my_entry->pw_name) | |
158 #endif | |
159 | |
160 /* Utilities */ | |
161 | |
162 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ | |
163 | |
164 static void | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
165 error (const char *s1, const char *s2) |
18 | 166 { |
167 printf ("%s: ", my_name); | |
168 printf (s1, s2); | |
169 printf ("\n"); | |
170 no_problems = false; | |
171 } | |
172 | |
173 /* Print error message and exit. */ | |
174 | |
175 static void | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
176 fatal (const char *s1) |
18 | 177 { |
72034
ca1a855f01ae
(fatal): Drop second parameter and treat first
Andreas Schwab <schwab@suse.de>
parents:
70278
diff
changeset
|
178 error ("%s", s1); |
55442
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
179 exit (EXIT_FAILURE); |
18 | 180 } |
181 | |
182 /* Like malloc but get fatal error if memory is exhausted. */ | |
183 | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
184 static long * |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
185 xmalloc (int size) |
18 | 186 { |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
187 long *result = (long *) malloc (((unsigned) size)); |
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
188 if (result == ((long *) NULL)) |
72034
ca1a855f01ae
(fatal): Drop second parameter and treat first
Andreas Schwab <schwab@suse.de>
parents:
70278
diff
changeset
|
189 fatal ("virtual memory exhausted"); |
18 | 190 return result; |
191 } | |
192 | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
193 static long * |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
194 xrealloc (long int *ptr, int size) |
18 | 195 { |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
196 long *result = (long *) realloc (ptr, ((unsigned) size)); |
12840
4e9a14304b8b
(xrealloc): Change cast to match return type.
Karl Heuer <kwzh@gnu.org>
parents:
12833
diff
changeset
|
197 if (result == ((long *) NULL)) |
18 | 198 fatal ("virtual memory exhausted"); |
199 return result; | |
200 } | |
201 | |
202 /* Initialize a linebuffer for use */ | |
203 | |
204 void | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
205 init_linebuffer (struct linebuffer *linebuffer) |
18 | 206 { |
207 linebuffer->size = INITIAL_LINE_SIZE; | |
208 linebuffer->buffer = ((char *) xmalloc (INITIAL_LINE_SIZE)); | |
209 } | |
210 | |
211 /* Read a line of text from `stream' into `linebuffer'. | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
212 Return the length of the line. */ |
18 | 213 |
214 long | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
215 readline (struct linebuffer *linebuffer, FILE *stream) |
18 | 216 { |
217 char *buffer = linebuffer->buffer; | |
218 char *p = linebuffer->buffer; | |
219 char *end = p + linebuffer->size; | |
220 | |
221 while (true) | |
222 { | |
223 int c = getc (stream); | |
224 if (p == end) | |
225 { | |
226 linebuffer->size *= 2; | |
34951
1efc40541908
(readline): Cast buffer to "long *" to pacify
Eli Zaretskii <eliz@gnu.org>
parents:
34609
diff
changeset
|
227 buffer = ((char *) xrealloc ((long *)buffer, linebuffer->size)); |
6992
ed57331fb222
(readline): Fix updating of p when buffer grows.
Richard M. Stallman <rms@gnu.org>
parents:
6954
diff
changeset
|
228 p = buffer + (p - linebuffer->buffer); |
6954
774fdc20d115
(readline): When extending the buffer,
Richard M. Stallman <rms@gnu.org>
parents:
6109
diff
changeset
|
229 end = buffer + linebuffer->size; |
18 | 230 linebuffer->buffer = buffer; |
231 } | |
232 if (c < 0 || c == '\n') | |
233 { | |
234 *p = 0; | |
235 break; | |
236 } | |
237 *p++ = c; | |
238 } | |
239 | |
240 return p - buffer; | |
241 } | |
242 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
243 /* Extract a colon-terminated keyword from the string FIELD. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
244 Return that keyword as a string stored in a static buffer. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
245 Store the address of the rest of the string into *REST. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
246 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
247 If there is no keyword, return NULL and don't alter *REST. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
248 |
18 | 249 char * |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
250 get_keyword (register char *field, char **rest) |
18 | 251 { |
252 static char keyword[KEYWORD_SIZE]; | |
253 register char *ptr; | |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
254 register int c; |
18 | 255 |
256 ptr = &keyword[0]; | |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
257 c = (unsigned char) *field++; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
258 if (isspace (c) || c == ':') |
18 | 259 return ((char *) NULL); |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
260 *ptr++ = (islower (c) ? toupper (c) : c); |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
261 while (((c = (unsigned char) *field++) != ':') && ! isspace (c)) |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
262 *ptr++ = (islower (c) ? toupper (c) : c); |
18 | 263 *ptr++ = '\0'; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
264 while (isspace (c)) |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
265 c = (unsigned char) *field++; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
266 if (c != ':') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
267 return ((char *) NULL); |
18 | 268 *rest = field; |
269 return &keyword[0]; | |
270 } | |
271 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
272 /* Nonzero if the string FIELD starts with a colon-terminated keyword. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
273 |
18 | 274 boolean |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
275 has_keyword (char *field) |
18 | 276 { |
277 char *ignored; | |
278 return (get_keyword (field, &ignored) != ((char *) NULL)); | |
279 } | |
280 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
281 /* Store the string FIELD, followed by any lines in THE_LIST, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
282 into the buffer WHERE. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
283 Concatenate lines, putting just a space between them. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
284 Delete everything contained in parentheses. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
285 When a recipient name contains <...>, we discard |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
286 everything except what is inside the <...>. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
287 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
288 We don't pay attention to overflowing WHERE; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
289 the caller has to make it big enough. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
290 |
18 | 291 char * |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
292 add_field (line_list the_list, register char *field, register char *where) |
18 | 293 { |
294 register char c; | |
295 while (true) | |
296 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
297 char *this_recipient_where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
298 int in_quotes = 0; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
299 |
18 | 300 *where++ = ' '; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
301 this_recipient_where = where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
302 |
18 | 303 while ((c = *field++) != '\0') |
304 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
305 if (c == '\\') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
306 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
307 else if (c == '"') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
308 { |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
309 in_quotes = ! in_quotes; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
310 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
311 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
312 else if (in_quotes) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
313 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
314 else if (c == '(') |
18 | 315 { |
316 while (*field && *field != ')') ++field; | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
317 if (! (*field++)) break; /* no close */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
318 continue; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
319 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
320 else if (c == ',') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
321 { |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
322 *where++ = ' '; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
323 /* When we get to the end of one recipient, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
324 don't discard it if the next one has <...>. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
325 this_recipient_where = where; |
18 | 326 } |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
327 else if (c == '<') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
328 /* Discard everything we got before the `<'. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
329 where = this_recipient_where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
330 else if (c == '>') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
331 /* Discard the rest of this name that follows the `>'. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
332 { |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
333 while (*field && *field != ',') ++field; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
334 if (! (*field++)) break; /* no comma */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
335 continue; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
336 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
337 else |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
338 *where++ = c; |
18 | 339 } |
340 if (the_list == NIL) break; | |
341 field = the_list->string; | |
342 the_list = the_list->continuation; | |
343 } | |
344 return where; | |
345 } | |
346 | |
347 line_list | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
348 make_file_preface (void) |
18 | 349 { |
350 char *the_string, *temp; | |
351 long idiotic_interface; | |
69697
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
352 struct tm *tm; |
18 | 353 long prefix_length; |
354 long user_length; | |
355 long date_length; | |
356 line_list result; | |
357 | |
358 prefix_length = strlen (FROM_PREFIX); | |
359 time (&idiotic_interface); | |
69697
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
360 /* Convert to a string, checking for out-of-range time stamps. |
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
361 Don't use 'ctime', as that might dump core if the hardware clock |
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
362 is set to a bizarre value. */ |
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
363 tm = localtime (&idiotic_interface); |
69790
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
364 if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) |
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
365 && (the_date = asctime (tm)))) |
72034
ca1a855f01ae
(fatal): Drop second parameter and treat first
Andreas Schwab <schwab@suse.de>
parents:
70278
diff
changeset
|
366 fatal ("current time is out of range"); |
18 | 367 /* the_date has an unwanted newline at the end */ |
368 date_length = strlen (the_date) - 1; | |
369 the_date[date_length] = '\0'; | |
370 temp = cuserid ((char *) NULL); | |
371 user_length = strlen (temp); | |
372 the_user = alloc_string (user_length + 1); | |
373 strcpy (the_user, temp); | |
18841
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
374 the_string = alloc_string (3 + prefix_length |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
375 + user_length |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
376 + date_length); |
18 | 377 temp = the_string; |
378 strcpy (temp, FROM_PREFIX); | |
379 temp = &temp[prefix_length]; | |
380 *temp++ = ' '; | |
381 strcpy (temp, the_user); | |
382 temp = &temp[user_length]; | |
383 *temp++ = ' '; | |
384 strcpy (temp, the_date); | |
385 result = new_list (); | |
386 result->string = the_string; | |
387 result->continuation = ((line_list) NULL); | |
388 return result; | |
389 } | |
390 | |
391 void | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
392 write_line_list (register line_list the_list, FILE *the_stream) |
18 | 393 { |
394 for ( ; | |
395 the_list != ((line_list) NULL) ; | |
396 the_list = the_list->continuation) | |
397 { | |
398 fputs (the_list->string, the_stream); | |
399 putc ('\n', the_stream); | |
400 } | |
401 return; | |
402 } | |
403 | |
404 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
405 close_the_streams (void) |
18 | 406 { |
407 register stream_list rem; | |
408 for (rem = the_streams; | |
409 rem != ((stream_list) NULL); | |
410 rem = rem->rest_streams) | |
411 no_problems = (no_problems && | |
412 ((*rem->action) (rem->handle) == 0)); | |
413 the_streams = ((stream_list) NULL); | |
55442
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
414 return (no_problems ? EXIT_SUCCESS : EXIT_FAILURE); |
18 | 415 } |
416 | |
417 void | |
109125
12b02558bf51
* lib-src/fakemail.c (action): Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109111
diff
changeset
|
418 add_a_stream (FILE *the_stream, int (*closing_action) (FILE *)) |
18 | 419 { |
420 stream_list old = the_streams; | |
421 the_streams = new_stream (); | |
422 the_streams->handle = the_stream; | |
423 the_streams->action = closing_action; | |
424 the_streams->rest_streams = old; | |
425 return; | |
426 } | |
427 | |
428 int | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
429 my_fclose (FILE *the_file) |
18 | 430 { |
431 putc ('\n', the_file); | |
432 fflush (the_file); | |
433 return fclose (the_file); | |
434 } | |
435 | |
436 boolean | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
437 open_a_file (char *name) |
18 | 438 { |
439 FILE *the_stream = fopen (name, "a"); | |
440 if (the_stream != ((FILE *) NULL)) | |
441 { | |
442 add_a_stream (the_stream, my_fclose); | |
443 if (the_user == ((char *) NULL)) | |
444 file_preface = make_file_preface (); | |
445 write_line_list (file_preface, the_stream); | |
446 return true; | |
447 } | |
448 return false; | |
449 } | |
450 | |
451 void | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
452 put_string (char *s) |
18 | 453 { |
454 register stream_list rem; | |
455 for (rem = the_streams; | |
456 rem != ((stream_list) NULL); | |
457 rem = rem->rest_streams) | |
458 fputs (s, rem->handle); | |
459 return; | |
460 } | |
461 | |
462 void | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
463 put_line (const char *string) |
18 | 464 { |
465 register stream_list rem; | |
466 for (rem = the_streams; | |
467 rem != ((stream_list) NULL); | |
468 rem = rem->rest_streams) | |
469 { | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
470 const char *s = string; |
20 | 471 int column = 0; |
472 | |
473 /* Divide STRING into lines. */ | |
474 while (*s != 0) | |
475 { | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
476 const char *breakpos; |
20 | 477 |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
478 /* Find the last char that fits. */ |
20 | 479 for (breakpos = s; *breakpos && column < 78; ++breakpos) |
480 { | |
481 if (*breakpos == '\t') | |
482 column += 8; | |
483 else | |
484 column++; | |
485 } | |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
486 /* If we didn't reach end of line, break the line. */ |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
487 if (*breakpos) |
20 | 488 { |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
489 /* Back up to just after the last comma that fits. */ |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
490 while (breakpos != s && breakpos[-1] != ',') --breakpos; |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
491 |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
492 if (breakpos == s) |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
493 { |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
494 /* If no comma fits, move past the first address anyway. */ |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
495 while (*breakpos != 0 && *breakpos != ',') ++breakpos; |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
496 if (*breakpos != 0) |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
497 /* Include the comma after it. */ |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
498 ++breakpos; |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
499 } |
20 | 500 } |
501 /* Output that much, then break the line. */ | |
502 fwrite (s, 1, breakpos - s, rem->handle); | |
503 column = 8; | |
504 | |
505 /* Skip whitespace and prepare to print more addresses. */ | |
506 s = breakpos; | |
507 while (*s == ' ' || *s == '\t') ++s; | |
3219
1aa8fa0a569e
(put_line): Don't output \n\t unless more text follows.
Richard M. Stallman <rms@gnu.org>
parents:
37
diff
changeset
|
508 if (*s != 0) |
1aa8fa0a569e
(put_line): Don't output \n\t unless more text follows.
Richard M. Stallman <rms@gnu.org>
parents:
37
diff
changeset
|
509 fputs ("\n\t", rem->handle); |
20 | 510 } |
18 | 511 putc ('\n', rem->handle); |
512 } | |
513 return; | |
514 } | |
515 | |
516 #define mail_error error | |
517 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
518 /* Handle an FCC field. FIELD is the text of the first line (after |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
519 the header name), and THE_LIST holds the continuation lines if any. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
520 Call open_a_file for each file. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
521 |
18 | 522 void |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
523 setup_files (register line_list the_list, register char *field) |
18 | 524 { |
525 register char *start; | |
526 register char c; | |
527 while (true) | |
528 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
529 while (((c = *field) != '\0') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
530 && (c == ' ' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
531 || c == '\t' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
532 || c == ',')) |
18 | 533 field += 1; |
534 if (c != '\0') | |
535 { | |
536 start = field; | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
537 while (((c = *field) != '\0') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
538 && c != ' ' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
539 && c != '\t' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
540 && c != ',') |
18 | 541 field += 1; |
542 *field = '\0'; | |
543 if (!open_a_file (start)) | |
544 mail_error ("Could not open file %s", start); | |
545 *field = c; | |
546 if (c != '\0') continue; | |
547 } | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
548 if (the_list == ((line_list) NULL)) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
549 return; |
18 | 550 field = the_list->string; |
551 the_list = the_list->continuation; | |
552 } | |
553 } | |
554 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
555 /* Compute the total size of all recipient names stored in THE_HEADER. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
556 The result says how big to make the buffer to pass to parse_header. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
557 |
18 | 558 int |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
559 args_size (header the_header) |
18 | 560 { |
561 register header old = the_header; | |
562 register line_list rem; | |
563 register int size = 0; | |
564 do | |
565 { | |
566 char *field; | |
567 register char *keyword = get_keyword (the_header->text->string, &field); | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
568 if ((strcmp (keyword, "TO") == 0) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
569 || (strcmp (keyword, "CC") == 0) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
570 || (strcmp (keyword, "BCC") == 0)) |
18 | 571 { |
572 size += 1 + strlen (field); | |
573 for (rem = the_header->text->continuation; | |
574 rem != NIL; | |
575 rem = rem->continuation) | |
576 size += 1 + strlen (rem->string); | |
577 } | |
578 the_header = the_header->next; | |
579 } while (the_header != old); | |
580 return size; | |
581 } | |
582 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
583 /* Scan the header described by the lists THE_HEADER, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
584 and put all recipient names into the buffer WHERE. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
585 Precede each recipient name with a space. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
586 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
587 Also, if the header has any FCC fields, call setup_files for each one. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
588 |
21389
48690fd8d40a
(_XOPEN_SOURCE): Define for declaration of cuserid.
Andreas Schwab <schwab@suse.de>
parents:
18841
diff
changeset
|
589 void |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
590 parse_header (header the_header, register char *where) |
18 | 591 { |
592 register header old = the_header; | |
593 do | |
594 { | |
595 char *field; | |
596 register char *keyword = get_keyword (the_header->text->string, &field); | |
597 if (strcmp (keyword, "TO") == 0) | |
598 where = add_field (the_header->text->continuation, field, where); | |
599 else if (strcmp (keyword, "CC") == 0) | |
600 where = add_field (the_header->text->continuation, field, where); | |
601 else if (strcmp (keyword, "BCC") == 0) | |
602 { | |
603 where = add_field (the_header->text->continuation, field, where); | |
604 the_header->previous->next = the_header->next; | |
605 the_header->next->previous = the_header->previous; | |
606 } | |
607 else if (strcmp (keyword, "FCC") == 0) | |
608 setup_files (the_header->text->continuation, field); | |
609 the_header = the_header->next; | |
610 } while (the_header != old); | |
611 *where = '\0'; | |
612 return; | |
613 } | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
614 |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
615 /* Read lines from the input until we get a blank line. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
616 Create a list of `header' objects, one for each header field, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
617 each of which points to a list of `line_list' objects, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
618 one for each line in that field. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
619 Continuation lines are grouped in the headers they continue. */ |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
620 |
18 | 621 header |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
622 read_header (void) |
18 | 623 { |
624 register header the_header = ((header) NULL); | |
625 register line_list *next_line = ((line_list *) NULL); | |
626 | |
627 init_linebuffer (&lb); | |
628 | |
629 do | |
630 { | |
631 long length; | |
632 register char *line; | |
633 | |
634 readline (&lb, stdin); | |
635 line = lb.buffer; | |
636 length = strlen (line); | |
637 if (length == 0) break; | |
638 | |
639 if (has_keyword (line)) | |
640 { | |
641 register header old = the_header; | |
642 the_header = new_header (); | |
643 if (old == ((header) NULL)) | |
644 { | |
645 the_header->next = the_header; | |
646 the_header->previous = the_header; | |
647 } | |
648 else | |
649 { | |
650 the_header->previous = old; | |
651 the_header->next = old->next; | |
652 old->next = the_header; | |
653 } | |
654 next_line = &(the_header->text); | |
655 } | |
656 | |
657 if (next_line == ((line_list *) NULL)) | |
658 { | |
659 /* Not a valid header */ | |
55442
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
660 exit (EXIT_FAILURE); |
18 | 661 } |
662 *next_line = new_list (); | |
663 (*next_line)->string = alloc_string (length); | |
664 strcpy (((*next_line)->string), line); | |
665 next_line = &((*next_line)->continuation); | |
666 *next_line = NIL; | |
667 | |
668 } while (true); | |
669 | |
70278
8e7233f487a3
(read_header): Give fatal error if input has no header.
Richard M. Stallman <rms@gnu.org>
parents:
69790
diff
changeset
|
670 if (! the_header) |
8e7233f487a3
(read_header): Give fatal error if input has no header.
Richard M. Stallman <rms@gnu.org>
parents:
69790
diff
changeset
|
671 fatal ("input message has no header"); |
18 | 672 return the_header->next; |
673 } | |
674 | |
675 void | |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
676 write_header (header the_header) |
18 | 677 { |
678 register header old = the_header; | |
679 do | |
680 { | |
681 register line_list the_list; | |
682 for (the_list = the_header->text; | |
683 the_list != NIL; | |
684 the_list = the_list->continuation) | |
685 put_line (the_list->string); | |
686 the_header = the_header->next; | |
687 } while (the_header != old); | |
688 put_line (""); | |
689 return; | |
690 } | |
691 | |
15683 | 692 int |
109111
52b76722152a
Convert function definitions to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
106815
diff
changeset
|
693 main (int argc, char **argv) |
18 | 694 { |
695 char *command_line; | |
696 header the_header; | |
697 long name_length; | |
109747
1f617baf8ae5
Fix -Wwrite-strings warnings in fakemail.c.
Jan D <jan.h.d@swipnet.se>
parents:
109744
diff
changeset
|
698 const char *mail_program_name; |
18 | 699 char buf[BUFLEN + 1]; |
700 register int size; | |
701 FILE *the_pipe; | |
702 | |
703 mail_program_name = getenv ("FAKEMAILER"); | |
704 if (!(mail_program_name && *mail_program_name)) | |
91725 | 705 mail_program_name = MAIL_PROGRAM_NAME; |
18 | 706 name_length = strlen (mail_program_name); |
707 | |
708 my_name = MY_NAME; | |
709 the_streams = ((stream_list) NULL); | |
710 the_date = ((char *) NULL); | |
711 the_user = ((char *) NULL); | |
712 | |
713 the_header = read_header (); | |
714 command_line = alloc_string (name_length + args_size (the_header)); | |
715 strcpy (command_line, mail_program_name); | |
716 parse_header (the_header, &command_line[name_length]); | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
717 |
18 | 718 the_pipe = popen (command_line, "w"); |
719 if (the_pipe == ((FILE *) NULL)) | |
720 fatal ("cannot open pipe to real mailer"); | |
721 | |
722 add_a_stream (the_pipe, pclose); | |
723 | |
724 write_header (the_header); | |
725 | |
726 /* Dump the message itself */ | |
727 | |
728 while (!feof (stdin)) | |
729 { | |
730 size = fread (buf, 1, BUFLEN, stdin); | |
731 buf[size] = '\0'; | |
732 put_string (buf); | |
733 } | |
734 | |
735 exit (close_the_streams ()); | |
736 } | |
737 | |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
738 #endif /* not MSDOS */ |
18 | 739 #endif /* not BSD 4.2 (or newer) */ |
52401 | 740 |
741 /* arch-tag: acb0afa6-315a-4c5b-b9e3-def5725c8783 | |
742 (do not change this comment) */ | |
55442
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
743 |
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
744 /* fakemail.c ends here */ |