1
/* splitup -- take TeX or MF in C as a single stream on stdin,
2
and it produces several .c and .h files in the current directory
5
Tim Morgan September 19, 1987. */
8
#include <kpathsea/getopt.h>
14
char *program_invocation_name;
15
int filenumber = 0, ifdef_nesting = 0, lines_in_file = 0;
16
char *output_name = NULL;
19
/* This used to be a fixed 2000, but since bibtex.c is almost 10000 lines
20
(200+K), we may as well decrease the number of split files we create.
21
Probably faster for the compiler, definitely faster for the linker,
22
simpler for the Makefiles, and generally better. Now we specify this
26
/* Do we split out a separate *ini.c file? */
29
/* Don't need long filenames, since we generate them all. */
30
char buffer[1024], tempfile[100], filename[100], ini_name[100];
32
FILE *out, *ini, *temp;
35
* Read a line of input into the buffer, returning `false' on EOF.
36
* If the line is of the form "#ifdef INI...", we set "has_ini"
37
* `true' else `false'. We also keep up with the #ifdef/#endif nesting
38
* so we know when it's safe to finish writing the current file.
43
if (fgets (buffer, sizeof (buffer), stdin) == NULL)
45
if (strncmp (buffer, "#ifdef", 6) == 0
46
|| strncmp (buffer, "#ifndef", 7) == 0)
49
if (strncmp (&buffer[7], "INI", 3) == 0)
52
else if (strncmp (buffer, "#endif", 6) == 0)
58
main P2C(int, argc, string *, argv)
64
program_invocation_name = argv[0];
66
while ((option = getopt(argc, argv, "il:")) != -1) {
72
max_lines = atoi(optarg);
74
FATAL("[-i] [-l lines] name");
77
FATAL("[-i] [-l lines] name");
81
if (optind + 1 != argc)
82
FATAL("[-i] [-l lines] name");
83
output_name = argv[optind];
85
sprintf (filename, "%sd.h", output_name);
86
sprintf (tempfile, "%s.tmp", output_name);
87
out = xfopen (filename, FOPEN_W_MODE);
88
fputs ("#undef TRIP\n#undef TRAP\n", out);
89
/* We have only one binary that can do both ini stuff and vir stuff. */
90
fputs ("#define STAT\n#define INI\n", out);
92
if (STREQ (output_name, "mf")) {
93
fputs ("#define INIMF\n#define MF\n", out);
94
coerce = "mfcoerce.h";
95
} else if (STREQ (output_name, "tex")) {
96
fputs ("#define INITEX\n#define TeX\n", out);
97
coerce = "texcoerce.h";
98
} else if (STREQ (output_name, "aleph")) {
99
fputs ("#define INITEX\n#define TeX\n#define Aleph\n", out);
100
coerce = "alephcoerce.h";
101
} else if (STREQ (output_name, "eomega")) {
102
fputs ("#define INITEX\n#define TeX\n#define eOmega\n", out);
103
coerce = "eomegacoerce.h";
104
} else if (STREQ (output_name, "etex")) {
105
fputs ("#define INITEX\n#define TeX\n#define eTeX\n", out);
106
coerce = "etexcoerce.h";
107
} else if (STREQ (output_name, "omega")) {
108
fputs ("#define INITEX\n#define TeX\n#define Omega\n", out);
109
coerce = "omegacoerce.h";
110
} else if (STREQ (output_name, "pdftex")) {
111
fputs ("#define INITEX\n#define TeX\n#define pdfTeX\n", out);
112
coerce = "pdftexcoerce.h";
113
} else if (STREQ (output_name, "luatex")) {
114
fputs ("#define INITEX\n#define TeX\n#define luaTeX\n", out);
115
coerce = "luatexcoerce.h";
116
} else if (STREQ (output_name, "pdfetex")) {
117
fputs ("#define INITEX\n#define TeX\n#define pdfeTeX\n", out);
118
coerce = "pdfetexcoerce.h";
119
} else if (STREQ (output_name, "xetex")) {
120
fputs ("#define INITEX\n#define TeX\n#define XeTeX\n", out);
121
coerce = "xetexcoerce.h";
122
} else if (STREQ (output_name, "mp")) {
123
fputs ("#define INIMP\n#define MP\n", out);
124
coerce = "mpcoerce.h";
126
FATAL1 ("Can only split mf, mp, tex, etex, omega, eomega, aleph, luatex, pdf[e]tex, or xetex,\n not %s", output_name);
128
coerce_len = strlen (coerce);
130
/* Read everything up to coerce.h. */
131
while (fgets (buffer, sizeof (buffer), stdin))
133
if (strncmp (&buffer[10], coerce, coerce_len) == 0)
136
if (buffer[0] == '#' || buffer[0] == '\n' || buffer[0] == '}'
137
|| buffer[0] == '/' || buffer[0] == ' '
138
|| strncmp (buffer, "typedef", 7) == 0)
141
fputs ("EXTERN ", out);
146
if (strncmp (&buffer[10], coerce, coerce_len) != 0)
147
FATAL1 ("No #include %s line", coerce);
150
xfclose (out, filename);
153
sprintf (ini_name, "%sini.c", output_name);
154
ini = xfopen (ini_name, FOPEN_W_MODE);
155
fputs ("#define EXTERN extern\n", ini);
156
fprintf (ini, "#include \"%sd.h\"\n\n", output_name);
159
sprintf (filename, "%s0.c", output_name);
160
out = xfopen (filename, FOPEN_W_MODE);
161
fputs ("#define EXTERN extern\n", out);
162
fprintf (out, "#include \"%sd.h\"\n\n", output_name);
166
/* Read one routine into a temp file */
168
temp = xfopen (tempfile, "w+");
172
fputs (buffer, temp);
173
if (buffer[0] == '}')
174
break; /* End of procedure */
176
while (ifdef_nesting > 0 && read_line ())
177
fputs (buffer, temp);
180
if (do_ini && has_ini)
181
{ /* Contained "#ifdef INI..." */
182
while (fgets (buffer, sizeof (buffer), temp))
186
{ /* Doesn't contain "#ifdef INI..." */
187
while (fgets (buffer, sizeof (buffer), temp))
193
xfclose (temp, tempfile);
195
/* Switch to new output file. */
196
if (max_lines && lines_in_file > max_lines)
198
xfclose (out, filename);
199
sprintf (filename, "%s%d.c", output_name, ++filenumber);
200
out = xfopen (filename, FOPEN_W_MODE);
201
fputs ("#define EXTERN extern\n", out);
202
fprintf (out, "#include \"%sd.h\"\n\n", output_name);
206
while (!feof (stdin));
208
xfclose (out, filename);
209
if (lines_in_file == 0)
213
xfclose (ini, ini_name);
215
if (unlink (tempfile)) {