Mercurial > emacs
annotate lib-src/fakemail.c @ 106768:21fd634f447a
Make line<->pixel_y conversion macros aware of native menu/tool bars.
They are placed above the internal border. This supersedes special
treatment of native tool bars in the display code.
This fixes wrong display position of native menu bars and bogus mouse
highlighting of native tool bars, both of which can be found when
internal border width is large. Also it fixes wrong flashed part on
visible bell with native menu bars.
* frame.h (FRAME_TOP_MARGIN_HEIGHT): New macro.
(FRAME_LINE_TO_PIXEL_Y, FRAME_PIXEL_Y_TO_LINE): Take account of pseudo
windows above internal border.
* window.h (WINDOW_MENU_BAR_P, WINDOW_TOOL_BAR_P): New macros.
(WINDOW_TOP_EDGE_Y, WINDOW_BOTTOM_EDGE_Y): Take account of pseudo
windows above internal border.
* xdisp.c (get_glyph_string_clip_rects, init_glyph_string): Don't treat
tool bar windows specially.
* xfns.c (x_set_tool_bar_lines): Take account of menu bar height.
* xterm.c (x_after_update_window_line): Don't treat tool bar windows
specially.
(XTflash): Take account of menu bar height.
* w32term.c (x_after_update_window_line): Don't treat tool bar windows
specially.
author | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> |
---|---|
date | Sat, 09 Jan 2010 13:16:32 +0900 |
parents | 0370b7985d6d |
children | 1d1d5d9bd884 |
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, |
100958 | 3 2005, 2006, 2007, 2008, 2009 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 |
18 | 33 main () |
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> | |
18841
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
62 |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
63 /* This is to declare cuserid. */ |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
64 #ifdef HAVE_UNISTD_H |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
65 #include <unistd.h> |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
66 #endif |
18 | 67 |
68 /* Type definitions */ | |
69 | |
70 #define boolean int | |
71 #define true 1 | |
72 #define false 0 | |
73 | |
69790
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
74 #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
|
75 |
1e68e7f3b824
* lib-src/b2m.c (main): Don't include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
69697
diff
changeset
|
76 /* 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
|
77 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
|
78 #ifndef TM_YEAR_IN_ASCTIME_RANGE |
69697
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
79 # 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
|
80 (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
|
81 #endif |
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
82 |
18 | 83 /* Various lists */ |
84 | |
85 struct line_record | |
86 { | |
87 char *string; | |
88 struct line_record *continuation; | |
89 }; | |
90 typedef struct line_record *line_list; | |
91 | |
92 struct header_record | |
93 { | |
94 line_list text; | |
95 struct header_record *next; | |
96 struct header_record *previous; | |
97 }; | |
98 typedef struct header_record *header; | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
99 |
18 | 100 struct stream_record |
101 { | |
102 FILE *handle; | |
103 int (*action)(); | |
104 struct stream_record *rest_streams; | |
105 }; | |
106 typedef struct stream_record *stream_list; | |
107 | |
108 /* A `struct linebuffer' is a structure which holds a line of text. | |
109 * `readline' reads a line from a stream into a linebuffer | |
110 * and works regardless of the length of the line. | |
111 */ | |
112 | |
113 struct linebuffer | |
114 { | |
115 long size; | |
116 char *buffer; | |
117 }; | |
118 | |
119 struct linebuffer lb; | |
120 | |
121 #define new_list() \ | |
122 ((line_list) xmalloc (sizeof (struct line_record))) | |
123 #define new_header() \ | |
124 ((header) xmalloc (sizeof (struct header_record))) | |
125 #define new_stream() \ | |
126 ((stream_list) xmalloc (sizeof (struct stream_record))) | |
127 #define alloc_string(nchars) \ | |
128 ((char *) xmalloc ((nchars) + 1)) | |
129 | |
130 /* Global declarations */ | |
131 | |
132 #define BUFLEN 1024 | |
133 #define KEYWORD_SIZE 256 | |
134 #define FROM_PREFIX "From" | |
135 #define MY_NAME "fakemail" | |
136 #define NIL ((line_list) NULL) | |
137 #define INITIAL_LINE_SIZE 200 | |
138 | |
91725 | 139 #ifndef MAIL_PROGRAM_NAME |
140 #define MAIL_PROGRAM_NAME "/bin/mail" | |
141 #endif | |
142 | |
18 | 143 static char *my_name; |
144 static char *the_date; | |
145 static char *the_user; | |
146 static line_list file_preface; | |
147 static stream_list the_streams; | |
148 static boolean no_problems = true; | |
149 | |
150 extern FILE *popen (); | |
151 extern int fclose (), pclose (); | |
152 | |
153 #ifdef CURRENT_USER | |
154 extern struct passwd *getpwuid (); | |
155 extern unsigned short geteuid (); | |
156 static struct passwd *my_entry; | |
157 #define cuserid(s) \ | |
158 (my_entry = getpwuid (((int) geteuid ())), \ | |
159 my_entry->pw_name) | |
160 #endif | |
161 | |
162 /* Utilities */ | |
163 | |
164 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ | |
165 | |
166 static void | |
167 error (s1, s2) | |
168 char *s1, *s2; | |
169 { | |
170 printf ("%s: ", my_name); | |
171 printf (s1, s2); | |
172 printf ("\n"); | |
173 no_problems = false; | |
174 } | |
175 | |
176 /* Print error message and exit. */ | |
177 | |
178 static void | |
72034
ca1a855f01ae
(fatal): Drop second parameter and treat first
Andreas Schwab <schwab@suse.de>
parents:
70278
diff
changeset
|
179 fatal (s1) |
ca1a855f01ae
(fatal): Drop second parameter and treat first
Andreas Schwab <schwab@suse.de>
parents:
70278
diff
changeset
|
180 char *s1; |
18 | 181 { |
72034
ca1a855f01ae
(fatal): Drop second parameter and treat first
Andreas Schwab <schwab@suse.de>
parents:
70278
diff
changeset
|
182 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
|
183 exit (EXIT_FAILURE); |
18 | 184 } |
185 | |
186 /* Like malloc but get fatal error if memory is exhausted. */ | |
187 | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
188 static long * |
18 | 189 xmalloc (size) |
190 int size; | |
191 { | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
192 long *result = (long *) malloc (((unsigned) size)); |
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
193 if (result == ((long *) NULL)) |
72034
ca1a855f01ae
(fatal): Drop second parameter and treat first
Andreas Schwab <schwab@suse.de>
parents:
70278
diff
changeset
|
194 fatal ("virtual memory exhausted"); |
18 | 195 return result; |
196 } | |
197 | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
198 static long * |
18 | 199 xrealloc (ptr, size) |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
200 long *ptr; |
18 | 201 int size; |
202 { | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
203 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
|
204 if (result == ((long *) NULL)) |
18 | 205 fatal ("virtual memory exhausted"); |
206 return result; | |
207 } | |
208 | |
209 /* Initialize a linebuffer for use */ | |
210 | |
211 void | |
212 init_linebuffer (linebuffer) | |
213 struct linebuffer *linebuffer; | |
214 { | |
215 linebuffer->size = INITIAL_LINE_SIZE; | |
216 linebuffer->buffer = ((char *) xmalloc (INITIAL_LINE_SIZE)); | |
217 } | |
218 | |
219 /* 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
|
220 Return the length of the line. */ |
18 | 221 |
222 long | |
223 readline (linebuffer, stream) | |
224 struct linebuffer *linebuffer; | |
225 FILE *stream; | |
226 { | |
227 char *buffer = linebuffer->buffer; | |
228 char *p = linebuffer->buffer; | |
229 char *end = p + linebuffer->size; | |
230 | |
231 while (true) | |
232 { | |
233 int c = getc (stream); | |
234 if (p == end) | |
235 { | |
236 linebuffer->size *= 2; | |
34951
1efc40541908
(readline): Cast buffer to "long *" to pacify
Eli Zaretskii <eliz@gnu.org>
parents:
34609
diff
changeset
|
237 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
|
238 p = buffer + (p - linebuffer->buffer); |
6954
774fdc20d115
(readline): When extending the buffer,
Richard M. Stallman <rms@gnu.org>
parents:
6109
diff
changeset
|
239 end = buffer + linebuffer->size; |
18 | 240 linebuffer->buffer = buffer; |
241 } | |
242 if (c < 0 || c == '\n') | |
243 { | |
244 *p = 0; | |
245 break; | |
246 } | |
247 *p++ = c; | |
248 } | |
249 | |
250 return p - buffer; | |
251 } | |
252 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
253 /* Extract a colon-terminated keyword from the string FIELD. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
254 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
|
255 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
|
256 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
257 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
|
258 |
18 | 259 char * |
260 get_keyword (field, rest) | |
261 register char *field; | |
262 char **rest; | |
263 { | |
264 static char keyword[KEYWORD_SIZE]; | |
265 register char *ptr; | |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
266 register int c; |
18 | 267 |
268 ptr = &keyword[0]; | |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
269 c = (unsigned char) *field++; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
270 if (isspace (c) || c == ':') |
18 | 271 return ((char *) NULL); |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
272 *ptr++ = (islower (c) ? toupper (c) : c); |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
273 while (((c = (unsigned char) *field++) != ':') && ! isspace (c)) |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
274 *ptr++ = (islower (c) ? toupper (c) : c); |
18 | 275 *ptr++ = '\0'; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
276 while (isspace (c)) |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
277 c = (unsigned char) *field++; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
278 if (c != ':') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
279 return ((char *) NULL); |
18 | 280 *rest = field; |
281 return &keyword[0]; | |
282 } | |
283 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
284 /* 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
|
285 |
18 | 286 boolean |
287 has_keyword (field) | |
288 char *field; | |
289 { | |
290 char *ignored; | |
291 return (get_keyword (field, &ignored) != ((char *) NULL)); | |
292 } | |
293 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
294 /* 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
|
295 into the buffer WHERE. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
296 Concatenate lines, putting just a space between them. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
297 Delete everything contained in parentheses. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
298 When a recipient name contains <...>, we discard |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
299 everything except what is inside the <...>. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
300 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
301 We don't pay attention to overflowing WHERE; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
302 the caller has to make it big enough. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
303 |
18 | 304 char * |
305 add_field (the_list, field, where) | |
306 line_list the_list; | |
307 register char *field, *where; | |
308 { | |
309 register char c; | |
310 while (true) | |
311 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
312 char *this_recipient_where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
313 int in_quotes = 0; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
314 |
18 | 315 *where++ = ' '; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
316 this_recipient_where = where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
317 |
18 | 318 while ((c = *field++) != '\0') |
319 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
320 if (c == '\\') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
321 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
322 else if (c == '"') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
323 { |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
324 in_quotes = ! in_quotes; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
325 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
326 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
327 else if (in_quotes) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
328 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
329 else if (c == '(') |
18 | 330 { |
331 while (*field && *field != ')') ++field; | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
332 if (! (*field++)) break; /* no close */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
333 continue; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
334 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
335 else if (c == ',') |
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 *where++ = ' '; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
338 /* When we get to the end of one recipient, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
339 don't discard it if the next one has <...>. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
340 this_recipient_where = where; |
18 | 341 } |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
342 else if (c == '<') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
343 /* Discard everything we got before the `<'. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
344 where = this_recipient_where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
345 else if (c == '>') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
346 /* Discard the rest of this name that follows the `>'. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
347 { |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
348 while (*field && *field != ',') ++field; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
349 if (! (*field++)) break; /* no comma */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
350 continue; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
351 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
352 else |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
353 *where++ = c; |
18 | 354 } |
355 if (the_list == NIL) break; | |
356 field = the_list->string; | |
357 the_list = the_list->continuation; | |
358 } | |
359 return where; | |
360 } | |
361 | |
362 line_list | |
363 make_file_preface () | |
364 { | |
365 char *the_string, *temp; | |
366 long idiotic_interface; | |
69697
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
367 struct tm *tm; |
18 | 368 long prefix_length; |
369 long user_length; | |
370 long date_length; | |
371 line_list result; | |
372 | |
373 prefix_length = strlen (FROM_PREFIX); | |
374 time (&idiotic_interface); | |
69697
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
375 /* 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
|
376 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
|
377 is set to a bizarre value. */ |
e112ec9aa49b
* b2m.c: Include <limits.h>.
Paul Eggert <eggert@twinsun.com>
parents:
68647
diff
changeset
|
378 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
|
379 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
|
380 && (the_date = asctime (tm)))) |
72034
ca1a855f01ae
(fatal): Drop second parameter and treat first
Andreas Schwab <schwab@suse.de>
parents:
70278
diff
changeset
|
381 fatal ("current time is out of range"); |
18 | 382 /* the_date has an unwanted newline at the end */ |
383 date_length = strlen (the_date) - 1; | |
384 the_date[date_length] = '\0'; | |
385 temp = cuserid ((char *) NULL); | |
386 user_length = strlen (temp); | |
387 the_user = alloc_string (user_length + 1); | |
388 strcpy (the_user, temp); | |
18841
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
389 the_string = alloc_string (3 + prefix_length |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
390 + user_length |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
391 + date_length); |
18 | 392 temp = the_string; |
393 strcpy (temp, FROM_PREFIX); | |
394 temp = &temp[prefix_length]; | |
395 *temp++ = ' '; | |
396 strcpy (temp, the_user); | |
397 temp = &temp[user_length]; | |
398 *temp++ = ' '; | |
399 strcpy (temp, the_date); | |
400 result = new_list (); | |
401 result->string = the_string; | |
402 result->continuation = ((line_list) NULL); | |
403 return result; | |
404 } | |
405 | |
406 void | |
407 write_line_list (the_list, the_stream) | |
408 register line_list the_list; | |
409 FILE *the_stream; | |
410 { | |
411 for ( ; | |
412 the_list != ((line_list) NULL) ; | |
413 the_list = the_list->continuation) | |
414 { | |
415 fputs (the_list->string, the_stream); | |
416 putc ('\n', the_stream); | |
417 } | |
418 return; | |
419 } | |
420 | |
421 int | |
422 close_the_streams () | |
423 { | |
424 register stream_list rem; | |
425 for (rem = the_streams; | |
426 rem != ((stream_list) NULL); | |
427 rem = rem->rest_streams) | |
428 no_problems = (no_problems && | |
429 ((*rem->action) (rem->handle) == 0)); | |
430 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
|
431 return (no_problems ? EXIT_SUCCESS : EXIT_FAILURE); |
18 | 432 } |
433 | |
434 void | |
435 add_a_stream (the_stream, closing_action) | |
436 FILE *the_stream; | |
437 int (*closing_action)(); | |
438 { | |
439 stream_list old = the_streams; | |
440 the_streams = new_stream (); | |
441 the_streams->handle = the_stream; | |
442 the_streams->action = closing_action; | |
443 the_streams->rest_streams = old; | |
444 return; | |
445 } | |
446 | |
447 int | |
448 my_fclose (the_file) | |
449 FILE *the_file; | |
450 { | |
451 putc ('\n', the_file); | |
452 fflush (the_file); | |
453 return fclose (the_file); | |
454 } | |
455 | |
456 boolean | |
457 open_a_file (name) | |
458 char *name; | |
459 { | |
460 FILE *the_stream = fopen (name, "a"); | |
461 if (the_stream != ((FILE *) NULL)) | |
462 { | |
463 add_a_stream (the_stream, my_fclose); | |
464 if (the_user == ((char *) NULL)) | |
465 file_preface = make_file_preface (); | |
466 write_line_list (file_preface, the_stream); | |
467 return true; | |
468 } | |
469 return false; | |
470 } | |
471 | |
472 void | |
473 put_string (s) | |
474 char *s; | |
475 { | |
476 register stream_list rem; | |
477 for (rem = the_streams; | |
478 rem != ((stream_list) NULL); | |
479 rem = rem->rest_streams) | |
480 fputs (s, rem->handle); | |
481 return; | |
482 } | |
483 | |
484 void | |
20 | 485 put_line (string) |
486 char *string; | |
18 | 487 { |
488 register stream_list rem; | |
489 for (rem = the_streams; | |
490 rem != ((stream_list) NULL); | |
491 rem = rem->rest_streams) | |
492 { | |
20 | 493 char *s = string; |
494 int column = 0; | |
495 | |
496 /* Divide STRING into lines. */ | |
497 while (*s != 0) | |
498 { | |
499 char *breakpos; | |
500 | |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
501 /* Find the last char that fits. */ |
20 | 502 for (breakpos = s; *breakpos && column < 78; ++breakpos) |
503 { | |
504 if (*breakpos == '\t') | |
505 column += 8; | |
506 else | |
507 column++; | |
508 } | |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
509 /* 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
|
510 if (*breakpos) |
20 | 511 { |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
512 /* 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
|
513 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
|
514 |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
515 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
|
516 { |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
517 /* 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
|
518 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
|
519 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
|
520 /* 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
|
521 ++breakpos; |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
522 } |
20 | 523 } |
524 /* Output that much, then break the line. */ | |
525 fwrite (s, 1, breakpos - s, rem->handle); | |
526 column = 8; | |
527 | |
528 /* Skip whitespace and prepare to print more addresses. */ | |
529 s = breakpos; | |
530 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
|
531 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
|
532 fputs ("\n\t", rem->handle); |
20 | 533 } |
18 | 534 putc ('\n', rem->handle); |
535 } | |
536 return; | |
537 } | |
538 | |
539 #define mail_error error | |
540 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
541 /* 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
|
542 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
|
543 Call open_a_file for each file. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
544 |
18 | 545 void |
546 setup_files (the_list, field) | |
547 register line_list the_list; | |
548 register char *field; | |
549 { | |
550 register char *start; | |
551 register char c; | |
552 while (true) | |
553 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
554 while (((c = *field) != '\0') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
555 && (c == ' ' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
556 || c == '\t' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
557 || c == ',')) |
18 | 558 field += 1; |
559 if (c != '\0') | |
560 { | |
561 start = field; | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
562 while (((c = *field) != '\0') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
563 && c != ' ' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
564 && c != '\t' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
565 && c != ',') |
18 | 566 field += 1; |
567 *field = '\0'; | |
568 if (!open_a_file (start)) | |
569 mail_error ("Could not open file %s", start); | |
570 *field = c; | |
571 if (c != '\0') continue; | |
572 } | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
573 if (the_list == ((line_list) NULL)) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
574 return; |
18 | 575 field = the_list->string; |
576 the_list = the_list->continuation; | |
577 } | |
578 } | |
579 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
580 /* 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
|
581 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
|
582 |
18 | 583 int |
584 args_size (the_header) | |
585 header the_header; | |
586 { | |
587 register header old = the_header; | |
588 register line_list rem; | |
589 register int size = 0; | |
590 do | |
591 { | |
592 char *field; | |
593 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
|
594 if ((strcmp (keyword, "TO") == 0) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
595 || (strcmp (keyword, "CC") == 0) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
596 || (strcmp (keyword, "BCC") == 0)) |
18 | 597 { |
598 size += 1 + strlen (field); | |
599 for (rem = the_header->text->continuation; | |
600 rem != NIL; | |
601 rem = rem->continuation) | |
602 size += 1 + strlen (rem->string); | |
603 } | |
604 the_header = the_header->next; | |
605 } while (the_header != old); | |
606 return size; | |
607 } | |
608 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
609 /* Scan the header described by the lists THE_HEADER, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
610 and put all recipient names into the buffer WHERE. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
611 Precede each recipient name with a space. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
612 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
613 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
|
614 |
21389
48690fd8d40a
(_XOPEN_SOURCE): Define for declaration of cuserid.
Andreas Schwab <schwab@suse.de>
parents:
18841
diff
changeset
|
615 void |
18 | 616 parse_header (the_header, where) |
617 header the_header; | |
618 register char *where; | |
619 { | |
620 register header old = the_header; | |
621 do | |
622 { | |
623 char *field; | |
624 register char *keyword = get_keyword (the_header->text->string, &field); | |
625 if (strcmp (keyword, "TO") == 0) | |
626 where = add_field (the_header->text->continuation, field, where); | |
627 else if (strcmp (keyword, "CC") == 0) | |
628 where = add_field (the_header->text->continuation, field, where); | |
629 else if (strcmp (keyword, "BCC") == 0) | |
630 { | |
631 where = add_field (the_header->text->continuation, field, where); | |
632 the_header->previous->next = the_header->next; | |
633 the_header->next->previous = the_header->previous; | |
634 } | |
635 else if (strcmp (keyword, "FCC") == 0) | |
636 setup_files (the_header->text->continuation, field); | |
637 the_header = the_header->next; | |
638 } while (the_header != old); | |
639 *where = '\0'; | |
640 return; | |
641 } | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
642 |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
643 /* 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
|
644 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
|
645 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
|
646 one for each line in that field. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
647 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
|
648 |
18 | 649 header |
650 read_header () | |
651 { | |
652 register header the_header = ((header) NULL); | |
653 register line_list *next_line = ((line_list *) NULL); | |
654 | |
655 init_linebuffer (&lb); | |
656 | |
657 do | |
658 { | |
659 long length; | |
660 register char *line; | |
661 | |
662 readline (&lb, stdin); | |
663 line = lb.buffer; | |
664 length = strlen (line); | |
665 if (length == 0) break; | |
666 | |
667 if (has_keyword (line)) | |
668 { | |
669 register header old = the_header; | |
670 the_header = new_header (); | |
671 if (old == ((header) NULL)) | |
672 { | |
673 the_header->next = the_header; | |
674 the_header->previous = the_header; | |
675 } | |
676 else | |
677 { | |
678 the_header->previous = old; | |
679 the_header->next = old->next; | |
680 old->next = the_header; | |
681 } | |
682 next_line = &(the_header->text); | |
683 } | |
684 | |
685 if (next_line == ((line_list *) NULL)) | |
686 { | |
687 /* 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
|
688 exit (EXIT_FAILURE); |
18 | 689 } |
690 *next_line = new_list (); | |
691 (*next_line)->string = alloc_string (length); | |
692 strcpy (((*next_line)->string), line); | |
693 next_line = &((*next_line)->continuation); | |
694 *next_line = NIL; | |
695 | |
696 } while (true); | |
697 | |
70278
8e7233f487a3
(read_header): Give fatal error if input has no header.
Richard M. Stallman <rms@gnu.org>
parents:
69790
diff
changeset
|
698 if (! the_header) |
8e7233f487a3
(read_header): Give fatal error if input has no header.
Richard M. Stallman <rms@gnu.org>
parents:
69790
diff
changeset
|
699 fatal ("input message has no header"); |
18 | 700 return the_header->next; |
701 } | |
702 | |
703 void | |
704 write_header (the_header) | |
705 header the_header; | |
706 { | |
707 register header old = the_header; | |
708 do | |
709 { | |
710 register line_list the_list; | |
711 for (the_list = the_header->text; | |
712 the_list != NIL; | |
713 the_list = the_list->continuation) | |
714 put_line (the_list->string); | |
715 the_header = the_header->next; | |
716 } while (the_header != old); | |
717 put_line (""); | |
718 return; | |
719 } | |
720 | |
15683 | 721 int |
18 | 722 main (argc, argv) |
723 int argc; | |
724 char **argv; | |
725 { | |
726 char *command_line; | |
727 header the_header; | |
728 long name_length; | |
729 char *mail_program_name; | |
730 char buf[BUFLEN + 1]; | |
731 register int size; | |
732 FILE *the_pipe; | |
733 | |
734 extern char *getenv (); | |
735 | |
736 mail_program_name = getenv ("FAKEMAILER"); | |
737 if (!(mail_program_name && *mail_program_name)) | |
91725 | 738 mail_program_name = MAIL_PROGRAM_NAME; |
18 | 739 name_length = strlen (mail_program_name); |
740 | |
741 my_name = MY_NAME; | |
742 the_streams = ((stream_list) NULL); | |
743 the_date = ((char *) NULL); | |
744 the_user = ((char *) NULL); | |
745 | |
746 the_header = read_header (); | |
747 command_line = alloc_string (name_length + args_size (the_header)); | |
748 strcpy (command_line, mail_program_name); | |
749 parse_header (the_header, &command_line[name_length]); | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
750 |
18 | 751 the_pipe = popen (command_line, "w"); |
752 if (the_pipe == ((FILE *) NULL)) | |
753 fatal ("cannot open pipe to real mailer"); | |
754 | |
755 add_a_stream (the_pipe, pclose); | |
756 | |
757 write_header (the_header); | |
758 | |
759 /* Dump the message itself */ | |
760 | |
761 while (!feof (stdin)) | |
762 { | |
763 size = fread (buf, 1, BUFLEN, stdin); | |
764 buf[size] = '\0'; | |
765 put_string (buf); | |
766 } | |
767 | |
768 exit (close_the_streams ()); | |
769 } | |
770 | |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
771 #endif /* not MSDOS */ |
18 | 772 #endif /* not BSD 4.2 (or newer) */ |
52401 | 773 |
774 /* arch-tag: acb0afa6-315a-4c5b-b9e3-def5725c8783 | |
775 (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
|
776 |
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
777 /* fakemail.c ends here */ |