1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#include "mktex.h"
#include "stackenv.h"
#include "variables.h"
#include "fileutils.h"
void __cdecl output_and_cleanup(int code)
{
FILE *f;
string line;
if (code == 0) {
/* output result if any */
if ((f = fopen(getval("STDOUT"), "r")) != NULL) {
if (redirect_stdout >= 0) {
int fds[3];
fds[0] = 0;
fds[1] = redirect_stdout;
fds[2] = 2;
push_fd(fds);
}
while((line = read_line(f)) != NULL) {
fputs(line, stdout);
free (line);
}
fclose(f);
if (redirect_stdout >= 0) {
pop_fd();
redirect_stdout = -1;
}
}
}
if (test_file('d', tmpdir))
rec_rmdir(tmpdir);
{
int count = 0;
/* Give more than one chance to remove the files */
while ((count++ < 20) && test_file('d', tmpdir)) {
Sleep(250);
rec_rmdir(tmpdir);
}
}
}
int main(int argc, char* argv[])
{
program_description * program = 0;
int i, errstatus;
#if defined(WIN32)
/* if _DEBUG is not defined, these macros will result in nothing. */
SETUP_CRTDBG;
/* Set the debug-heap flag so that freed blocks are kept on the
linked list, to catch any inadvertent use of freed memory */
SET_CRT_DEBUG_FIELD( _CRTDBG_DELAY_FREE_MEM_DF );
#endif
redirect_stdout = -1;
output_and_cleanup_function = output_and_cleanup;
#if 0
extern MKTEXDLL string (* var_lookup)(const_string);
var_lookup = getval;
#endif
mktexinit(argc, argv);
for(i = 0; makedesc[i].name; ++i) {
if (FILESTRCASEEQ(kpse_program_name, makedesc[i].name)) {
program_number = i;
progname = makedesc[i].name;
program = makedesc+i;
break;
}
}
if (!makedesc[i].name) {
fprintf(stderr, "This program was incorrectly copied to the name %s\n",
argv[0]);
return 1;
}
/* mktex_opt may modify argc and shift argv */
argc = mktex_opt(argc, argv, program);
errstatus = program->prog(argc, argv);
mt_exit(errstatus);
return 0; /* Not reached !!! */
}
|