home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / gnuish / make358.arc / patches1 < prev    next >
Text File  |  1990-09-22  |  197KB  |  6,917 lines

  1. diff -cBdNp e:/gnu/make/gnu/ar.c ./ar.c
  2. *** e:/gnu/make/gnu/ar.c    Tue Jul 24 00:52:34 1990
  3. --- ./ar.c    Tue Jul 24 00:53:36 1990
  4. *************** You should have received a copy of the G
  5. *** 15,27 ****
  6. --- 15,53 ----
  7.   along with GNU Make; see the file COPYING.  If not, write to
  8.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  9.   
  10. + /*
  11. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  12. +  *
  13. +  * To this port, the same copying conditions apply as to the
  14. +  * original release.
  15. +  *
  16. +  * IMPORTANT:
  17. +  * This file is not identical to the original GNU release!
  18. +  * You should have received this code as patch to the official
  19. +  * GNU release.
  20. +  *
  21. +  * MORE IMPORTANT:
  22. +  * This port comes with ABSOLUTELY NO WARRANTY.
  23. +  *
  24. +  * $Header: e:/gnu/make/RCS/ar.c'v 3.58.0.2 90/07/18 10:17:58 tho Exp $
  25. +  */
  26.   #include "make.h"
  27.   #include "file.h"
  28.   
  29.   
  30. + #ifdef MSDOS
  31. + /* Defined in zipscan.c.  */
  32. + extern long ar_scan (char *archive, long (*f) (int, char *, long, long, long,
  33. +              long, int, int, int, long), long arg);
  34. + extern long ar_name_equal (char *name, char *mem);
  35. + extern long ar_member_touch (char *arname, char *memname);
  36. + #else /* not MSDOS */
  37.   /* Defined in arscan.c.  */
  38.   extern long int ar_scan ();
  39.   extern int ar_member_touch ();
  40. + #endif /* not MSDOS */
  41.   
  42.   
  43.   /* Return nonzero if NAME is an archive-member reference, zero if not.
  44. *************** ar_member_date (name)
  45. *** 71,77 ****
  46.     /* Make sure we know the modtime of the archive itself because
  47.        we are likely to be called just before commands to remake a
  48.        member are run, and they will change the archive itself.  */
  49. !   (void) f_mtime (enter_file (arname));
  50.   
  51.     val = ar_scan (arname, ar_member_date_1, (long int) memname);
  52.   
  53. --- 97,103 ----
  54.     /* Make sure we know the modtime of the archive itself because
  55.        we are likely to be called just before commands to remake a
  56.        member are run, and they will change the archive itself.  */
  57. !   (void) f_mtime (enter_file (arname), 0);
  58.   
  59.     val = ar_scan (arname, ar_member_date_1, (long int) memname);
  60.   
  61. *************** ar_touch (name)
  62. *** 115,121 ****
  63.   
  64.     /* Make sure we know the modtime of the archive itself before we
  65.        touch the member, since this will change the archive itself.  */
  66. !   (void) f_mtime (enter_file (arname));
  67.   
  68.     val = 1;
  69.     switch (ar_member_touch (arname, memname))
  70. --- 142,148 ----
  71.   
  72.     /* Make sure we know the modtime of the archive itself before we
  73.        touch the member, since this will change the archive itself.  */
  74. !   (void) f_mtime (enter_file (arname), 0);
  75.   
  76.     val = 1;
  77.     switch (ar_member_touch (arname, memname))
  78. diff -cBdNp e:/gnu/make/gnu/commands.c ./commands.c
  79. *** e:/gnu/make/gnu/commands.c    Tue Jul 24 00:52:38 1990
  80. --- ./commands.c    Tue Jul 24 00:53:42 1990
  81. *************** You should have received a copy of the G
  82. *** 16,21 ****
  83. --- 16,38 ----
  84.   along with GNU Make; see the file COPYING.  If not, write to
  85.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  86.   
  87. + /*
  88. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  89. +  *
  90. +  * To this port, the same copying conditions apply as to the
  91. +  * original release.
  92. +  *
  93. +  * IMPORTANT:
  94. +  * This file is not identical to the original GNU release!
  95. +  * You should have received this code as patch to the official
  96. +  * GNU release.
  97. +  *
  98. +  * MORE IMPORTANT:
  99. +  * This port comes with ABSOLUTELY NO WARRANTY.
  100. +  *
  101. +  * $Header: e:/gnu/make/RCS/commands.c'v 3.58.0.3 90/07/18 22:23:13 tho Exp $
  102. +  */
  103.   #include "make.h"
  104.   #include "dep.h"
  105.   #include "commands.h"
  106. *************** the Free Software Foundation, 675 Mass A
  107. *** 23,28 ****
  108. --- 40,49 ----
  109.   #include "variable.h"
  110.   #include "job.h"
  111.   
  112. + #ifdef MSDOS            /* really ? */
  113. + #define    sigmask(signal)        signal
  114. + #endif /* MSDOS */
  115.   #ifndef    sigmask
  116.   #define    sigmask(sig)    (1 << ((sig) - 1))
  117.   #endif
  118. *************** the Free Software Foundation, 675 Mass A
  119. *** 30,35 ****
  120. --- 51,60 ----
  121.   extern int remote_kill ();
  122.   
  123.   extern int getpid ();
  124. + #ifdef MSDOS
  125. + static  void set_file_variables (struct file *file);
  126. + #endif /* MSDOS */
  127.   
  128.   /* Set FILE's automatic variables up.  */
  129.   
  130. *************** set_file_variables (file)
  131. *** 171,177 ****
  132.           cF = p + 1;
  133.           Flen = len - (p - c);
  134.           cD = c;
  135. !         Dlen = (p - c) - 1;
  136.         }
  137.       bcopy (cD, cDp, Dlen);
  138.       cDp += Dlen;
  139. --- 196,202 ----
  140.           cF = p + 1;
  141.           Flen = len - (p - c);
  142.           cD = c;
  143. !         Dlen = (p - c);
  144.         }
  145.       bcopy (cD, cDp, Dlen);
  146.       cDp += Dlen;
  147. *************** execute_file_commands (file)
  148. *** 332,339 ****
  149. --- 357,368 ----
  150.     new_job (file);
  151.   }
  152.   
  153. + #ifdef MSDOS
  154. + #define    PROPAGATED_SIGNAL_MASK    (sigmask (SIGINT))
  155. + #else /* not MSDOS */
  156.   #define    PROPAGATED_SIGNAL_MASK \
  157.     (sigmask (SIGTERM) | sigmask (SIGINT) | sigmask (SIGHUP) | sigmask (SIGQUIT))
  158. + #endif /* not MSDOS */
  159.   
  160.   /* Handle fatal signals.  */
  161.   
  162. *************** fatal_error_signal (sig)
  163. *** 349,354 ****
  164. --- 378,384 ----
  165.     /* A termination signal won't be sent to the entire
  166.        process group, but it means we want to kill the children.  */
  167.   
  168. + #ifndef MSDOS
  169.     if (sig == SIGTERM)
  170.       {
  171.         register struct child *c;
  172. *************** fatal_error_signal (sig)
  173. *** 358,363 ****
  174. --- 388,394 ----
  175.         (void) kill (c->pid, SIGTERM);
  176.         unblock_children ();
  177.       }
  178. + #endif /* ! MSDOS */
  179.   
  180.     /* If we got a signal that means the user
  181.        wanted to kill make, remove pending targets.  */
  182. *************** fatal_error_signal (sig)
  183. *** 390,404 ****
  184. --- 421,441 ----
  185.   
  186.     remove_intermediates (1);
  187.   
  188. + #ifndef MSDOS
  189.     if (sig == SIGQUIT)
  190.       /* We don't want to send ourselves SIGQUIT, because it will
  191.          cause a core dump.  Just exit instead.  */
  192.       exit (1);
  193. + #endif /* !MSDOS */
  194.   
  195. + #ifdef MSDOS
  196. +   abort ();
  197. + #else
  198.     /* Signal the same code; this time it will really be fatal.  */
  199.     if (kill (getpid (), sig) < 0)
  200.       /* It shouldn't return, but if it does, die anyway.  */
  201.       pfatal_with_name ("kill");
  202. + #endif /* MSDOS */
  203.   
  204.     return 0;
  205.   }
  206. diff -cBdNp e:/gnu/make/gnu/commands.h ./commands.h
  207. *** e:/gnu/make/gnu/commands.h    Tue Jul 24 00:52:38 1990
  208. --- ./commands.h    Tue Jul 24 00:53:46 1990
  209. *************** You should have received a copy of the G
  210. *** 15,20 ****
  211. --- 15,37 ----
  212.   along with GNU Make; see the file COPYING.  If not, write to
  213.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  214.   
  215. + /*
  216. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  217. +  *
  218. +  * To this port, the same copying conditions apply as to the
  219. +  * original release.
  220. +  *
  221. +  * IMPORTANT:
  222. +  * This file is not identical to the original GNU release!
  223. +  * You should have received this code as patch to the official
  224. +  * GNU release.
  225. +  *
  226. +  * MORE IMPORTANT:
  227. +  * This port comes with ABSOLUTELY NO WARRANTY.
  228. +  *
  229. +  * $Header: e:/gnu/make/RCS/commands.h'v 3.58.0.2 90/07/17 03:32:49 tho Exp $
  230. +  */
  231.   /* Structure that gives the commands to make a file
  232.      and information about where these commands came from.  */
  233.   
  234. *************** struct commands
  235. *** 28,34 ****
  236.       char any_recurse;        /* Nonzero if any `lines_recurse' elt is.  */
  237.     };
  238.   
  239.   extern void execute_file_commands ();
  240.   extern void print_commands ();
  241.   extern void delete_child_targets ();
  242. --- 45,60 ----
  243.       char any_recurse;        /* Nonzero if any `lines_recurse' elt is.  */
  244.     };
  245.   
  246. ! /* commands.c */
  247. ! #ifdef MSDOS
  248. ! extern  void chop_commands (struct commands *cmds);
  249. ! extern  void execute_file_commands (struct file *file);
  250. ! extern  int fatal_error_signal (int sig);
  251. ! extern  void delete_child_targets (struct child *child);
  252. ! extern  void print_commands (struct commands *cmds);
  253. ! #else /* not MSDOS */
  254.   extern void execute_file_commands ();
  255.   extern void print_commands ();
  256.   extern void delete_child_targets ();
  257. + #endif /* not MSDOS */
  258. diff -cBdNp e:/gnu/make/gnu/default.c ./default.c
  259. *** e:/gnu/make/gnu/default.c    Tue Jul 24 00:52:40 1990
  260. --- ./default.c    Tue Jul 24 00:53:48 1990
  261. *************** You should have received a copy of the G
  262. *** 16,21 ****
  263. --- 16,38 ----
  264.   along with GNU Make; see the file COPYING.  If not, write to
  265.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  266.   
  267. + /*
  268. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  269. +  *
  270. +  * To this port, the same copying conditions apply as to the
  271. +  * original release.
  272. +  *
  273. +  * IMPORTANT:
  274. +  * This file is not identical to the original GNU release!
  275. +  * You should have received this code as patch to the official
  276. +  * GNU release.
  277. +  *
  278. +  * MORE IMPORTANT:
  279. +  * This port comes with ABSOLUTELY NO WARRANTY.
  280. +  *
  281. +  * $Header: e:/gnu/make/RCS/default.c'v 3.58.0.3 90/07/18 10:42:57 tho Exp $
  282. +  */
  283.   #include "make.h"
  284.   #include "rule.h"
  285.   #include "dep.h"
  286. *************** the Free Software Foundation, 675 Mass A
  287. *** 24,29 ****
  288. --- 41,178 ----
  289.   #include "variable.h"
  290.   
  291.   
  292. + #if defined(MSDOS) && !defined(STRICT)
  293. + static char default_suffixes[] = \
  294. +   ".com .exe .obj .c .pas .for .r .y .l .asm .h .dvi .tex .web";
  295. + static struct pspec default_pattern_rules[] =
  296. + {
  297. +   "(%)", "%",
  298. +   "$(ZIP) $(ZFLAGS) $@ $<",
  299. +   0, 0, 0
  300. + };
  301. + static struct pspec default_terminal_rules[] =
  302. + {
  303. +   /* RCS  */
  304. +   "%", "%'v",
  305. +   "$(CO) $(COFLAGS) $@",
  306. +   "%", "RCS/%'v",
  307. +   "$(CO) $(COFLAGS) $@",
  308. +   "%.asm", "%.a'v",        /* kludges until we convert */
  309. +   "$(CO) $(COFLAGS) $@",        /* RCS to prefixes ... */
  310. +   "%.asm", "RCS/%.a'v",
  311. +   "$(CO) $(COFLAGS) $@",
  312. +   "%.for", "%.f'v",
  313. +   "$(CO) $(COFLAGS) $@",
  314. +   "%.for", "RCS/%.f'v",
  315. +   "$(CO) $(COFLAGS) $@",
  316. +   "%.tex", "%.t'v",
  317. +   "$(CO) $(COFLAGS) $@",
  318. +   "%.tex", "RCS/%.t'v",
  319. +   "$(CO) $(COFLAGS) $@",
  320. +   "%.web", "%.w'v",
  321. +   "$(CO) $(COFLAGS) $@",
  322. +   "%.web", "RCS/%.w'v",
  323. +   "$(CO) $(COFLAGS) $@",
  324. +   /* Backup */
  325. +   /* we should add some rules for copying .zip archives to
  326. +      disk, but: how to handle the ':' of the drive ? */
  327. +       0, 0, 0
  328. + };
  329. + static char *default_suffix_rules[] =
  330. + {
  331. +   ".exe.com",
  332. +   "$(EXE2BIN) $< $@",
  333. +   ".obj.exe",
  334. +   "$(LINK.s) $<;",
  335. +   ".asm.obj",
  336. +   "$(COMPILE.s) $<;",
  337. +   ".c.obj",
  338. +   "$(COMPILE.c) $<",
  339. +   ".for.obj",
  340. +   "$(COMPILE.f) $<",
  341. +   ".pas.exe",
  342. +   "$(COMPILE.p) $<",
  343. +   ".y.c",
  344. +   "$(YACC.y) $< \n mv -f y_tab.c $@",
  345. +   ".l.c",
  346. +   "$(LEX.l) $< \n mv -f lexyy.c $@",
  347. +   ".r.for",
  348. +   "$(PREPROCESS.r) < $< > $@",
  349. +   ".tex.dvi",
  350. +   "-$(TEX) $<",
  351. +   ".web.for",            /* make it smarter about changefiles! */
  352. +   "$(FTANGLE) $<",
  353. +   ".web.pas",
  354. +   "$(TANGLE) $<",
  355. +   ".web.c",
  356. +   "$(CTANGLE) $<",
  357. +   ".web.tex",
  358. +   "$(WEAVE) $<",
  359. +   0
  360. + };
  361. + static char *default_variables[] =
  362. + {
  363. +   "AR", "lib",
  364. +   "ARFLAGS", "-+",
  365. +   "AS", "masm",            /* might want tasm here */
  366. +   "CC", "cl",            /* might want tcc here  */
  367. +   "CO", "co",
  368. +   "CPP", "$(CC) -E",
  369. +   "FC", "fl",
  370. +   "F77", "$(FC)",
  371. +   "F77FLAGS", "$(FFLAGS)",
  372. +   "LEX", "flex",
  373. +   "LINT", "$(CC) -Zs -W4",
  374. +   "LINTFLAGS", "$(CFLAGS)",
  375. +   "PC", "tpc",
  376. +   "YACC", "bison -y",
  377. +   "TEX", "latex",
  378. +   "WEAVE", "weave",
  379. +   "CWEAVE", "cweave",
  380. +   "FWEAVE", "fweave",
  381. +   "TANGLE", "tangle",
  382. +   "CTANGLE", "ctangle",
  383. +   "FTANGLE", "ftangle",
  384. +   "RAT4", "ratfor",
  385. +   "LINK", "link",            /* might want tlink here */
  386. +   "EXE2BIN", "exe2bin",
  387. +   "ZIP", "pkzip",
  388. +   "RM", "rm -f",
  389. +   "COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) -c",
  390. +   "LINK.s", "$(LINK) $(LDFLAGS)",
  391. +   "YACC.y", "$(YACC) $(YFLAGS)",
  392. +   "LEX.l", "$(LEX) $(LFLAGS) -t",
  393. +   "COMPILE.f", "$(FC) $(FFLAGS) -c",
  394. +   "LINK.f", "$(LINK) $(LDFLAGS)",
  395. +   "COMPILE.p", "$(PC) $(PFLAGS)",
  396. +   "COMPILE.s", "$(AS) $(ASFLAGS)",
  397. +   "LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS)",
  398. +   "PREPROCESS.r", "$(RAT4) $(RFLAGS)",
  399. +   0, 0
  400. + };
  401. + #else
  402.   /* This is the default list of suffixes for suffix rules.
  403.      `.s' must come last, so that a `.o' file will be made from
  404.      a `.c' or `.p' or ... file rather than from a .s file.  */
  405. *************** static char *default_variables[] =
  406. *** 246,251 ****
  407. --- 395,403 ----
  408.   
  409.       0, 0
  410.     };
  411. + #endif /* MSDOS && !STRICT */
  412.   
  413.   /* Set up the default .SUFFIXES list.  */
  414.   
  415. diff -cBdNp e:/gnu/make/gnu/dep.h ./dep.h
  416. *** e:/gnu/make/gnu/dep.h    Tue Jul 24 00:52:42 1990
  417. --- ./dep.h    Tue Jul 24 00:53:50 1990
  418. *************** You should have received a copy of the G
  419. *** 15,20 ****
  420. --- 15,37 ----
  421.   along with GNU Make; see the file COPYING.  If not, write to
  422.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  423.   
  424. + /*
  425. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  426. +  *
  427. +  * To this port, the same copying conditions apply as to the
  428. +  * original release.
  429. +  *
  430. +  * IMPORTANT:
  431. +  * This file is not identical to the original GNU release!
  432. +  * You should have received this code as patch to the official
  433. +  * GNU release.
  434. +  *
  435. +  * MORE IMPORTANT:
  436. +  * This port comes with ABSOLUTELY NO WARRANTY.
  437. +  *
  438. +  * $Header: e:/gnu/make/RCS/dep.h'v 3.58.0.1 90/07/17 01:00:01 tho Exp $
  439. +  */
  440.   /* Structure representing one dependency of a file.
  441.      Each struct file's `deps' points to a chain of these,
  442.      chained through the `next'.
  443. *************** struct nameseq
  444. *** 38,46 ****
  445.       char *name;
  446.     };
  447.   
  448.   extern struct nameseq *multi_glob (), *parse_file_seq ();
  449.   
  450.   #ifndef    iAPX286
  451.   #define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name)
  452. --- 55,67 ----
  453.       char *name;
  454.     };
  455.   
  456. ! /* read.c */
  457. ! #ifdef  MSDOS
  458. ! extern  struct nameseq *multi_glob (struct nameseq *chain, unsigned int size);
  459. ! extern  struct nameseq *parse_file_seq (char **stringp, char stopchar, unsigned int size);
  460. ! #else /* not MSDOS */
  461.   extern struct nameseq *multi_glob (), *parse_file_seq ();
  462. ! #endif /* not MSDOS */
  463.   
  464.   #ifndef    iAPX286
  465.   #define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name)
  466. diff -cBdNp e:/gnu/make/gnu/dir.c ./dir.c
  467. *** e:/gnu/make/gnu/dir.c    Tue Jul 24 00:52:44 1990
  468. --- ./dir.c    Tue Jul 24 00:53:52 1990
  469. *************** You should have received a copy of the G
  470. *** 16,23 ****
  471. --- 16,47 ----
  472.   along with GNU Make; see the file COPYING.  If not, write to
  473.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  474.   
  475. + /*
  476. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  477. +  *
  478. +  * To this port, the same copying conditions apply as to the
  479. +  * original release.
  480. +  *
  481. +  * IMPORTANT:
  482. +  * This file is not identical to the original GNU release!
  483. +  * You should have received this code as patch to the official
  484. +  * GNU release.
  485. +  *
  486. +  * MORE IMPORTANT:
  487. +  * This port comes with ABSOLUTELY NO WARRANTY.
  488. +  *
  489. +  * $Header: e:/gnu/make/RCS/dir.c'v 3.58.0.1 90/07/17 00:59:03 tho Exp $
  490. +  */
  491.   #include "make.h"
  492.   
  493. + #ifdef MSDOS
  494. + #include "msd_dir.h"
  495. + #define D_NAMLEN(d) ((d)->d_namlen)
  496. + #else /* not MSDOS */
  497.   #if    defined(USGr3) || defined(DIRENT)
  498.   
  499.   #include <dirent.h>
  500. *************** the Free Software Foundation, 675 Mass A
  501. *** 35,40 ****
  502. --- 59,65 ----
  503.   
  504.   #endif    /* USGr3 or DIRENT.  */
  505.   
  506. + #endif /* not MSDOS */
  507.   
  508.   /* Hash table of directories.  */
  509.   
  510. *************** struct dirfile
  511. *** 73,78 ****
  512. --- 98,107 ----
  513.   #define DIRFILE_BUCKETS 1007
  514.   #endif
  515.   
  516. + #ifdef MSDOS
  517. + static  struct directory *find_directory (char *name);
  518. + #endif /* MSDOS */
  519.   /* Find the directory named NAME and return its `struct directory'.  */
  520.   
  521.   static struct directory *
  522. diff -cBdNp e:/gnu/make/gnu/expand.c ./expand.c
  523. *** e:/gnu/make/gnu/expand.c    Tue Jul 24 00:52:46 1990
  524. --- ./expand.c    Tue Jul 24 00:53:54 1990
  525. *************** You should have received a copy of the G
  526. *** 16,26 ****
  527. --- 16,46 ----
  528.   along with GNU Make; see the file COPYING.  If not, write to
  529.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  530.   
  531. + /*
  532. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  533. +  *
  534. +  * To this port, the same copying conditions apply as to the
  535. +  * original release.
  536. +  *
  537. +  * IMPORTANT:
  538. +  * This file is not identical to the original GNU release!
  539. +  * You should have received this code as patch to the official
  540. +  * GNU release.
  541. +  *
  542. +  * MORE IMPORTANT:
  543. +  * This port comes with ABSOLUTELY NO WARRANTY.
  544. +  *
  545. +  * $Header: e:/gnu/make/RCS/expand.c'v 3.58.0.1 90/07/17 00:59:05 tho Exp $
  546. +  */
  547.   #include "make.h"
  548.   #include "commands.h"
  549.   #include "file.h"
  550.   #include "variable.h"
  551.   
  552. + #ifdef MSDOS
  553. + static  char *recursively_expand (struct variable *v);
  554. + #endif /* MSDOS */
  555.   
  556.   /* Recursively expand V.  The returned string is malloc'd.  */
  557.   
  558. *************** char *
  559. *** 308,320 ****
  560. --- 328,349 ----
  561.   allocated_variable_expand (line)
  562.        char *line;
  563.   {
  564. + #ifdef MSDOS
  565. +   return allocated_var_exp_for_file (line, (struct file *) 0);
  566. + #else
  567.     return allocated_variable_expand_for_file (line, (struct file *) 0);
  568. + #endif /* MSDOS */
  569.   }
  570.   
  571.   /* Like variable_expand_for_file, but the returned string is malloc'd.  */
  572.   
  573.   char *
  574. + #ifdef MSDOS
  575. + allocated_var_exp_for_file (line, file)
  576. + #else
  577.   allocated_variable_expand_for_file (line, file)
  578. + #endif /* MSDOS */
  579.        char *line;
  580.        struct file *file;
  581.   {
  582. diff -cBdNp e:/gnu/make/gnu/file.c ./file.c
  583. *** e:/gnu/make/gnu/file.c    Tue Jul 24 00:52:48 1990
  584. --- ./file.c    Tue Jul 24 00:53:58 1990
  585. *************** You should have received a copy of the G
  586. *** 15,20 ****
  587. --- 15,37 ----
  588.   along with GNU Make; see the file COPYING.  If not, write to
  589.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  590.   
  591. + /*
  592. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  593. +  *
  594. +  * To this port, the same copying conditions apply as to the
  595. +  * original release.
  596. +  *
  597. +  * IMPORTANT:
  598. +  * This file is not identical to the original GNU release!
  599. +  * You should have received this code as patch to the official
  600. +  * GNU release.
  601. +  *
  602. +  * MORE IMPORTANT:
  603. +  * This port comes with ABSOLUTELY NO WARRANTY.
  604. +  *
  605. +  * $Header: e:/gnu/make/RCS/file.c'v 3.58.0.3 90/07/24 00:21:16 tho Exp $
  606. +  */
  607.   #include "make.h"
  608.   #include "commands.h"
  609.   #include "dep.h"
  610. *************** the Free Software Foundation, 675 Mass A
  611. *** 22,29 ****
  612.   #include "variable.h"
  613.   #include <errno.h>
  614.   
  615.   extern int errno;
  616.   
  617.   
  618.   /* Hash table of files the makefile knows how to make.  */
  619. --- 39,49 ----
  620.   #include "variable.h"
  621.   #include <errno.h>
  622.   
  623. ! #ifdef MSDOS
  624. ! #include <time.h>
  625. ! #else /* not MSDOS */        /* <stdlib.h> */
  626.   extern int errno;
  627. + #endif /* not MSDOS */
  628.   
  629.   
  630.   /* Hash table of files the makefile knows how to make.  */
  631. diff -cBdNp e:/gnu/make/gnu/file.h ./file.h
  632. *** e:/gnu/make/gnu/file.h    Tue Jul 24 00:52:50 1990
  633. --- ./file.h    Tue Jul 24 00:54:00 1990
  634. *************** You should have received a copy of the G
  635. *** 15,20 ****
  636. --- 15,37 ----
  637.   along with GNU Make; see the file COPYING.  If not, write to
  638.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  639.   
  640. + /*
  641. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  642. +  *
  643. +  * To this port, the same copying conditions apply as to the
  644. +  * original release.
  645. +  *
  646. +  * IMPORTANT:
  647. +  * This file is not identical to the original GNU release!
  648. +  * You should have received this code as patch to the official
  649. +  * GNU release.
  650. +  *
  651. +  * MORE IMPORTANT:
  652. +  * This port comes with ABSOLUTELY NO WARRANTY.
  653. +  *
  654. +  * $Header: e:/gnu/make/RCS/file.h'v 3.58.0.1 90/07/17 01:00:03 tho Exp $
  655. +  */
  656.   /* Structure that represents the info on one file
  657.      that the makefile says how to make.
  658.      All of these are chained together through `next'.  */
  659. *************** extern unsigned int num_intermediates;
  660. *** 79,89 ****
  661.   
  662.   extern struct file *default_goal_file, *suffix_file, *default_file;
  663.   
  664.   extern struct file *lookup_file (), *enter_file ();
  665.   extern void remove_intermediates (), snap_deps ();
  666.   extern void rename_file ();
  667.   
  668.   extern time_t f_mtime ();
  669.   #define file_mtime_1(f, v) \
  670. --- 96,114 ----
  671.   
  672.   extern struct file *default_goal_file, *suffix_file, *default_file;
  673.   
  674. ! /*     file.c */
  675. ! #ifdef  MSDOS
  676. ! extern  struct file *enter_file (char *name);
  677. ! extern  struct file *lookup_file (char *name);
  678. ! extern  void print_file_data_base (void);
  679. ! extern  void remove_intermediates (int sig);
  680. ! extern  void rename_file (struct file *file, char *name);
  681. ! extern  void snap_deps (void);
  682. ! #else /* not MSDOS */
  683.   extern struct file *lookup_file (), *enter_file ();
  684.   extern void remove_intermediates (), snap_deps ();
  685.   extern void rename_file ();
  686. ! #endif /* not MSDOS */
  687.   
  688.   extern time_t f_mtime ();
  689.   #define file_mtime_1(f, v) \
  690. diff -cBdNp e:/gnu/make/gnu/function.c ./function.c
  691. *** e:/gnu/make/gnu/function.c    Tue Jul 24 00:52:52 1990
  692. --- ./function.c    Tue Jul 24 00:54:10 1990
  693. *************** You should have received a copy of the G
  694. *** 16,21 ****
  695. --- 16,38 ----
  696.   along with GNU Make; see the file COPYING.  If not, write to
  697.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  698.   
  699. + /*
  700. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  701. +  *
  702. +  * To this port, the same copying conditions apply as to the
  703. +  * original release.
  704. +  *
  705. +  * IMPORTANT:
  706. +  * This file is not identical to the original GNU release!
  707. +  * You should have received this code as patch to the official
  708. +  * GNU release.
  709. +  *
  710. +  * MORE IMPORTANT:
  711. +  * This port comes with ABSOLUTELY NO WARRANTY.
  712. +  *
  713. +  * $Header: e:/gnu/make/RCS/function.c'v 3.58.0.3 90/07/19 01:01:52 tho Exp $
  714. +  */
  715.   #include "make.h"
  716.   #include "variable.h"
  717.   #include "dep.h"
  718. *************** the Free Software Foundation, 675 Mass A
  719. *** 23,31 ****
  720. --- 40,80 ----
  721.   #include "job.h"
  722.   #include <errno.h>
  723.   
  724. + #ifdef MSDOS
  725. + #include <fcntl.h>
  726. + #include <io.h>
  727. + #include <time.h>
  728. + #include <process.h>
  729. + extern int last_child_pid;
  730. + extern int last_child_status;
  731. + extern int swap_and_spawnvpe (char *device, char *cmd, char **argv,
  732. +                   char **envvec);
  733. + extern char *mktmpname (char *prefix);
  734. + struct stringlist
  735. +   {
  736. +     char **list;    /* Nil-terminated list of strings.  */
  737. +     unsigned int idx;    /* Index into above.  */
  738. +     unsigned int max;    /* Number of pointers allocated.  */
  739. +   };
  740. + extern struct stringlist *swapping_device;
  741. + #endif /* MSDOS */
  742. + #ifndef MSDOS
  743.   extern int errno;
  744. + #endif /* not MSDOS */
  745.   
  746. + #ifdef MSDOS
  747. + static  char *expand_function (char *o, enum function function, char *text, char *end);
  748. + static  char *string_glob (char *line);
  749. + #else /* not MSDOS */
  750.   static char *string_glob ();
  751. + #endif /* not MSDOS */
  752.   
  753.   /* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing
  754.      each occurrence of SUBST with REPLACE. TEXT is null-terminated.  SLEN is
  755. *************** expand_function (o, function, text, end)
  756. *** 310,315 ****
  757. --- 359,374 ----
  758.        char *text;
  759.        char *end;
  760.   {
  761. + #ifdef MSDOS
  762. +   extern char **construct_command_argv ();
  763. +   char **argv;
  764. +   int save_stdout;
  765. +   char *pipe_file = mktmpname ("pi");
  766. +   int pipe_fds;
  767. +   char *buffer = (char *) xmalloc (201);
  768. +   unsigned int maxlen = 200;
  769. +   int cc;
  770. + #endif /* MSDOS */
  771.     char *p, *p2, *p3;
  772.     unsigned int i, len;
  773.     int doneany = 0;
  774. *************** expand_function (o, function, text, end)
  775. *** 337,342 ****
  776. --- 396,470 ----
  777.       else
  778.         buf[0] = '\0';
  779.   
  780. + #ifdef MSDOS
  781. +           argv = construct_command_argv (text, (struct file *) 0);
  782. + #if 0
  783. +      {
  784. +         int ac = 0;
  785. +         char **av = argv;
  786. +         printf ( "expand_function(): spawning process");
  787. +         while (*av)
  788. +         printf( " $%d=`%s'", ac++, *av++);
  789. +         printf( "\n");
  790. +      }
  791. + #endif /* NEVER */
  792. +     save_stdout = dup (1);            /* redirect stdout */
  793. +     pipe_fds = open (pipe_file, O_CREAT|O_RDWR|O_TEXT, S_IREAD|S_IWRITE);
  794. +     if (dup2 (pipe_fds, 1) == -1)
  795. +       pfatal_with_name ("Can't redirect /dev/stdout");
  796. +           last_child_pid = pid = abs ((int) clock());    /* reasonably random */
  797. +     last_child_status =
  798. +       swap_and_spawnvpe (swapping_device ? swapping_device->list[0] : NULL,
  799. +                 argv[0], argv, environ);
  800. +     dup2 (save_stdout, 1);            /* reset stdout */
  801. +     if (lseek (pipe_fds, 0L, SEEK_SET) == -1L)
  802. +       pfatal_with_name ("Can't rewind intermediate file for pipe");
  803. +           /* Record the PID for child_handler.  */
  804. +           shell_function_pid = pid;
  805. +           shell_function_completed = 0;
  806. +           /* Loop until child_handler sets shell_function_completed
  807. +        to the status of our child shell.  */
  808. +           while (shell_function_completed == 0)
  809. +               wait_for_children (1, 0);
  810. +           /* Read from the pipe until it gets EOF.  */
  811. +           i = 0;
  812. +           do {
  813. +                if (i == maxlen)
  814. +          {
  815. +              maxlen += 512;
  816. +              buffer = (char *) xrealloc (buffer, maxlen + 1);
  817. +          }
  818. +         cc = read (pipe_fds, &buffer[i], maxlen - i);
  819. +         if (cc > 0)
  820. +           i += cc;
  821. +            } while (cc > 0);
  822. +           unlink(pipe_file);
  823. +           /* The child finished normally.  Replace all
  824. +              newlines in its output with spaces, and put
  825. +              that in the variable output buffer.  */
  826. +           for (p = buffer; p < buffer + i; ++p)
  827. +               if (*p == '\n')
  828. +                 *p = ' ';
  829. +           o = variable_buffer_output (o, buffer, i);
  830. +           free (buffer);
  831. + #else
  832.       if (pipe (pipedes) < 0)
  833.         {
  834.           perror_with_name (buf, "pipe");
  835. *************** expand_function (o, function, text, end)
  836. *** 429,434 ****
  837. --- 557,563 ----
  838.   
  839.           free (buffer);
  840.         }
  841. + #endif /* MSDOS */
  842.   
  843.       free (text);
  844.       break;
  845. diff -cBdNp e:/gnu/make/gnu/glob.c ./glob.c
  846. *** e:/gnu/make/gnu/glob.c    Tue Jul 24 00:52:54 1990
  847. --- ./glob.c    Tue Jul 24 00:54:14 1990
  848. ***************
  849. *** 1,5 ****
  850.   /* File-name wildcard pattern matching for GNU.
  851. !    Copyright (C) 1985, 1988, 1989 Free Software Foundation, Inc.
  852.   
  853.      This program is free software; you can redistribute it and/or modify
  854.      it under the terms of the GNU General Public License as published by
  855. --- 1,5 ----
  856.   /* File-name wildcard pattern matching for GNU.
  857. !    Copyright (C) 1985, 1988, 1989, 1990 Free Software Foundation, Inc.
  858.   
  859.      This program is free software; you can redistribute it and/or modify
  860.      it under the terms of the GNU General Public License as published by
  861. ***************
  862. *** 14,52 ****
  863.      You should have received a copy of the GNU General Public License
  864.      along with this program; if not, write to the Free Software
  865.      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  866.   
  867.   /* To whomever it may concern: I have never seen the code which most
  868.      Unix programs use to perform this function.  I wrote this from scratch
  869.      based on specifications for the pattern matching.  --RMS.  */
  870.   
  871.   #include <sys/types.h>
  872.   
  873. ! #if    defined(USGr3) || defined(DIRENT)
  874.   
  875.   #include <dirent.h>
  876.   #define direct dirent
  877. ! #define    D_NAMLEN(d) strlen((d)->d_name)
  878. ! #else    /* Not USGr3 and not DIRENT.  */
  879.   #define D_NAMLEN(d) ((d)->d_namlen)
  880. ! #    ifdef    USG
  881. ! #include "ndir.h"   /* Get ndir.h from the Emacs distribution.  */
  882. ! #    else    /* Not USG.  */
  883.   #include <sys/dir.h>
  884. ! #    endif    /* USG.  */
  885.   
  886. ! #endif    /* USGr3 or DIRENT.  */
  887.   
  888. ! #ifdef USG
  889. ! #include <memory.h>
  890.   #include <string.h>
  891. ! #define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
  892. ! #define rindex    strrchr
  893.   
  894.   #else /* not USG */
  895.   #include <strings.h>
  896.   extern void bcopy ();
  897.   #endif /* not USG */
  898.   
  899. --- 14,86 ----
  900.      You should have received a copy of the GNU General Public License
  901.      along with this program; if not, write to the Free Software
  902.      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  903. + /*
  904. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  905. +  *
  906. +  * To this port, the same copying conditions apply as to the
  907. +  * original release.
  908. +  *
  909. +  * IMPORTANT:
  910. +  * This file is not identical to the original GNU release!
  911. +  * You should have received this code as patch to the official
  912. +  * GNU release.
  913. +  *
  914. +  * MORE IMPORTANT:
  915. +  * This port comes with ABSOLUTELY NO WARRANTY.
  916. +  *
  917. +  * $Header: e:/gnu/make/RCS/glob.c'v 3.58.0.1 90/07/17 00:59:14 tho Exp $
  918. +  */
  919.   
  920.   /* To whomever it may concern: I have never seen the code which most
  921.      Unix programs use to perform this function.  I wrote this from scratch
  922.      based on specifications for the pattern matching.  --RMS.  */
  923.   
  924. + #ifdef MSDOS
  925. + #include <stdio.h>
  926.   #include <sys/types.h>
  927. + #include <malloc.h>
  928. + #include "msd_dir.h"
  929. + #define D_NAMLEN(d) ((d)->d_namlen)
  930.   
  931. ! #else /* not MSDOS */
  932.   
  933. + #if defined(USGr3) || defined(DIRENT) || defined(__GNU_LIBRARY__)
  934.   #include <dirent.h>
  935.   #define direct dirent
  936. ! #define D_NAMLEN(d) strlen((d)->d_name)
  937. ! #else /* not USGr3 or DIRENT or __GNU_LIBRARY__ */
  938.   #define D_NAMLEN(d) ((d)->d_namlen)
  939. ! #ifdef USG
  940. ! #ifdef SYSNDIR
  941. ! #include <sys/ndir.h>
  942. ! #else
  943. ! #include "ndir.h"        /* Get ndir.h from the Emacs distribution.  */
  944. ! #endif /* not SYSNDIR */
  945. ! #else /* not USG */
  946.   #include <sys/dir.h>
  947. ! #endif /* USG */
  948. ! #endif /* USGr3 */
  949.   
  950. ! #endif /* not MSDOS */
  951.   
  952. ! #if    defined(STDC_HEADERS) || defined(__GNU_LIBRARY__)
  953. ! #include <stdlib.h>
  954.   #include <string.h>
  955. ! #define bcopy(s, d, n) memcpy ((d), (s), (n))
  956. ! #define index strchr
  957. ! #define rindex strrchr
  958. ! #else
  959.   
  960. + #ifdef USG
  961. + #include <string.h>
  962. + #include <memory.h>
  963. + #define bcopy(s, d, n) memcpy ((d), (s), (n))
  964. + #define index strchr
  965. + #define rindex strrchr
  966.   #else /* not USG */
  967.   #include <strings.h>
  968.   extern void bcopy ();
  969.   #endif /* not USG */
  970.   
  971. ***************
  972. *** 50,76 ****
  973.   extern void bcopy ();
  974.   #endif /* not USG */
  975.   
  976. ! #ifdef    __GNUC__
  977. ! #define    alloca(n)    __builtin_alloca (n)
  978. ! #else    /* Not GCC.  */
  979. ! #ifdef    sparc
  980. ! #include <alloca.h>
  981. ! #else    /* Not sparc.  */
  982. ! extern char *alloca ();
  983. ! #endif    /* sparc.  */
  984. ! #endif    /* GCC.  */
  985. ! extern char *malloc (), *realloc ();
  986.   extern void free ();
  987.   
  988.   #ifndef NULL
  989.   #define NULL 0
  990.   #endif
  991.   
  992. ! /* Global variable which controls whether or not * matches .*.
  993. !    Non-zero means don't match .*.  */
  994. ! int noglob_dot_filenames = 1;
  995.   
  996.   
  997.   static int glob_match_after_star ();
  998.   
  999. --- 84,122 ----
  1000.   extern void bcopy ();
  1001.   #endif /* not USG */
  1002.   
  1003. ! extern char *malloc ();
  1004. ! extern char *realloc ();
  1005.   extern void free ();
  1006.   
  1007.   #ifndef NULL
  1008.   #define NULL 0
  1009.   #endif
  1010. + #endif    /* Not STDC_HEADERS or __GNU_LIBRARY__.  */
  1011.   
  1012. ! #ifdef __GNUC__
  1013. ! #define alloca __builtin_alloca
  1014. ! #else /* Not GCC.  */
  1015. ! #ifdef sparc
  1016. ! #include <alloca.h>
  1017. ! #else /* Not sparc.  */
  1018. ! #ifndef MSDOS
  1019. ! extern char *alloca ();
  1020. ! #endif /* not MSDOS */
  1021. ! #endif /* sparc.  */
  1022. ! #endif /* GCC.  */
  1023. ! #ifdef MSDOS
  1024. ! extern  int glob_pattern_p(char *);
  1025. ! extern  int glob_match(char *,char *,int);
  1026. ! static  int glob_match_after_star(char *,char *);
  1027. ! extern  char * *glob_vector(char *,char *);
  1028. ! static  char * *glob_dir_to_array(char *,char **);
  1029. ! extern  char * *glob_filename(char *);
  1030. ! #endif /* MSDOS */
  1031. !   
  1032.   
  1033. + /* Nonzero if '*' and '?' do not match an initial '.' for glob_filename.  */
  1034. + int noglob_dot_filenames = 1;
  1035.   
  1036.   static int glob_match_after_star ();
  1037.   
  1038. *************** glob_match (pattern, text, dot_special)
  1039. *** 151,157 ****
  1040.         register char c1 = *t++;
  1041.         int invert;
  1042.   
  1043. !       invert = *p == '!';
  1044.         if (invert)
  1045.           p++;
  1046.   
  1047. --- 199,209 ----
  1048.         register char c1 = *t++;
  1049.         int invert;
  1050.   
  1051. !       if (c1 == '\0')
  1052. !         return 0;
  1053. !       invert = (*p == '!');
  1054.         if (invert)
  1055.           p++;
  1056.   
  1057. *************** glob_match (pattern, text, dot_special)
  1058. *** 166,175 ****
  1059.             cend = cstart;
  1060.           }
  1061.   
  1062. !           if (c == '\0')
  1063. !         return 0;
  1064.   
  1065.             c = *p++;
  1066.             if (c == '-')
  1067.           {
  1068.             cend = *p++;
  1069. --- 218,228 ----
  1070.             cend = cstart;
  1071.           }
  1072.   
  1073. !           if (cstart == '\0')
  1074. !         return 0;    /* Missing ']'. */
  1075.   
  1076.             c = *p++;
  1077.             if (c == '-')
  1078.           {
  1079.             cend = *p++;
  1080. *************** glob_match (pattern, text, dot_special)
  1081. *** 191,204 ****
  1082.       match:
  1083.         /* Skip the rest of the [...] construct that already matched.  */
  1084.         while (c != ']')
  1085. !         { 
  1086.             if (c == '\0')
  1087.           return 0;
  1088.             c = *p++;
  1089.             if (c == '\0')
  1090.           return 0;
  1091. !           else if (c == '\\')
  1092. !         ++p;
  1093.           }
  1094.         if (invert)
  1095.           return 0;
  1096. --- 244,257 ----
  1097.       match:
  1098.         /* Skip the rest of the [...] construct that already matched.  */
  1099.         while (c != ']')
  1100. !         {
  1101.             if (c == '\0')
  1102.           return 0;
  1103.             c = *p++;
  1104.             if (c == '\0')
  1105.           return 0;
  1106. !           if (c == '\\')
  1107. !         p++;
  1108.           }
  1109.         if (invert)
  1110.           return 0;
  1111. *************** glob_match_after_star (pattern, text)
  1112. *** 234,242 ****
  1113.     else
  1114.       c1 = c;
  1115.   
  1116.     while (1)
  1117.       {
  1118. !       if ((c == '[' || *t == c1) && glob_match (p - 1, t, 0))
  1119.       return 1;
  1120.         if (*t++ == '\0')
  1121.       return 0;
  1122. --- 287,296 ----
  1123.     else
  1124.       c1 = c;
  1125.   
  1126. +   --p;
  1127.     while (1)
  1128.       {
  1129. !       if ((c == '[' || *t == c1) && glob_match (p, t, 0))
  1130.       return 1;
  1131.         if (*t++ == '\0')
  1132.       return 0;
  1133. *************** glob_match_after_star (pattern, text)
  1134. *** 246,252 ****
  1135.   /* Return a vector of names of files in directory DIR
  1136.      whose names match glob pattern PAT.
  1137.      The names are not in any particular order.
  1138. !    Wildcards at the beginning of PAT do not match an initial period.
  1139.   
  1140.      The vector is terminated by an element that is a null pointer.
  1141.   
  1142. --- 300,307 ----
  1143.   /* Return a vector of names of files in directory DIR
  1144.      whose names match glob pattern PAT.
  1145.      The names are not in any particular order.
  1146. !    Wildcards at the beginning of PAT do not match an initial period
  1147. !    if noglob_dot_filenames is nonzero.
  1148.   
  1149.      The vector is terminated by an element that is a null pointer.
  1150.   
  1151. *************** glob_match_after_star (pattern, text)
  1152. *** 253,259 ****
  1153.      To free the space allocated, first free the vector's elements,
  1154.      then free the vector.
  1155.   
  1156. !    Return 0 if cannot get enough memory to hold the pointer
  1157.      and the names.
  1158.   
  1159.      Return -1 if cannot access directory DIR.
  1160. --- 308,314 ----
  1161.      To free the space allocated, first free the vector's elements,
  1162.      then free the vector.
  1163.   
  1164. !    Return NULL if cannot get enough memory to hold the pointer
  1165.      and the names.
  1166.   
  1167.      Return -1 if cannot access directory DIR.
  1168. *************** glob_vector (pat, dir)
  1169. *** 265,274 ****
  1170.        char *dir;
  1171.   {
  1172.     struct globval
  1173. !     {
  1174. !       struct globval *next;
  1175. !       char *name;
  1176. !     };
  1177.   
  1178.     DIR *d;
  1179.     register struct direct *dp;
  1180. --- 320,329 ----
  1181.        char *dir;
  1182.   {
  1183.     struct globval
  1184. !   {
  1185. !     struct globval *next;
  1186. !     char *name;
  1187. !   };
  1188.   
  1189.     DIR *d;
  1190.     register struct direct *dp;
  1191. *************** glob_vector (pat, dir)
  1192. *** 284,290 ****
  1193.     if (d == NULL)
  1194.       return (char **) -1;
  1195.   
  1196. !   lastlink = 0;
  1197.     count = 0;
  1198.     lose = 0;
  1199.   
  1200. --- 339,345 ----
  1201.     if (d == NULL)
  1202.       return (char **) -1;
  1203.   
  1204. !   lastlink = NULL;
  1205.     count = 0;
  1206.     lose = 0;
  1207.   
  1208. *************** glob_vector (pat, dir)
  1209. *** 297,308 ****
  1210.         dp = readdir (d);
  1211.         if (dp == NULL)
  1212.       break;
  1213.         if (dp->d_ino != 0
  1214.         && glob_match (pat, dp->d_name, noglob_dot_filenames))
  1215.       {
  1216.         nextlink = (struct globval *) alloca (sizeof (struct globval));
  1217.         nextlink->next = lastlink;
  1218. !       nextname = (char *) malloc (D_NAMLEN(dp) + 1);
  1219.         if (nextname == NULL)
  1220.           {
  1221.             lose = 1;
  1222. --- 352,368 ----
  1223.         dp = readdir (d);
  1224.         if (dp == NULL)
  1225.       break;
  1226. + #ifdef MSDOS    /* dp->d_ino is always 0 in the MS-DOS implementation. */
  1227. +       if (glob_match (pat, dp->d_name, noglob_dot_filenames))
  1228. + #else
  1229.         if (dp->d_ino != 0
  1230.         && glob_match (pat, dp->d_name, noglob_dot_filenames))
  1231. + #endif /* MSDOS */
  1232.       {
  1233.         nextlink = (struct globval *) alloca (sizeof (struct globval));
  1234.         nextlink->next = lastlink;
  1235. !       i = D_NAMLEN (dp) + 1;
  1236. !       nextname = (char *) malloc (i);
  1237.         if (nextname == NULL)
  1238.           {
  1239.             lose = 1;
  1240. *************** glob_vector (pat, dir)
  1241. *** 310,320 ****
  1242.           }
  1243.         lastlink = nextlink;
  1244.         nextlink->name = nextname;
  1245. !       bcopy (dp->d_name, nextname, D_NAMLEN(dp) + 1);
  1246. !       ++count;
  1247.       }
  1248.       }
  1249. !   (void) closedir (d);
  1250.   
  1251.     if (!lose)
  1252.       {
  1253. --- 370,380 ----
  1254.           }
  1255.         lastlink = nextlink;
  1256.         nextlink->name = nextname;
  1257. !       bcopy (dp->d_name, nextname, i);
  1258. !       count++;
  1259.       }
  1260.       }
  1261. !   closedir (d);
  1262.   
  1263.     if (!lose)
  1264.       {
  1265. *************** glob_vector (pat, dir)
  1266. *** 345,352 ****
  1267.     return name_vector;
  1268.   }
  1269.   
  1270. ! /* Return a new array which is the concatenation
  1271. !    of each string in ARRAY to DIR. */
  1272.   
  1273.   static char **
  1274.   glob_dir_to_array (dir, array)
  1275. --- 405,413 ----
  1276.     return name_vector;
  1277.   }
  1278.   
  1279. ! /* Return a new array, replacing ARRAY, which is the concatenation
  1280. !    of each string in ARRAY to DIR.
  1281. !    Return NULL if out of memory.  */
  1282.   
  1283.   static char **
  1284.   glob_dir_to_array (dir, array)
  1285. *************** glob_dir_to_array (dir, array)
  1286. *** 353,359 ****
  1287.        char *dir, **array;
  1288.   {
  1289.     register unsigned int i, l;
  1290. !   int add_slash;
  1291.     char **result;
  1292.   
  1293.     l = strlen (dir);
  1294. --- 414,420 ----
  1295.        char *dir, **array;
  1296.   {
  1297.     register unsigned int i, l;
  1298. !   int add_slash = 0;
  1299.     char **result;
  1300.   
  1301.     l = strlen (dir);
  1302. *************** glob_dir_to_array (dir, array)
  1303. *** 360,370 ****
  1304.     if (l == 0)
  1305.       return array;
  1306.   
  1307. !   add_slash = dir[l - 1] != '/';
  1308.   
  1309. !   i = 0;
  1310. !   while (array[i] != NULL)
  1311. !     ++i;
  1312.   
  1313.     result = (char **) malloc ((i + 1) * sizeof (char *));
  1314.     if (result == NULL)
  1315. --- 421,431 ----
  1316.     if (l == 0)
  1317.       return array;
  1318.   
  1319. !   if (dir[l - 1] != '/')
  1320. !     add_slash++;
  1321.   
  1322. !   for (i = 0; array[i] != NULL; i++)
  1323. !     ;
  1324.   
  1325.     result = (char **) malloc ((i + 1) * sizeof (char *));
  1326.     if (result == NULL)
  1327. *************** glob_dir_to_array (dir, array)
  1328. *** 372,382 ****
  1329.   
  1330.     for (i = 0; array[i] != NULL; i++)
  1331.       {
  1332. !       result[i] = (char *) malloc (l + (add_slash ? 1 : 0)
  1333. !                    + strlen (array[i]) + 1);
  1334.         if (result[i] == NULL)
  1335.       return NULL;
  1336. !       sprintf (result[i], "%s%s%s", dir, add_slash ? "/" : "", array[i]);
  1337.       }
  1338.     result[i] = NULL;
  1339.   
  1340. --- 433,445 ----
  1341.   
  1342.     for (i = 0; array[i] != NULL; i++)
  1343.       {
  1344. !       result[i] = (char *) malloc (1 + l + add_slash + strlen (array[i]));
  1345.         if (result[i] == NULL)
  1346.       return NULL;
  1347. !       strcpy (result[i], dir);
  1348. !       if (add_slash)
  1349. !     result[i][l] = '/';
  1350. !       strcpy (result[i] + l + add_slash, array[i]);
  1351.       }
  1352.     result[i] = NULL;
  1353.   
  1354. *************** glob_dir_to_array (dir, array)
  1355. *** 392,399 ****
  1356.      marking the end of the array with a null-pointer as an element.
  1357.      If no pathnames match, then the array is empty (first element is null).
  1358.      If there isn't enough memory, then return NULL.
  1359. !    If a file system error occurs, return -1; `errno' has the error code.  */
  1360.   
  1361.   char **
  1362.   glob_filename (pathname)
  1363.        char *pathname;
  1364. --- 454,464 ----
  1365.      marking the end of the array with a null-pointer as an element.
  1366.      If no pathnames match, then the array is empty (first element is null).
  1367.      If there isn't enough memory, then return NULL.
  1368. !    If a file system error occurs, return -1; `errno' has the error code.
  1369.   
  1370. +    Wildcards at the beginning of PAT, or following a slash,
  1371. +    do not match an initial period if noglob_dot_filenames is nonzero.  */
  1372.   char **
  1373.   glob_filename (pathname)
  1374.        char *pathname;
  1375. *************** glob_filename (pathname)
  1376. *** 420,426 ****
  1377.       }
  1378.     else
  1379.       {
  1380. !       directory_len = filename - pathname;
  1381.         directory_name = (char *) alloca (directory_len + 1);
  1382.         bcopy (pathname, directory_name, directory_len);
  1383.         directory_name[directory_len] = '\0';
  1384. --- 485,491 ----
  1385.       }
  1386.     else
  1387.       {
  1388. !       directory_len = (filename - pathname) + 1;
  1389.         directory_name = (char *) alloca (directory_len + 1);
  1390.         bcopy (pathname, directory_name, directory_len);
  1391.         directory_name[directory_len] = '\0';
  1392. *************** glob_filename (pathname)
  1393. *** 427,436 ****
  1394.         ++filename;
  1395.       }
  1396.   
  1397.     if (glob_pattern_p (directory_name))
  1398.       {
  1399. -       /* If directory_name contains globbing characters, then we
  1400. -      have to expand the previous levels.  Just recurse. */
  1401.         char **directories;
  1402.         register unsigned int i;
  1403.   
  1404. --- 492,501 ----
  1405.         ++filename;
  1406.       }
  1407.   
  1408. +   /* If directory_name contains globbing characters, then we
  1409. +      have to expand the previous levels.  Just recurse. */
  1410.     if (glob_pattern_p (directory_name))
  1411.       {
  1412.         char **directories;
  1413.         register unsigned int i;
  1414.   
  1415. *************** glob_filename (pathname)
  1416. *** 440,446 ****
  1417.         directories = glob_filename (directory_name);
  1418.         if (directories == NULL)
  1419.       goto memory_error;
  1420. !       else if ((int) directories == -1)
  1421.       return (char **) -1;
  1422.         else if (*directories == NULL)
  1423.       {
  1424. --- 505,511 ----
  1425.         directories = glob_filename (directory_name);
  1426.         if (directories == NULL)
  1427.       goto memory_error;
  1428. !       else if (directories == (char **) -1)
  1429.       return (char **) -1;
  1430.         else if (*directories == NULL)
  1431.       {
  1432. *************** glob_filename (pathname)
  1433. *** 451,462 ****
  1434.         /* We have successfully globbed the preceding directory name.
  1435.        For each name in DIRECTORIES, call glob_vector on it and
  1436.        FILENAME.  Concatenate the results together.  */
  1437. !       for (i = 0; directories[i] != NULL; ++i)
  1438.       {
  1439.         char **temp_results = glob_vector (filename, directories[i]);
  1440.         if (temp_results == NULL)
  1441.           goto memory_error;
  1442. !       else if ((int) temp_results == -1)
  1443.           /* This filename is probably not a directory.  Ignore it.  */
  1444.           ;
  1445.         else
  1446. --- 516,527 ----
  1447.         /* We have successfully globbed the preceding directory name.
  1448.        For each name in DIRECTORIES, call glob_vector on it and
  1449.        FILENAME.  Concatenate the results together.  */
  1450. !       for (i = 0; directories[i] != NULL; i++)
  1451.       {
  1452.         char **temp_results = glob_vector (filename, directories[i]);
  1453.         if (temp_results == NULL)
  1454.           goto memory_error;
  1455. !       else if (temp_results == (char **) -1)
  1456.           /* This filename is probably not a directory.  Ignore it.  */
  1457.           ;
  1458.         else
  1459. *************** glob_filename (pathname)
  1460. *** 476,487 ****
  1461.             for (l = 0; array[l] != NULL; ++l)
  1462.           result[result_size++ - 1] = array[l];
  1463.             result[result_size - 1] = NULL;
  1464. -           /* Note that the elements of ARRAY are not freed.  */
  1465.             free ((char *) array);
  1466.           }
  1467.       }
  1468.         /* Free the directories.  */
  1469. !       for (i = 0; directories[i]; i++)
  1470.       free (directories[i]);
  1471.         free ((char *) directories);
  1472.   
  1473. --- 541,551 ----
  1474.             for (l = 0; array[l] != NULL; ++l)
  1475.           result[result_size++ - 1] = array[l];
  1476.             result[result_size - 1] = NULL;
  1477.             free ((char *) array);
  1478.           }
  1479.       }
  1480.         /* Free the directories.  */
  1481. !       for (i = 0; directories[i] != NULL; i++)
  1482.       free (directories[i]);
  1483.         free ((char *) directories);
  1484.   
  1485. *************** glob_filename (pathname)
  1486. *** 488,496 ****
  1487.         return result;
  1488.       }
  1489.   
  1490.     if (*filename == '\0')
  1491.       {
  1492. -       /* If there is only a directory name, return it.  */
  1493.         result = (char **) realloc ((char *) result, 2 * sizeof (char *));
  1494.         if (result == NULL)
  1495.       return NULL;
  1496. --- 552,560 ----
  1497.         return result;
  1498.       }
  1499.   
  1500. +   /* If there is only a directory name, return it. */
  1501.     if (*filename == '\0')
  1502.       {
  1503.         result = (char **) realloc ((char *) result, 2 * sizeof (char *));
  1504.         if (result == NULL)
  1505.       return NULL;
  1506. *************** glob_filename (pathname)
  1507. *** 509,521 ****
  1508.                        (directory_len == 0
  1509.                         ? "." : directory_name));
  1510.   
  1511. !       if (temp_results == NULL || (int) temp_results == -1)
  1512.       return temp_results;
  1513.   
  1514.         return glob_dir_to_array (directory_name, temp_results);
  1515.       }
  1516.   
  1517. !  memory_error:;
  1518.     if (result != NULL)
  1519.       {
  1520.         register unsigned int i;
  1521. --- 573,585 ----
  1522.                        (directory_len == 0
  1523.                         ? "." : directory_name));
  1524.   
  1525. !       if (temp_results == NULL || temp_results == (char **) -1)
  1526.       return temp_results;
  1527.   
  1528.         return glob_dir_to_array (directory_name, temp_results);
  1529.       }
  1530.   
  1531. ! memory_error:;
  1532.     if (result != NULL)
  1533.       {
  1534.         register unsigned int i;
  1535. *************** main (argc, argv)
  1536. *** 532,546 ****
  1537.        int argc;
  1538.        char **argv;
  1539.   {
  1540. !   unsigned int i;
  1541.   
  1542. !   for (i = 1; i < argc; ++i)
  1543.       {
  1544. !       char **value = glob_filename (argv[i]);
  1545.         if (value == NULL)
  1546. !     puts ("Out of memory.")
  1547. !       else if ((int) value == -1)
  1548. !     perror (argv[i]);
  1549.         else
  1550.       for (i = 0; value[i] != NULL; i++)
  1551.         puts (value[i]);
  1552. --- 596,611 ----
  1553.        int argc;
  1554.        char **argv;
  1555.   {
  1556. !   char **value;
  1557. !   int i, optind;
  1558.   
  1559. !   for (optind = 1; optind < argc; optind++)
  1560.       {
  1561. !       value = glob_filename (argv[optind]);
  1562.         if (value == NULL)
  1563. !     puts ("virtual memory exhausted");
  1564. !       else if (value == (char **) -1)
  1565. !     perror (argv[optind]);
  1566.         else
  1567.       for (i = 0; value[i] != NULL; i++)
  1568.         puts (value[i]);
  1569. *************** main (argc, argv)
  1570. *** 545,551 ****
  1571.       for (i = 0; value[i] != NULL; i++)
  1572.         puts (value[i]);
  1573.       }
  1574.     exit (0);
  1575.   }
  1576. ! #endif    /* TEST.  */
  1577. --- 610,616 ----
  1578.       for (i = 0; value[i] != NULL; i++)
  1579.         puts (value[i]);
  1580.       }
  1581.     exit (0);
  1582.   }
  1583. ! #endif /* TEST */
  1584. diff -cBdNp e:/gnu/make/gnu/implicit.c ./implicit.c
  1585. *** e:/gnu/make/gnu/implicit.c    Tue Jul 24 00:52:58 1990
  1586. --- ./implicit.c    Tue Jul 24 00:54:16 1990
  1587. *************** You should have received a copy of the G
  1588. *** 16,27 ****
  1589. --- 16,48 ----
  1590.   along with GNU Make; see the file COPYING.  If not, write to
  1591.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  1592.   
  1593. + /*
  1594. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  1595. +  *
  1596. +  * To this port, the same copying conditions apply as to the
  1597. +  * original release.
  1598. +  *
  1599. +  * IMPORTANT:
  1600. +  * This file is not identical to the original GNU release!
  1601. +  * You should have received this code as patch to the official
  1602. +  * GNU release.
  1603. +  *
  1604. +  * MORE IMPORTANT:
  1605. +  * This port comes with ABSOLUTELY NO WARRANTY.
  1606. +  *
  1607. +  * $Header: e:/gnu/make/RCS/implicit.c'v 3.58.0.1 90/07/17 00:59:17 tho Exp $
  1608. +  */
  1609.   #include "make.h"
  1610.   #include "rule.h"
  1611.   #include "dep.h"
  1612.   #include "file.h"
  1613.   
  1614. + #ifdef MSDOS
  1615. + static  int pattern_search (struct file *file, char *name, unsigned int depth, unsigned int recursions);
  1616. + #else /* not MSDOS */
  1617.   static int pattern_search ();
  1618. + #endif /* not MSDOS */
  1619.   
  1620.   /* For a FILE which has no commands specified, try to figure out some
  1621.      from the implicit pattern rules.
  1622. diff -cBdNp e:/gnu/make/gnu/job.c ./job.c
  1623. *** e:/gnu/make/gnu/job.c    Tue Jul 24 00:53:00 1990
  1624. --- ./job.c    Tue Jul 24 00:54:34 1990
  1625. *************** You should have received a copy of the G
  1626. *** 16,21 ****
  1627. --- 16,38 ----
  1628.   along with GNU Make; see the file COPYING.  If not, write to
  1629.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  1630.   
  1631. + /*
  1632. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  1633. +  *
  1634. +  * To this port, the same copying conditions apply as to the
  1635. +  * original release.
  1636. +  *
  1637. +  * IMPORTANT:
  1638. +  * This file is not identical to the original GNU release!
  1639. +  * You should have received this code as patch to the official
  1640. +  * GNU release.
  1641. +  *
  1642. +  * MORE IMPORTANT:
  1643. +  * This port comes with ABSOLUTELY NO WARRANTY.
  1644. +  *
  1645. +  * $Header: e:/gnu/make/RCS/job.c'v 3.58.0.6 90/07/22 14:31:11 tho Exp $
  1646. +  */
  1647.   #include "make.h"
  1648.   #include "commands.h"
  1649.   #include "job.h"
  1650. *************** the Free Software Foundation, 675 Mass A
  1651. *** 23,29 ****
  1652. --- 40,77 ----
  1653.   #include "variable.h"
  1654.   #include <errno.h>
  1655.   
  1656. + #ifdef MSDOS
  1657. + #define PATHSEP    ';'
  1658. + #else
  1659. + #define PATHSEP    ':'
  1660. + #endif
  1661. + #ifndef MSDOS
  1662.   extern int errno;
  1663. + #endif /* not MSDOS */
  1664. + #ifdef MSDOS
  1665. + #include <time.h>
  1666. + #include <process.h>
  1667. + #include <io.h>
  1668. + int last_child_pid = 0;            /* no child started yet ... */
  1669. + int last_child_status = 0;
  1670. + struct stringlist
  1671. +   {
  1672. +     char **list;    /* Nil-terminated list of strings.  */
  1673. +     unsigned int idx;    /* Index into above.  */
  1674. +     unsigned int max;    /* Number of pointers allocated.  */
  1675. +   };
  1676. + extern struct stringlist *swapping_device;
  1677. + extern int swap_and_spawnvpe (char *device, char *cmd, char **argv,
  1678. +                   char **envvec);
  1679. + #endif /* MSDOS */
  1680.   
  1681.   #if    defined(USG) && !defined(HAVE_VFORK)
  1682.   #define    vfork    fork
  1683. *************** extern int wait3 ();
  1684. *** 72,77 ****
  1685. --- 120,129 ----
  1686.   
  1687.   #endif    /* WTERMSIG defined or USG and don't have <sys/wait.h>.  */
  1688.   
  1689. + #ifdef MSDOS
  1690. + static char *search_path (char *file, char *path);
  1691. + static  void child_error (char *target_name, int exit_code, int exit_sig, int coredump, int ignored);
  1692. + #endif /* MSDOS */
  1693.   
  1694.   extern int dup2 ();
  1695.   extern int fork (), wait (), execve ();
  1696. *************** extern int geteuid (), getegid ();
  1697. *** 82,87 ****
  1698. --- 134,142 ----
  1699.   #define sigmask(sig) (1 << ((sig) - 1))
  1700.   #endif
  1701.   
  1702. + #ifdef MSDOS
  1703. + #define getdtablesize() _NFILE
  1704. + #else /* not MSDOS */
  1705.   #ifndef USG
  1706.   extern int getdtablesize ();
  1707.   #else
  1708. *************** extern int getdtablesize ();
  1709. *** 88,93 ****
  1710. --- 143,149 ----
  1711.   #include <sys/param.h>
  1712.   #define getdtablesize() NOFILE
  1713.   #endif
  1714. + #endif /* not MSDOS */
  1715.   
  1716.   extern void wait_to_start_job ();
  1717.   extern int start_remote_job_p ();
  1718. *************** void init_siglist ();
  1719. *** 101,108 ****
  1720. --- 157,170 ----
  1721.   extern char *sys_siglist[];
  1722.   #endif    /* USG and not HAVE_SIGLIST.  */
  1723.   
  1724. + #ifdef MSDOS
  1725. + extern  int child_handler (int sig);
  1726. + static void start_job (struct child *child);
  1727. + static void free_child (struct child *child);
  1728. + #else /* not MSDOS */
  1729.   int child_handler ();
  1730.   static void free_child (), start_job ();
  1731. + #endif /* not MSDOS */
  1732.   
  1733.   /* Chain of all children.  */
  1734.   
  1735. *************** extern void block_remote_children (), un
  1736. *** 148,153 ****
  1737. --- 210,216 ----
  1738.   void
  1739.   block_children ()
  1740.   {
  1741. + #ifndef MSDOS
  1742.   #ifdef USG
  1743.     /* Ignoring SIGCLD makes wait always return -1.
  1744.        Using the default action does the right thing.  */
  1745. *************** block_children ()
  1746. *** 155,160 ****
  1747. --- 218,224 ----
  1748.   #else
  1749.     (void) sigblock (sigmask (SIGCHLD));
  1750.   #endif
  1751. + #endif /* ! MSDOS */
  1752.   
  1753.     block_remote_children ();
  1754.   }
  1755. *************** block_children ()
  1756. *** 163,173 ****
  1757. --- 227,239 ----
  1758.   void
  1759.   unblock_children ()
  1760.   {
  1761. + #ifndef MSDOS
  1762.   #ifdef    USG
  1763.     (void) signal (SIGCLD, child_handler);
  1764.   #else
  1765.     (void) sigsetmask (sigblock (0) & ~sigmask (SIGCHLD));
  1766.   #endif
  1767. + #endif /* ! MSDOS */
  1768.   
  1769.     unblock_remote_children ();
  1770.   }
  1771. *************** wait_for_children (n, err)
  1772. *** 380,390 ****
  1773. --- 446,458 ----
  1774.   {
  1775.     block_children ();
  1776.   
  1777. + #ifndef MSDOS
  1778.     if (err && (children != 0 || shell_function_pid != 0))
  1779.       {
  1780.         fflush (stdout);
  1781.         error ("*** Waiting for unfinished jobs....");
  1782.       }
  1783. + #endif /* not MSDOS */
  1784.   
  1785.     /* Call child_handler to do the work.  */
  1786.     (void) child_handler (- (int) n);
  1787. *************** start_job (child)
  1788. *** 431,437 ****
  1789. --- 499,509 ----
  1790.         {
  1791.       /* Expand and run the next line.  */
  1792.       child->command_ptr = child->commands
  1793. + #ifdef MSDOS
  1794. +       = allocated_var_exp_for_file
  1795. + #else
  1796.         = allocated_variable_expand_for_file
  1797. + #endif /* MSDOS */
  1798.           (child->file->cmds->command_lines[child->command_line++],
  1799.            child->file);
  1800.         }
  1801. *************** start_job (child)
  1802. *** 536,541 ****
  1803. --- 608,614 ----
  1804.     
  1805.     /* Set up a bad standard input that reads from a broken pipe.  */
  1806.   
  1807. + #ifndef MSDOS
  1808.     if (bad_stdin == -1)
  1809.       {
  1810.         /* Make a file descriptor that is the read end of a broken pipe.
  1811. *************** start_job (child)
  1812. *** 549,554 ****
  1813. --- 622,628 ----
  1814.         bad_stdin = pd[0];
  1815.       }
  1816.       }
  1817. + #endif /* ! MSDOS */
  1818.   
  1819.     /* Decide whether to give this child the `good' standard input
  1820.        (one that points to the terminal or whatever), or the `bad' one
  1821. *************** start_job (child)
  1822. *** 564,569 ****
  1823. --- 638,675 ----
  1824.     if (child->environment == 0)
  1825.       child->environment = target_environment (child->file);
  1826.   
  1827. + #ifdef MSDOS
  1828. +   child->remote = 0;
  1829. +   child->pid = abs ((int) clock());        /* reasonably random */
  1830. + #if (0)
  1831. +        {
  1832. +               int ac = 0;
  1833. +               char **av = argv;
  1834. +               printf ( "start_job(): spawning process");
  1835. +               while (*av)
  1836. +                printf( " $%d=`%s'", ac++, *av++);
  1837. +               printf( "\n");
  1838. +        }
  1839. + #endif /* NEVER */
  1840. +   /* LAST_CHILD_STATUS and LAST_CHILD_PID will be used by our
  1841. +      (faked) wait for MS-DOS to bury this 'child' */
  1842. +   last_child_status
  1843. +     = swap_and_spawnvpe (swapping_device ? swapping_device->list[0] : NULL,
  1844. +             argv[0], argv, child->environment);
  1845. +   last_child_pid = child->pid;
  1846. +   if (last_child_status == -1)
  1847. +     pfatal_with_name ("vm_spawnvp");
  1848. +   child->file->command_state = cs_running;    /* in *some* sense ...  */
  1849. + #else /* not MSDOS */
  1850.     if (start_remote_job_p ())
  1851.       {
  1852.         int is_remote, id, used_stdin;
  1853. *************** start_job (child)
  1854. *** 608,613 ****
  1855. --- 714,722 ----
  1856.        say the commands are running and return.  */
  1857.   
  1858.     child->file->command_state = cs_running;
  1859. + #endif /* not MSDOS */
  1860.     return;
  1861.   
  1862.    error:;
  1863. *************** new_job (file)
  1864. *** 679,684 ****
  1865. --- 788,794 ----
  1866.       }
  1867.   }
  1868.   
  1869. + #ifndef MSDOS
  1870.   /* Replace the current process with one executing the command in ARGV.
  1871.      STDIN_FD and STDOUT_FD are used as the process's stdin and stdout;
  1872.      FILE, if not nil, is used as the variable-set to expand `PATH' and `SHELL';
  1873. *************** child_execute_job (stdin_fd, stdout_fd, 
  1874. *** 711,716 ****
  1875. --- 821,827 ----
  1876.           allocated_variable_expand_for_file ("$(PATH)", file),
  1877.           allocated_variable_expand_for_file ("$(SHELL)", file));
  1878.   }
  1879. + #endif /* not MSDOS */
  1880.   
  1881.   /* Search PATH for FILE, returning a full pathname or nil.
  1882.      The returned pathname is allocated via `malloc'.  */
  1883. *************** search_path (file, path)
  1884. *** 742,748 ****
  1885.         int perm;
  1886.         char *p;
  1887.   
  1888. !       p = index (path, ':');
  1889.         if (p == 0)
  1890.           p = path + strlen (path);
  1891.   
  1892. --- 853,859 ----
  1893.         int perm;
  1894.         char *p;
  1895.   
  1896. !       p = index (path, PATHSEP);
  1897.         if (p == 0)
  1898.           p = path + strlen (path);
  1899.   
  1900. *************** search_path (file, path)
  1901. *** 758,763 ****
  1902. --- 869,877 ----
  1903.         if (stat (program, &st) == 0
  1904.             && (st.st_mode & S_IFMT) == S_IFREG)
  1905.           {
  1906. + #ifdef MSDOS            /* we always have permission */
  1907. +           return program;
  1908. + #else /* not MSDOS */
  1909.             if (st.st_uid == geteuid ())
  1910.           perm = (st.st_mode & 0100);
  1911.             else if (st.st_gid == getegid ())
  1912. *************** search_path (file, path)
  1913. *** 778,783 ****
  1914. --- 892,898 ----
  1915.   
  1916.             if (perm != 0)
  1917.           return program;
  1918. + #endif /* not MSDOS */
  1919.           }
  1920.   
  1921.         path = p + 1;
  1922. *************** search_path (file, path)
  1923. *** 787,792 ****
  1924. --- 902,908 ----
  1925.     return 0;
  1926.   }
  1927.   
  1928. + #ifndef MSDOS
  1929.   /* Replace the current process with one running the command in ARGV,
  1930.      with environment ENVP.  The program named in ARGV[0] is searched
  1931.      for in PATH.  SHELL is the shell program to run for shell scripts.
  1932. *************** exec_command (argv, envp, path, shell)
  1933. *** 840,845 ****
  1934. --- 956,962 ----
  1935.   
  1936.     _exit (127);
  1937.   }
  1938. + #endif /* not MSDOS */
  1939.   
  1940.   /* Figure out the argument list necessary to run LINE as a command.
  1941.      Try to avoid using a shell.  This routine handles only ' quoting.
  1942. *************** construct_command_argv (line, file)
  1943. *** 855,866 ****
  1944.        char *line;
  1945.        struct file *file;
  1946.   {
  1947. -   static char sh_chars[] = "#;\"*?[]&|<>(){}=$`";
  1948. -   static char *sh_cmds[] = { "cd", "eval", "exec", "exit", "login",
  1949. -                  "logout", "set", "umask", "wait", "while", "for",
  1950. -                  "case", "if", ":", ".", "break", "continue",
  1951. -                  "export", "read", "readonly", "shift", "times",
  1952. -                  "trap", "switch", 0 };
  1953.     register int i;
  1954.     register char *p;
  1955.     register char *ap;
  1956. --- 972,977 ----
  1957. *************** construct_command_argv (line, file)
  1958. *** 868,877 ****
  1959. --- 979,1067 ----
  1960.     int instring;
  1961.     char **new_argv = 0;
  1962.   
  1963. + #ifdef MSDOS
  1964. +   char *sh_chars;
  1965. +   char **sh_cmds;
  1966. +   char *base;
  1967. +   char *shell_command;
  1968. +   char switch_char = '/';
  1969. +   static char _sh_chars[]
  1970. +     = "#;\"*?[]&|<>(){}=$`";
  1971. +   static char *_sh_cmds[]
  1972. +     = {    "cd", "echo", "eval", "exec", "exit", "login", "logout", "set",
  1973. +     "umask", "wait", "while", "for", "case", "if", ":", ".", "break",
  1974. +     "continue", "export", "read", "readonly", "shift", "times",
  1975. +     "trap", "switch", NULL };
  1976. +   static char _4dos_chars[]
  1977. +     = "<|>^&%";
  1978. +   static char *_4dos_cmds[]
  1979. +     = {    "alias", "attrib", "beep", "cd", "cdd", "chdir", "copy", "del",
  1980. +     "dir", "echo", "erase", "except", "for", "global", "if", "iff",
  1981. +     "keystack", "md", "move", "popd", "pushd", "rd", "ren", "rename",
  1982. +     "set", "timer", "unalias", "unset", NULL };
  1983. +   static char _command_com_chars[]
  1984. +     = "<|>%";
  1985. +   static char *_command_com_cmds[]
  1986. +     = { "attrib", "cd", "chdir", "copy", "del", "dir", "echo", "erase",
  1987. +     "for", "if", "md", "quit", "rd", "ren", "rename", "set", "unset",
  1988. +     NULL };
  1989. +   /* See if it is safe to parse commands internally.  */
  1990. +   /* $(SHELL) is always defined (see variable.c)  */
  1991. +   p = base = shell_command
  1992. +     = strlwr (allocated_var_exp_for_file ("$(SHELL)", file));
  1993. +   while (*p)
  1994. +     {
  1995. +       if ((*p == '/' || *p == '\\' || *p == ':') && p[1])
  1996. +     base = p + 1;
  1997. +       p++;
  1998. +     }
  1999. +   if (!strncmp ("sh", base, 2))
  2000. +     {
  2001. +       sh_chars = _sh_chars;
  2002. +       sh_cmds = _sh_cmds;
  2003. +       switch_char = '/';    /* this is true for by Bourne shell */
  2004. +     }
  2005. +   else if (!strncmp ("4dos", base, 4))
  2006. +     {
  2007. +       sh_chars = _4dos_chars;
  2008. +       sh_cmds = _4dos_cmds;
  2009. +     }
  2010. +   else if (!strncmp ("command", base, 7))
  2011. +     {
  2012. +       sh_chars = _command_com_chars;
  2013. +       sh_cmds = _command_com_cmds;
  2014. +     }
  2015. +   else
  2016. +     {
  2017. +       free (shell_command);
  2018. +       goto slow;
  2019. +     }
  2020. + #else /* not MSDOS */
  2021. +   static char sh_chars[] = "#;\"*?[]&|<>(){}=$`";
  2022. +   static char *sh_cmds[] = { "cd", "eval", "exec", "exit", "login",
  2023. +                  "logout", "set", "umask", "wait", "while", "for",
  2024. +                  "case", "if", ":", ".", "break", "continue",
  2025. +                  "export", "read", "readonly", "shift", "times",
  2026. +                  "trap", "switch", 0 };
  2027.     /* See if it is safe to parse commands internally.  */
  2028.     p = variable_expand_for_file ("$(SHELL)", file);
  2029.     if (strcmp (p, "/bin/sh"))
  2030.       goto slow;
  2031. + #endif /* not MSDOS */
  2032.     p = variable_expand_for_file ("$(IFS)", file);
  2033.     for (ap = p; *ap != '\0'; ++ap)
  2034.       if (*ap != ' ' && *ap != '\t' && *ap != '\n')
  2035. *************** construct_command_argv (line, file)
  2036. *** 966,973 ****
  2037. --- 1156,1168 ----
  2038.     if (new_argv != 0)
  2039.       free (new_argv);
  2040.     new_argv = (char **) xmalloc (4 * sizeof (char *));
  2041. + #ifdef MSDOS
  2042. +   new_argv[0] = allocated_var_exp_for_file ("$(SHELL)", file);
  2043. +   new_argv[1] = (switch_char == '-') ? "-c" : "/c";
  2044. + #else /* not MSDOS */
  2045.     new_argv[0] = allocated_variable_expand_for_file ("$(SHELL)", file);
  2046.     new_argv[1] = "-c";
  2047. + #endif /* not MSDOS */
  2048.     new_argv[2] = line;
  2049.     new_argv[3] = 0;
  2050.   
  2051. *************** init_siglist ()
  2052. *** 990,1001 ****
  2053. --- 1185,1199 ----
  2054.       sprintf (buf, "Signal %u", i);
  2055.       sys_siglist[i] = savestring (buf, strlen (buf));
  2056.       break;
  2057. + #ifndef MSDOS
  2058.         case SIGHUP:
  2059.       sys_siglist[i] = "Hangup";
  2060.       break;
  2061. + #endif /* ! MSDOS */
  2062.         case SIGINT:
  2063.       sys_siglist[i] = "Interrupt";
  2064.       break;
  2065. + #ifndef MSDOS
  2066.         case SIGQUIT:
  2067.       sys_siglist[i] = "Quit";
  2068.       break;
  2069. *************** init_siglist ()
  2070. *** 1008,1013 ****
  2071. --- 1206,1212 ----
  2072.         case SIGIOT:
  2073.       sys_siglist[i] = "IOT Trap";
  2074.       break;
  2075. + #endif /* ! MSDOS */
  2076.   #ifdef    SIGEMT
  2077.         case SIGEMT:
  2078.       sys_siglist[i] = "EMT Trap";
  2079. *************** init_siglist ()
  2080. *** 1021,1026 ****
  2081. --- 1220,1226 ----
  2082.         case SIGFPE:
  2083.       sys_siglist[i] = "Floating Point Exception";
  2084.       break;
  2085. + #ifndef MSDOS
  2086.         case SIGKILL:
  2087.       sys_siglist[i] = "Killed";
  2088.       break;
  2089. *************** init_siglist ()
  2090. *** 1048,1053 ****
  2091. --- 1248,1254 ----
  2092.         case SIGUSR2:
  2093.       sys_siglist[i] = "User-defined signal 2";
  2094.       break;
  2095. + #endif /* ! MSDOS */
  2096.   #ifdef    SIGCLD
  2097.         case SIGCLD:
  2098.   #endif
  2099. *************** init_siglist ()
  2100. *** 1125,1131 ****
  2101.   }
  2102.   #endif    /* USG and not HAVE_SIGLIST.  */
  2103.   
  2104. ! #if    defined(USG) && !defined(USGr3) && !defined(HAVE_DUP2)
  2105.   int
  2106.   dup2 (old, new)
  2107.        int old, new;
  2108. --- 1326,1332 ----
  2109.   }
  2110.   #endif    /* USG and not HAVE_SIGLIST.  */
  2111.   
  2112. ! #if defined(USG) && !defined(USGr3) && !defined(HAVE_DUP2) && !defined (MSDOS)
  2113.   int
  2114.   dup2 (old, new)
  2115.        int old, new;
  2116. *************** dup2 (old, new)
  2117. *** 1143,1146 ****
  2118.   
  2119.     return fd;
  2120.   }
  2121. ! #endif    /* USG and not USGr3 and not HAVE_DUP2.  */
  2122. --- 1344,1363 ----
  2123.   
  2124.     return fd;
  2125.   }
  2126. ! #endif    /* USG and not USGr3 and not HAVE_DUP2 and not MSDOS.  */
  2127. ! #ifdef MSDOS
  2128. ! /* fake a wait ... */
  2129. ! int
  2130. ! wait (WAIT_T *status)
  2131. !  {
  2132. !    int temp = last_child_pid;        /* the last child we spawned */
  2133. !    *status = last_child_status << 8;    /* it's return code (not a signal) */
  2134. !    last_child_pid = 0;            /* the only child ... */
  2135. !    return temp;
  2136. !  }
  2137. ! #endif    /* MSDOS */
  2138. diff -cBdNp e:/gnu/make/gnu/job.h ./job.h
  2139. *** e:/gnu/make/gnu/job.h    Tue Jul 24 00:53:02 1990
  2140. --- ./job.h    Tue Jul 24 00:54:36 1990
  2141. ***************
  2142. *** 1,3 ****
  2143. --- 1,20 ----
  2144. + /*
  2145. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  2146. +  *
  2147. +  * To this port, the same copying conditions apply as to the
  2148. +  * original release.
  2149. +  *
  2150. +  * IMPORTANT:
  2151. +  * This file is not identical to the original GNU release!
  2152. +  * You should have received this code as patch to the official
  2153. +  * GNU release.
  2154. +  *
  2155. +  * MORE IMPORTANT:
  2156. +  * This port comes with ABSOLUTELY NO WARRANTY.
  2157. +  *
  2158. +  * $Header: e:/gnu/make/RCS/job.h'v 3.58.0.2 90/07/17 03:32:50 tho Exp $
  2159. +  */
  2160.   /* Structure describing a running or dead child process.  */
  2161.   
  2162.   struct child
  2163. *************** struct child
  2164. *** 23,31 ****
  2165. --- 40,59 ----
  2166.   
  2167.   extern struct child *children;
  2168.   
  2169. + #ifdef MSDOS
  2170. + extern  int _cdecl wait (int *status);
  2171. + extern  void new_job (struct file *file);
  2172. + extern  void block_children (void);
  2173. + extern  void unblock_children (void);
  2174. + #else /* not MSDOS */
  2175.   extern void new_job ();
  2176.   extern void wait_for_children ();
  2177.   extern void block_children (), unblock_children ();
  2178. + #endif /* not MSDOS */
  2179. + #ifdef MSDOS
  2180. + extern  void exec_command (char **argv, char **envp, char *path, char *shell);
  2181. + #endif /* MSDOS */
  2182.   
  2183.   extern char **construct_command_argv ();
  2184.   extern void child_execute_job ();
  2185. diff -cBdNp e:/gnu/make/gnu/load.c ./load.c
  2186. *** e:/gnu/make/gnu/load.c    Tue Jul 24 00:53:04 1990
  2187. --- ./load.c    Tue Jul 24 00:54:38 1990
  2188. *************** You should have received a copy of the G
  2189. *** 15,20 ****
  2190. --- 15,37 ----
  2191.   along with GNU Make; see the file COPYING.  If not, write to
  2192.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  2193.   
  2194. + /*
  2195. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  2196. +  *
  2197. +  * To this port, the same copying conditions apply as to the
  2198. +  * original release.
  2199. +  *
  2200. +  * IMPORTANT:
  2201. +  * This file is not identical to the original GNU release!
  2202. +  * You should have received this code as patch to the official
  2203. +  * GNU release.
  2204. +  *
  2205. +  * MORE IMPORTANT:
  2206. +  * This port comes with ABSOLUTELY NO WARRANTY.
  2207. +  *
  2208. +  * $Header: e:/gnu/make/RCS/load.c'v 3.58.0.1 90/07/17 00:59:28 tho Exp $
  2209. +  */
  2210.   #include "make.h"
  2211.   #include "commands.h"
  2212.   #include "job.h"
  2213. *************** load_average ()
  2214. *** 134,145 ****
  2215. --- 151,165 ----
  2216.   #define LDAV_CVT ((double) load)
  2217.   #endif
  2218.   
  2219. + #ifndef MSDOS
  2220.   #include <nlist.h>
  2221. + #include <nlist.h>
  2222.   #ifdef    NLIST_NAME_UNION
  2223.   #define    nl_name    n_un.n_name
  2224.   #else
  2225.   #define    nl_name    n_name
  2226.   #endif
  2227. + #endif /* not MSDOS */
  2228.   
  2229.   #ifdef    USG
  2230.   #include <fcntl.h>
  2231. diff -cBdNp e:/gnu/make/gnu/main.c ./main.c
  2232. *** e:/gnu/make/gnu/main.c    Tue Jul 24 00:53:06 1990
  2233. --- ./main.c    Tue Jul 24 00:54:50 1990
  2234. *************** You should have received a copy of the G
  2235. *** 15,20 ****
  2236. --- 15,37 ----
  2237.   along with GNU Make; see the file COPYING.  If not, write to
  2238.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  2239.   
  2240. + /*
  2241. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  2242. +  *
  2243. +  * To this port, the same copying conditions apply as to the
  2244. +  * original release.
  2245. +  *
  2246. +  * IMPORTANT:
  2247. +  * This file is not identical to the original GNU release!
  2248. +  * You should have received this code as patch to the official
  2249. +  * GNU release.
  2250. +  *
  2251. +  * MORE IMPORTANT:
  2252. +  * This port comes with ABSOLUTELY NO WARRANTY.
  2253. +  *
  2254. +  * $Header: e:/gnu/make/RCS/main.c'v 3.58.0.6 90/07/22 18:55:19 tho Exp $
  2255. +  */
  2256.   #include "make.h"
  2257.   #include "commands.h"
  2258.   #include "dep.h"
  2259. *************** the Free Software Foundation, 675 Mass A
  2260. *** 24,29 ****
  2261. --- 41,53 ----
  2262.   #include <ctype.h>
  2263.   #include <time.h>
  2264.   
  2265. + #ifdef MSDOS
  2266. + #include <process.h>
  2267. + extern char *msdos_version_string;
  2268. + extern int swap_and_spawnvpe (char *device, char *cmd, char **argv,
  2269. +                   char **envvec);
  2270. + extern char *msdos_format_filename (char *name);
  2271. + #endif /* MSDOS */
  2272.   
  2273.   extern char *version_string;
  2274.   
  2275. *************** extern void print_rule_data_base ();
  2276. *** 37,42 ****
  2277. --- 61,70 ----
  2278.   extern void print_file_data_base ();
  2279.   extern void print_vpath_data_base ();
  2280.   
  2281. + #ifdef MSDOS
  2282. + #include <direct.h>
  2283. + #include <io.h>
  2284. + #else /* not MSDOS */
  2285.   extern int chdir ();
  2286.   extern void exit ();
  2287.   extern long int atol ();
  2288. *************** extern long int atol ();
  2289. *** 43,54 ****
  2290.   extern time_t time ();
  2291.   extern int mktemp ();
  2292.   extern double atof ();
  2293.   
  2294.   static void log_working_directory ();
  2295.   static void print_data_base (), print_version ();
  2296.   static void decode_switches (), decode_env_switches ();
  2297.   static void define_makeflags ();
  2298.   
  2299.   #if 0 /* dummy tag */
  2300.   flags () {}
  2301. --- 71,92 ----
  2302.   extern time_t time ();
  2303.   extern int mktemp ();
  2304.   extern double atof ();
  2305. + #endif /* not MSDOS */
  2306.   
  2307. + #ifdef MSDOS
  2308. + extern  int main (int argc, char **argv, char **envp);
  2309. + static  void decode_switches (int argc, char **argv);
  2310. + static  void decode_env_switches (char *envar, unsigned int len);
  2311. + static  void define_makeflags (int pf);
  2312. + static  void print_version (void);
  2313. + static  void print_data_base (void);
  2314. + static  void log_working_directory (int entering);
  2315. + #else /* not MSDOS */
  2316.   static void log_working_directory ();
  2317.   static void print_data_base (), print_version ();
  2318.   static void decode_switches (), decode_env_switches ();
  2319.   static void define_makeflags ();
  2320. ! #endif /* not MSDOS */
  2321.   
  2322.   #if 0 /* dummy tag */
  2323.   flags () {}
  2324. *************** static struct stringlist *old_files = 0;
  2325. *** 206,211 ****
  2326. --- 244,256 ----
  2327.   
  2328.   static struct stringlist *new_files = 0;
  2329.   
  2330. + #ifdef MSDOS
  2331. + /* String describing the swapping mode to be used.
  2332. +    (one of "xms, ems, disk, none") */
  2333. +  
  2334. + struct stringlist *swapping_device = NULL;
  2335. + #endif /* MSDOS */
  2336.   /* The table of command switches.  */
  2337.   
  2338.   static struct command_switch switches[] =
  2339. *************** static struct command_switch switches[] 
  2340. *** 234,239 ****
  2341. --- 279,287 ----
  2342.       { 'v', flag, (char *) &print_version_flag, 0, 0, 0, 0 },
  2343.       { 'w', flag, (char *) &print_directory_flag, 1, 1, 0, 0 },
  2344.       { 'W', string, (char *) &new_files, 0, 0, 0, 0 },
  2345. + #ifdef MSDOS
  2346. +     { 'x', string, (char *) &swapping_device, 0, 0, 0, 0 },
  2347. + #endif /* MSDOS */
  2348.       { '\0', ignore, 0, 0, 0, 0 }
  2349.     };
  2350.   
  2351. *************** struct file *default_goal_file;
  2352. *** 261,266 ****
  2353. --- 309,322 ----
  2354.      This is zero if the makefiles do not define .DEFAULT.  */
  2355.   
  2356.   struct file *default_file;
  2357. + #ifdef MSDOS
  2358. + /* Under MS-DOS the current directory is not local to the process,
  2359. +    so we have to find means to back up somehow.  */
  2360. + char current_directory[MAXPATHLEN];
  2361. + #endif /* MSDOS */
  2362.   
  2363.   int
  2364.   main (argc, argv, envp)
  2365. *************** main (argc, argv, envp)
  2366. *** 282,289 ****
  2367. --- 338,348 ----
  2368.     struct dep *goals = 0;
  2369.     register struct dep *lastgoal;
  2370.     struct dep *read_makefiles;
  2371. + #ifndef MSDOS            /* see above */
  2372.     char current_directory[MAXPATHLEN];
  2373. + #endif /* not MSDOS */
  2374.   
  2375.     default_goal_file = 0;
  2376.     reading_filename = 0;
  2377.     reading_lineno_ptr = 0;
  2378. *************** main (argc, argv, envp)
  2379. *** 292,303 ****
  2380. --- 351,365 ----
  2381.     init_siglist ();
  2382.   #endif
  2383.   
  2384. + #ifndef MSDOS
  2385.     if (signal (SIGHUP, fatal_error_signal) == SIG_IGN)
  2386.       (void) signal (SIGHUP, SIG_IGN);
  2387.     if (signal (SIGQUIT, fatal_error_signal) == SIG_IGN)
  2388.       (void) signal (SIGQUIT, SIG_IGN);
  2389. + #endif /* ! MSDOS */
  2390.     if (signal (SIGINT, fatal_error_signal) == SIG_IGN)
  2391.       (void) signal (SIGINT, SIG_IGN);
  2392. + #ifndef MSDOS
  2393.     if (signal (SIGILL, fatal_error_signal) == SIG_IGN)
  2394.       (void) signal (SIGILL, SIG_IGN);
  2395.     if (signal (SIGTRAP, fatal_error_signal) == SIG_IGN)
  2396. *************** main (argc, argv, envp)
  2397. *** 304,309 ****
  2398. --- 366,372 ----
  2399.       (void) signal (SIGTRAP, SIG_IGN);
  2400.     if (signal (SIGIOT, fatal_error_signal) == SIG_IGN)
  2401.       (void) signal (SIGIOT, SIG_IGN);
  2402. + #endif /* ! MSDOS */
  2403.   #ifdef    SIGEMT
  2404.     if (signal (SIGEMT, fatal_error_signal) == SIG_IGN)
  2405.       (void) signal (SIGEMT, SIG_IGN);
  2406. *************** main (argc, argv, envp)
  2407. *** 314,319 ****
  2408. --- 377,383 ----
  2409.   #endif
  2410.     if (signal (SIGFPE, fatal_error_signal) == SIG_IGN)
  2411.       (void) signal (SIGFPE, SIG_IGN);
  2412. + #ifndef MSDOS
  2413.     if (signal (SIGBUS, fatal_error_signal) == SIG_IGN)
  2414.       (void) signal (SIGBUS, SIG_IGN);
  2415.     if (signal (SIGSEGV, fatal_error_signal) == SIG_IGN)
  2416. *************** main (argc, argv, envp)
  2417. *** 322,327 ****
  2418. --- 386,392 ----
  2419.       (void) signal (SIGSYS, SIG_IGN);
  2420.     if (signal (SIGTERM, fatal_error_signal) == SIG_IGN)
  2421.       (void) signal (SIGTERM, SIG_IGN);
  2422. + #endif /* ! MSDOS */
  2423.   #ifdef SIGXCPU
  2424.     if (signal (SIGXCPU, fatal_error_signal) == SIG_IGN)
  2425.       (void) signal (SIGXCPU, SIG_IGN);
  2426. *************** main (argc, argv, envp)
  2427. *** 333,339 ****
  2428.   
  2429.     /* Make sure stdout is line-buffered.  */
  2430.   
  2431. ! #if    defined(USGr3) || defined(HPUX) || defined(hpux)
  2432.     setvbuf (stdout, (char *) 0, _IOLBF, BUFSIZ);
  2433.   #else    /* Not USGr3 and not HPUX.  */
  2434.   #ifdef    USG
  2435. --- 398,404 ----
  2436.   
  2437.     /* Make sure stdout is line-buffered.  */
  2438.   
  2439. ! #if    defined(USGr3) || defined(HPUX) || defined(hpux) || defined (MSDOS)
  2440.     setvbuf (stdout, (char *) 0, _IOLBF, BUFSIZ);
  2441.   #else    /* Not USGr3 and not HPUX.  */
  2442.   #ifdef    USG
  2443. *************** main (argc, argv, envp)
  2444. *** 345,350 ****
  2445. --- 410,419 ----
  2446.   
  2447.     /* Figure out where this program lives.  */
  2448.   
  2449. + #ifdef MSDOS            /* cosmetics */
  2450. +   msdos_format_filename (argv[0]);
  2451. + #endif /* MSDOS */
  2452.     if (argv[0] == 0)
  2453.       argv[0] = "";
  2454.     if (argv[0][0] == '\0')
  2455. *************** main (argc, argv, envp)
  2456. *** 366,372 ****
  2457. --- 435,445 ----
  2458.   #endif
  2459.     if (getwd (current_directory) == 0)
  2460.       {
  2461. + #ifdef MSDOS
  2462. +       error ("getwd: %s", msdos_format_filename (current_directory));
  2463. + #else /* not MSDOS */
  2464.         error ("getwd: %s", current_directory);
  2465. + #endif /* not MSDOS */
  2466.         current_directory[0] = '\0';
  2467.       }
  2468.   #ifdef    USG
  2469. *************** main (argc, argv, envp)
  2470. *** 470,477 ****
  2471. --- 543,555 ----
  2472.        Append the command-line variable definitions gathered above
  2473.        so sub-makes will get them as command-line definitions.  */
  2474.   
  2475. + #ifdef MSDOS
  2476. +   if (current_directory[0] != '\0' && argv[0] != 0
  2477. +   && argv[0][1] != ':' && argv[0][0] != '/' && index (argv[0], '/') != 0)
  2478. + #else /* not MSDOS */
  2479.     if (current_directory[0] != '\0'
  2480.         && argv[0] != 0 && argv[0][0] != '/' && index (argv[0], '/') != 0)
  2481. + #endif /* not MSDOS */
  2482.       argv[0] = concat (current_directory, "/", argv[0]);
  2483.   
  2484.     if (cmd_defs_idx > 0)
  2485. *************** main (argc, argv, envp)
  2486. *** 520,526 ****
  2487. --- 598,608 ----
  2488.           /* This makefile is standard input.  Since we may re-exec
  2489.              and thus re-read the makefiles, we read standard input
  2490.              into a temporary file and read from that.  */
  2491. + #ifdef MSDOS        /* Can't use $TMP, sice it may contain a `:'  */
  2492. +         static char name[] = "./GmXXXXXX";
  2493. + #else /* not MSDOS */
  2494.           static char name[] = "/tmp/GmXXXXXX";
  2495. + #endif /* not MSDOS */
  2496.           FILE *outfile;
  2497.   
  2498.           /* Free the storage allocated for "-".  */
  2499. *************** main (argc, argv, envp)
  2500. *** 562,572 ****
  2501. --- 644,656 ----
  2502.     /* Set up to handle children dying.  This must be done before
  2503.        reading in the makefiles so that `shell' function calls will work.  */
  2504.   
  2505. + #ifndef MSDOS
  2506.   #ifdef SIGCHLD
  2507.     (void) signal (SIGCHLD, child_handler);
  2508.   #else
  2509.     (void) signal (SIGCLD, child_handler);
  2510.   #endif
  2511. + #endif /* ! MSDOS */
  2512.   
  2513.     /* Install the default implicit rules.  */
  2514.   
  2515. *************** main (argc, argv, envp)
  2516. *** 824,832 ****
  2517. --- 908,921 ----
  2518.           sprintf (*p, "MAKELEVEL=%u", makelevel);
  2519.           break;
  2520.             }
  2521. + #ifdef MSDOS        /* MSC'c execve () will fail with our spawn(). */
  2522. +       exit (swap_and_spawnvpe (swapping_device
  2523. +         ? swapping_device->list[0] : NULL, argv[0], argv, environ));
  2524. + #else /* not MSDOS */
  2525.         exec_command (argv, environ,
  2526.               allocated_variable_expand ("$(PATH)"),
  2527.               allocated_variable_expand ("$(SHELL)"));
  2528. + #endif /* not MSDOS */
  2529.         /* NOTREACHED */
  2530.       }
  2531.       }
  2532. *************** print_version ()
  2533. *** 1235,1240 ****
  2534. --- 1324,1335 ----
  2535.   %sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
  2536.   %sPARTICULAR PURPOSE.\n\n", precede, precede, precede, precede);
  2537.   
  2538. + #ifdef MSDOS
  2539. +   printf ("%sMS-DOS port (C) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>\n\
  2540. + %sthis is an alpha version, compiled %s.\n\n",
  2541. +       precede, precede, msdos_version_string);
  2542. + #endif /* MSDOS */
  2543.     printed_version = 1;
  2544.   
  2545.     /* Flush stdout so the user doesn't have to wait to see the
  2546. *************** die (status)
  2547. *** 1289,1294 ****
  2548. --- 1384,1410 ----
  2549.       log_working_directory (0);
  2550.       }
  2551.   
  2552. + #ifdef MSDOS
  2553. +   if (directories != 0 && directories->idx > 0)
  2554. +     {
  2555. +       char bad;
  2556. +       if (current_directory[0] != '\0')
  2557. +     {
  2558. +       if (chdir (current_directory) < 0)
  2559. +         {
  2560. +           perror_with_name ("chdir", "");
  2561. +           bad = 1;
  2562. +         }
  2563. +       else
  2564. +         bad = 0;
  2565. +     }
  2566. +       else
  2567. +     bad = 1;
  2568. +       if (bad)
  2569. +     fatal ("Couldn't change back to original directory.");
  2570. +     }
  2571. + #endif / MSDOS */
  2572.     exit (status);
  2573.   }
  2574.   
  2575. *************** log_working_directory (entering)
  2576. *** 1323,1331 ****
  2577. --- 1439,1454 ----
  2578.     block_children ();
  2579.   #endif
  2580.     if (getwd (pwdbuf) == 0)
  2581. + #ifdef MSDOS
  2582. +     printf ("an unknown directory (getwd: %s)\n",
  2583. +         msdos_format_filename (pwdbuf));
  2584. +   else
  2585. +     printf ("directory `%s'\n", msdos_format_filename (pwdbuf));
  2586. + #else /* not MSDOS */
  2587.       printf ("an unknown directory (getwd: %s)\n", pwdbuf);
  2588.     else
  2589.       printf ("directory `%s'\n", pwdbuf);
  2590. + #endif /* not MSDOS */
  2591.   #ifdef    USG
  2592.     unblock_children ();
  2593.   #endif
  2594. diff -cBdNp e:/gnu/make/gnu/make.h ./make.h
  2595. *** e:/gnu/make/gnu/make.h    Tue Jul 24 00:53:08 1990
  2596. --- ./make.h    Tue Jul 24 00:54:54 1990
  2597. *************** You should have received a copy of the G
  2598. *** 15,20 ****
  2599. --- 15,37 ----
  2600.   along with GNU Make; see the file COPYING.  If not, write to
  2601.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  2602.   
  2603. + /*
  2604. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  2605. +  *
  2606. +  * To this port, the same copying conditions apply as to the
  2607. +  * original release.
  2608. +  *
  2609. +  * IMPORTANT:
  2610. +  * This file is not identical to the original GNU release!
  2611. +  * You should have received this code as patch to the official
  2612. +  * GNU release.
  2613. +  *
  2614. +  * MORE IMPORTANT:
  2615. +  * This port comes with ABSOLUTELY NO WARRANTY.
  2616. +  *
  2617. +  * $Header: e:/gnu/make/RCS/make.h'v 3.58.0.2 90/07/17 03:32:52 tho Exp $
  2618. +  */
  2619.   #include <signal.h>
  2620.   #include <stdio.h>
  2621.   
  2622. *************** the Free Software Foundation, 675 Mass A
  2623. *** 22,28 ****
  2624. --- 39,48 ----
  2625.   #include <sys/types.h>
  2626.   #endif
  2627.   
  2628. + #ifndef MSDOS
  2629.   #include <sys/param.h>
  2630. + #endif /* not MSDOS */
  2631.   #ifndef MAXPATHLEN
  2632.   #define MAXPATHLEN 1024
  2633.   #endif    /* No MAXPATHLEN.  */
  2634. *************** extern void bzero (), bcopy ();
  2635. *** 53,59 ****
  2636. --- 73,83 ----
  2637.   #ifdef    sparc
  2638.   #include <alloca.h>
  2639.   #else    /* Not sparc.  */
  2640. + #ifdef MSDOS
  2641. + #include <malloc.h>
  2642. + #else /* not MSDOS */
  2643.   extern char *alloca ();
  2644. + #endif /* not MSDOS  */
  2645.   #endif    /* sparc.  */
  2646.   #endif    /* GCC.  */
  2647.   
  2648. *************** extern char *alloca ();
  2649. *** 76,82 ****
  2650. --- 100,133 ----
  2651.   #define    ENUM_BITFIELD(bits)
  2652.   #endif
  2653.   
  2654. + #ifdef MSDOS
  2655. + extern  void die (int status);
  2656. + #else /* not MSDOS */
  2657.   extern void die ();
  2658. + #endif /* not MSDOS */
  2659. + /*     misc.c */
  2660. + #ifdef MSDOS
  2661. + extern  char *concat (char *s1, char *s2, char *s3);
  2662. + extern  char *end_of_token (char *s);
  2663. + extern  char *find_next_token (char **ptr, unsigned int *lengthptr);
  2664. + extern  char *lindex (char *s, char *limit, int c);
  2665. + extern  char *next_token (char *s);
  2666. + extern  char *savestring (char *str, unsigned int length);
  2667. + extern  char *sindex (char *big, unsigned int blen, char *small,
  2668. +               unsigned int slen);
  2669. + extern  char *xmalloc (unsigned int size);
  2670. + extern  char *xrealloc (char *ptr, unsigned int size);
  2671. + extern  int alpha_compare (char **s1, char **s2);
  2672. + extern  struct dep *copy_dep_chain (struct dep *d);
  2673. + extern  void collapse_continuations (char *line);
  2674. + extern  void collapse_line (char *line);
  2675. + extern  void error (char *s1, ...);
  2676. + extern  void fatal (char *s1, ...);
  2677. + extern  void perror_with_name (char *str, char *name);
  2678. + extern  void pfatal_with_name (char *name);
  2679. + extern  void print_spaces (unsigned int n);
  2680. + #else /* not MSDOS */
  2681.   extern void fatal (), error ();
  2682.   extern void pfatal_with_name (), perror_with_name ();
  2683.   extern char *savestring (), *concat ();
  2684. *************** extern int alpha_compare ();
  2685. *** 88,121 ****
  2686.   extern void print_spaces ();
  2687.   extern struct dep *copy_dep_chain ();
  2688.   extern char *find_percent ();
  2689.   
  2690.   #ifndef    NO_ARCHIVES
  2691.   extern int ar_name ();
  2692.   extern int ar_touch ();
  2693.   extern time_t ar_member_date ();
  2694.   #endif
  2695.   
  2696.   extern void dir_load ();
  2697.   extern int dir_file_exists_p (), file_exists_p (), file_impossible_p ();
  2698.   extern void file_impossible ();
  2699.   extern char *dir_name ();
  2700.   
  2701.   extern void set_default_suffixes (), install_default_implicit_rules ();
  2702.   extern void convert_to_pattern (), count_implicit_rule_limits ();
  2703.   extern void create_pattern_rule ();
  2704.   
  2705.   extern void build_vpath_lists (), construct_vpath_list ();
  2706.   extern int vpath_search ();
  2707.   extern void construct_include_path ();
  2708.   
  2709.   extern int update_goal_chain ();
  2710.   extern void notice_finished_file ();
  2711.   
  2712.   extern int glob_pattern_p ();
  2713.   extern char **glob_filename ();
  2714.   
  2715.   #ifndef    USG
  2716.   extern int sigsetmask ();
  2717.   #endif
  2718. --- 139,248 ----
  2719.   extern void print_spaces ();
  2720.   extern struct dep *copy_dep_chain ();
  2721.   extern char *find_percent ();
  2722. + #endif /* not MSDOS */
  2723.   
  2724. + /* ar.c */
  2725.   #ifndef    NO_ARCHIVES
  2726. + #ifdef MSDOS
  2727. + extern  int ar_name (char *name);
  2728. + extern  int ar_touch (char *name);
  2729. + extern  long ar_member_date (char *name);
  2730. + #else /* not MSDOS */
  2731.   extern int ar_name ();
  2732.   extern int ar_touch ();
  2733.   extern time_t ar_member_date ();
  2734. + #endif /* not MSDOS */
  2735.   #endif
  2736.   
  2737. + /* dir.c */
  2738. + #ifdef MSDOS
  2739. + extern  char *dir_name (char *dir);
  2740. + extern  int dir_file_exists_p (char *dirname, char *filename);
  2741. + extern  int file_exists_p (char *name);
  2742. + extern  int file_impossible_p (char *filename);
  2743. + extern  void file_impossible (char *filename);
  2744. + extern  void print_dir_data_base (void);
  2745. + #else /* not MSDOS */
  2746.   extern void dir_load ();
  2747.   extern int dir_file_exists_p (), file_exists_p (), file_impossible_p ();
  2748.   extern void file_impossible ();
  2749.   extern char *dir_name ();
  2750. + #endif /* not MSDOS */
  2751.   
  2752. + /* default.c */
  2753. + #ifdef MSDOS
  2754. + extern  void install_default_implicit_rules (void);
  2755. + extern  void set_default_suffixes (void);
  2756. + #else /* not MSDOS */
  2757.   extern void set_default_suffixes (), install_default_implicit_rules ();
  2758. + #endif /* not MSDOS */
  2759. + /* rule.c */
  2760. + #ifdef MSDOS
  2761. + extern  void convert_to_pattern (void);
  2762. + extern  void count_implicit_rule_limits (void);
  2763. + extern  void create_pattern_rule (char **targets, char **target_percents,
  2764. +                   int terminal, struct dep *deps,
  2765. +                   struct commands *commands, int override);
  2766. + extern  void print_rule_data_base (void);
  2767. + #else /* not MSDOS */
  2768.   extern void convert_to_pattern (), count_implicit_rule_limits ();
  2769.   extern void create_pattern_rule ();
  2770. + #endif /* not MSDOS */
  2771.   
  2772. + /*    vpath.c */
  2773. + #ifdef MSDOS
  2774. + extern  int vpath_search (char **file);
  2775. + extern  void build_vpath_lists (void);
  2776. + extern  void construct_vpath_list (char *pattern, char *dirpath);
  2777. + extern  void print_vpath_data_base (void);
  2778. + #else /* not MSDOS */
  2779.   extern void build_vpath_lists (), construct_vpath_list ();
  2780.   extern int vpath_search ();
  2781. ! #endif /* not MSDOS */
  2782. !   
  2783. ! /*     read.c */
  2784. ! #ifdef MSDOS
  2785. ! extern  char *find_percent (char *pattern);
  2786. ! extern  struct dep *read_all_makefiles (char **makefiles);
  2787. ! extern  void uniquize_deps (struct dep *chain);
  2788. ! extern  void construct_include_path (char **arg_dirs);
  2789. ! #else /* not MSDOS */
  2790.   extern void construct_include_path ();
  2791. + #endif /* not MSDOS */
  2792.   
  2793. + /*   remake.c */
  2794. + #ifdef MSDOS
  2795. + extern  int update_goal_chain (struct dep *goals, int makefiles);
  2796. + extern  void notice_finished_file (struct file *file);
  2797. + extern  time_t f_mtime (struct file *file, int search);
  2798. + extern  int remote_kill (int id, int sig);
  2799. + extern  int remote_status (int *exit_code_ptr, int *signal_ptr,
  2800. +                int *coredump_ptr, int block);
  2801. + extern  int start_remote_job (char **argv, int stdin_fd, int *is_remote,
  2802. +                   int *id_ptr, int *used_stdin);
  2803. + extern  int start_remote_job_p (void);
  2804. + extern  void block_remote_children (void);
  2805. + extern  void unblock_remote_children (void);
  2806. + #else /* not MSDOS */
  2807.   extern int update_goal_chain ();
  2808.   extern void notice_finished_file ();
  2809. ! #endif /* not MSDOS */
  2810.   
  2811. + /* glob.c */
  2812. + #ifdef MSDOS
  2813. + extern  char **glob_filename (char *pathname);
  2814. + extern  char **glob_vector (char *pat, char *dir);
  2815. + extern  int glob_match (char *pattern, char *text, int dot_special);
  2816. + extern  int glob_pattern_p (char *pattern);
  2817. + #else /* not MSDOS */
  2818.   extern int glob_pattern_p ();
  2819.   extern char **glob_filename ();
  2820. + #endif /* not MSDOS */
  2821.   
  2822. + #ifdef MSDOS
  2823. + #include <stdlib.h>
  2824. + #else /* not MSDOS */
  2825.   #ifndef    USG
  2826.   extern int sigsetmask ();
  2827.   #endif
  2828. *************** extern void qsort ();
  2829. *** 127,134 ****
  2830. --- 254,273 ----
  2831.   extern int atoi ();
  2832.   extern int pipe (), close (), open (), lseek (), read ();
  2833.   extern char *ctime ();
  2834. + #endif /* not MSDOS */
  2835. + #ifdef MSDOS
  2836. + extern  char **construct_command_argv (char *line, struct file *file);
  2837. + extern  void wait_for_children (unsigned int n, int err);
  2838. + extern  void wait_to_start_job (void);
  2839. + extern  void init_siglist (void);
  2840. + extern  void print_file_variables (struct file *file);
  2841. + extern  int try_implicit_rule (struct file *file, unsigned int depth);
  2842. + #endif /* MSDOS */
  2843.   
  2844. + #ifndef MSDOS            /* <stdlib.h> */
  2845.   extern char **environ;
  2846. + #endif /* not MSDOS */
  2847.   
  2848.   #ifdef    USG
  2849.   extern char *getcwd ();
  2850. diff -cBdNp e:/gnu/make/gnu/makefile ./makefile
  2851. *** e:/gnu/make/gnu/makefile    Tue Jul 24 00:56:17 1990
  2852. --- ./makefile    Tue Jul 24 00:55:54 1990
  2853. ***************
  2854. *** 0 ****
  2855. --- 1,150 ----
  2856. + # Copyright (C) 1988, 1989 Free Software Foundation, Inc.
  2857. + # This file is part of GNU Make.
  2858. + # 
  2859. + # GNU Make is free software; you can redistribute it and/or modify
  2860. + # it under the terms of the GNU General Public License as published by
  2861. + # the Free Software Foundation; either version 1, or (at your option)
  2862. + # any later version.
  2863. + #
  2864. + # GNU Make is distributed in the hope that it will be useful,
  2865. + # but WITHOUT ANY WARRANTY; without even the implied warranty of
  2866. + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2867. + # GNU General Public License for more details.
  2868. + # 
  2869. + # You should have received a copy of the GNU General Public License
  2870. + # along with GNU Make; see the file COPYING.  If not, write to
  2871. + # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  2872. + # MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  2873. + #
  2874. + # To this port, the same copying conditions apply as to the
  2875. + # original release.
  2876. + #
  2877. + # IMPORTANT:
  2878. + # This file is not identical to the original GNU release!
  2879. + # You should have received this code as patch to the official
  2880. + # GNU release.
  2881. + #
  2882. + # MORE IMPORTANT:
  2883. + # This port comes with ABSOLUTELY NO WARRANTY.
  2884. + #
  2885. + # $Header: e:/gnu/make/RCS/makefile.'v 3.58.0.9 90/07/23 23:17:36 tho Exp $
  2886. + #
  2887. + #    Makefile for GNU Make
  2888. + #
  2889. + BINDIR    = c:/bin
  2890. + #BUILD = debug
  2891. + BUILD = production
  2892. + ifeq ($(BUILD),debug)
  2893. + CFLAGS    = $(defines) -FPa -AL -Od -Zi -W4 -DSTDC_HEADERS
  2894. + CRIPPLED_CFLAGS = $(CFLAGS)
  2895. + LDFLAGS = /st:0x8000/map/co
  2896. + else
  2897. + CFLAGS    = $(defines) -FPa -AL -Ox -W4 -DSTDC_HEADERS
  2898. + CRIPPLED_CFLAGS = $(defines) -FPa -AL -Od -W4 -DSTDC_HEADERS
  2899. + LDFLAGS = /st:0x8000/map/e
  2900. + endif
  2901. + defines = -DUSG -DNO_LDAV -DNO_FLOAT
  2902. + INSTALL    = cp
  2903. + # Any extra object files your system needs.
  2904. + extras    = msd_dir.obj
  2905. + swapobj    = swap.obj spawn.obj
  2906. + swapsrc    = swap.c spawn.c
  2907. + # If you don't want archive support, comment these out.
  2908. + ARCHIVES = ar.obj zipscan.obj
  2909. + ARCHIVES_SRC = ar.c zipscan.c
  2910. + objs  = $(swapobj) glob.obj commands.obj job.obj dir.obj file.obj load.obj \
  2911. +         misc.obj main.obj read.obj remake.obj remote.obj rule.obj \
  2912. +         implicit.obj default.obj variable.obj expand.obj function.obj \
  2913. +         vpath.obj $(ARCHIVES) $(extras)
  2914. + srcs  = $(swapsrc) glob.c commands.c job.c dir.c file.c load.c misc.c \
  2915. +         main.c read.c remake.c remote.c rule.c implicit.c default.c \
  2916. +         variable.c expand.c function.c vpath.c version.c $(ARCHIVES_SRC)
  2917. + incs  =    commands.h dep.h file.h job.h make.h rule.h variable.h msd_dir.h
  2918. + DISK = b:
  2919. + ZIPFILE    = gnumake.zip
  2920. + RCSFILES = $(patsubst %, RCS/%'v, $(srcs) $(incs)) RCS/makefile.'v
  2921. + MISC    = projects ChangeLog makepat mkpatch
  2922. + all: gnumake.exe
  2923. + gnumake.exe: $(objs) version.c
  2924. +     $(CC) $(CFLAGS) -c version.c
  2925. +     $(LINK) $(LDFLAGS) $(objs) version, $@;
  2926. + # Well, here optimization is dangerous... (inline assembler etc.)
  2927. + swap.obj: swap.c
  2928. +     $(CC) $(CRIPPLED_CFLAGS) -c $*.c
  2929. + # MSC 6.0 bombs with `-Ox'
  2930. + main.obj : main.c make.h commands.h dep.h file.h variable.h job.h
  2931. +     $(CC) $(CRIPPLED_CFLAGS) -c $*.c
  2932. + # debugging
  2933. + swap.exe: swap.c spawn.c
  2934. +     $(CC) $(CRIPPLED_CFLAGS) -DTEST -Zi -Fe$@ swap.c spawn.c
  2935. +     rm -f swap.obj spawn.obj
  2936. + tags: $(srcs) $(srcs2) $(srcs3) $(incs)
  2937. +     etags  *.c *.h
  2938. + install: $(BINDIR)/make.exe
  2939. + $(BINDIR)/make.exe:gnumake.exe
  2940. +     $(INSTALL) $< $@
  2941. + clean:
  2942. +     rm -f *.obj *.map tags errs
  2943. +     rcsclean *.c *.h makefile
  2944. + zip: $(ZIPFILE)
  2945. + disk: $(DISK)/$(ZIPFILE)
  2946. + $(ZIPFILE): $(RCSFILES) $(MISC)
  2947. +     pkzip -frp $@
  2948. + $(DISK)/$(ZIPFILE): $(ZIPFILE)
  2949. +     cp $< $@
  2950. +     pkunzip -t $@ | grep -vw OK
  2951. + # Dependencies:
  2952. + ar.obj: make.h file.h 
  2953. + commands.obj: make.h dep.h commands.h file.h variable.h job.h
  2954. + default.obj: make.h rule.h dep.h file.h commands.h variable.h
  2955. + dir.obj: make.h msd_dir.h
  2956. + expand.obj: make.h commands.h file.h variable.h
  2957. + file.obj: make.h commands.h dep.h file.h variable.h
  2958. + function.obj: make.h variable.h dep.h commands.h job.h
  2959. + glob.obj: msd_dir.h
  2960. + implicit.obj: make.h rule.h dep.h file.h
  2961. + job.obj: make.h commands.h job.h file.h variable.h
  2962. + load.obj: make.h commands.h job.h
  2963. + misc.obj: make.h dep.h
  2964. + msd_dir.obj: msd_dir.h
  2965. + read.obj: make.h commands.h dep.h file.h variable.h
  2966. + remake.obj: make.h commands.h job.h dep.h file.h
  2967. + remote.obj: remote-s.c make.h commands.h
  2968. + rule.obj: make.h commands.h dep.h file.h variable.h rule.h
  2969. + variable.obj: make.h commands.h variable.h dep.h file.h
  2970. + vpath.obj: make.h file.h variable.h
  2971. diff -cBdNp e:/gnu/make/gnu/misc.c ./misc.c
  2972. *** e:/gnu/make/gnu/misc.c    Tue Jul 24 00:53:10 1990
  2973. --- ./misc.c    Tue Jul 24 00:54:56 1990
  2974. *************** You should have received a copy of the G
  2975. *** 15,20 ****
  2976. --- 15,37 ----
  2977.   along with GNU Make; see the file COPYING.  If not, write to
  2978.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  2979.   
  2980. + /*
  2981. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  2982. +  *
  2983. +  * To this port, the same copying conditions apply as to the
  2984. +  * original release.
  2985. +  *
  2986. +  * IMPORTANT:
  2987. +  * This file is not identical to the original GNU release!
  2988. +  * You should have received this code as patch to the official
  2989. +  * GNU release.
  2990. +  *
  2991. +  * MORE IMPORTANT:
  2992. +  * This port comes with ABSOLUTELY NO WARRANTY.
  2993. +  *
  2994. +  * $Header: e:/gnu/make/RCS/misc.c'v 3.58.0.2 90/07/18 23:08:20 tho Exp $
  2995. +  */
  2996.   #include "make.h"
  2997.   #include "dep.h"
  2998.   
  2999. *************** void
  3000. *** 237,244 ****
  3001. --- 254,263 ----
  3002.   perror_with_name (str, name)
  3003.        char *str, *name;
  3004.   {
  3005. + #ifndef MSDOS
  3006.     extern int errno, sys_nerr;
  3007.     extern char *sys_errlist[];
  3008. + #endif /* not MSDOS */
  3009.   
  3010.     if (errno < sys_nerr)
  3011.       error ("%s%s: %s", str, name, sys_errlist[errno]);
  3012. *************** void
  3013. *** 252,259 ****
  3014. --- 271,280 ----
  3015.   pfatal_with_name (name)
  3016.        char *name;
  3017.   {
  3018. + #ifndef MSDOS
  3019.     extern int errno, sys_nerr;
  3020.     extern char *sys_errlist[];
  3021. + #endif /* not MSDOS */
  3022.   
  3023.     if (errno < sys_nerr)
  3024.       fatal ("%s: %s", name, sys_errlist[errno]);
  3025. *************** pfatal_with_name (name)
  3026. *** 264,270 ****
  3027. --- 285,295 ----
  3028.   }
  3029.   
  3030.   /* Like malloc but get fatal error if memory is exhausted.  */
  3031. + #ifdef MSDOS
  3032. + #include <malloc.h>
  3033. + #else
  3034.   extern char *malloc (), *realloc ();
  3035. + #endif /* ! MSDOS */
  3036.   
  3037.   char *
  3038.   xmalloc (size)
  3039. *************** dep_name (dep)
  3040. *** 442,444 ****
  3041. --- 467,487 ----
  3042.     return dep->name == 0 ? dep->file->name : dep->name;
  3043.   }
  3044.   #endif
  3045. + #ifdef MSDOS
  3046. + #include <ctype.h>
  3047. + /* Filenames returned by MS-DOS system calls are formatted very ugly:
  3048. +    all uppercase and backslashes.  Perform some cosmetics.  */
  3049. + char *
  3050. + msdos_format_filename (char *name)
  3051. + {
  3052. +   char *p = name;
  3053. +   while (*p = (*p == '\\') ? '/' : tolower (*p))
  3054. +     p++;
  3055. +   return name;
  3056. + }
  3057. + #endif /* MSDOS */
  3058. diff -cBdNp e:/gnu/make/gnu/msd_dir.c ./msd_dir.c
  3059. *** e:/gnu/make/gnu/msd_dir.c    Tue Jul 24 00:56:18 1990
  3060. --- ./msd_dir.c    Tue Jul 24 00:55:40 1990
  3061. ***************
  3062. *** 0 ****
  3063. --- 1,232 ----
  3064. + /*  msd_dir.c - portable directory routines
  3065. +     Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  3066. +     This program is free software; you can redistribute it and/or modify
  3067. +     it under the terms of the GNU General Public License as published by
  3068. +     the Free Software Foundation; either version 1, or (at your option)
  3069. +     any later version.
  3070. +     This program is distributed in the hope that it will be useful,
  3071. +     but WITHOUT ANY WARRANTY; without even the implied warranty of
  3072. +     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3073. +     GNU General Public License for more details.
  3074. +     You should have received a copy of the GNU General Public License
  3075. +     along with this program; if not, write to the Free Software
  3076. +     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3077. +     IMPORTANT:
  3078. +     This code is not an official part of the GNU project and the
  3079. +     author is not affiliated to the Free Software Foundation.
  3080. +     He just likes their code and spirit.
  3081. +     $Header: e:/gnu/make/RCS/msd_dir.c'v 2.0 90/06/29 00:35:36 tho Stable $
  3082. +  */
  3083. + /* Everything non trivial in this code is from: @(#)msd_dir.c 1.4
  3084. +    87/11/06.  A public domain implementation of BSD directory routines
  3085. +    for MS-DOS.  Written by Michael Rendell ({uunet,utai}michael@garfield),
  3086. +    August 1897 */
  3087. + #include <stdio.h>
  3088. + #include <stdlib.h>
  3089. + #include <string.h>
  3090. + #include <sys/types.h>
  3091. + #include <sys/stat.h>
  3092. + #include <dos.h>
  3093. + #include "msd_dir.h"
  3094. + static void free_dircontents (struct _dircontents *);
  3095. + /* find ALL files! */
  3096. + #define ATTRIBUTES    (_A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_SUBDIR)
  3097. + DIR *
  3098. + opendir (char *name)
  3099. + {
  3100. +   struct find_t find_buf;
  3101. +   DIR *dirp;
  3102. +   struct _dircontents *dp;
  3103. +   char name_buf[_MAX_PATH + 1];
  3104. +   char *slash = "";
  3105. +   if (!name)
  3106. +     name = "";
  3107. +   else if (*name)
  3108. +     {
  3109. +       char *s;
  3110. +       int l = strlen (name);
  3111. +       s = name + l - 1;
  3112. +       if ( !(l == 2 && *s == ':') && *s != '\\' && *s != '/')
  3113. +     slash = "/";    /* save to insert slash between path and "*.*" */
  3114. +     }
  3115. +   strcat (strcat (strcpy (name_buf, name), slash), "*.*");
  3116. +   dirp = (DIR *) malloc (sizeof (DIR));
  3117. +   if (dirp == (DIR *)0)
  3118. +     return (DIR *)0;
  3119. +   dirp->dd_loc = 0;
  3120. +   dirp->dd_contents = dirp->dd_cp = (struct _dircontents *) 0;
  3121. +   if (_dos_findfirst (name_buf, ATTRIBUTES, &find_buf))
  3122. +     {
  3123. +       free (dirp);
  3124. +       return (DIR *)0;
  3125. +     }
  3126. +   do
  3127. +     {
  3128. +       dp = (struct _dircontents *) malloc (sizeof (struct _dircontents));
  3129. +       if (dp == (struct _dircontents *)0)
  3130. +     {
  3131. +       free_dircontents (dirp->dd_contents);
  3132. +       return (DIR *)0;
  3133. +     }
  3134. +       dp->_d_entry = malloc (strlen (find_buf.name) + 1);
  3135. +       if (dp->_d_entry == (char *)0)
  3136. +     {
  3137. +       free (dp);
  3138. +       free_dircontents (dirp->dd_contents);
  3139. +       return (DIR *)0;
  3140. +     }
  3141. +       if (dirp->dd_contents)
  3142. +     dirp->dd_cp = dirp->dd_cp->_d_next = dp;
  3143. +       else
  3144. +     dirp->dd_contents = dirp->dd_cp = dp;
  3145. +       strcpy (dp->_d_entry, find_buf.name);
  3146. +       dp->_d_next = (struct _dircontents *)0;
  3147. +     } while (! _dos_findnext (&find_buf));
  3148. +   dirp->dd_cp = dirp->dd_contents;
  3149. +   return dirp;
  3150. + }
  3151. + void
  3152. + closedir (DIR *dirp)
  3153. + {
  3154. +   free_dircontents (dirp->dd_contents);
  3155. +   free ((char *) dirp);
  3156. + }
  3157. + struct direct *
  3158. + readdir (DIR *dirp)
  3159. + {
  3160. +   static struct direct dp;
  3161. +   if (dirp->dd_cp == (struct _dircontents *)0)
  3162. +     return (struct direct *)0;
  3163. +   dp.d_namlen = dp.d_reclen =
  3164. +     strlen (strcpy (dp.d_name, dirp->dd_cp->_d_entry));
  3165. +   strlwr (dp.d_name);        /* JF */
  3166. +   dp.d_ino = 0;
  3167. +   dirp->dd_cp = dirp->dd_cp->_d_next;
  3168. +   dirp->dd_loc++;
  3169. +   return &dp;
  3170. + }
  3171. + void
  3172. + seekdir (DIR *dirp, long off)
  3173. + {
  3174. +   long i = off;
  3175. +   struct _dircontents *dp;
  3176. +   if (off < 0)
  3177. +     return;
  3178. +   for (dp = dirp->dd_contents; --i >= 0 && dp; dp = dp->_d_next)
  3179. +     ;
  3180. +   dirp->dd_loc = off - (i + 1);
  3181. +   dirp->dd_cp = dp;
  3182. + }
  3183. + long
  3184. + telldir (DIR *dirp)
  3185. + {
  3186. +   return dirp->dd_loc;
  3187. + }
  3188. + /* Garbage collection */
  3189. + static void
  3190. + free_dircontents (struct _dircontents *dp)
  3191. + {
  3192. +   struct _dircontents *odp;
  3193. +   while (dp)
  3194. +     {
  3195. +       if (dp->_d_entry)
  3196. +     free (dp->_d_entry);
  3197. +       dp = (odp = dp)->_d_next;
  3198. +       free (odp);
  3199. +     }
  3200. + }
  3201. + #ifdef TEST
  3202. + void main (int argc, char *argv[]);
  3203. + void
  3204. + main (int argc, char *argv[])
  3205. + {
  3206. +   static DIR *directory;
  3207. +   struct direct *entry = (struct direct *)0;
  3208. +   char *name = "";
  3209. +   if (argc > 1)
  3210. +     name = argv[1];
  3211. +   directory = opendir (name);
  3212. +   if (!directory)
  3213. +     {
  3214. +       fprintf (stderr, "can't open directory `%s'.\n", name);
  3215. +       exit (2);
  3216. +     }
  3217. +   while (entry = readdir (directory))
  3218. +     printf ("> %s\n", entry->d_name);
  3219. +   printf ("done.\n");
  3220. + }
  3221. + #endif /* TEST */
  3222. + /* 
  3223. +  * Local Variables:
  3224. +  * mode:C
  3225. +  * ChangeLog:ChangeLog
  3226. +  * compile-command:make
  3227. +  * End:
  3228. +  */
  3229. + /* 
  3230. +  * Local Variables:
  3231. +  * mode:C
  3232. +  * ChangeLog:ChangeLog
  3233. +  * compile-command:make
  3234. +  * End:
  3235. +  */
  3236. diff -cBdNp e:/gnu/make/gnu/msd_dir.h ./msd_dir.h
  3237. *** e:/gnu/make/gnu/msd_dir.h    Tue Jul 24 00:56:18 1990
  3238. --- ./msd_dir.h    Tue Jul 24 00:55:42 1990
  3239. ***************
  3240. *** 0 ****
  3241. --- 1,63 ----
  3242. + /*  msd_dir.c - portable directory routines
  3243. +     Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  3244. +     This program is free software; you can redistribute it and/or modify
  3245. +     it under the terms of the GNU General Public License as published by
  3246. +     the Free Software Foundation; either version 1, or (at your option)
  3247. +     any later version.
  3248. +     This program is distributed in the hope that it will be useful,
  3249. +     but WITHOUT ANY WARRANTY; without even the implied warranty of
  3250. +     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3251. +     GNU General Public License for more details.
  3252. +     You should have received a copy of the GNU General Public License
  3253. +     along with this program; if not, write to the Free Software
  3254. +     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3255. +     IMPORTANT:
  3256. +     This code is not an official part of the GNU project and the
  3257. +     author is not affiliated to the Free Software Foundation.
  3258. +     He just likes their code and spirit.
  3259. +     $Header: e:/gnu/make/RCS/msd_dir.h'v 2.0 90/06/29 00:35:36 tho Stable $
  3260. +  */
  3261. + /* Everything non trivial in this code is taken from: @(#)msd_dir.c 1.4
  3262. +    87/11/06.  A public domain implementation of BSD directory routines
  3263. +    for MS-DOS.  Written by Michael Rendell ({uunet,utai}michael@garfield),
  3264. +    August 1897 */
  3265. + #define    rewinddir(dirp)    seekdir(dirp, 0L)
  3266. + #define    MAXNAMLEN    12
  3267. + struct direct
  3268. + {
  3269. +   ino_t d_ino;            /* a bit of a farce */
  3270. +   int d_reclen;            /* more farce */
  3271. +   int d_namlen;            /* length of d_name */
  3272. +   char d_name[MAXNAMLEN + 1];    /* garentee null termination */
  3273. + };
  3274. + struct _dircontents
  3275. + {
  3276. +   char *_d_entry;
  3277. +   struct _dircontents *_d_next;
  3278. + };
  3279. + typedef struct _dirdesc
  3280. + {
  3281. +   int dd_id;            /* uniquely identify each open directory */
  3282. +   long dd_loc;            /* where we are in directory entry is this */
  3283. +   struct _dircontents *dd_contents;    /* pointer to contents of dir */
  3284. +   struct _dircontents *dd_cp;    /* pointer to current position */
  3285. + } DIR;
  3286. + extern void seekdir (DIR *, long);
  3287. + extern long telldir (DIR *);
  3288. + extern DIR *opendir (char *);
  3289. + extern void closedir (DIR *);
  3290. + extern struct direct *readdir (DIR *);
  3291. diff -cBdNp e:/gnu/make/gnu/read.c ./read.c
  3292. *** e:/gnu/make/gnu/read.c    Tue Jul 24 00:53:14 1990
  3293. --- ./read.c    Tue Jul 24 00:55:08 1990
  3294. *************** You should have received a copy of the G
  3295. *** 15,20 ****
  3296. --- 15,37 ----
  3297.   along with GNU Make; see the file COPYING.  If not, write to
  3298.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  3299.   
  3300. + /*
  3301. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  3302. +  *
  3303. +  * To this port, the same copying conditions apply as to the
  3304. +  * original release.
  3305. +  *
  3306. +  * IMPORTANT:
  3307. +  * This file is not identical to the original GNU release!
  3308. +  * You should have received this code as patch to the official
  3309. +  * GNU release.
  3310. +  *
  3311. +  * MORE IMPORTANT:
  3312. +  * This port comes with ABSOLUTELY NO WARRANTY.
  3313. +  *
  3314. +  * $Header: e:/gnu/make/RCS/read.c'v 3.58.0.3 90/07/23 22:52:53 tho Exp $
  3315. +  */
  3316.   #include "make.h"
  3317.   #include "commands.h"
  3318.   #include "dep.h"
  3319. *************** the Free Software Foundation, 675 Mass A
  3320. *** 21,35 ****
  3321.   #include "file.h"
  3322.   #include "variable.h"
  3323.   
  3324.   #include <pwd.h>
  3325.   struct passwd *getpwnam ();
  3326.   static void read_makefile ();
  3327.   static unsigned int readline (), do_define ();
  3328.   static int conditional_line ();
  3329.   static void record_files ();
  3330.   static char *find_semicolon ();
  3331.   
  3332.   
  3333.   /* A `struct linebuffer' is a structure which holds a line of text.
  3334. --- 38,70 ----
  3335.   #include "file.h"
  3336.   #include "variable.h"
  3337.   
  3338. + #ifndef MSDOS
  3339.   #include <pwd.h>
  3340.   struct passwd *getpwnam ();
  3341. ! #endif /* not MSDOS */
  3342. !   
  3343. ! #ifdef MSDOS
  3344. ! #include <ctype.h>
  3345. ! static  void read_makefile (char *filename, int type);
  3346. ! static  unsigned int readline (struct linebuffer *linebuffer, FILE *stream,
  3347. !                    char *filename);
  3348. ! static  unsigned int do_define (char *name, unsigned int namelen,
  3349. !         enum variable_origin origin, unsigned int lineno,
  3350. !         FILE *infile, char *filename);
  3351. ! static  int conditional_line (char *line, char *filename, unsigned int lineno);
  3352. ! static  void record_files (struct nameseq *filenames, char *pattern,
  3353. !         char *pattern_percent, struct dep *deps,
  3354. !         unsigned int commands_started, char *commands,
  3355. !         unsigned int commands_idx, int two_colon, char *filename,
  3356. !         unsigned int lineno, int set_default);
  3357. ! static char *find_semicolon (char *string);
  3358. ! #else /* not MSDOS */
  3359.   static void read_makefile ();
  3360.   static unsigned int readline (), do_define ();
  3361.   static int conditional_line ();
  3362.   static void record_files ();
  3363.   static char *find_semicolon ();
  3364. + #endif /* not MSDOS */
  3365.   
  3366.   
  3367.   /* A `struct linebuffer' is a structure which holds a line of text.
  3368. *************** read_all_makefiles (makefiles)
  3369. *** 149,155 ****
  3370. --- 184,194 ----
  3371.     if (num_makefiles == 0)
  3372.       {
  3373.         static char *default_makefiles[] =
  3374. + #ifdef MSDOS
  3375. +     { "makefile.gnu", "makefile", 0 };
  3376. + #else /* not MSDOS */
  3377.       { "GNUmakefile", "makefile", "Makefile", 0 };
  3378. + #endif /* not MSDOS */
  3379.         register char **p = default_makefiles;
  3380.         while (*p != 0 && !file_exists_p (*p))
  3381.       ++p;
  3382. *************** read_makefile (filename, type)
  3383. *** 493,499 ****
  3384. --- 532,542 ----
  3385.   
  3386.         /* Is this a static pattern rule: `target: %targ: %dep; ...'?  */
  3387.         p = index (p2, ':');
  3388. + #ifdef MSDOS
  3389. +       while (p != 0 && p[-1] == '\\' && (isspace (p[1]) || p != p2 + 2))
  3390. + #else /* not MSDOS */
  3391.         while (p != 0 && p[-1] == '\\')
  3392. + #endif /* not MSDOS */
  3393.           {
  3394.             register char *q = &p[-1];
  3395.             register int backslash = 0;
  3396. *************** read_makefile (filename, type)
  3397. *** 504,510 ****
  3398. --- 547,557 ----
  3399.             else
  3400.           break;
  3401.           }
  3402. + #ifdef MSDOS
  3403. +       if (p != 0 && (isspace (p[1]) || p != p2 + 2))
  3404. + #else /* not MSDOS */
  3405.         if (p != 0)
  3406. + #endif /* not MSDOS */
  3407.           {
  3408.             struct nameseq *target;
  3409.             target = parse_file_seq (&p2, ':', sizeof (struct nameseq));
  3410. *************** parse_file_seq (stringp, stopchar, size)
  3411. *** 1221,1226 ****
  3412. --- 1268,1277 ----
  3413.       break;
  3414.         /* Yes, find end of next name.  */
  3415.         q = p;
  3416. + #ifdef MSDOS        /* interpret "c:foo" as file on different drive.  */
  3417. +       if (isalpha (p[0]) && p[1] == ':' && !isspace (p[2]))
  3418. +     p += 3;
  3419. + #endif /* MSDOS */
  3420.         while (1)
  3421.       {
  3422.         c = *p++;
  3423. *************** multi_glob (chain, size)
  3424. *** 1427,1432 ****
  3425. --- 1478,1484 ----
  3426.       {
  3427.         nexto = old->next;
  3428.   
  3429. + #ifndef MSDOS
  3430.         if (*old->name == '~')
  3431.       {
  3432.         if (old->name[1] == '/' || old->name[1] == '\0')
  3433. *************** multi_glob (chain, size)
  3434. *** 1486,1491 ****
  3435. --- 1538,1544 ----
  3436.           }
  3437.           }
  3438.       }
  3439. + #endif /* ! MSDOS */
  3440.   
  3441.         if (glob_pattern_p (old->name))
  3442.       {
  3443. diff -cBdNp e:/gnu/make/gnu/remake.c ./remake.c
  3444. *** e:/gnu/make/gnu/remake.c    Tue Jul 24 00:53:16 1990
  3445. --- ./remake.c    Tue Jul 24 00:55:14 1990
  3446. *************** You should have received a copy of the G
  3447. *** 15,20 ****
  3448. --- 15,37 ----
  3449.   along with GNU Make; see the file COPYING.  If not, write to
  3450.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  3451.   
  3452. + /*
  3453. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  3454. +  *
  3455. +  * To this port, the same copying conditions apply as to the
  3456. +  * original release.
  3457. +  *
  3458. +  * IMPORTANT:
  3459. +  * This file is not identical to the original GNU release!
  3460. +  * You should have received this code as patch to the official
  3461. +  * GNU release.
  3462. +  *
  3463. +  * MORE IMPORTANT:
  3464. +  * This port comes with ABSOLUTELY NO WARRANTY.
  3465. +  *
  3466. +  * $Header: e:/gnu/make/RCS/remake.c'v 3.58.0.1 90/07/17 00:59:46 tho Exp $
  3467. +  */
  3468.   #include "make.h"
  3469.   #include "commands.h"
  3470.   #include "job.h"
  3471. *************** the Free Software Foundation, 675 Mass A
  3472. *** 27,35 ****
  3473.   #include <fcntl.h>
  3474.   #endif
  3475.   
  3476.   extern int open (), fstat (), read (), lseek (), write (), close ();
  3477.   extern time_t time ();
  3478.   
  3479.   extern int try_implicit_rule ();
  3480.   extern time_t ar_member_date ();
  3481. --- 44,56 ----
  3482.   #include <fcntl.h>
  3483.   #endif
  3484.   
  3485. ! #ifdef MSDOS
  3486. ! #include <io.h>
  3487. ! #include <time.h>
  3488. ! #else /* not MSDOS */
  3489.   extern int open (), fstat (), read (), lseek (), write (), close ();
  3490.   extern time_t time ();
  3491. + #endif /* not MSDOS */
  3492.   
  3493.   extern int try_implicit_rule ();
  3494.   extern time_t ar_member_date ();
  3495. *************** extern time_t ar_member_date ();
  3496. *** 38,47 ****
  3497. --- 59,78 ----
  3498.   /* Incremented when a file has been remade.  */
  3499.   unsigned int files_remade = 0;
  3500.   
  3501. + #ifdef MSDOS
  3502. + static  int update_file (struct file *file, unsigned int depth);
  3503. + static  int update_file_1 (struct file *file, unsigned int depth);
  3504. + static  int check_dep (struct file *file, unsigned int depth, long this_mtime, int *must_make_ptr);
  3505. + static  void remake_file (struct file *file);
  3506. + static  long name_mtime (char *name);
  3507. + static  long library_file_mtime (char *lib);
  3508. + static  int touch_file (struct file *file);
  3509. + #else /* not MSDOS */
  3510.   static int update_file (), update_file_1 (), check_dep ();
  3511.   static void remake_file ();
  3512.   static time_t name_mtime (), library_file_mtime ();
  3513.   extern time_t f_mtime ();
  3514. + #endif /* not MSDOS */
  3515.   
  3516.   /* Remake all the goals in the `struct dep' chain GOALS.  Return -1 if nothing
  3517.      was done, 0 if all goals were updated successfully, or 1 if a goal failed.
  3518. diff -cBdNp e:/gnu/make/gnu/rule.c ./rule.c
  3519. *** e:/gnu/make/gnu/rule.c    Tue Jul 24 00:53:22 1990
  3520. --- ./rule.c    Tue Jul 24 00:55:20 1990
  3521. *************** You should have received a copy of the G
  3522. *** 16,21 ****
  3523. --- 16,38 ----
  3524.   along with GNU Make; see the file COPYING.  If not, write to
  3525.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  3526.   
  3527. + /*
  3528. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  3529. +  *
  3530. +  * To this port, the same copying conditions apply as to the
  3531. +  * original release.
  3532. +  *
  3533. +  * IMPORTANT:
  3534. +  * This file is not identical to the original GNU release!
  3535. +  * You should have received this code as patch to the official
  3536. +  * GNU release.
  3537. +  *
  3538. +  * MORE IMPORTANT:
  3539. +  * This port comes with ABSOLUTELY NO WARRANTY.
  3540. +  *
  3541. +  * $Header: e:/gnu/make/RCS/rule.c'v 3.58.0.1 90/07/17 00:59:49 tho Exp $
  3542. +  */
  3543.   #include "make.h"
  3544.   #include "commands.h"
  3545.   #include "dep.h"
  3546. *************** the Free Software Foundation, 675 Mass A
  3547. *** 23,30 ****
  3548. --- 40,52 ----
  3549.   #include "variable.h"
  3550.   #include "rule.h"
  3551.   
  3552. + #ifdef MSDOS
  3553. + static void freerule (struct rule *rule, struct rule *lastrule);
  3554. + static int new_pattern_rule (struct rule *rule, int override);
  3555. + #else /* not MSDOS */
  3556.   static void freerule ();
  3557.   static int new_pattern_rule ();
  3558. + #endif /* not MSDOS */
  3559.   
  3560.   /* Chain of all pattern rules.  */
  3561.   
  3562. diff -cBdNp e:/gnu/make/gnu/rule.h ./rule.h
  3563. *** e:/gnu/make/gnu/rule.h    Tue Jul 24 00:53:24 1990
  3564. --- ./rule.h    Tue Jul 24 00:55:22 1990
  3565. *************** You should have received a copy of the G
  3566. *** 15,20 ****
  3567. --- 15,37 ----
  3568.   along with GNU Make; see the file COPYING.  If not, write to
  3569.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  3570.   
  3571. + /*
  3572. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  3573. +  *
  3574. +  * To this port, the same copying conditions apply as to the
  3575. +  * original release.
  3576. +  *
  3577. +  * IMPORTANT:
  3578. +  * This file is not identical to the original GNU release!
  3579. +  * You should have received this code as patch to the official
  3580. +  * GNU release.
  3581. +  *
  3582. +  * MORE IMPORTANT:
  3583. +  * This port comes with ABSOLUTELY NO WARRANTY.
  3584. +  *
  3585. +  * $Header: e:/gnu/make/RCS/rule.h'v 3.58.0.1 90/07/17 01:00:07 tho Exp $
  3586. +  */
  3587.   /* Structure used for pattern rules.  */
  3588.   
  3589.   struct rule
  3590. *************** extern unsigned int max_pattern_dep_leng
  3591. *** 47,51 ****
  3592.   extern struct file *suffix_file;
  3593.   extern unsigned int maxsuffix;
  3594.   
  3595.   extern void install_pattern_rule ();
  3596. --- 64,71 ----
  3597.   extern struct file *suffix_file;
  3598.   extern unsigned int maxsuffix;
  3599.   
  3600. ! #ifdef  MSDOS
  3601. ! extern  void install_pattern_rule (struct pspec *p, int terminal);
  3602. ! #else /* not MSDOS */
  3603.   extern void install_pattern_rule ();
  3604. + #endif /* not MSDOS */
  3605. diff -cBdNp e:/gnu/make/gnu/spawn.c ./spawn.c
  3606. *** e:/gnu/make/gnu/spawn.c    Tue Jul 24 00:56:23 1990
  3607. --- ./spawn.c    Tue Jul 24 00:55:48 1990
  3608. ***************
  3609. *** 0 ****
  3610. --- 1,726 ----
  3611. + /*  spawn.c - replacements for MSC spawn*() functions
  3612. +     Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  3613. +     This program is free software; you can redistribute it and/or modify
  3614. +     it under the terms of the GNU General Public License as published by
  3615. +     the Free Software Foundation; either version 1, or (at your option)
  3616. +     any later version.
  3617. +     This program is distributed in the hope that it will be useful,
  3618. +     but WITHOUT ANY WARRANTY; without even the implied warranty of
  3619. +     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3620. +     GNU General Public License for more details.
  3621. +     You should have received a copy of the GNU General Public License
  3622. +     along with this program; if not, write to the Free Software
  3623. +     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3624. +     IMPORTANT:
  3625. +     This code is not an official part of the GNU project and the
  3626. +     author is not affiliated to the Free Software Foundation.
  3627. +     He just likes their code and spirit.  */
  3628. + static char RCS_id[] =
  3629. + "$Header: e:/gnu/make/RCS/spawn.c'v 0.18 90/07/22 14:42:38 tho Exp $";
  3630. + #include <stdio.h>
  3631. + #include <stdlib.h>
  3632. + #include <string.h>
  3633. + #include <ctype.h>
  3634. + #include <process.h>
  3635. + #include <malloc.h>
  3636. + #include <errno.h>
  3637. + #include <direct.h>
  3638. + #include <dos.h>
  3639. + #include <io.h>
  3640. + #include <sys/types.h>
  3641. + #define MAX_MSDOS_CMDLINE    126
  3642. + #define MAX_MSDOS_PATH        144
  3643. + /* IMPORTED DECLARATIONS */
  3644. + enum swapping_mode
  3645. + {
  3646. +   none, disk, ems, xms
  3647. + };
  3648. + extern int
  3649. + spawn_child (enum swapping_mode mode, char *path, char *cmdline, char *env,
  3650. +          int len, char *swap_file);
  3651. + /* PRIVATE DECLARATIONS */
  3652. + static void swapping_mode_hook (enum swapping_mode * swapping_ptr, char *dev);
  3653. + static int commandline_hook (char *cmd, char **argv, char **env0,
  3654. +                  char **respond_file_name_ptr);
  3655. + static char *putenv_cmdline (char *cmd, char **argv);
  3656. + static int build_environment (char _far ** envbuf, char *cmdline,
  3657. +                   char **envvec);
  3658. + static char *build_link_respond_file (char **argv);
  3659. + static char *build_lib_respond_file (char **argv);
  3660. + static char *build_zip_respond_file (char **argv);
  3661. + static int build_cmdline (char **argv);
  3662. + static char *expand_path (char *name, char *env, char *(*select) (char *));
  3663. + static char *executable_p (char *path);
  3664. + extern void *xmalloc (size_t size);
  3665. + extern void *xrealloc (void *ptr, size_t size);
  3666. + static char *extensions[] =/* extensions recognized during */
  3667. + {                /* path search */
  3668. +   ".bat",            /* this will be passed to the shell */
  3669. +   ".exe",
  3670. +   ".com",
  3671. +   NULL,
  3672. + };
  3673. + #define PATH_SEP    ';'
  3674. + #define FSLASH        '/'
  3675. + #define BSLASH        '\\'
  3676. + /* PUBLIC DECLARATIONS */
  3677. + extern char *mktmpname (char *prefix);
  3678. + /* The main entry points, work just like spawnvpe?() from the standard MSC
  3679. +    library.  */
  3680. + int swap_and_spawnvp (char *device, char *cmd, char **argv);
  3681. + int swap_and_spawnvpe (char *device, char *cmd, char **argv, char **envvec);
  3682. + int
  3683. + swap_and_spawnvp (char *device, char *cmd, char **argv)
  3684. + {
  3685. +   return swap_and_spawnvpe (device, cmd, argv, NULL);
  3686. + }
  3687. + int
  3688. + swap_and_spawnvpe (char *device, char *cmd, char **argv, char **envvec)
  3689. + {
  3690. +   int len;
  3691. +   int rc;
  3692. +   char _far *env = (char _far *) 0;
  3693. +   char *env0 = NULL;
  3694. +   char *respond_file_name = NULL;
  3695. +   char *swap_file_name = mktmpname ("vm");
  3696. +   enum swapping_mode swapping = xms;
  3697. +   if (device != NULL)
  3698. +     swapping_mode_hook (&swapping, device);
  3699. +   argv[0] = expand_path (cmd, "PATH", executable_p);
  3700. +   if (argv[0] == NULL)
  3701. +     return ENOENT;
  3702. +   rc = commandline_hook (cmd, argv, &env0, &respond_file_name);
  3703. +   if (rc)
  3704. +     return rc;
  3705. +   len = build_environment (&env, env0, (envvec == NULL) ? environ : envvec);
  3706. +   if (!len)
  3707. +     return E2BIG;
  3708. +   rc = spawn_child (swapping, argv[0], argv[1], env, len, swap_file_name);
  3709. +   if (env0)
  3710. +     free (env0);
  3711. +   if (env)
  3712. +     free (env);
  3713. +   if (*argv[1])
  3714. +     free (argv[1]);
  3715. +   free (swap_file_name);
  3716. +   if (respond_file_name)    /* clean up disk */
  3717. +     unlink (respond_file_name);
  3718. +   return rc;
  3719. + }
  3720. + /* Look if DEV corresponds to a known swapping device and set *SWAPPING_PTR
  3721. +    accordingly;  */
  3722. + void
  3723. + swapping_mode_hook (enum swapping_mode * swapping_ptr, char *dev)
  3724. + {
  3725. +   if (dev)
  3726. +     {
  3727. +       strlwr (dev);
  3728. +       if (!strcmp ("xms", dev))
  3729. +     *swapping_ptr = xms;
  3730. +       else if (!strcmp ("ems", dev))
  3731. +     {
  3732. +       fprintf (stderr, "Swapping to expanded memory is not supported yet, "
  3733. +            "will try extended memory.\n");
  3734. +       *swapping_ptr = xms;
  3735. +     }
  3736. +       else if (!strcmp ("disk", dev))
  3737. +     *swapping_ptr = disk;
  3738. +       else if (!strcmp ("none", dev))
  3739. +     {
  3740. +       fprintf (stderr, "No swapping is not supported yet, "
  3741. +                 "will swap to disk.\n");
  3742. +       *swapping_ptr = disk;
  3743. +     }
  3744. +       else
  3745. +     {
  3746. +       fprintf (stderr, "Can't swap to `%s' (no such device), "
  3747. +            "will try extended memory.\n", dev);
  3748. +       *swapping_ptr = xms;
  3749. +     }
  3750. +     }
  3751. + }
  3752. + /* Look if CMD allows or requires special treatment, manipulate ARGV
  3753. +    accordingly. If necessary, create ENV0 and RESPOND_FILE_NAME_PTR.
  3754. +    In any case, merge ARGV[1], ... into ARGV[1].
  3755. +    ~~~~~~~~~~~
  3756. +    Note that the special treatment can be switched off by giving CMD
  3757. +    uppercase!  */
  3758. + int
  3759. + commandline_hook (char *cmd, char **argv, char **env0,
  3760. +           char **respond_file_name_ptr)
  3761. + {
  3762. +   if (!strcmp ("cl", cmd) || !strcmp ("fl", cmd) || !strcmp ("masm", cmd))
  3763. +     *env0 = putenv_cmdline (cmd, argv);
  3764. +   else if (!strcmp ("link", cmd))
  3765. +     {
  3766. +       *respond_file_name_ptr = build_link_respond_file (argv);
  3767. +       if (*respond_file_name_ptr == NULL)
  3768. +     return E2BIG;
  3769. +     }
  3770. +   else if (!strcmp ("lib", cmd))
  3771. +     {
  3772. +       *respond_file_name_ptr = build_lib_respond_file (argv);
  3773. +       if (*respond_file_name_ptr == NULL)
  3774. +     return E2BIG;
  3775. +     }
  3776. +   else if (!strcmp ("pkzip", cmd) || !strcmp ("pkunzip", cmd))
  3777. +     {
  3778. +       *respond_file_name_ptr = build_zip_respond_file (argv);
  3779. +       if (*respond_file_name_ptr == NULL)
  3780. +     return E2BIG;
  3781. +     }
  3782. +   else if (!build_cmdline (argv))
  3783. +     return E2BIG;
  3784. +   return 0;            /* success */
  3785. + }
  3786. + /* Manipulating the environment.  */
  3787. + /* Merge CMDLINE, ENVVEC[0], ... into ENVBUF as a well formed MS-DOS
  3788. +    environment (will be malloc()'d).  Returns the length (incl. the
  3789. +    trailing '\0's)  of the resulting environment.  */
  3790. + int
  3791. + build_environment (char _far ** envbuf, char *cmdline, char **envvec)
  3792. + {
  3793. +   char *p;
  3794. +   char **envptr = envvec;
  3795. +   int len = 1;
  3796. +   if (envvec == NULL && cmdline == NULL)
  3797. +     return 0;
  3798. +   if (cmdline != NULL)
  3799. +     len += strlen (cmdline) + 1;
  3800. +   if (envvec != NULL)
  3801. +     while (*envptr)
  3802. +       len += strlen (*envptr++) + 1;
  3803. +   p = *envbuf = (char *) xmalloc (len);
  3804. +   if (cmdline != NULL)
  3805. +     {
  3806. +       strcpy (p, cmdline);
  3807. +       p += strlen (cmdline) + 1;
  3808. +     }
  3809. +   envptr = envvec;
  3810. +   if (envvec != NULL)
  3811. +     while (*envptr)
  3812. +       {
  3813. +     strcpy (p, *envptr);
  3814. +     p += strlen (*envptr++) + 1;
  3815. +       }
  3816. +   *p++ = '\0';            /* end of environment! */
  3817. +   return (len);
  3818. + }
  3819. + /* Manipulating the commandline.  */
  3820. + /* The following functions for manipulating the commandline do NOT free
  3821. +    the storage of the ARGV[] strings, since they can't know how it was
  3822. +    allocated (separately or as single block).  */
  3823. + /* Build an environment entry for passing options to the Microsoft C
  3824. +    and Fortran Compilers and Macro Assembler.  CMD is the command to
  3825. +    execute.  ARGV[1],... will be moved to an environment entry "CMD" and
  3826. +    we will have ARGV[1] == "".  */
  3827. + char *
  3828. + putenv_cmdline (char *cmd, char **argv)
  3829. + {
  3830. +   int nologo_flag = 0;
  3831. +   char **av = argv + 1;
  3832. +   char *p;
  3833. +   char *env;
  3834. +   int len = 3 + strlen (cmd);
  3835. +   /* `fl' and `cl' understand the "-nologo" option to suppress the banner,
  3836. +       `masm' not.  */
  3837. +   if (!strcmp (cmd, "fl") || !strcmp (cmd, "cl"))
  3838. +     {
  3839. +       nologo_flag = 1;
  3840. +       len += 8;
  3841. +     }
  3842. +   while (*av)
  3843. +     len += strlen (*av++) + 1;
  3844. +   p = env = (char *) xmalloc (len);
  3845. +   strcpy (p, strupr (cmd));
  3846. +   p += strlen (cmd);
  3847. +   *p++ = '=';
  3848. +   if (nologo_flag)
  3849. +     {
  3850. +       strcpy (p, "-nologo");
  3851. +       p += 7;
  3852. +     }
  3853. +   av = argv + 1;
  3854. +   while (*av)            /* paste arguments together */
  3855. +     {
  3856. +       *p++ = ' ';
  3857. +       strcpy (p, *av);
  3858. +       p += strlen (*av++);
  3859. +     }
  3860. +   *argv[1] = '\0';        /* commandline terminated */
  3861. +   return env;
  3862. + }
  3863. + /* Build a respondfile for the Microsoft linker from ARGV[0].  Returns the
  3864. +    name of the generated file on success, NULL otherwise.  The new
  3865. +    commandline ARGV[1] holds the proper command for instructing the linker
  3866. +    to use this respondfile.  */
  3867. + char *
  3868. + build_link_respond_file (char **argv)
  3869. + {
  3870. +   int len = 0;
  3871. +   char **av = argv;
  3872. +   FILE *respond_file;
  3873. +   char *respond_file_name = mktmpname ("lk");
  3874. +   if (!(respond_file = fopen (respond_file_name, "w")))
  3875. +     {
  3876. +       fprintf (stderr, "can't open link respond_file %s.\n",
  3877. +            respond_file_name);
  3878. +       return NULL;
  3879. +     }
  3880. +   while (*++av)
  3881. +     {
  3882. +       char *cp;
  3883. +       if (strlen (*av) + len > 50)
  3884. +     {
  3885. +       fprintf (respond_file, "+\n");
  3886. +       len = 0;
  3887. +     }
  3888. +       while (cp = strchr (*av, ','))    /* new respond group? */
  3889. +     {
  3890. +       *cp = '\n';
  3891. +       len = *av - cp - 1;    /* precompensate */
  3892. +     }
  3893. +       len += fprintf (respond_file, "%s ", *av);
  3894. +     }
  3895. +   fprintf (respond_file, ";\n");/* avoid prompts! */
  3896. +   fclose (respond_file);
  3897. +   argv[1] = (char *) xmalloc (strlen (respond_file_name) + 9);
  3898. +   sprintf (argv[1], "/batch @%s", respond_file_name);
  3899. +   return respond_file_name;
  3900. + }
  3901. + /* Build a respondfile for the Microsoft library manager from ARGV[0].
  3902. +    Returns the name of the generated file on success, NULL otherwise.  The
  3903. +    new commandline ARGV[1] holds the proper command for instructing the
  3904. +    library manager to use this respondfile.   A module without command
  3905. +    inherits the one of it's predecessor.  This allows constructions like
  3906. +    `lib foo.lib -+ $?' in the makefiles (idea stolen from Kneller's
  3907. +    `ndmake').  */
  3908. + char *
  3909. + build_lib_respond_file (char **argv)
  3910. + {
  3911. +   int len = 0;
  3912. +   char **av = argv;
  3913. +   FILE *respond_file;
  3914. +   char *respond_file_name = mktmpname ("lb");
  3915. +   static char lib_action[3] = "+";
  3916. +   if (!(respond_file = fopen (respond_file_name, "w")))
  3917. +     {
  3918. +       fprintf (stderr, "can't open lib respond_file %s.\n",
  3919. +            respond_file_name);
  3920. +       return NULL;
  3921. +     }
  3922. +   fprintf (respond_file, " %s\n ", *++av);    /* easy: the lib file  */
  3923. +   if (access (*av, 0))        /* new library */
  3924. +     fprintf (respond_file, "y\n ");    /* create it! */
  3925. +   while (*++av)
  3926. +     {
  3927. +       char *cp;
  3928. +       if (strchr ("+-*", **av))
  3929. +     {
  3930. +       lib_action[0] = *(*av)++;
  3931. +       if (strchr ("+-*", **av))
  3932. +         lib_action[1] = *(*av)++;
  3933. +       else
  3934. +         lib_action[1] = '\0';
  3935. +     }
  3936. +       if (**av)
  3937. +     {
  3938. +       if (strlen (*av) + len > 50)
  3939. +         {
  3940. +           fprintf (respond_file, "&\n ");
  3941. +           len = 0;
  3942. +         }
  3943. +       len += fprintf (respond_file, "%s", lib_action) + 1;
  3944. +       while (cp = strchr (*av, ','))    /* new respond group? */
  3945. +         {
  3946. +           *cp = '\n';
  3947. +           len = *av - cp - 1;    /* precompensate */
  3948. +           lib_action[0] = '\0';    /* no more actions! */
  3949. +         }
  3950. +       len += fprintf (respond_file, "%s ", *av) + 1;
  3951. +     }
  3952. +     }
  3953. +   fprintf (respond_file, ";\n");/* avoid prompts! */
  3954. +   fclose (respond_file);
  3955. +   argv[1] = (char *) xmalloc (strlen (respond_file_name) + 10);
  3956. +   sprintf (argv[1], "/nologo @%s", respond_file_name);
  3957. +   return respond_file_name;
  3958. + }
  3959. + /* Build a respondfile for the pk(un)?zip archive managers from ARGV[0].
  3960. +    Returns the name of the generated file on success, NULL otherwise.  The
  3961. +    new commandline ARGV[1] holds the proper command for instructing
  3962. +    pk(un)?zip to use this respondfile.  */
  3963. + char *
  3964. + build_zip_respond_file (char **argv)
  3965. + {
  3966. +   char *cmdline = (char *) xmalloc (127 * sizeof (char));
  3967. +   char *ptr = cmdline;
  3968. +   char **av = argv + 1;
  3969. +   int len = 0;
  3970. +   FILE *respond_file = NULL;
  3971. +   char *respond_file_name = mktmpname ("zi");
  3972. +   respond_file = fopen (respond_file_name, "w");
  3973. +   if (respond_file == NULL)
  3974. +     {
  3975. +       fprintf (stderr, "can't open zip respondfile %s.\n", respond_file_name);
  3976. +       return NULL;
  3977. +     }
  3978. +   while (**av == '-')        /* leave options on the commandline */
  3979. +     {
  3980. +       if (ptr - cmdline + strlen (*av) > 126)
  3981. +     {
  3982. +       free (cmdline);
  3983. +       return NULL;
  3984. +     }
  3985. +       strcpy (ptr, *av);
  3986. +       ptr += strlen (*av);
  3987. +       *ptr++ = ' ';
  3988. +       av++;
  3989. +     }
  3990. +   if (*av == NULL        /* missing zipfilename? */
  3991. +       || ptr - cmdline + strlen (*av) + strlen (respond_file_name) > 124)
  3992. +     {
  3993. +       free (cmdline);
  3994. +       return NULL;
  3995. +     }
  3996. +   sprintf (ptr, "%s @%s", *av++, respond_file_name);
  3997. +   while (*av)
  3998. +     fprintf (respond_file, "%s\n", *av++);
  3999. +   fprintf (respond_file, "\n");
  4000. +   fclose (respond_file);
  4001. +   argv[1] = cmdline;
  4002. +   return respond_file_name;
  4003. + }
  4004. + /* Build a MS-DOS commandline from the supplied argument vector ARGV and
  4005. +    put it into ARGV[1].  Storage of the old argv[1], ... is NOT free()'d,
  4006. +    since we can't know how it was allocated (separately or as single
  4007. +    block)! ARGV[0] is assumed to be a fully expanded pathname incl
  4008. +    extension.  If ARGV[0] ends int ".bat", we will pass the command to the
  4009. +    shell.  Returns 1 on success, 0 if the commandline is too long.  */
  4010. + int
  4011. + build_cmdline (char **argv)
  4012. + {
  4013. +   char *cmdline = (char *) xmalloc (128 * sizeof (char));
  4014. +   char *p = cmdline;
  4015. +   char *tmp;
  4016. +   char **av;
  4017. +   if ((tmp = strrchr (argv[0], '.'))    /* .bat files will be passed */
  4018. +       && !strcmp (tmp + 1, "bat"))    /* to the shell ...  */
  4019. +     {
  4020. +       *tmp = '\0';        /* terminate */
  4021. +       strcpy (p, "/c ");    /* return after execution */
  4022. +       p += 3;
  4023. +       if ((tmp = strrchr (argv[0], BSLASH))    /* strip path */
  4024. +       || (tmp = strrchr (argv[0], FSLASH)))
  4025. +     strcpy (p, tmp + 1);
  4026. +       else
  4027. +     strcpy (p, argv[0]);
  4028. +       p += strlen (p);
  4029. +       *p++ = ' ';
  4030. +       if (!(argv[0] = getenv ("COMSPEC")))
  4031. +     {
  4032. +       fprintf (stderr, "command processor not found!");
  4033. +       exit (1);
  4034. +     }
  4035. +     }
  4036. +   av = argv;            /* paste arguments together */
  4037. +   while (*++av)
  4038. +     {
  4039. +       strcpy (p, *av);
  4040. +       p += strlen (*av);
  4041. +       *p++ = ' ';
  4042. +       if ((p - cmdline) > 126)
  4043. +     return (0);        /* commandline to long for MeSy-DOS */
  4044. +     }
  4045. +   *p = '\0';
  4046. +   argv[1] = cmdline;
  4047. +   return (1);            /* success */
  4048. + }
  4049. + /* $PATH search.  */
  4050. + /* Look for NAME in the directories from $ENV ($PATH, if ENV is NULL),
  4051. +    satisfying SELECT.  */
  4052. + char *
  4053. + expand_path (char *name, char *env, char *(*select) (char *))
  4054. + {
  4055. +   size_t name_len = strlen (name) + 6;    /*  SELECT may append 4 chars! */
  4056. +   char *exp = (char *) xmalloc (name_len);
  4057. +   strcpy (exp, name);
  4058. +   if ((*select) (exp))        /* first look in current directory. */
  4059. +     return exp;
  4060. +   /* If not an absolute path, scan $PATH  */
  4061. +   if (exp[1] != ':' && *exp != BSLASH && *exp != FSLASH)
  4062. +     {
  4063. +       char *ptr = getenv ((env == NULL) ? "PATH" : env);
  4064. +       if (ptr != NULL)
  4065. +     {
  4066. +       char *path = (char *) alloca (strlen (ptr) + 1);
  4067. +       strcpy (path, ptr);    /* get a copy strtok() can butcher. */
  4068. +       ptr = strtok (path, ";");
  4069. +       while (ptr != NULL)
  4070. +         {
  4071. +           exp = (char *) xrealloc (exp, strlen (ptr) + name_len);
  4072. +           if ((*select) (strcat (strcat (strcpy (exp, ptr), "/"), name)))
  4073. +         return exp;
  4074. +           ptr = strtok (NULL, ";");
  4075. +         }
  4076. +     }
  4077. +     }
  4078. +   free (exp);
  4079. +   return NULL;            /* We've failed!  */
  4080. + }
  4081. + /* Return the expanded path with extension iff PATH is an executable MS-DOS
  4082. +    program, NULL otherwise.  */
  4083. + static char *
  4084. + executable_p (char *path)
  4085. + {
  4086. +   char *base;
  4087. +   const char **ext = extensions;
  4088. +   base = strrchr (strrchr (path, BSLASH), FSLASH);
  4089. +   if (base == NULL)
  4090. +     base = path;
  4091. +   if (strchr (base, '.'))    /* explicit extension? */
  4092. +     {
  4093. +       if (!access (path, 0))
  4094. +     return path;
  4095. +     }
  4096. +   else
  4097. +     {
  4098. +       while (*base)        /* point to the end */
  4099. +     *base++;
  4100. +       while (*ext)        /* try all extensions */
  4101. +     {
  4102. +       strcpy (base, *ext++);
  4103. +       if (!access (path, 0))
  4104. +         return path;
  4105. +     }
  4106. +     }
  4107. +   return NULL;            /* failed */
  4108. + }
  4109. + /* Get a unique filename in the temporary directory from the environment
  4110. +    entry TMP or TEMP, if this fails, use current directory.  (replacement
  4111. +    for tempnam(), whish is *too* touchy about trailing path separators!) */
  4112. + char *
  4113. + mktmpname (char *prefix)
  4114. + {
  4115. +   register int len;
  4116. +   register char *ptr;
  4117. +   register char *tmpname;
  4118. +   static char default_prefix[3] = "vm";
  4119. +   if (!prefix[0] || !prefix[1])    /* did the user supply a prefix? */
  4120. +     prefix = default_prefix;
  4121. +   if (!(ptr = getenv ("TMP")) && !(ptr = getenv ("TEMP")))
  4122. +     {
  4123. +       ptr = ".";
  4124. +       len = 1;
  4125. +     }
  4126. +   else
  4127. +     {
  4128. +       len = strlen (ptr) - 1;
  4129. +       if ((ptr[len] == FSLASH) || (ptr[len] == BSLASH))
  4130. +     ptr[len] = '\0';
  4131. +     }
  4132. +   tmpname = xmalloc (len + 10);
  4133. +   sprintf (tmpname, "%s\\%2sXXXXXX", ptr, prefix);
  4134. +   mktemp (tmpname);
  4135. +   return tmpname;
  4136. + }
  4137. + #ifdef TEST
  4138. + extern void main (int ac, char **av);
  4139. + void *
  4140. + xmalloc (size_t size)
  4141. + {
  4142. +   void *result = malloc (size);
  4143. +   if (result == NULL)
  4144. +     {
  4145. +       fprintf (stderr, "virtual memory exhausted");
  4146. +       abort ();
  4147. +     }
  4148. +   return result;
  4149. + }
  4150. + void *
  4151. + xrealloc (void *ptr, size_t size)
  4152. + {
  4153. +   void *result = realloc (ptr, size);
  4154. +   if (result == NULL)
  4155. +     {
  4156. +       fprintf (stderr, "virtual memory exhausted");
  4157. +       abort ();
  4158. +     }
  4159. +   return result;
  4160. + }
  4161. + void
  4162. + main (int ac, char **av)
  4163. + {
  4164. +   int n = 0;
  4165. +   int j = 2;
  4166. +   char **argv;
  4167. +   argv = (char **) xmalloc ((ac - 1) * sizeof (char **));
  4168. +   while (j < ac)
  4169. +     {
  4170. +       argv[n] = (char *) xmalloc (strlen (av[j]) + 1);
  4171. +       strcpy (argv[n++], av[j++]);
  4172. +     }
  4173. +   argv[n] = NULL;
  4174. +   swap_and_spawnvp (av[1], *argv, argv);
  4175. + }
  4176. + #endif /* TEST */
  4177. + /*
  4178. +  * Local Variables:
  4179. +  * mode:C
  4180. +  * ChangeLog:ChangeLog
  4181. +  * compile-command:cl -DTEST -W3 vmspawn.c swapcore
  4182. +  * End:
  4183. +  */
  4184. diff -cBdNp e:/gnu/make/gnu/swap.c ./swap.c
  4185. *** e:/gnu/make/gnu/swap.c    Tue Jul 24 00:56:24 1990
  4186. --- ./swap.c    Tue Jul 24 00:55:46 1990
  4187. ***************
  4188. *** 0 ****
  4189. --- 1,1065 ----
  4190. + /*  swap.c - swap parent to disk, EMS, or XMS while executing child (MS-DOS)
  4191. +     Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  4192. +     This program is free software; you can redistribute it and/or modify
  4193. +     it under the terms of the GNU General Public License as published by
  4194. +     the Free Software Foundation; either version 1, or (at your option)
  4195. +     any later version.
  4196. +     This program is distributed in the hope that it will be useful,
  4197. +     but WITHOUT ANY WARRANTY; without even the implied warranty of
  4198. +     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4199. +     GNU General Public License for more details.
  4200. +     You should have received a copy of the GNU General Public License
  4201. +     along with this program; if not, write to the Free Software
  4202. +     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  4203. +     IMPORTANT:
  4204. +     This code is not an official part of the GNU project and the
  4205. +     author is not affiliated to the Free Software Foundation.
  4206. +     He just likes their code and spirit.  */
  4207. + static char RCS_id[] =
  4208. + "$Header: e:/gnu/make/RCS/swap.c'v 0.11 90/07/23 18:34:29 tho Exp $";
  4209. + #include <stdio.h>
  4210. + #include <stdlib.h>
  4211. + #include <string.h>
  4212. + #include <ctype.h>
  4213. + #include <signal.h>
  4214. + #include <sys/types.h>
  4215. + #include <dos.h>
  4216. + /* Add OFF to PTR, taking care of segment overflow  */
  4217. + #define FP_ADD(ptr,off) \
  4218. +   (FP_SEG (ptr) += (off) >> 4, FP_OFF (ptr) += (off) & 0xff, ptr)
  4219. + /* Paragraph-align PTR.  */
  4220. + #define FP_PARA_ALIGN(ptr)            \
  4221. +   {                        \
  4222. +     FP_SEG (ptr)                \
  4223. +       += ((FP_OFF (ptr) + 15) >> 4) + 1;    \
  4224. +     FP_OFF (ptr) = 0x0000;            \
  4225. +   }
  4226. + /* generate inline code (usable in swapper!) */
  4227. + #pragma intrinsic (memcpy)
  4228. + /* don't call MS' stack checker (it will fail with the local stack!)  */
  4229. + #pragma check_stack (off)
  4230. + #define FILE_IO_BLKSIZE        0x8000
  4231. + #define MAX_MSDOS_CMDLINE    126
  4232. + #define MAX_MSDOS_PATH        144
  4233. + #define MAX_MSDOS_MCBS        25
  4234. + /* Atributte to force storage in the code segment! */
  4235. + #define CODE _based (_segname ("_CODE"))
  4236. + static off_t        CODE _swap_swapped_bytes;
  4237. + static unsigned int    CODE _swap_handle;
  4238. + static unsigned int    CODE _swap_psp;
  4239. + static unsigned int    CODE _swap_resident_paras;
  4240. + static unsigned int    CODE _swap_first_block_paras;
  4241. + /* Parameters for DOS for creating a child process */
  4242. + #pragma pack (1)
  4243. + static struct
  4244. + {
  4245. +   _segment    environment_segment;
  4246. +   char _far    *cmd_line_ptr;
  4247. +   char _far    *fcb_ptr_1;
  4248. +   char _far    *fcb_ptr_2;
  4249. + }            CODE _swap_parameter_block;
  4250. + #pragma pack ()
  4251. + static char        CODE _swap_path[MAX_MSDOS_PATH];
  4252. + static char        CODE _swap_cmdline[MAX_MSDOS_CMDLINE + 2];
  4253. + static char        CODE _swap_fcb_1[16];    /* FCBs for DOS.  */
  4254. + static char        CODE _swap_fcb_2[16];
  4255. + static unsigned int    CODE _swap_environ_seg;
  4256. + static unsigned int    CODE _swap_environment_size;
  4257. + static int        CODE _swap_return_code;
  4258. + static struct
  4259. + {
  4260. +   _segment    loc;
  4261. +   unsigned int    len;
  4262. + }            CODE _swap_orig_mcbs[MAX_MSDOS_MCBS];
  4263. + /* This is a kludge to store _far pointers in the code segment.  */
  4264. + static struct
  4265. + {
  4266. +   char _far *env;
  4267. +   char _far *env_ptr;
  4268. +   char _far *xms_fct;
  4269. +   int (*swap_in_fct) (int handle, void _far * buffer, long bytes);
  4270. +   int (*swap_out_fct) (int handle, void _far * buffer, long bytes);
  4271. + }             CODE __swap_far_ptrs;
  4272. + #define _swap_environment    (__swap_far_ptrs.env)
  4273. + #define _swap_environment_ptr    (__swap_far_ptrs.env_ptr)
  4274. + #define _swap_xms_control    (__swap_far_ptrs.xms_fct)
  4275. + #define _swap_in_function    (__swap_far_ptrs.swap_in_fct)
  4276. + #define _swap_out_function    (__swap_far_ptrs.swap_out_fct)
  4277. + #pragma pack (1)
  4278. + static struct
  4279. + {
  4280. +   long    length;
  4281. +   int    src_handle;
  4282. +   long    src_offset;
  4283. +   int    dest_handle;
  4284. +   long    dest_offset;
  4285. + }            CODE  _swap_xms_move_table;
  4286. + #pragma pack ()
  4287. + /* The local stack */
  4288. + #define STACK_SIZE    0x200
  4289. + static char        CODE _swap_local_stack[STACK_SIZE];
  4290. + static unsigned int    CODE _swap_stack_pointer;
  4291. + static _segment        CODE _swap_stack_segment;
  4292. + /* This uses the first transient function to determine the end of the
  4293. +    resident code.  */
  4294. + #define FIRST_TO_SWAP    (&install_parameters)
  4295. + /* MS-DOS interface */
  4296. + #pragma pack (1)        /* won't fit, if we don't pack! */
  4297. + struct mcb_info
  4298. + {
  4299. +   char         id_byte;    /* 'M': not, 'Z': last MCB    */
  4300. +   unsigned short owner;        /* PSP of owner            */
  4301. +   unsigned short length;    /* length (in paragraphs = 16b)    */
  4302. + };
  4303. + #pragma pack ()
  4304. + static void _swap_fatal_error (char code, char CODE *msg, size_t len);
  4305. + static int  _swap_free_block (_segment block);
  4306. + static int  _swap_set_block (_segment block, unsigned int paras);
  4307. + static unsigned int  _swap_allocate_block (unsigned int paras);
  4308. + static void _swap_free_upper_blocks (void);
  4309. + static void _swap_reclaim_upper_blocks (void);
  4310. + static int  _swap_load_and_execute_program (void);
  4311. + /* Disk I/O */
  4312. + static unsigned int _swap_read (int handle, void _far * buffer, size_t bytes);
  4313. + static unsigned int _swap_write (int handle, void _far * buffer, size_t bytes);
  4314. + static int  _swap_rewind (int handle);
  4315. + static int  _swap_write_to_handle (int handle, void _far * buffer, long size);
  4316. + static int  _swap_read_from_handle (int handle, void _far * buffer, long size);
  4317. + /* XMS */
  4318. + static int _swap_xms_move_out (int handle, void _far * buffer, long bytes);
  4319. + static int _swap_xms_move_in (int handle, void _far * buffer, long bytes);
  4320. + static int _swap_xms_move (void);
  4321. + static int xms_installed (void);
  4322. + static void xms_get_control_function (void);
  4323. + static unsigned int xms_allocate_memory (unsigned int kilobytes);
  4324. + static unsigned int xms_free_memory (unsigned int handle);
  4325. + /* EMS */
  4326. + static int _swap_ems_save_page_map (int handle);
  4327. + static int _swap_ems_restore_page_map (int handle);
  4328. + static int _swap_ems_map_logical_page (int handle, int logical_page);
  4329. + static int _swap_move_to_ems (int handle, void _far *buffer, long bytes);
  4330. + static int _swap_move_from_ems (int handle, void _far *buffer, long bytes);
  4331. + static int _swap_ems_present (void);
  4332. + static int _swap_ems_alloc_pages (int n);
  4333. + static int _swap_ems_free_pages (int handle);
  4334. + static void _far *_swap_ems_get_page_frame (void);
  4335. + /* Signal handling */
  4336. + static void (_interrupt _far *_swap_caller_int23) (void);
  4337. + static void _interrupt _far _swap_int23_handler (void);
  4338. + static int    CODE _swap_user_interrupt = 0;    /* record interrupts  */
  4339. + static char    CODE _swap_int23_handler_message[] =
  4340. +   "\r\n\a\a\a*** User interrupt: waiting for child...\r\n\r\n";
  4341. + /* "Higher" level code.  */
  4342. + static void _swap_setup_environment (void);
  4343. + static int  _swap_spawn_child (void);
  4344. + static void install_parameters (char *path, char *cmdline, char *env,
  4345. +                 size_t size);
  4346. + static struct mcb_info far *last_mcb (void);
  4347. + static int  alloc_swap_file (char *name, long size);
  4348. + static unsigned int cleanup_swap_file (unsigned handle, char *name);
  4349. + /* The ONE and ONLY entry point */
  4350. + enum swapping_mode { none, disk, ems, xms };
  4351. + int spawn_child (enum swapping_mode mode, char *path, char *cmdline,
  4352. +          char *env, int len, char *swap_file);
  4353. + /* Very Fatal Error messages.  */
  4354. + static char CODE _swap_err_msg_head[] = \
  4355. +   "\r\nFatal error in memory management. Aborting.\r\nReason: ";
  4356. + static char CODE _swap_err_msg_0[] = "Can't reallocate core.";
  4357. + static char CODE _swap_err_msg_1[] = "Can't swap code back.";
  4358. + static char CODE _swap_err_msg_2[] = "Can't release core.";
  4359. + static char CODE _swap_err_msg_3[] = "Too many MCBs.";
  4360. + #define SWAP_FATAL_ERROR(num) \
  4361. +   _swap_fatal_error (-1, _swap_err_msg_##num, sizeof (_swap_err_msg_##num))
  4362. + void
  4363. + _swap_setup_environment (void)
  4364. + {
  4365. +   _swap_resident_paras = FP_SEG (_swap_environment) - _swap_psp;
  4366. +   if (_swap_environment_size && *_swap_environment_ptr)
  4367. +     {
  4368. +       memcpy (_swap_environment, _swap_environment_ptr,
  4369. +           _swap_environment_size);
  4370. +       _swap_resident_paras += (_swap_environment_size + 15) >> 4;
  4371. +       _swap_environ_seg = FP_SEG (_swap_environment);
  4372. +     }
  4373. +   else
  4374. +     _swap_environ_seg = 0;    /* pass our own environment */
  4375. + }
  4376. + /* Memory management.
  4377. +    WARNING:  this used undocumented MS-DOS features.
  4378. +    This features seem to be very stable anyway (Microsoft obviously uses
  4379. +    them in their own programs and since they won't want to break them,
  4380. +    these feaatures shouldn't go away.  */
  4381. + /* Does this MCB belong to us?  */
  4382. + #define OUR_MCB(mcb) ((mcb)->owner == _swap_psp)
  4383. + /* Return a pointer to OUR first MCB */
  4384. + #define FIRST_MCB(mcb) \
  4385. +   (FP_SEG (mcb) = _swap_psp - 1, FP_OFF (mcb) = 0, mcb)
  4386. + /* Return a pointer to the next MCB */
  4387. + #define NEXT_MCB(mcb) \
  4388. +   (FP_SEG (mcb) = FP_SEG (mcb) + mcb->length + 1, mcb)
  4389. + int
  4390. + _swap_free_block (_segment block)
  4391. + {
  4392. +   _asm
  4393. +     {
  4394. +       mov    ax, block;
  4395. +       mov    es, ax;
  4396. +       mov    ah, 0x49        /* MS-DOS Free Allocated Memory */
  4397. +       int    0x21
  4398. +       jc    failed
  4399. +       xor    ax, ax;            /* success */
  4400. +     failed:
  4401. +     }
  4402. + }
  4403. + int
  4404. + _swap_set_block (_segment block, unsigned int paras)
  4405. + {
  4406. +   _asm
  4407. +     {
  4408. +       mov    ax, block
  4409. +       mov    es, ax
  4410. +       mov    bx, paras
  4411. +       mov    ah, 4ah            /* MS-DOS Set Block */
  4412. +       int    0x21
  4413. +       jc    failed
  4414. +       xor    ax, ax            /* success */
  4415. +     failed:
  4416. +     }
  4417. + }
  4418. + static unsigned int
  4419. +  _swap_allocate_block (unsigned int paras)
  4420. + {
  4421. +   _asm
  4422. +     {
  4423. +       mov    bx, paras
  4424. +       mov    ah, 0x48    /* MS-DOS Allocate Memory */
  4425. +       int    0x21
  4426. +       jnc    done
  4427. +       mov    ax, 0x0000    /* failed */
  4428. +     done:
  4429. +     }
  4430. + }
  4431. + /* Free, one by one, the memoy blocks owned by us.  This excluded the
  4432. +    first block, which will be shrunk later.  _swap_orig_mcbs will be
  4433. +    zero-terminated. */
  4434. + void
  4435. + _swap_free_upper_blocks (void)
  4436. + {
  4437. +   int i = 0;
  4438. +   struct mcb_info far *mcb;
  4439. +   FIRST_MCB (mcb);
  4440. +   while (mcb->id_byte == 'M')
  4441. +     {
  4442. +       NEXT_MCB (mcb);    /* leave the first block intact (for the moment)  */
  4443. +       if (OUR_MCB (mcb))
  4444. +     {
  4445. +       if (i >= MAX_MSDOS_MCBS)
  4446. +         SWAP_FATAL_ERROR (3);
  4447. +       if (_swap_free_block (FP_SEG (mcb) + 1))
  4448. +         SWAP_FATAL_ERROR (2);
  4449. +       _swap_orig_mcbs[i].loc = FP_SEG (mcb) + 1;
  4450. +       _swap_orig_mcbs[i].len = mcb->length;
  4451. +       i++;
  4452. +     }
  4453. +     }
  4454. +   _swap_orig_mcbs[i].loc = 0x000;
  4455. + }
  4456. + /* Reclaim, one by one, the original memory blocks, as stored in
  4457. +    _swap_orig_mcbs.  From the MS-DOS point of view, this should be not
  4458. +    necessary, since MS-DOS keeps (to my knowledge) no internal record of
  4459. +    the memory allocation and the original MCBs are restored together with
  4460. +    the image.  But in this way we can catch the fatal condition when the
  4461. +    child has (illegally) left a resident grandchild.  Also we will be
  4462. +    warned if our methos fails with future MS-DOS versions.  */
  4463. + void
  4464. + _swap_reclaim_upper_blocks (void)
  4465. + {
  4466. +   int i = 0;
  4467. +   while (_swap_orig_mcbs[i].loc != 0x000)
  4468. +     if (_swap_allocate_block (_swap_orig_mcbs[i].len)
  4469. +     != _swap_orig_mcbs[i].loc)
  4470. +       SWAP_FATAL_ERROR (0);
  4471. +     else
  4472. +       i++;
  4473. + }
  4474. + int
  4475. + _swap_load_and_execute_program (void)
  4476. + {
  4477. +   _swap_parameter_block.environment_segment = _swap_environ_seg;
  4478. +   _swap_parameter_block.cmd_line_ptr = (char _far *) &_swap_cmdline;
  4479. +   _swap_parameter_block.fcb_ptr_1 = (char _far *) &_swap_fcb_1;
  4480. +   _swap_parameter_block.fcb_ptr_2 = (char _far *) &_swap_fcb_2;
  4481. +   /* The compiler saves si and di by himself.  */
  4482. +   _asm
  4483. +     {
  4484. +       push    ds        /* save ds */
  4485. +       mov    ax, cs        /* let es and ds point into code segment */
  4486. +       mov    es, ax
  4487. +       mov    ds, ax
  4488. +       mov    si, offset _swap_cmdline    /* parse commandline */
  4489. +       mov    di, offset _swap_fcb_1        /* create first FCB */
  4490. +       mov    ax, 0x2901         /* MS-DOS Parse File Name */
  4491. +       int    0x21
  4492. +       mov    di, offset _swap_fcb_2        /* create second FCB */
  4493. +       mov    ax, 0x2901          /* MS-DOS Parse File Name */
  4494. +       int    0x21
  4495. +       mov    bx, offset _swap_parameter_block /* es:bx */
  4496. +       mov    dx, offset _swap_path         /* ds:dx */
  4497. +       mov    ax, 0x4b00        /* MS-DOS Load and Execute Program */
  4498. +       int    21h
  4499. +       mov    ax, 0ffffh        /* assume failure */
  4500. +       jc    failed
  4501. +       mov    ah, 0x4d        /* MS-DOS Get Return Code of Child */
  4502. +       int    21h
  4503. +       mov    _swap_return_code, ax    /* store return code */
  4504. +     failed:
  4505. +       pop    ds        /* restore ds */
  4506. +     }
  4507. + }
  4508. + int
  4509. + _swap_spawn_child (void)    /* CAN'T TAKE PARAMETERS! */
  4510. + {
  4511. +   /* void */            /* CAN'T HAVE LOCAL VARIABLES!  */
  4512. +     /* FROM HERE ON: DON'T REFER TO THE GLOBAL STACK! */
  4513. +   _asm
  4514. +     {
  4515. +       mov    cs:_swap_stack_pointer, sp    /* save stack position */
  4516. +       mov    cs:_swap_stack_segment, ss
  4517. +       cli                    /* Interrupts off */
  4518. +       mov    ax, seg _swap_local_stack    /* Change stack */
  4519. +       mov    ss, ax                /* Point to top of new stack */
  4520. +       mov    sp, offset _swap_local_stack + STACK_SIZE
  4521. +       sti                    /* Interrupts on */
  4522. +     }
  4523. +   if ((*_swap_out_function) (_swap_handle, _swap_environment,
  4524. +                  _swap_swapped_bytes))
  4525. +     return -1;
  4526. +   _swap_setup_environment ();
  4527. +   _swap_free_upper_blocks ();
  4528. +   _swap_set_block (_swap_psp, _swap_resident_paras);
  4529. +   _swap_load_and_execute_program ();        /* !!! BIG DEAL !!! */
  4530. +   if (_swap_set_block (_swap_psp, _swap_first_block_paras))
  4531. +     SWAP_FATAL_ERROR (0);
  4532. +   _swap_reclaim_upper_blocks ();
  4533. +   if ((*_swap_in_function) (_swap_handle, _swap_environment,
  4534. +                  _swap_swapped_bytes))
  4535. +     SWAP_FATAL_ERROR (1);
  4536. +   _asm
  4537. +     {
  4538. +       mov    ax, cs:_swap_stack_pointer    /* get saved stack position */
  4539. +       mov    bx, cs:_swap_stack_segment
  4540. +       cli                    /* Interrupts off */
  4541. +       mov    ss, bx                /* Change stack */
  4542. +       mov    sp, ax
  4543. +       sti                    /* Interrupts on */
  4544. +     }
  4545. +     /* THE GLOBAL STACK IS SAVE AGAIN! */
  4546. +   return _swap_return_code;
  4547. + }
  4548. + /* Display LEN bytes from string MSG and *immediately* return to DOS,
  4549. +    with CODE as return code.  This is a panic exit, only to be used
  4550. +    as a last resort.            ~~~~~~~~~~            */
  4551. + void
  4552. + _swap_fatal_error (char code, char CODE *msg, size_t len)
  4553. + {
  4554. +   _asm
  4555. +     {
  4556. +       mov    ax, cs        /* ds = cs */
  4557. +       mov    ds, ax
  4558. +       mov    bx, 0x02    /* /dev/stderr */
  4559. +       mov    dx, offset _swap_err_msg_head
  4560. +       mov    cx, length _swap_err_msg_head
  4561. +       mov    ah, 0x40    /* MS-DOS Write Handle */
  4562. +       int    0x21
  4563. +       mov    dx, msg        /* message */
  4564. +       mov    cx, len        /* length */
  4565. +       mov    ah, 0x40
  4566. +       int    0x21
  4567. +       mov    al, code    /* bail out */
  4568. +       mov    ah, 0x4c    /* MS-DOS End Process */
  4569. +       int    0x21
  4570. +     }
  4571. + }
  4572. + /* Lowest level disk I/0:  */
  4573. + /* Write SIZE bytes from BUFFER to HANDLE.  Returns 0 on success, -1 on
  4574. +    failure.  */
  4575. + int
  4576. + _swap_write_to_handle (int handle, void _far *buffer, off_t size)
  4577. + {
  4578. +   while (size > 0L)
  4579. +     {
  4580. +       size_t bytes = (size_t) min (size, FILE_IO_BLKSIZE);
  4581. +       size_t bytes_written = _swap_write (handle, buffer, bytes);
  4582. +       if (bytes_written != bytes)
  4583. +     return -1;
  4584. +       FP_ADD (buffer, bytes);
  4585. +       size -= bytes;
  4586. +     }
  4587. +   return 0;
  4588. + }
  4589. + size_t
  4590. + _swap_write (int handle, void _far *buffer, size_t bytes)
  4591. + {
  4592. +   _asm
  4593. +     {
  4594. +       push    ds
  4595. +       mov    dx, word ptr buffer    /* offset */
  4596. +       mov    ax, word ptr buffer + 2    /* segment */
  4597. +       mov    ds, ax
  4598. +       mov    bx, handle
  4599. +       mov    cx, bytes
  4600. +       mov    ah, 0x40        /* MS-DOS Write Handle */
  4601. +       int    0x21
  4602. +       jnc    done
  4603. +       mov    ax, 0xffff
  4604. +     done:
  4605. +       pop    ds
  4606. +     }
  4607. + }
  4608. + /* Read SIZE bytes from HANDLE to BUFFER.  Returns 0 on success, -1 on
  4609. +    failure.  */
  4610. + int
  4611. + _swap_read_from_handle (int handle, void _far *buffer, off_t size)
  4612. + {
  4613. +   _swap_rewind (handle);
  4614. +   while (size > 0L)
  4615. +     {
  4616. +       size_t bytes = (size_t) min (size, FILE_IO_BLKSIZE);
  4617. +       size_t bytes_read = _swap_read (handle, buffer, bytes);
  4618. +       if (bytes_read != bytes)
  4619. +     return -1;
  4620. +       FP_ADD (buffer, bytes);
  4621. +       size -= bytes;
  4622. +     }
  4623. +   return 0;
  4624. + }
  4625. + size_t
  4626. + _swap_read (int handle, void _far *buffer, size_t bytes)
  4627. + {
  4628. +   _asm
  4629. +     {
  4630. +       push    ds
  4631. +       mov    dx, word ptr buffer    /* offset */
  4632. +       mov    ax, word ptr buffer + 2 /* segment */
  4633. +       mov    ds, ax
  4634. +       mov    bx, handle
  4635. +       mov    cx, bytes
  4636. +       mov    ah, 0x3f        /* MS-DOS Read Handle */
  4637. +       int    0x21
  4638. +       jnc    done
  4639. +       mov    ax, 0xffff
  4640. +     done:
  4641. +       pop    ds
  4642. +     }
  4643. + }
  4644. + /* Rewind the file pointer for HANDLE to the beginning of the file.  */
  4645. + int
  4646. + _swap_rewind (int handle)
  4647. + {
  4648. +   _asm
  4649. +     {
  4650. +       mov    bx, handle
  4651. +       mov    cx, 0x0000    /* offset = 0 */
  4652. +       mov    dx, 0x0000
  4653. +       mov    ax, 0x4200    /* MS-DOS Move File Pointer, (beginning) */
  4654. +       int    0x21
  4655. +       jc    failed
  4656. +       mov    ax, 0x0000
  4657. +     failed:
  4658. +     }
  4659. + }
  4660. + /* XMS interface */
  4661. + int
  4662. + _swap_xms_move_out (int handle, void _far *buffer, long bytes)
  4663. + {
  4664. +   _swap_xms_move_table.length = bytes;
  4665. +   _swap_xms_move_table.src_handle = 0x0000;
  4666. +   _swap_xms_move_table.src_offset = (long) buffer;
  4667. +   _swap_xms_move_table.dest_handle = handle;
  4668. +   _swap_xms_move_table.dest_offset = 0L;
  4669. +   _swap_xms_move ();
  4670. + }
  4671. + int
  4672. + _swap_xms_move_in (int handle, void _far *buffer, long bytes)
  4673. + {
  4674. +   _swap_xms_move_table.length = bytes;
  4675. +   _swap_xms_move_table.dest_handle = 0x0000;
  4676. +   _swap_xms_move_table.dest_offset = (long) buffer;
  4677. +   _swap_xms_move_table.src_handle = handle;
  4678. +   _swap_xms_move_table.src_offset = 0L;
  4679. +   _swap_xms_move ();
  4680. + }
  4681. + int
  4682. + _swap_xms_move (void)
  4683. + {
  4684. +   _asm
  4685. +     {
  4686. +       push    ds
  4687. +       mov    si, offset _swap_xms_move_table
  4688. +       mov    ax, seg _swap_xms_move_table
  4689. +       mov    ds, ax
  4690. +       mov    ah, 0x0b
  4691. +       call    far ptr cs:[_swap_xms_control]
  4692. +       cmp    ax, 0x0001
  4693. +       jne    failed
  4694. +       mov    ax, 0x0000
  4695. +       jmp    done
  4696. +     failed:
  4697. +       mov    ax, 0xffff
  4698. +     done:
  4699. +       pop    ds
  4700. +     }
  4701. + }
  4702. + #if 0
  4703. + /* EMS interface */
  4704. + #define PHYSICAL_PAGE    0x00
  4705. + int
  4706. + _swap_move_to_ems (int handle, void _far *buffer, long bytes)
  4707. + {
  4708. +   int logical_page = 0;
  4709. +   while (paras > 0)
  4710. +     {
  4711. +       unsigned int bytes = min (paras, 0x0400) << 4;
  4712. +       paras -= bytes >> 4;
  4713. +       if (ems_map_logical_page (handle, logical_page++))
  4714. +     return -1;
  4715. +       memcpy (swappee.ems_page_frame, &msdos_child_environment, bytes);
  4716. +     }
  4717. +   return 0;
  4718. + }
  4719. + int
  4720. + _swap_move_from_ems (int handle, void _far *buffer, long bytes)
  4721. + {
  4722. +   int logical_page = 0;
  4723. +   while (paras > 0)
  4724. +     {
  4725. +       unsigned int bytes = min (paras, 0x0400) << 4;
  4726. +       paras -= bytes >> 4;
  4727. +       if (ems_map_logical_page (handle, logical_page++))
  4728. +     return -1;
  4729. +       memcpy (&msdos_child_environment, swappee.ems_page_frame, bytes);
  4730. +     }
  4731. +   return 0;
  4732. + }
  4733. + int
  4734. + _swap_ems_map_logical_page (int handle, int logical_page)
  4735. + {
  4736. +   _asm
  4737. +     {
  4738. +       mov    dx, handle
  4739. +       mov    bx, logical_page
  4740. +       mov    ax, 0x4400 + PHYSICAL_PAGE    /* EMS Map Page */
  4741. +       int    0x67
  4742. +       mov    cl,  8                /* "mov ax, ah" */
  4743. +       shr    ax, cl
  4744. +     }
  4745. + }
  4746. + void
  4747. + _swap_ems_save_page_map (int handle)
  4748. + {
  4749. +   _asm
  4750. +     {
  4751. +       mov    dx, handle
  4752. +       mov    ah, 0x47            /* EMS Save Page Map */
  4753. +       int    0x67
  4754. +       mov    cl,  8                /* "mov ax, ah" */
  4755. +       shr    ax, cl
  4756. +     }
  4757. + }
  4758. + void
  4759. + _swap_ems_restore_page_map (int handle)
  4760. + {
  4761. +   _asm
  4762. +     {
  4763. +       mov    dx, handle
  4764. +       mov    ah, 0x48            /* EMS Restore Page Map */
  4765. +       int    0x67
  4766. +       mov    cl,  8                /* "mov ax, ah" */
  4767. +       shr    ax, cl
  4768. +     }
  4769. + }
  4770. + #endif /* NEVER */
  4771. + /* Signal handling */
  4772. + /* Simple ^C handler that displays a short message and waits for the child
  4773. +    to return.  Set a flag _swap_user_interrupt which can be used to
  4774. +    determine, whether such an event occured.
  4775. +    Note:  resetting the C library signals is NOT enough, since even the
  4776. +    default handlers use at least some library code.  */
  4777. + void _interrupt _far
  4778. + _swap_int23_handler (void)
  4779. + {
  4780. +   _swap_user_interrupt = 1;
  4781. +   _asm
  4782. +     {
  4783. +       sti            /* want to access DOS */
  4784. +       mov    ax, cs        /* ds = cs */
  4785. +       mov    ds, ax
  4786. +       mov    bx, 0x02    /* /dev/stderr */
  4787. +       mov    dx, offset _swap_int23_handler_message
  4788. +       mov    cx, length _swap_int23_handler_message
  4789. +       mov    ah, 0x40    /* MS-DOS Write Handle */
  4790. +       int    0x21
  4791. +     }
  4792. + }
  4793. + /* The transient part starts here. */
  4794. + #pragma check_stack ()
  4795. + /* Install the global parameters.  Execute this as the first function, since
  4796. +    some macros need _swap_psp with the correct value.  */
  4797. + void
  4798. + install_parameters (char *path, char *cmdline, char *env, size_t size)
  4799. + {
  4800. +   size_t len = strlen (cmdline);
  4801. +   struct mcb_info far *mcb;
  4802. +   _fstrcpy ((char _far *) _swap_path, (char _far *) path);
  4803. +   *_swap_cmdline = (char) len;
  4804. +   _fstrcpy ((char _far *) _swap_cmdline + 1, (char _far *) cmdline);
  4805. +   _swap_cmdline[len+1] = '\r';
  4806. +   _swap_environment_ptr = env;    /* this will be copied later */
  4807. +   _swap_environment_size = size;
  4808. +   _swap_psp = _psp;    /* put them into a save place. */
  4809. +   _swap_first_block_paras = FIRST_MCB (mcb)->length;
  4810. + }
  4811. + /* Allocate a swap file named NAME, making sure that at least SIZE bytes
  4812. +    are available on the disk.  Returns a MS-DOS handle (not to be
  4813. +    confused with a C file-descriptor!).  */
  4814. + int
  4815. + alloc_swap_file (char *name, off_t size)
  4816. + {
  4817. +   struct diskfree_t disk_free;
  4818. +   unsigned drive;
  4819. +   off_t free;
  4820. +   int handle;
  4821. +   if (name == NULL || *name == '\0')    /* could create filename ourselves. */
  4822. +     return -1;
  4823. +   if (name[1] == ':')
  4824. +     drive = tolower (*name) - 'a' + 1;
  4825. +   else
  4826. +     /* Get current drive. */
  4827. +     _dos_getdrive (&drive);
  4828. +   _dos_getdiskfree (drive, &disk_free);
  4829. +   free = (off_t) disk_free.avail_clusters *
  4830. +     (off_t) disk_free.sectors_per_cluster * (off_t) disk_free.bytes_per_sector;
  4831. +   if (free < size)
  4832. +     return (-1);
  4833. +   if (_dos_creat (name, _A_NORMAL, &handle))
  4834. +     return (-1);
  4835. +   else
  4836. +     return handle;
  4837. + }
  4838. + /* Close and delete the temporary file.  */
  4839. + unsigned int
  4840. + cleanup_swap_file (unsigned int handle, char *name)
  4841. + {
  4842. +   return !_dos_close (handle) && !unlink (name);
  4843. + }
  4844. + /* More XMS */
  4845. + /* Microsoft's recommendation:  */
  4846. + int
  4847. + xms_installed (void)
  4848. + {
  4849. +   _asm
  4850. +     {
  4851. +       mov    ax, 0x4300
  4852. +       int    0x2f
  4853. +       cmp    al, 0x80
  4854. +       jne    failed
  4855. +       mov    ax, 0x0001
  4856. +       jmp    done
  4857. +     failed:
  4858. +       mov    ax, 0x0000
  4859. +     done:
  4860. +     }
  4861. + }
  4862. + void
  4863. + xms_get_control_function (void)
  4864. + {
  4865. +   _asm
  4866. +     {
  4867. +       mov    ax, 0x4310
  4868. +       int    0x2f
  4869. +       mov    word ptr cs:_swap_xms_control, bx
  4870. +       mov    bx, es
  4871. +       mov    word ptr cs:_swap_xms_control + 2, bx
  4872. +     }
  4873. + }
  4874. + unsigned int
  4875. + xms_allocate_memory (unsigned int kilobytes)
  4876. + {
  4877. +   _asm
  4878. +     {
  4879. +       mov    dx, kilobytes
  4880. +       mov    ah, 0x09
  4881. +       call    far ptr cs:[_swap_xms_control]
  4882. +       cmp    ax, 0x0001
  4883. +       jne    failed
  4884. +       mov    ax, dx
  4885. +       jmp    done
  4886. +     failed:
  4887. +       mov    ax, 0xffff
  4888. +     done:
  4889. +     }
  4890. + }
  4891. + unsigned int
  4892. + xms_free_memory (unsigned int handle)
  4893. + {
  4894. +   _asm
  4895. +     {
  4896. +       mov    dx, handle
  4897. +       mov    ah, 0x0a
  4898. +       call    far ptr cs:[_swap_xms_control]
  4899. +       cmp    ax, 0x0001
  4900. +       je    done
  4901. +       mov    ax, 0x0000
  4902. +     done:
  4903. +     }
  4904. + }
  4905. + #if 0
  4906. + /* More EMS */
  4907. + /* Test for presence of LIM EMS 4.0.
  4908. +    (this procedure is taken from the LIM specification).  */
  4909. + int
  4910. + _swap_ems_present (void)
  4911. + {
  4912. +   static char _far ems_id[] = "EMMXXXX0"; /* LIM EMS 4.0 identification. */
  4913. +   char _far *ems_device = (char _far *) _dos_getvect (0x67);
  4914. +   FP_OFF (ems_device) = 0x000a;
  4915. +   return !_fstrcmp (ems_id, ems_device);
  4916. + }
  4917. + /* Allocate pages from the EMS Manager.  Returns handle or -1 no error.  */
  4918. + int
  4919. + _swap_ems_alloc_pages (int n)
  4920. + {
  4921. +   _asm
  4922. +     {
  4923. +       mov    bx, n
  4924. +       mov    ah, 0x43    /* EMS Allocate Pages */
  4925. +       int    0x67
  4926. +       cmp    ah, 0x00
  4927. +       jz    success
  4928. +       mov    ax, 0xffff    /* failure */
  4929. +       ret
  4930. +     success:
  4931. +       mov    ax, dx        /* return handle */
  4932. +     }
  4933. + }
  4934. + /* Free pages allocated for HANDLE.  Returns 0 if successful.  */
  4935. + int
  4936. + _swap_ems_free_pages (int handle)
  4937. + {
  4938. +   _asm
  4939. +     {
  4940. +       mov    dx, handle
  4941. +       mov    ah, 0x45    /* EMS Free Pages */
  4942. +       int    0x67
  4943. +       mov    cl, 8        /* "mov ax, ah" */
  4944. +       shr    ax, cl
  4945. +     }
  4946. + }
  4947. + /* Return far pointer to EMS page frame.  */
  4948. + void _far *
  4949. + _swap_ems_get_page_frame (void)
  4950. + {
  4951. +   void _far *frame = (void _far *) 0;
  4952. +   _asm
  4953. +     {
  4954. +       mov    ah, 0x41        /* EMS Page Frame */
  4955. +       int    0x67
  4956. +       cmp    ah, 0x00
  4957. +       jz    success
  4958. +       ret                /* failure */
  4959. +     success:
  4960. +       mov    word ptr frame + 2, bx    /* segment of page frame */
  4961. +     }
  4962. +   return frame;
  4963. + }
  4964. + #endif /* NEVER */
  4965. + /* Return the last MCB owned by us.
  4966. +    WARNING:  This assumes that _swap_psp has already been set to _PSP
  4967. +          (e.g. by install_parameters())   */
  4968. + struct mcb_info far *
  4969. + last_mcb (void)
  4970. + {
  4971. +   struct mcb_info far *mcb;
  4972. +   struct mcb_info far *ret;
  4973. +   FIRST_MCB (mcb);
  4974. +   while (mcb->id_byte == 'M')
  4975. +     {
  4976. +       if (OUR_MCB (mcb))
  4977. +     ret = NEXT_MCB (mcb);
  4978. +       else
  4979. +     NEXT_MCB (mcb);
  4980. +     }
  4981. +   if (mcb->id_byte == 'Z')    /* found the end */
  4982. +     return ret;
  4983. +   else                /* error */
  4984. +     return NULL;
  4985. + }
  4986. + /* MODE is the preferred swapping mode, if XMS or EMS are requested but not
  4987. +    available, it is mapped to DISK.  PATH is the complete path of the program
  4988. +    to be executed, it must not be longer than MAX_MSDOS_PATH (=144).  CMDLINE
  4989. +    is the commandline to be passed to the program, it must not be longer than
  4990. +    MAX_MSDOS_CMDLINE (=126).  ENV is a well formed MS-DOS environment of
  4991. +    length LEN, including the terminating '\0's.  FILE is a valid filename,
  4992. +    which will be used for a possible disk swap file.  */
  4993. + int
  4994. + spawn_child (enum swapping_mode mode, char *path, char *cmdline, char *env,
  4995. +          int len, char *file)
  4996. + {
  4997. +   int rc;
  4998. +   unsigned int (*cleanup_function) (unsigned int handle,...);
  4999. +   install_parameters (path, cmdline, env, len);
  5000. +   _swap_environment = (char _far *) FIRST_TO_SWAP;
  5001. +   FP_PARA_ALIGN (_swap_environment);
  5002. +   _swap_swapped_bytes = (long) ((char _huge *) last_mcb ()
  5003. +             - (char _huge *) _swap_environment);
  5004. +   switch (mode)
  5005. +     {
  5006. +     case ems:            /* not implemented yet */
  5007. +       /* fall through */
  5008. +     case xms:
  5009. +       if (xms_installed ())
  5010. +     {
  5011. +       xms_get_control_function ();
  5012. +       _swap_out_function = _swap_xms_move_out;
  5013. +       _swap_in_function = _swap_xms_move_in;
  5014. +       cleanup_function = xms_free_memory;
  5015. +       _swap_handle = xms_allocate_memory (
  5016. +         (unsigned int) ((_swap_swapped_bytes + 0x03ff) >> 10) + 1);
  5017. +       if (_swap_handle != -1)
  5018. +         break;
  5019. +     }
  5020. +       /* fall through */
  5021. +     case disk:
  5022. +       _swap_out_function = _swap_write_to_handle;
  5023. +       _swap_in_function = _swap_read_from_handle;
  5024. +       cleanup_function = cleanup_swap_file;
  5025. +       _swap_handle = alloc_swap_file (file, _swap_swapped_bytes);
  5026. +       if (_swap_handle == -1)
  5027. +     {
  5028. +       fprintf (stderr, "Out of swap space!\n");
  5029. +       exit (0);
  5030. +     }
  5031. +     }
  5032. +   _swap_user_interrupt = 0;
  5033. +   _swap_caller_int23 = _dos_getvect (0x23);    /* temporarily disable ^C  */
  5034. +   _dos_setvect (0x23, _swap_int23_handler);
  5035. +   rc = _swap_spawn_child ();
  5036. +   if (_swap_user_interrupt)            /* did the user hit ^C ? */
  5037. +     rc = 0xffff;
  5038. +   _dos_setvect (0x23, _swap_caller_int23);
  5039. +   cleanup_function (_swap_handle, file);
  5040. +   return rc;
  5041. + }
  5042. + /* 
  5043. +  * Local Variables:
  5044. +  * mode:C
  5045. +  * minor-mode:auto-fill
  5046. +  * ChangeLog:ChangeLog
  5047. +  * compile-command:make
  5048. +  * End:
  5049. +  */
  5050. diff -cBdNp e:/gnu/make/gnu/variable.c ./variable.c
  5051. *** e:/gnu/make/gnu/variable.c    Tue Jul 24 00:53:28 1990
  5052. --- ./variable.c    Tue Jul 24 00:55:26 1990
  5053. *************** You should have received a copy of the G
  5054. *** 16,21 ****
  5055. --- 16,38 ----
  5056.   along with GNU Make; see the file COPYING.  If not, write to
  5057.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  5058.   
  5059. + /*
  5060. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  5061. +  *
  5062. +  * To this port, the same copying conditions apply as to the
  5063. +  * original release.
  5064. +  *
  5065. +  * IMPORTANT:
  5066. +  * This file is not identical to the original GNU release!
  5067. +  * You should have received this code as patch to the official
  5068. +  * GNU release.
  5069. +  *
  5070. +  * MORE IMPORTANT:
  5071. +  * This port comes with ABSOLUTELY NO WARRANTY.
  5072. +  *
  5073. +  * $Header: e:/gnu/make/RCS/variable.c'v 3.58.0.3 90/07/20 11:27:29 tho Exp $
  5074. +  */
  5075.   #include "make.h"
  5076.   #include "commands.h"
  5077.   #include "variable.h"
  5078. *************** the Free Software Foundation, 675 Mass A
  5079. *** 22,27 ****
  5080. --- 39,51 ----
  5081.   #include "dep.h"
  5082.   #include "file.h"
  5083.   
  5084. + #ifdef MSDOS
  5085. + #define DEFAULT_SHELL "command"
  5086. + #else /* not MSDOS */
  5087. + #define DEFAULT_SHELL "/bin/sh"
  5088. + #endif /* not MSDOS */
  5089. + #ifndef MSDOS
  5090.   #ifdef    __GNUC__
  5091.   #define    max(a, b) \
  5092.     ({ register int __a = (a), __b = (b); __a > __b ? __a : __b; })
  5093. *************** the Free Software Foundation, 675 Mass A
  5094. *** 28,33 ****
  5095. --- 52,58 ----
  5096.   #else
  5097.   #define max(a, b) ((a) > (b) ? (a) : (b))
  5098.   #endif
  5099. + #endif /* not MSDOS */
  5100.   
  5101.   
  5102.   /* Hash table of all global variable definitions.  */
  5103. *************** struct variable_set_list *current_variab
  5104. *** 56,61 ****
  5105. --- 81,96 ----
  5106.   
  5107.   static unsigned int variable_buffer_length;
  5108.   static char *variable_buffer;
  5109. + #ifdef MSDOS
  5110. + static struct variable *define_variable_in_set (char *name,
  5111. +         unsigned int length, char *value, enum variable_origin origin,
  5112. +         int recursive, struct variable_set *set);
  5113. + static void print_variable (struct variable *v, char *prefix);
  5114. + static void print_variable_set (struct variable_set *set, char *prefix);
  5115. + static void merge_variable_sets (struct variable_set *set0,
  5116. +                  struct variable_set *set1);
  5117. + #endif /* MSDOS */
  5118.   
  5119.   /* Implement variables.  */
  5120.   
  5121. *************** define_automatic_variables ()
  5122. *** 364,370 ****
  5123.   
  5124.     /* This won't override any definition, but it
  5125.        will provide one if there isn't one there.  */
  5126. !   v = define_variable ("SHELL", 5, "/bin/sh", o_default, 0);
  5127.   
  5128.     /* Don't let SHELL come from the environment
  5129.        if MAKELEVEL is 0.  Also, SHELL must not be empty.  */
  5130. --- 399,405 ----
  5131.   
  5132.     /* This won't override any definition, but it
  5133.        will provide one if there isn't one there.  */
  5134. !   v = define_variable ("SHELL", 5, DEFAULT_SHELL, o_default, 0);
  5135.   
  5136.     /* Don't let SHELL come from the environment
  5137.        if MAKELEVEL is 0.  Also, SHELL must not be empty.  */
  5138. *************** define_automatic_variables ()
  5139. *** 371,378 ****
  5140.     if (*v->value == '\0' || (v->origin == o_env && makelevel == 0))
  5141.       {
  5142.         v->origin = o_file;
  5143. !       v->value = savestring ("/bin/sh", 7);
  5144.       }
  5145.   }
  5146.   
  5147.   /* Subroutine of variable_expand and friends:
  5148. --- 406,414 ----
  5149.     if (*v->value == '\0' || (v->origin == o_env && makelevel == 0))
  5150.       {
  5151.         v->origin = o_file;
  5152. !       v->value = savestring (DEFAULT_SHELL, 7);
  5153.       }
  5154.   }
  5155.   
  5156.   /* Subroutine of variable_expand and friends:
  5157. diff -cBdNp e:/gnu/make/gnu/variable.h ./variable.h
  5158. *** e:/gnu/make/gnu/variable.h    Tue Jul 24 00:53:28 1990
  5159. --- ./variable.h    Tue Jul 24 00:55:28 1990
  5160. *************** You should have received a copy of the G
  5161. *** 15,20 ****
  5162. --- 15,37 ----
  5163.   along with GNU Make; see the file COPYING.  If not, write to
  5164.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  5165.   
  5166. + /*
  5167. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  5168. +  *
  5169. +  * To this port, the same copying conditions apply as to the
  5170. +  * original release.
  5171. +  *
  5172. +  * IMPORTANT:
  5173. +  * This file is not identical to the original GNU release!
  5174. +  * You should have received this code as patch to the official
  5175. +  * GNU release.
  5176. +  *
  5177. +  * MORE IMPORTANT:
  5178. +  * This port comes with ABSOLUTELY NO WARRANTY.
  5179. +  *
  5180. +  * $Header: e:/gnu/make/RCS/variable.h'v 3.58.0.2 90/07/17 03:32:57 tho Exp $
  5181. +  */
  5182.   /* Codes in a variable definition saying where the definition came from.
  5183.      Increasing numeric values signify less-overridable definitions.  */
  5184.   enum variable_origin
  5185. *************** struct variable_set_list
  5186. *** 63,94 ****
  5187.   extern struct variable_set_list *current_variable_set_list;
  5188.   
  5189.   
  5190.   extern char *variable_buffer_output ();
  5191.   extern char *initialize_variable_output ();
  5192.   extern char *save_variable_output ();
  5193.   extern void restore_variable_output ();
  5194.   
  5195.   extern void push_new_variable_scope (), pop_variable_scope ();
  5196.   
  5197.   extern int handle_function ();
  5198.   extern char *variable_expand (), *allocated_variable_expand ();
  5199.   extern char *variable_expand_for_file ();
  5200.   extern char *allocated_variable_expand_for_file ();
  5201.   extern char *expand_argument ();
  5202.   
  5203.   extern void define_automatic_variables ();
  5204.   extern void initialize_file_variables ();
  5205.   extern void print_file_variables ();
  5206.   
  5207.   extern void merge_variable_set_lists ();
  5208.   
  5209.   extern int try_variable_definition ();
  5210.   
  5211.   extern struct variable *lookup_variable (), *define_variable ();
  5212.   extern struct variable *define_variable_for_file ();
  5213.   
  5214.   extern int pattern_matches ();
  5215.   extern char *subst_expand (), *patsubst_expand ();
  5216.   
  5217.   extern char **target_environment ();
  5218. --- 80,177 ----
  5219.   extern struct variable_set_list *current_variable_set_list;
  5220.   
  5221.   
  5222. + /* variable.c */
  5223. + extern  void print_variable_data_base (void);
  5224. + #ifdef  MSDOS
  5225. + extern  char *variable_buffer_output (char *ptr, char *string,
  5226. +                       unsigned int length);
  5227. + extern  char *initialize_variable_output (void);
  5228. + extern  char *save_variable_output (void);
  5229. + extern  void restore_variable_output (char *save);
  5230. + #else /* not MSDOS */
  5231.   extern char *variable_buffer_output ();
  5232.   extern char *initialize_variable_output ();
  5233.   extern char *save_variable_output ();
  5234.   extern void restore_variable_output ();
  5235. + #endif /* not MSDOS */
  5236.   
  5237. + #ifdef  MSDOS
  5238. + extern  void push_new_variable_scope (void);
  5239. + extern  void pop_variable_scope (void);
  5240. + #else /* not MSDOS */
  5241.   extern void push_new_variable_scope (), pop_variable_scope ();
  5242. + #endif /* not MSDOS */
  5243.   
  5244. + #ifdef  MSDOS
  5245. + extern  int handle_function (char **op, char **stringp);
  5246. + #else /* not MSDOS */
  5247.   extern int handle_function ();
  5248. ! #endif /* not MSDOS */
  5249. !   
  5250. ! #ifdef  MSDOS
  5251. ! extern  char *allocated_variable_expand (char *line);
  5252. ! extern  char *allocated_var_exp_for_file (char *line, struct file *file);
  5253. ! extern  char *expand_argument (char *str, char *end);
  5254. ! extern  char *variable_expand (char *line);
  5255. ! extern  char *variable_expand_for_file (char *line, struct file *file);
  5256. ! #else /* not MSDOS */
  5257.   extern char *variable_expand (), *allocated_variable_expand ();
  5258.   extern char *variable_expand_for_file ();
  5259.   extern char *allocated_variable_expand_for_file ();
  5260.   extern char *expand_argument ();
  5261. + #endif /* not MSDOS */
  5262.   
  5263. + #ifdef  MSDOS
  5264. + extern  void define_automatic_variables (void);
  5265. + extern  void initialize_file_variables (struct file *file);
  5266. + #else /* not MSDOS */
  5267.   extern void define_automatic_variables ();
  5268.   extern void initialize_file_variables ();
  5269. + #endif /* not MSDOS */
  5270.   extern void print_file_variables ();
  5271.   
  5272. + #ifdef MSDOS
  5273. + extern void merge_variable_set_lists (struct variable_set_list **setlist0,
  5274. +                       struct variable_set_list *setlist1);
  5275. + #else /* not MSDOS */
  5276.   extern void merge_variable_set_lists ();
  5277. + #endif /* not MSDOS */
  5278.   
  5279. + #ifdef  MSDOS
  5280. + extern  int try_variable_definition (char *line, enum variable_origin origin);
  5281. + #else /* not MSDOS */
  5282.   extern int try_variable_definition ();
  5283. + #endif /* not MSDOS */
  5284.   
  5285. + #ifdef  MSDOS
  5286. + extern  struct variable *define_variable (char *name, unsigned int length,
  5287. +         char *value, enum variable_origin origin, int recursive);
  5288. + extern  struct variable *define_variable_for_file (char *name,
  5289. +         unsigned int length, char *value,
  5290. +         enum variable_origin origin, int recursive, struct file *file);
  5291. + extern  struct variable *lookup_variable (char *name, unsigned int length);
  5292. + #else /* not MSDOS */
  5293.   extern struct variable *lookup_variable (), *define_variable ();
  5294.   extern struct variable *define_variable_for_file ();
  5295. + #endif /* not MSDOS */
  5296.   
  5297. + #ifdef  MSDOS
  5298. + extern int pattern_matches (char *pattern, char *percent, char *word);
  5299. + extern char *patsubst_expand (char *o, char *text, char *pattern,
  5300. +         char *replace, char *pattern_percent, char *replace_percent);
  5301. + extern char *subst_expand (char *o, char *text, char *subst, char *replace,
  5302. +         unsigned int slen, unsigned int rlen, int by_word,
  5303. +         int suffix_only);
  5304. + #else /* not MSDOS */
  5305.   extern int pattern_matches ();
  5306.   extern char *subst_expand (), *patsubst_expand ();
  5307. + #endif /* not MSDOS */
  5308.   
  5309. + #ifdef  MSDOS
  5310. + extern  char **target_environment (struct file *file);
  5311. + #else /* not MSDOS */
  5312.   extern char **target_environment ();
  5313. + #endif /* not MSDOS */
  5314. diff -cBdNp e:/gnu/make/gnu/version.c ./version.c
  5315. *** e:/gnu/make/gnu/version.c    Tue Jul 24 00:53:30 1990
  5316. --- ./version.c    Tue Jul 24 00:55:30 1990
  5317. ***************
  5318. *** 1,4 ****
  5319. --- 1,9 ----
  5320.   char *version_string = "3.58";
  5321. + #ifdef MSDOS
  5322. + char *msdos_version_string = __DATE__ ", " __TIME__;
  5323. + #endif /* MSDOS */
  5324.   
  5325.   /*
  5326.     Local variables:
  5327. diff -cBdNp e:/gnu/make/gnu/vpath.c ./vpath.c
  5328. *** e:/gnu/make/gnu/vpath.c    Tue Jul 24 00:53:32 1990
  5329. --- ./vpath.c    Tue Jul 24 00:55:34 1990
  5330. *************** You should have received a copy of the G
  5331. *** 15,24 ****
  5332. --- 15,46 ----
  5333.   along with GNU Make; see the file COPYING.  If not, write to
  5334.   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  5335.   
  5336. + /*
  5337. +  * MS-DOS port (c) 1990 by Thorsten Ohl <td12@ddagsi3.bitnet>
  5338. +  *
  5339. +  * To this port, the same copying conditions apply as to the
  5340. +  * original release.
  5341. +  *
  5342. +  * IMPORTANT:
  5343. +  * This file is not identical to the original GNU release!
  5344. +  * You should have received this code as patch to the official
  5345. +  * GNU release.
  5346. +  *
  5347. +  * MORE IMPORTANT:
  5348. +  * This port comes with ABSOLUTELY NO WARRANTY.
  5349. +  *
  5350. +  * $Header: e:/gnu/make/RCS/vpath.c'v 3.58.0.2 90/07/17 23:21:21 tho Exp $
  5351. +  */
  5352.   #include "make.h"
  5353.   #include "file.h"
  5354.   #include "variable.h"
  5355.   
  5356. + #ifdef MSDOS
  5357. + #define PATHSEP    ';'
  5358. + #else
  5359. + #define PATHSEP    ':'
  5360. + #endif
  5361.   
  5362.   /* Structure used to represent a selective VPATH searchpath.  */
  5363.   
  5364. *************** static struct vpath *vpaths;
  5365. *** 40,46 ****
  5366. --- 62,72 ----
  5367.   
  5368.   static struct vpath *general_vpath;
  5369.   
  5370. + #ifdef MSDOS
  5371. + static  int selective_vpath_search (struct vpath *path, char **file);
  5372. + #else /* not MSDOS */
  5373.   static int selective_vpath_search ();
  5374. + #endif /* not MSDOS */
  5375.   
  5376.   /* Reverse the chain of selective VPATH lists so they
  5377.      will be searched in the order given in the makefiles
  5378. *************** construct_vpath_list (pattern, dirpath)
  5379. *** 149,155 ****
  5380.   
  5381.     /* Skip over any initial colons.  */
  5382.     p = dirpath;
  5383. !   while (*p == ':')
  5384.       ++p;
  5385.   
  5386.     /* Figure out the maximum number of VPATH entries and
  5387. --- 175,181 ----
  5388.   
  5389.     /* Skip over any initial colons.  */
  5390.     p = dirpath;
  5391. !   while (*p == PATHSEP)
  5392.       ++p;
  5393.   
  5394.     /* Figure out the maximum number of VPATH entries and
  5395. *************** construct_vpath_list (pattern, dirpath)
  5396. *** 158,164 ****
  5397.        increment our estimated number for each colon we find.  */
  5398.     maxelem = 2;
  5399.     while (*p != '\0')
  5400. !     if (*p++ == ':')
  5401.         ++maxelem;
  5402.   
  5403.     vpath = (char **) xmalloc (maxelem * sizeof (char *));
  5404. --- 184,190 ----
  5405.        increment our estimated number for each colon we find.  */
  5406.     maxelem = 2;
  5407.     while (*p != '\0')
  5408. !     if (*p++ == PATHSEP)
  5409.         ++maxelem;
  5410.   
  5411.     vpath = (char **) xmalloc (maxelem * sizeof (char *));
  5412. *************** construct_vpath_list (pattern, dirpath)
  5413. *** 172,178 ****
  5414.         unsigned int len;
  5415.   
  5416.         /* Find the next entry.  */
  5417. !       while (*p != '\0' && *p == ':')
  5418.       ++p;
  5419.         if (*p == '\0')
  5420.       break;
  5421. --- 198,204 ----
  5422.         unsigned int len;
  5423.   
  5424.         /* Find the next entry.  */
  5425. !       while (*p != '\0' && *p == PATHSEP)
  5426.       ++p;
  5427.         if (*p == '\0')
  5428.       break;
  5429. *************** construct_vpath_list (pattern, dirpath)
  5430. *** 179,185 ****
  5431.   
  5432.         /* Find the end of this entry.  */
  5433.         v = p;
  5434. !       while (*p != '\0' && *p != ':')
  5435.       ++p;
  5436.   
  5437.         len = p - v;
  5438. --- 205,211 ----
  5439.   
  5440.         /* Find the end of this entry.  */
  5441.         v = p;
  5442. !       while (*p != '\0' && *p != PATHSEP)
  5443.       ++p;
  5444.   
  5445.         len = p - v;
  5446. *************** print_vpath_data_base ()
  5447. *** 379,385 ****
  5448.   
  5449.         for (i = 0; v->searchpath[i] != 0; ++i)
  5450.       printf ("%s%c", v->searchpath[i],
  5451. !         v->searchpath[i + 1] == 0 ? '\n' : ':');
  5452.       }
  5453.   
  5454.     if (vpaths == 0)
  5455. --- 405,411 ----
  5456.   
  5457.         for (i = 0; v->searchpath[i] != 0; ++i)
  5458.       printf ("%s%c", v->searchpath[i],
  5459. !         v->searchpath[i + 1] == 0 ? '\n' : PATHSEP);
  5460.       }
  5461.   
  5462.     if (vpaths == 0)
  5463. *************** print_vpath_data_base ()
  5464. *** 397,402 ****
  5465.         fputs ("\n# General (`VPATH' variable) search path:\n# ", stdout);
  5466.   
  5467.         for (i = 0; path[i] != 0; ++i)
  5468. !     printf ("%s%c", path[i], path[i + 1] == 0 ? '\n' : ':');
  5469.       }
  5470.   }
  5471. --- 423,428 ----
  5472.         fputs ("\n# General (`VPATH' variable) search path:\n# ", stdout);
  5473.   
  5474.         for (i = 0; path[i] != 0; ++i)
  5475. !     printf ("%s%c", path[i], path[i + 1] == 0 ? '\n' : PATHSEP);
  5476.       }
  5477.   }
  5478. diff -cBdNp e:/gnu/make/gnu/zipscan.c ./zipscan.c
  5479. *** e:/gnu/make/gnu/zipscan.c    Tue Jul 24 00:56:27 1990
  5480. --- ./zipscan.c    Tue Jul 24 00:55:50 1990
  5481. ***************
  5482. *** 0 ****
  5483. --- 1,794 ----
  5484. + /*  zipscan.c - scan .zip archives
  5485. +     Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  5486. +     This program is free software; you can redistribute it and/or modify
  5487. +     it under the terms of the GNU General Public License as published by
  5488. +     the Free Software Foundation; either version 1, or (at your option)
  5489. +     any later version.
  5490. +     This program is distributed in the hope that it will be useful,
  5491. +     but WITHOUT ANY WARRANTY; without even the implied warranty of
  5492. +     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5493. +     GNU General Public License for more details.
  5494. +     You should have received a copy of the GNU General Public License
  5495. +     along with this program; if not, write to the Free Software
  5496. +     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  5497. +     IMPORTANT:
  5498. +     This code is not an official part of the GNU project and the
  5499. +     author is not affiliated to the Free Software Foundation.
  5500. +     He just likes their code and spirit.  */
  5501. + static char RCS_id[] =
  5502. + "$Header: e:/gnu/make/RCS/zipscan.c'v 0.2 90/07/18 22:23:26 tho Exp $";
  5503. + /* The following section is taken from the file appnote.txt
  5504. +    (from the PK(UN)?ZIP v1.1 distribution).  */
  5505. + /*
  5506. + General Format of a ZIP file
  5507. + ----------------------------
  5508. +   Files stored in arbitrary order.  Large zipfiles can span multiple
  5509. +   diskette media.
  5510. +   Overall zipfile format:
  5511. +     [local file header+file data] . . .
  5512. +     [central directory] end of central directory record
  5513. +   A.  Local file header:
  5514. +     local file header signature    4 bytes  (0x04034b50)
  5515. +     version needed to extract    2 bytes
  5516. +     general purpose bit flag    2 bytes
  5517. +     compression method        2 bytes
  5518. +     last mod file time         2 bytes
  5519. +     last mod file date        2 bytes
  5520. +     crc-32               4 bytes
  5521. +     compressed size            4 bytes
  5522. +     uncompressed size        4 bytes
  5523. +     filename length            2 bytes
  5524. +     extra field length        2 bytes
  5525. +     filename (variable size)
  5526. +     extra field (variable size)
  5527. +   B.  Central directory structure:
  5528. +       [file header] . . .  end of central dir record
  5529. +       File header:
  5530. +     central file header signature    4 bytes  (0x02014b50)
  5531. +     version made by            2 bytes
  5532. +     version needed to extract    2 bytes
  5533. +     general purpose bit flag    2 bytes
  5534. +     compression method        2 bytes
  5535. +     last mod file time         2 bytes
  5536. +     last mod file date        2 bytes
  5537. +     crc-32               4 bytes
  5538. +     compressed size            4 bytes
  5539. +     uncompressed size        4 bytes
  5540. +     filename length            2 bytes
  5541. +     extra field length        2 bytes
  5542. +     file comment length        2 bytes
  5543. +     disk number start        2 bytes
  5544. +     internal file attributes    2 bytes
  5545. +     external file attributes    4 bytes
  5546. +     relative offset of local header    4 bytes
  5547. +     filename (variable size)
  5548. +     extra field (variable size)
  5549. +     file comment (variable size)
  5550. +       End of central dir record:
  5551. +     end of central dir signature    4 bytes  (0x06054b50)
  5552. +     number of this disk        2 bytes
  5553. +     number of the disk with the
  5554. +     start of the central directory    2 bytes
  5555. +     total number of entries in
  5556. +     the central dir on this disk    2 bytes
  5557. +     total number of entries in
  5558. +     the central dir            2 bytes
  5559. +     size of the central directory   4 bytes
  5560. +     offset of start of central
  5561. +     directory with respect to
  5562. +     the starting disk number    4 bytes
  5563. +     zipfile comment length        2 bytes
  5564. +     zipfile comment (variable size)
  5565. +   C.  Explanation of fields:
  5566. +       version made by
  5567. +       The upper byte indicates the host system (OS) for the
  5568. +       file.  Software can use this information to determine
  5569. +       the line record format for text files etc.  The current
  5570. +       mappings are:
  5571. +       0 - MS-DOS and OS/2 (F.A.T. file systems)
  5572. +       1 - Amiga            2 - VMS
  5573. +       3 - *nix            4 - VM/CMS
  5574. +       5 - Atari ST                  6 - OS/2 H.P.F.S.
  5575. +       7 - Macintosh            8 - Z-System
  5576. +       9 - CP/M            10 thru 255 - unused
  5577. +       The lower byte indicates the version number of the
  5578. +       software used to encode the file.  The value/10
  5579. +       indicates the major version number, and the value
  5580. +       mod 10 is the minor version number.
  5581. +       version needed to extract
  5582. +       The minimum software version needed to extract the
  5583. +       file, mapped as above.
  5584. +       general purpose bit flag:
  5585. +           bit 0: If set, indicates that the file is encrypted.
  5586. +           bit 1: If the compression method used was type 6,
  5587. +          Imploding, then this bit, if set, indicates
  5588. +          an 8K sliding dictionary was used.  If clear,
  5589. +          then a 4K sliding dictionary was used.
  5590. +           bit 2: If the compression method used was type 6,
  5591. +          Imploding, then this bit, if set, indicates
  5592. +          an 3 Shannon-Fano trees were used to encode the
  5593. +          sliding dictionary output.  If clear, then 2
  5594. +          Shannon-Fano trees were used.
  5595. +       Note:  Bits 1 and 2 are undefined if the compression
  5596. +          method is other than type 6 (Imploding).
  5597. +           The upper three bits are reserved and used internally
  5598. +       by the software when processing the zipfile.  The
  5599. +       remaining bits are unused in version 1.0.
  5600. +       compression method:
  5601. +       (see accompanying documentation for algorithm
  5602. +       descriptions)
  5603. +       0 - The file is stored (no compression)
  5604. +       1 - The file is Shrunk
  5605. +       2 - The file is Reduced with compression factor 1
  5606. +       3 - The file is Reduced with compression factor 2
  5607. +       4 - The file is Reduced with compression factor 3
  5608. +       5 - The file is Reduced with compression factor 4
  5609. +           6 - The file is Imploded
  5610. +       date and time fields:
  5611. +       The date and time are encoded in standard MS-DOS
  5612. +       format.
  5613. +       CRC-32:
  5614. +       The CRC-32 algorithm was generously contributed by
  5615. +       David Schwaderer and can be found in his excellent
  5616. +       book "C Programmers Guide to NetBIOS" published by
  5617. +       Howard W. Sams & Co. Inc.  The 'magic number' for
  5618. +       the CRC is 0xdebb20e3.  The proper CRC pre and post
  5619. +       conditioning is used, meaning that the CRC register
  5620. +       is pre-conditioned with all ones (a starting value
  5621. +       of 0xffffffff) and the value is post-conditioned by
  5622. +       taking the one's complement of the CRC residual.
  5623. +     
  5624. +       compressed size:
  5625. +       uncompressed size:
  5626. +       The size of the file compressed and uncompressed,
  5627. +       respectively.
  5628. +       filename length:
  5629. +       extra field length:
  5630. +       file comment length:
  5631. +       The length of the filename, extra field, and comment
  5632. +       fields respectively.  The combined length of any
  5633. +       directory record and these three fields should not
  5634. +       generally exceed 65,535 bytes.
  5635. +       disk number start:
  5636. +       The number of the disk on which this file begins.
  5637. +       internal file attributes:
  5638. +       The lowest bit of this field indicates, if set, that
  5639. +       the file is apparently an ASCII or text file.  If not
  5640. +       set, that the file apparently contains binary data.
  5641. +       The remaining bits are unused in version 1.0.
  5642. +       external file attributes:
  5643. +       The mapping of the external attributes is
  5644. +       host-system dependent (see 'version made by').  For
  5645. +       MS-DOS, the low order byte is the MS-DOS directory
  5646. +       attribute byte.
  5647. +       relative offset of local header:
  5648. +       This is the offset from the start of the first disk on
  5649. +       which this file appears, to where the local header should
  5650. +       be found.
  5651. +       filename:
  5652. +       The name of the file, with optional relative path.
  5653. +       The path stored should not contain a drive or
  5654. +       device letter, or a leading slash.  All slashes
  5655. +       should be forward slashes '/' as opposed to
  5656. +       backwards slashes '\' for compatibility with Amiga
  5657. +       and Unix file systems etc.
  5658. +       extra field:
  5659. +       This is for future expansion.  If additional information
  5660. +       needs to be stored in the future, it should be stored
  5661. +       here.  Earlier versions of the software can then safely
  5662. +       skip this file, and find the next file or header.  This
  5663. +       field will be 0 length in version 1.0.
  5664. +       In order to allow different programs and different types 
  5665. +       of information to be stored in the 'extra' field in .ZIP 
  5666. +       files, the following structure should be used for all 
  5667. +       programs storing data in this field:
  5668. +       header1+data1 + header2+data2 . . .
  5669. +       Each header should consist of:
  5670. +         Header ID - 2 bytes
  5671. +         Data Size - 2 bytes
  5672. +       Note: all fields stored in Intel low-byte/high-byte order.
  5673. +       The Header ID field indicates the type of data that is in 
  5674. +       the following data block.
  5675. +       
  5676. +       Header ID's of 0 thru 31 are reserved for use by PKWARE.  
  5677. +       The remaining ID's can be used by third party vendors for 
  5678. +       proprietary usage.
  5679. +       The Data Size field indicates the size of the following 
  5680. +       data block. Programs can use this value to skip to the 
  5681. +       next header block, passing over any data blocks that are 
  5682. +       not of interest.
  5683. +       Note: As stated above, the size of the entire .ZIP file
  5684. +         header, including the filename, comment, and extra
  5685. +         field should not exceed 64K in size.
  5686. +       In case two different programs should appropriate the same 
  5687. +       Header ID value, it is strongly recommended that each 
  5688. +       program place a unique signature of at least two bytes in 
  5689. +       size (and preferably 4 bytes or bigger) at the start of 
  5690. +       each data area.  Every program should verify that it's 
  5691. +       unique signature is present, in addition to the Header ID 
  5692. +       value being correct, before assuming that it is a block of 
  5693. +       known type.
  5694. +       file comment:
  5695. +       The comment for this file.
  5696. +       number of this disk:
  5697. +       The number of this disk, which contains central
  5698. +       directory end record.
  5699. +       number of the disk with the start of the central directory:
  5700. +       The number of the disk on which the central
  5701. +       directory starts.
  5702. +       total number of entries in the central dir on this disk:
  5703. +       The number of central directory entries on this disk.
  5704. +     
  5705. +       total number of entries in the central dir:
  5706. +       The total number of files in the zipfile.
  5707. +       size of the central directory:
  5708. +       The size (in bytes) of the entire central directory.
  5709. +       offset of start of central directory with respect to
  5710. +       the starting disk number:
  5711. +       Offset of the start of the central direcory on the
  5712. +       disk on which the central directory starts.
  5713. +       zipfile comment length:
  5714. +       The length of the comment for this zipfile.
  5715. +       zipfile comment:
  5716. +       The comment for this zipfile.
  5717. +   D.  General notes:
  5718. +       1)  All fields unless otherwise noted are unsigned and stored
  5719. +       in Intel low-byte:high-byte, low-word:high-word order.
  5720. +       2)  String fields are not null terminated, since the
  5721. +       length is given explicitly.
  5722. +       3)  Local headers should not span disk boundries.  Also, even
  5723. +       though the central directory can span disk boundries, no
  5724. +       single record in the central directory should be split
  5725. +       across disks.
  5726. +       4)  The entries in the central directory may not necessarily
  5727. +       be in the same order that files appear in the zipfile.
  5728. + */
  5729. + /* Code starts here */
  5730. + #include <stdio.h>
  5731. + #include <stdlib.h>
  5732. + #include <stdarg.h>
  5733. + #include <string.h>
  5734. + #include <fcntl.h>
  5735. + #include <time.h>
  5736. + #include <malloc.h>
  5737. + #include <io.h>
  5738. + #pragma pack(2)
  5739. + struct local_zip_header
  5740. + {
  5741. +   unsigned long    signature;    /* 0x04034b50 */
  5742. +   unsigned int    extr_ver;    /* version needed to extract */
  5743. +   unsigned int    bit_flag;    /* general purpose bit flag */
  5744. +   unsigned int    method;        /* compression method */
  5745. +   unsigned int    last_mod_time;     /* last mod file time */
  5746. +   unsigned int    last_mod_date;    /* last mod file date */
  5747. +   unsigned long    crc;        /* crc-32 */
  5748. +   unsigned long comp_size;    /* compressed size */
  5749. +   unsigned long uncomp_size;    /* uncompressed size */
  5750. +   size_t    name_len;    /* filename length */
  5751. +   size_t    extra_len;    /* extra field length */
  5752. +   /* filename (variable size) */
  5753. +   /* extra field (variable size) */
  5754. + };
  5755. + struct zip_header
  5756. + {
  5757. +   unsigned long    signature;    /* 0x02014b50 */
  5758. +   unsigned int    creat_ver;    /* version made by */
  5759. +   unsigned int    extr_ver;    /* version needed to extract */
  5760. +   unsigned int    bit_flag;    /* general purpose bit flag */
  5761. +   unsigned int    method;        /* compression method */
  5762. +   unsigned int    last_mod_time;     /* last mod file time */
  5763. +   unsigned int    last_mod_date;    /* last mod file date */
  5764. +   unsigned long    crc;        /* crc-32 */
  5765. +   unsigned long comp_size;    /* compressed size */
  5766. +   unsigned long uncomp_size;    /* uncompressed size */
  5767. +   size_t    name_len;    /* filename length */
  5768. +   size_t    extra_len;    /* extra field length */
  5769. +   size_t    comment_len;    /* file comment length */
  5770. +   unsigned int    disk_start;    /* disk number start */
  5771. +   unsigned int    int_attrib;    /* internal file attributes */
  5772. +   unsigned long    ext_attrib;    /* external file attributes */
  5773. +   unsigned long offset;        /* relative offset of local header */
  5774. +   /* filename (variable size) */
  5775. +   /* extra field (variable size) */
  5776. +   /* file comment (variable size) */
  5777. + };
  5778. + struct central_dir
  5779. + {
  5780. +   unsigned long    signature;    /* 0x06054b50 */
  5781. +   unsigned int    disk_num;    /* number of this disk */
  5782. +   unsigned int    cd_disk_num;    /* number of the disk with the start
  5783. +                    of the central directory */
  5784. +   unsigned int    dir_entries;    /* total number of entries in the
  5785. +                    central dir on this disk */
  5786. +   unsigned int    total_entries;    /* total number of entries in the
  5787. +                    central dir */
  5788. +   unsigned long    dir_size;    /* size of the central directory */
  5789. +   unsigned long    dir_offset;    /* offset of start of central directory
  5790. +                    with respect to the starting disk number */
  5791. +   size_t    comment_len;    /* zipfile comment length */
  5792. +   /* zipfile comment (variable size) */
  5793. + };
  5794. + #pragma pack()
  5795. + char *zip_get_first (char *filename, int *fd_ptr,
  5796. +              struct local_zip_header *header,
  5797. +              long *header_pos, long *data_pos);
  5798. + char *zip_get_next (int fd, struct local_zip_header *header,
  5799. +             long *header_pos, long *data_pos);
  5800. + long ar_scan (char *archive, long (*f) (int, char *, long, long, long, long,
  5801. +           int, int, int, long), long arg);
  5802. + static long ar_member_pos (int desc, char *name, long hdrpos, long datapos,
  5803. +                long size, long date, int uid, int gid, int mode,
  5804. +                char *mem);
  5805. + long ar_name_equal (char *name, char *mem);
  5806. + long ar_member_touch (char *arname, char *memname);
  5807. + time_t dos_time (unsigned int time, unsigned int date);
  5808. + extern void *xmalloc (size_t size);
  5809. + #ifdef TEST
  5810. + char *program_name;
  5811. + void fatal (int code, char *format, ... );
  5812. + #endif
  5813. + static int month_offset[12] =
  5814. + {
  5815. +     0, /* January */
  5816. +    31, /* February */
  5817. +    59, /* March */
  5818. +    90, /* April */
  5819. +   120, /* May */
  5820. +   151, /* June */
  5821. +   181, /* July */
  5822. +   212, /* August */
  5823. +   243, /* September */
  5824. +   273, /* October */
  5825. +   304, /* November */
  5826. +   334, /* December */
  5827. + };
  5828. + #define leap_year(n)    (((n) & 0x0600) == 0)    /* 1980 was! */
  5829. + #define year(n)        (((n) & 0xff00) >> 9)
  5830. + #define month(n)    (((n) & 0x01e0) >> 5)
  5831. + #define day(n)        ((n) & 0x001f)
  5832. + #define hour(n)        (((n) & 0xf800) >> 11)
  5833. + #define minutes(n)    (((n) & 0x07e0) >> 5)
  5834. + #define seconds(n)    (((n) & 0x001f) << 1)
  5835. + time_t
  5836. + dos_time (unsigned int time, unsigned int date)
  5837. + {
  5838. +   time_t result = 3652;        /* 1970 - 1980, (incl. 2 leap years) */
  5839. +   result += year (date) * 365L;
  5840. +   result += year (date) >> 2;    /* add leap years! */
  5841. +   result += month_offset[month (date) - 1] + day (date);
  5842. +   if (leap_year(date) && month (date) > 2)    /* After Feb. in leap year */
  5843. +     result++;
  5844. +   result *= 24L;        /* convert to hours */
  5845. +   result += hour (time);
  5846. +   result *= 60L;        /* convert to minutes */
  5847. +   result += minutes (time);
  5848. +   result *= 60L;        /* convert to seconds */
  5849. +   result += seconds (time);
  5850. +   return result + timezone;
  5851. + }
  5852. + /* Magic numbers.  */
  5853. + #define ZIP_HEADER_SIGNATURE    0x02014b50    /* "\x50\x4b" = "PK" !!! */
  5854. + #define LOCAL_HEADER_SIGNATURE    0x04034b50
  5855. + #define CENTRAL_DIR_SIGNATURE    0x06054b50
  5856. + char *
  5857. + zip_get_first (char *filename, int *fd_ptr, struct local_zip_header *header,
  5858. +            long *header_pos, long *data_pos)
  5859. + {
  5860. +   tzset ();            /* in case the caller forgot */
  5861. +   *fd_ptr = open (filename, O_RDONLY|O_BINARY);
  5862. +   if (*fd_ptr < 0)
  5863. +     return NULL;
  5864. +   return zip_get_next (*fd_ptr, header, header_pos, data_pos);
  5865. + }
  5866. + char *
  5867. + zip_get_next (int fd, struct local_zip_header *header,
  5868. +           long *header_pos, long *data_pos)
  5869. + {
  5870. +   size_t bytes;
  5871. +   char *member_name = NULL;
  5872. +   *header_pos = tell (fd);
  5873. +   bytes = read (fd, (char *) header, sizeof (struct local_zip_header));
  5874. +   if (bytes != sizeof (struct local_zip_header))
  5875. +     return NULL;
  5876. +   if (header->signature != LOCAL_HEADER_SIGNATURE)
  5877. +     return NULL;
  5878. +   member_name = (char *) xmalloc (header->name_len + 1);
  5879. +   bytes = read (fd, member_name, header->name_len);
  5880. +   if (bytes != header->name_len)
  5881. +     return NULL;
  5882. +   member_name[header->name_len] = '\0';
  5883. +   *data_pos = *header_pos + sizeof (struct local_zip_header)
  5884. +           + header->name_len + header->extra_len;
  5885. +   lseek (fd, header->comp_size + (long) header->extra_len, SEEK_CUR);
  5886. +   return strlwr (member_name);
  5887. + }
  5888. + /* Takes three arguments ARCHIVE, FUNCTION and ARG.
  5889. +    Open the archive named ARCHIVE, find its members one by one,
  5890. +    and for each one call FUNCTION with the following arguments:
  5891. +      archive file descriptor for reading the data,
  5892. +      member name,
  5893. +      member header position in file,
  5894. +      member data position in file,
  5895. +      member data size,
  5896. +      member date,
  5897. +      member uid,
  5898. +      member gid,
  5899. +      member protection mode,
  5900. +      ARG.
  5901. +    The descriptor is poised to read the data of the member
  5902. +    when FUNCTION is called.  It does not matter how much
  5903. +    data FUNCTION reads.
  5904. +    If FUNCTION returns nonzero, we immediately return
  5905. +    what FUNCTION returned.
  5906. +    Returns -1 if archive does not exist,
  5907. +    Returns -2 if archive has invalid format.
  5908. +    Returns 0 if have scanned successfully.  */
  5909. + long
  5910. + ar_scan (char *archive,
  5911. +      long (*f) (int, char *, long, long, long, long, int, int, int, long),
  5912. +      long arg)
  5913. + {
  5914. +   int fd;
  5915. +   struct local_zip_header header;
  5916. +   long header_pos;
  5917. +   long data_pos;
  5918. +   char *name = zip_get_first (archive, &fd, &header, &header_pos, &data_pos);
  5919. +   if (fd < 0)
  5920. +     return -1L;
  5921. +   if (name == NULL)
  5922. +     return -2L;
  5923. +   while (name && *name)
  5924. +     {
  5925. +       time_t time_buf = dos_time (header.last_mod_time, header.last_mod_date);
  5926. +       long fnval = (*f) (fd, name,
  5927. +              header_pos, data_pos,
  5928. +              header.uncomp_size,
  5929. +              time_buf,
  5930. +              0, 0, 0,
  5931. +              arg);
  5932. +       if (fnval)
  5933. +     {
  5934. +       close (fd);
  5935. +       return fnval;
  5936. +     }
  5937. +       free (name);
  5938. +       name = zip_get_next (fd, &header, &header_pos, &data_pos);
  5939. +     }
  5940. +   close (fd);
  5941. +   return 0L;
  5942. + }
  5943. + /* Return nonzero iff NAME matches MEM.  If NAME is longer than
  5944. +    sizeof (struct ar_hdr.ar_name), MEM may be the truncated version.  */
  5945. + long
  5946. + ar_name_equal (name, mem)
  5947. +      char *name, *mem;
  5948. + {
  5949. +   return (long) !strcmp (name, mem);
  5950. + }
  5951. + /* ARGSUSED */
  5952. + static long int
  5953. + ar_member_pos (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
  5954. +      int desc;
  5955. +      char *name;
  5956. +      long int hdrpos, datapos, size, date;
  5957. +      int uid, gid, mode;
  5958. +      char *mem;
  5959. + {
  5960. +   if (!ar_name_equal (name, mem))
  5961. +     return 0;
  5962. +   return hdrpos;
  5963. + }
  5964. + /* Set date of member MEMNAME in archive ARNAME to current time.
  5965. +    Returns 0 if successful,
  5966. +    -1 if file ARNAME does not exist,
  5967. +    -2 if not a valid archive,
  5968. +    -3 if other random system call error (including file read-only),
  5969. +    1 if valid but member MEMNAME does not exist.  */
  5970. + long
  5971. + ar_member_touch (arname, memname)
  5972. +      char *arname, *memname;
  5973. + {
  5974. +   /* CODE ME !!! */
  5975. +   return -3L;
  5976. + }
  5977. + #ifdef TEST
  5978. + long int
  5979. + describe_member (desc, name, hdrpos, datapos, size, date, uid, gid, mode)
  5980. +      int desc;
  5981. +      char *name;
  5982. +      long int hdrpos, datapos, size, date;
  5983. +      int uid, gid, mode;
  5984. + {
  5985. +   extern char *ctime ();
  5986. +   printf ("Member %s: %ld bytes at %ld (%ld).\n", name, size, hdrpos, datapos);
  5987. +   printf ("  Date %s", ctime (&date));
  5988. +   printf ("  uid = %d, gid = %d, mode = 0%o.\n", uid, gid, mode);
  5989. +   return 0;
  5990. + }
  5991. + void
  5992. + main (int argc, char **argv)
  5993. + {
  5994. +   ar_scan (argv[1], describe_member);
  5995. + }
  5996. + void *
  5997. + xmalloc (size_t size)
  5998. + {
  5999. +   register void *ptr = malloc (size);
  6000. +   if (ptr == (void *)0)
  6001. +     fatal (2, "out of memory");
  6002. +   return(ptr);
  6003. + }
  6004. + void
  6005. + fatal (int code, char *format, ... )
  6006. + {
  6007. +   va_list arg_ptr;        /* variable-length arguments    */
  6008. +   va_start (arg_ptr, format);
  6009. +   fprintf (stderr, "%s: fatal error: ", program_name);
  6010. +   vfprintf (stderr, format, arg_ptr);
  6011. +   fprintf (stderr, ".\n");
  6012. +   exit (code);
  6013. + }
  6014. + #endif /* TEST */
  6015. + #if 0
  6016. + /* Look alike to the portable directory functions.*/
  6017. + struct _zipcontents
  6018. + {
  6019. +   char *_z_entry;
  6020. +   struct _zipcontents *_z_next;
  6021. + };
  6022. + typedef struct _zipdesc
  6023. + {
  6024. +   int zd_fd;                /* file handle */
  6025. +   int zd_access;            /* access mode (O_RDWR or O_RDONLY) */
  6026. +   struct _zipcontents *zd_contents;    /* root of the list of entries */
  6027. +   struct _zipcontents *zd_cp;        /* current entry */
  6028. + } ZIP;
  6029. + #define    rewindzip(zipp)    seekzip (zipp, 0L)
  6030. + void seekzip (ZIP *zipp, long off);
  6031. + long tellzip (ZIP *zipp);
  6032. + ZIP *openzip (char *name);
  6033. + void closezip (ZIP *zipp);
  6034. + struct zip_header *readzip (ZIP *zipp);
  6035. + void
  6036. + seekzip (ZIP *zipp, long off)
  6037. + {
  6038. +   /* CODE ME !!! */
  6039. +   return lseek (zipp->zd_fd, off, SEEK_SET);
  6040. +   /* better: seek() for name! */
  6041. + }
  6042. + long
  6043. + tellzip (ZIP *zipp)
  6044. + {
  6045. +   /* CODE ME !!! */
  6046. +   return tell (zipp->zd_fd);
  6047. + }
  6048. + /* Open the zipfile NAME, scan through the local headers and check with
  6049. +    the central directory for consistency.  Put the central directory
  6050. +    entries into the linked list rooted by zipp->zd_contents.  */
  6051. + ZIP *
  6052. + openzip (char *name)
  6053. + {
  6054. +   ZIP *zipp;
  6055. +   zipp->zd_access = O_RDWR;    /* we might want to `touch' the archive  */
  6056. +   zipp->zd_fd = open (name, zipp->zd_access|O_BINARY);
  6057. +   if (zipp->zd_fd == -1)
  6058. +     {                /* at least, try to read the archive  */
  6059. +       zipp->zd_access = O_RDONLY;
  6060. +       zipp->zd_fd = open (name, zipp->zd_access|O_BINARY);
  6061. +       if (zipp->zd_fd == -1)
  6062. +     return NULL;
  6063. +     }
  6064. +   /* CODE ME !!! */
  6065. +   return zipp;
  6066. + }
  6067. + void
  6068. + closezip (ZIP *zipp)
  6069. + {
  6070. +   /* CODE ME !!! */
  6071. +   close (zipp->zd_fd);
  6072. + }
  6073. + struct zip_header *
  6074. + readzip (ZIP *zipp)
  6075. + {
  6076. +   /* CODE ME !!! */
  6077. + }
  6078. + #endif /* NEVER */
  6079. + /* 
  6080. +  * Local Variables:
  6081. +  * mode:C
  6082. +  * ChangeLog:ChangeLog
  6083. +  * compile-command:cl -DTEST -W4 zipscan.c
  6084. +  * End:
  6085. +  */
  6086.