XEmacs 21.2.40 "Persephone".
[chise/xemacs-chise.git.1] / lib-src / cvtmail.c
1 /* Copyright (C) 1985, 1993, 1994 Free Software Foundation
2 This file is part of GNU Emacs.
3
4 GNU Emacs is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
7 any later version.
8
9 GNU Emacs is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with GNU Emacs; see the file COPYING.  If not, write to
16 the Free the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA.  */
18
19 /* Synched up with: FSF 19.28. */
20
21 /* cvtmail:
22  * Program to convert oldstyle goslings emacs mail directories into
23  * gnu-rmail format.  Program expects a directory called Messages to
24  * exist in your home directory, containing individual mail messages in
25  * separate files in the standard gosling emacs mail reader format.
26  *
27  * Program takes one argument: an output file.  This file will contain
28  * all the messages in Messages directory, in berkeley mail format.
29  * If no output file is mentioned, messages are put in ~/OMAIL.
30  *
31  * In order to get rmail to read the messages, the resulting file must
32  * be mv'ed to ~/mbox, and then have rmail invoked on them.
33  *
34  * Author: Larry Kolodney, 1985
35  */
36
37
38 #include <config.h>
39
40 #include <stdio.h>
41 #include <string.h>
42 #include <stdlib.h>
43
44 static void *xmalloc (size_t);
45 static void *xrealloc (void *, size_t);
46 static void skip_to_lf (FILE *stream);
47 static void fatal (const char *s1, const char *s2);
48 static void error (const char *s1, const char *s2);
49
50 int
51 main (int argc, char *argv[])
52 {
53   char *hd;
54   char *md;
55   char *mdd;
56   char *mfile;
57   char *cf;
58   int cflen;
59   FILE *mddf;
60   FILE *mfilef;
61   FILE *cff;
62   char pre[10];
63   char name[14];
64   int c;
65
66   hd = getenv ("HOME");
67
68   md = (char *) xmalloc (strlen (hd) + 10);
69   strcpy (md, hd);
70   strcat (md, "/Messages");
71
72   mdd = (char *) xmalloc (strlen (md) + 11);
73   strcpy (mdd, md);
74   strcat (mdd, "/Directory");
75
76   cflen = 100;
77   cf = (char *) xmalloc (cflen);
78
79   mddf = fopen (mdd, "r");
80   if (argc > 1)
81     mfilef = fopen (argv[1], "w");
82   else
83     {
84       mfile = (char *) xmalloc (strlen (hd) + 7);
85       strcpy (mfile, hd);
86       strcat (mfile, "/OMAIL");
87       mfilef = fopen (mfile, "w");
88     }
89   skip_to_lf (mddf);
90   while (fscanf (mddf, "%4c%14[0123456789]", pre, name) != EOF)
91     {
92       int comp_len = strlen (md) + strlen (name) + 2;
93       if (cflen < comp_len)
94         {
95           cflen = strlen (md) + strlen (name) + 2;
96           cf = (char *) xrealloc (cf, cflen);
97         }
98       strcpy (cf, md);
99       strcat (cf,"/");
100       strcat (cf, name);
101       cff = fopen (cf, "r");
102       while ((c = getc(cff)) != EOF)
103         putc (c, mfilef);
104       putc ('\n', mfilef);
105       skip_to_lf (mddf);
106      fclose (cff);
107     }
108   fclose (mddf);
109   fclose (mfilef);
110   return 0;
111 }
112
113 static void
114 skip_to_lf (FILE *stream)
115 {
116   register int c;
117   while ((c = getc(stream)) != '\n')
118     ;
119 }
120
121 static void *
122 xmalloc (size_t size)
123 {
124   void *result = malloc (size);
125   if (!result)
126     fatal ("virtual memory exhausted", 0);
127   return result;
128 }
129
130 static void *
131 xrealloc (void *ptr, size_t size)
132 {
133   void *result = realloc (ptr, size);
134   if (!result)
135     fatal ("virtual memory exhausted", 0);
136   return result;
137 }
138
139 /* Print error message and exit.  */
140
141 static void
142 fatal (const char *s1, const char *s2)
143 {
144   error (s1, s2);
145   exit (1);
146 }
147
148 static void
149 error (const char *s1, const char *s2)
150 {
151   fprintf (stderr, "cvtmail: ");
152   fprintf (stderr, s1, s2);
153   fprintf (stderr, "\n");
154 }