OSDN Git Service

removed non-used codes and files.
[putex/putex.git] / src / texsourc / openinou.c
1 /* Copyright 1992 Karl Berry
2    Copyright 2007 TeX Users Group
3    Copyright 2014 Clerk Ma
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18    02110-1301 USA.  */
19
20 #ifdef _WINDOWS
21   #define NOCOMM
22   #define NOSOUND
23   #define NODRIVERS
24   #define STRICT
25   #pragma warning(disable:4115) // kill rpcasync.h complaint
26   #include <windows.h>
27   #define MYLIBAPI __declspec(dllexport)
28 #endif
29
30 #include "texwin.h"
31
32 #pragma warning(disable:4996)
33 #pragma warning(disable:4131) // old style declarator
34 #pragma warning(disable:4135) // conversion between different integral types
35 #pragma warning(disable:4127) // conditional expression is constant
36
37 #include <setjmp.h>
38
39 #include <direct.h>           /* for _getcwd() */
40
41 #define EXTERN extern
42
43 #include "texd.h"
44
45 #define PATH_SEP        '/'
46 #define PATH_SEP_STRING "/"
47
48 /* openinout.c: open input and output files. */
49
50 #define BUILDNAMEDIRECT         /* avoid malloc for string concat */
51
52 bool test_read_access (unsigned char *, int);   /* in ourpaths.c - bkph */
53
54 extern char *unixify (char *);      /* in pathsrch.c bkph */
55
56 extern void try_and_open (char *);    /* in local.c bkph */
57
58 extern int shorten_file_name;       /* in local.c bkph */
59
60 #ifdef FUNNY_CORE_DUMP
61 /* This is defined in ./texmf.c.  */
62 extern void funny_core_dump();
63 #endif /* FUNNY_CORE_DUMP */
64
65 #ifdef MSDOS
66
67 #ifdef BUILDNAMEDIRECT
68 /* kpathsea/concat.c */
69 /* kpathsea/concat3.c */
70 /* similar to concat, but AVOIDS using malloc, pass in place to put result */
71 char *xconcat (char *buffer, char *s1, char *s2)
72 {
73   int n1 = strlen(s1);
74   int n2 = strlen(s2);
75
76   if (buffer == s2)
77   {     /* treat special case of overlap */
78     memmove (buffer + n1, buffer, n2 + 1); /* trailing null ! */
79     strncpy (buffer, s1, n1);
80   }
81   else
82   {
83     strcpy(buffer, s1);
84     strcat(buffer + n1, s2);
85   }
86
87   return buffer;
88 }
89 /* similar to concat3, but avoids using malloc, pass in place to put result */
90 char *xconcat3 (char *buffer, char *s1, char *s2, char *s3)
91 {
92   int n1 = strlen(s1);
93   int n2 = strlen(s2);
94   int n3 = strlen(s3);
95
96   if (buffer == s3)
97   {     /* treat special case of overlap */
98     memmove (buffer + n1 + n2, buffer, n3 + 1); /* trailing null ! */
99     strncpy (buffer, s1, n1);
100     strncpy (buffer + n1, s2, n2);
101   }
102   else
103   {
104     strcpy(buffer, s1);
105     strcat(buffer + n1, s2);
106     strcat(buffer + n1 + n2, s3);
107   }
108   return buffer;
109 }
110 #endif /* end of BUILDNAMEDIRECT  */
111
112 #endif  /* end of ifdef MSDOS ??? */
113
114 #ifdef MSDOS
115 /* separated out 1996/Jan/20 to make easier to read */
116 /* assumes path does not end in PATH_SEP */
117 void patch_in_path (unsigned char *buffer, unsigned char *name, unsigned char *path)
118 {
119 #ifdef BUILDNAMEDIRECT
120   if (*path == '\0')
121     strcpy((char *) buffer, (char *) name);
122   else
123     xconcat3((char *) buffer, (char *) path, PATH_SEP_STRING, (char *) name);
124 #else
125   string temp_name;
126   temp_name = concat3 (path, PATH_SEP_STRING, name);
127   strcpy (buffer, temp_name);
128   free (temp_name);
129 #endif
130 }
131
132 int qualified (unsigned char * name)
133 {
134   if (strchr((char *) name, PATH_SEP) != NULL ||
135       strchr((char *) name, '\\') != NULL ||
136       strchr((char *) name, ':') != NULL)
137     return 1;
138   else
139     return 0;
140 }
141 /* patch path if 
142     (i)   path not empty
143     (ii)  name not qualified
144     (iii) ext match
145 */
146 int prepend_path_if (unsigned char *buffer, unsigned char *name, char *ext, unsigned char *path)
147 {
148   if (path == NULL)
149     return 0;
150
151   if (*path == '\0')
152     return 0;
153
154   if (qualified(name))
155     return 0;
156
157   if (strstr((char *)name, ext) == NULL)
158     return 0;
159
160   patch_in_path(buffer, name, path);
161
162   return 1;
163 }
164 #endif      /* end of MSDOS */
165
166 /*  Following works on null-terminated strings */
167
168 void check_short_name (unsigned char *s)
169 {
170   unsigned char *star, *sdot;
171   int n;
172
173   if ((star = (unsigned char *) strrchr((char *) s, '\\')) != NULL)
174     star++;
175   else if ((star = (unsigned char *) strrchr((char *) s, '/')) != NULL)
176     star++;
177   else if ((star = (unsigned char *) strchr((char *) s, ':')) != NULL)
178     star++;
179   else
180     star = s;
181
182   if ((sdot = (unsigned char *) strchr((char *) star, '.')) != NULL)
183     n = sdot - star;
184   else
185     n = strlen((char *) star);
186
187   if (n > 8)
188     strcpy((char *) star + 8, (char *) star + n);
189
190   if ((sdot = (unsigned char *) strchr((char *) star, '.')) != NULL)
191   {
192     star = sdot + 1;
193
194     n = strlen((char *) star);
195
196     if (n > 3)
197       *(star + 3) = '\0';
198   }
199 }
200
201 /* Following works on both null-terminated names */
202 /* reconvert 254 to '~' in file name 95/Sep/26 */
203 /* reconvert 255 to ' ' in file name 95/Sep/26 */
204 /* we do this in tex3.c start_input() -> scan_file_name() now 95/Sep/26 */
205 /* kpathsea/tilde.c */
206 void retwiddle (unsigned char *s)
207 {
208 /* assumes null terminated - 97/June/5 */
209 /*  while (*s != '\0' && *s != ' ') { */
210   while (*s != '\0')
211   {
212     if (*s == (unsigned char) pseudo_tilde)
213       *s = '~';
214     else if (*s == (unsigned char) pseudo_space)
215       *s = ' ';
216     s++;
217   }
218 }
219
220 /* in lib/openclose.c */
221 bool open_input (FILE **f, path_constant_type path_index, char *fopen_mode)
222 {
223   bool openable = false;
224
225 #if defined (FUNNY_CORE_DUMP) && !defined (BibTeX)
226   if (path_index == TEXINPUTPATH &&
227       strncmp (name_of_file + 1, "HackyInputFileNameForCoreDump.tex", 33) == 0)
228     funny_core_dump();
229 #endif /* FUNNY_CORE_DUMP and not BibTeX */
230
231 #ifdef MSDOS
232   if (return_flag)
233   {
234     if (strcmp(fopen_mode, "r") == 0)
235       fopen_mode = "rb";    /* so can catch `return' bkph */
236   }
237 #endif /* MSDOS */
238
239   name_of_file[name_length + 1] = '\0'; /* null terminate */
240
241 /* reinsert '~' and ' ' in file names -  95/June/5 */
242 /* done late to prevent problems with  null_terminate / space_terminate */  
243   if (pseudo_tilde != 0 || pseudo_space != 0)
244     retwiddle(name_of_file + 1);
245
246 #ifdef MSDOS
247 /* 8 + 3 file names on Windows NT 95/Feb/20 */
248   if (shorten_file_name)
249   {
250     check_short_name(name_of_file + 1);
251   }
252 #endif  /* MSDOS */
253   
254   if (open_trace_flag)
255   {
256     sprintf(log_line, " Open `%s' for input ", name_of_file + 1); /* Pascal */
257     show_line(log_line, 0);
258   }
259
260   if (test_read_access(name_of_file + 1, path_index))
261   {
262     *f = xfopen((char *) name_of_file + 1, fopen_mode);
263
264 #ifdef MSDOS
265     if (name_of_file[1] == '.' && (name_of_file[2] == PATH_SEP || name_of_file[2] == '\\'))
266 #else
267     if (name_of_file[1] == '.' && name_of_file[2] == PATH_SEP)
268 #endif
269     {
270       unsigned i = 1;
271
272       while (name_of_file[i + 2] != '\0')
273       {
274         name_of_file[i] = name_of_file[i + 2];
275         i++;
276       }
277
278       name_of_file[i] = '\0';
279       name_length = i - 1;
280     }
281     else
282       name_length = strlen((char *) name_of_file + 1);
283       
284 #ifdef TeX
285     if (path_index == TFMFILEPATH)
286     {
287       tfm_temp = getc (*f);
288     }
289 #endif /* TeX */  
290
291 #ifdef MSDOS
292     if (strstr((char *) name_of_file + 1, ".fmt") != NULL)
293     {
294       if (format_file == NULL)
295       {
296         format_file = xstrdup((char *) name_of_file + 1);
297       }
298     }
299     else if (strstr((char *)name_of_file + 1, ".poo") != NULL)
300     {
301       if (string_file == NULL)
302       {
303         string_file = xstrdup((char *) name_of_file + 1);
304       }
305     }
306     else if (strstr((char *)name_of_file+1, ".tfm") != NULL)
307     {
308       if (show_tfm_flag && log_opened)
309       {
310 #ifdef WRAPLINES
311         int old_setting = selector;
312         char *s = name_of_file + 1;
313         selector = log_only;
314         print_char(' ');
315         print_char('(');
316
317         while (*s != '\0')
318           print_char (*s++);
319
320         print_char(')');
321         selector = old_setting;
322 #else
323         int n; 
324         n = strlen((char *) name_of_file + 1);
325
326         if (file_offset + n > max_print_line)
327         {
328           putc('\n', log_file);
329           file_offset = 0;
330         }
331         else
332           putc(' ', log_file);
333
334         fprintf(log_file, "(%s)", name_of_file + 1);
335         file_offset += n+3;
336 /*        space_terminate (name_of_file + 1);  */
337 #endif  /*  end of WRAPLINES */
338       }
339     }
340 /*    code added 98/Sep/29 to catch first file input */
341 /*    is there a problem if this file bombs ? */
342     else if (source_direct == NULL) /* 98/Sep/29 */
343     {
344       char *s;
345
346       source_direct = xstrdup((char *) name_of_file + 1);
347
348       if (trace_flag)
349       {
350         sprintf(log_line, "Methinks the source %s is `%s'\n", "file", source_direct);
351         show_line(log_line, 0);
352       }
353
354       if ((s = strrchr(source_direct, '/')) == NULL)
355         *source_direct = '\0';
356       else
357         *(s+1) = '\0';
358
359       if (trace_flag)
360       {
361         sprintf(log_line, "Methinks the source %s is `%s'\n", "directory", source_direct);
362         show_line(log_line, 0);
363       }
364     }
365 #endif  /* end of MSDOS */
366     openable = true;
367   }
368 /*  space_terminate (name_of_file + 1); */
369   {
370     unsigned temp_length = strlen((char *) name_of_file + 1);
371     name_of_file[temp_length + 1] = ' ';  /* space terminate */
372 /*    set up name_length ??? */
373   }
374
375   return openable;
376 }
377
378 /* Call the external program PROGRAM, passing it `name_of_file'.  */
379 /* This nonsense probably only works for Unix anyway. bkph */
380 /* For one thing, MakeTeXTFM etc is more than 8 characters ! */
381
382 #ifdef MSDOS
383   #define NO_MAKETEX
384 #endif
385
386 #define TEXONLY
387
388 char *get_env_shroud (char *);    /* defined in texmf.c */
389
390 /* char outputdirectory[PATH_MAX]; */       /* defined in local.c */
391
392 extern char * dvi_directory; /* defined in local.c */
393 extern char * log_directory; /* defined in local.c */
394 extern char * aux_directory; /* defined in local.c */
395 extern char * fmt_directory; /* defined in local.c */
396 extern char * pdf_directory; /* defined in local.c */
397
398 /* At least check for I/O error (such as disk full) when closing */
399 /* Would be better to check while writing - but this is better than nothing */
400 /* This is used for both input and output files, but never mind ... */
401
402 /* now a_close returns -1 on error --- which could be used by caller */
403 /* probably want to ignore on input files ... */
404
405 void perrormod (char *s);       /* in local.c */
406
407 // check_fclose not used by anything
408 /* 1993/Nov/20 - bkph */
409 int check_fclose (FILE * f)
410 {
411   if (f == NULL)
412     return 0;      // sanity check
413
414   if (ferror(f) || fclose (f))
415   {
416     perrormod("\n! I/O Error");
417     uexit (1);    // ???
418   }
419
420   return 0;
421 }
422
423 /* open_output moved down here to avoid potential pragma problem */
424
425 bool open_output (FILE **f, char *fopen_mode)
426 {
427   unsigned temp_length;
428
429   name_of_file[name_length + 1] = '\0'; /* null terminate */
430
431   if (pseudo_tilde != 0 || pseudo_space !=  0)
432   {
433     retwiddle(name_of_file + 1);
434   }
435
436 #ifdef MSDOS
437 /* 8 + 3 file names on Windows NT 95/Feb/20 */
438   if (shorten_file_name)
439   {
440     check_short_name(name_of_file + 1);
441   }
442 #endif
443
444 #ifdef MSDOS
445
446   if (prepend_path_if (name_of_file + 1, name_of_file + 1, ".dvi", (unsigned char *) dvi_directory) ||
447       prepend_path_if (name_of_file + 1, name_of_file + 1, ".log", (unsigned char *) log_directory) ||
448       prepend_path_if (name_of_file + 1, name_of_file + 1, ".aux", (unsigned char *) aux_directory) ||
449       prepend_path_if (name_of_file + 1, name_of_file + 1, ".fmt", (unsigned char *) fmt_directory) ||
450       prepend_path_if (name_of_file + 1, name_of_file + 1, ".pdf", (unsigned char *) pdf_directory))
451   {
452     if (open_trace_flag)
453     {
454       sprintf(log_line, "After prepend %s\n", name_of_file+1);
455       show_line(log_line, 0);
456     }
457   }
458 #endif
459
460   if (open_trace_flag)
461   {
462     sprintf(log_line, " Open `%s' for output ", name_of_file + 1);
463     show_line(log_line, 0);
464   }
465
466 /* Is the filename openable as given?  */
467
468 /*  if share_flag is non-zero and we are opening for reading use fsopen */
469 /*  but we can assume this is opening here for *output* */
470   *f = fopen((char *) name_of_file + 1, fopen_mode);
471
472 /* Can't open as given.  Try the envvar.  */
473   if (*f == NULL)
474   {
475     string temp_dir = get_env_shroud ("UFYNGPVU");
476
477 /*    if (deslash) unixify(temp_dir); */    /* deslashify 93/Dec/28 */
478
479     if (temp_dir != NULL)
480     {
481 #ifdef BUILDNAMEDIRECT
482       unsigned char temp_name[PATH_MAX];
483       xconcat3((char *) temp_name, temp_dir, PATH_SEP_STRING, (char *) name_of_file + 1);
484 #else
485 /*    string temp_name = concat3 (temp_dir, "/", name_of_file + 1); */
486       string temp_name = concat3 (temp_dir, PATH_SEP_STRING, name_of_file + 1);
487 #endif
488       if (deslash)
489         unixify((char *) temp_name);     /* deslashify 93/Dec/28 */
490 /*  If share_flag is non-zero and we are opening for reading use fsopen */
491 /*  but we can assume this is opening here for *output* */
492       *f = fopen((char*)temp_name, fopen_mode);
493 /*  If this succeeded, change name_of_file accordingly.  */
494       if (*f)
495         strcpy((char*) name_of_file + 1, (char *) temp_name);
496 #ifndef BUILDNAMEDIRECT
497       free (temp_name);
498 #endif
499     }
500   }
501
502   if (strstr((char *) name_of_file + 1, ".dvi") != NULL)
503   {
504     if (qualified(name_of_file + 1))
505       *log_line = '\0';
506     else
507     {
508       (void) _getcwd(log_line, sizeof(log_line));
509       strcat(log_line, PATH_SEP_STRING);
510     }
511
512     strcat(log_line, (char*) name_of_file + 1);
513     unixify(log_line);
514     dvi_file_name = xstrdup(log_line);
515   }
516   else if (strstr((char *)name_of_file + 1, ".log") != NULL)
517   {
518     if (qualified(name_of_file + 1))
519       *log_line = '\0';
520     else
521     {
522       (void) _getcwd(log_line, sizeof(log_line));
523       strcat(log_line, PATH_SEP_STRING);
524     }
525
526     strcat(log_line, (char *) name_of_file + 1);
527     unixify(log_line);
528     log_file_name = xstrdup(log_line);
529   }
530
531   temp_length = strlen ((char *)name_of_file + 1);
532   name_of_file[temp_length+1] = ' ';
533
534   if (*f)
535     name_length = temp_length;
536   
537   return *f != NULL;
538 }