~ubuntu-branches/ubuntu/jaunty/luatex/jaunty

« back to all changes in this revision

Viewing changes to src/texk/web2c/web2c/splitup.c

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Preining
  • Date: 2007-09-24 12:56:11 UTC
  • Revision ID: james.westby@ubuntu.com-20070924125611-a8ge689azbptxvla
Tags: upstream-0.11.2
ImportĀ upstreamĀ versionĀ 0.11.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
3
   as its output.
 
4
 
 
5
   Tim Morgan  September 19, 1987.  */
 
6
 
 
7
#include "config.h"
 
8
#include <kpathsea/getopt.h>
 
9
 
 
10
#ifdef VMS
 
11
#define unlink delete
 
12
#endif
 
13
 
 
14
char *program_invocation_name;
 
15
int filenumber = 0, ifdef_nesting = 0, lines_in_file = 0;
 
16
char *output_name = NULL;
 
17
boolean has_ini;
 
18
 
 
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
 
23
   in 'convert'. */
 
24
long int max_lines;
 
25
 
 
26
/* Do we split out a separate *ini.c file? */
 
27
boolean do_ini;
 
28
 
 
29
/* Don't need long filenames, since we generate them all.  */
 
30
char buffer[1024], tempfile[100], filename[100], ini_name[100];
 
31
 
 
32
FILE *out, *ini, *temp;
 
33
 
 
34
/*
 
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.
 
39
 */
 
40
int
 
41
read_line P1H(void)
 
42
{
 
43
  if (fgets (buffer, sizeof (buffer), stdin) == NULL)
 
44
    return false;
 
45
  if (strncmp (buffer, "#ifdef", 6) == 0
 
46
      || strncmp (buffer, "#ifndef", 7) == 0)
 
47
    {
 
48
      ++ifdef_nesting;
 
49
      if (strncmp (&buffer[7], "INI", 3) == 0)
 
50
        has_ini = true;
 
51
    }
 
52
  else if (strncmp (buffer, "#endif", 6) == 0)
 
53
    --ifdef_nesting;
 
54
  return true;
 
55
}
 
56
 
 
57
int
 
58
main P2C(int, argc, string *, argv)
 
59
{
 
60
  string coerce;
 
61
  unsigned coerce_len;
 
62
  int option;
 
63
 
 
64
  program_invocation_name = argv[0];
 
65
  
 
66
  while ((option = getopt(argc, argv, "il:")) != -1) {
 
67
    switch (option) {
 
68
    case 'i':
 
69
      do_ini = true;
 
70
      break;
 
71
    case 'l':
 
72
      max_lines = atoi(optarg);
 
73
      if (max_lines <= 0)
 
74
        FATAL("[-i] [-l lines] name");
 
75
      break;
 
76
    default:
 
77
      FATAL("[-i] [-l lines] name");
 
78
      break;
 
79
    }
 
80
  }
 
81
  if (optind + 1 != argc)
 
82
    FATAL("[-i] [-l lines] name");
 
83
  output_name = argv[optind];
 
84
 
 
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);
 
91
  
 
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";
 
125
  } else
 
126
    FATAL1 ("Can only split mf, mp, tex, etex, omega, eomega, aleph, luatex, pdf[e]tex, or xetex,\n not %s", output_name);
 
127
  
 
128
  coerce_len = strlen (coerce);
 
129
  
 
130
  /* Read everything up to coerce.h.  */
 
131
  while (fgets (buffer, sizeof (buffer), stdin))
 
132
    {
 
133
      if (strncmp (&buffer[10], coerce, coerce_len) == 0)
 
134
        break;
 
135
 
 
136
      if (buffer[0] == '#' || buffer[0] == '\n' || buffer[0] == '}'
 
137
          || buffer[0] == '/' || buffer[0] == ' '
 
138
          || strncmp (buffer, "typedef", 7) == 0)
 
139
        /*nothing */ ;
 
140
      else
 
141
        fputs ("EXTERN ", out);
 
142
 
 
143
      fputs (buffer, out);
 
144
    }
 
145
 
 
146
  if (strncmp (&buffer[10], coerce, coerce_len) != 0)
 
147
    FATAL1 ("No #include %s line", coerce);
 
148
 
 
149
  fputs (buffer, out);
 
150
  xfclose (out, filename);
 
151
 
 
152
  if (do_ini) {
 
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);
 
157
  }
 
158
 
 
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);
 
163
 
 
164
  do
 
165
    {
 
166
      /* Read one routine into a temp file */
 
167
      has_ini = false;
 
168
      temp = xfopen (tempfile, "w+");
 
169
 
 
170
      while (read_line ())
 
171
        {
 
172
          fputs (buffer, temp);
 
173
          if (buffer[0] == '}')
 
174
            break;              /* End of procedure */
 
175
        }
 
176
      while (ifdef_nesting > 0 && read_line ())
 
177
        fputs (buffer, temp);
 
178
      rewind (temp);
 
179
 
 
180
      if (do_ini && has_ini)
 
181
        {                       /* Contained "#ifdef INI..." */
 
182
          while (fgets (buffer, sizeof (buffer), temp))
 
183
            fputs (buffer, ini);
 
184
        }
 
185
      else
 
186
        {                       /* Doesn't contain "#ifdef INI..." */
 
187
          while (fgets (buffer, sizeof (buffer), temp))
 
188
            {
 
189
              fputs (buffer, out);
 
190
              lines_in_file++;
 
191
            }
 
192
        }
 
193
      xfclose (temp, tempfile);
 
194
 
 
195
      /* Switch to new output file.  */
 
196
      if (max_lines && lines_in_file > max_lines)
 
197
        {
 
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);
 
203
          lines_in_file = 0;
 
204
        }
 
205
    }
 
206
  while (!feof (stdin));
 
207
 
 
208
  xfclose (out, filename);
 
209
  if (lines_in_file == 0)
 
210
    unlink (filename);
 
211
 
 
212
  if (do_ini)
 
213
    xfclose (ini, ini_name);
 
214
 
 
215
  if (unlink (tempfile)) {
 
216
      perror (tempfile);
 
217
      exit (EXIT_FAILURE);
 
218
  }
 
219
 
 
220
  return EXIT_SUCCESS;
 
221
}