home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / gnuish / m4v05.arc / patches < prev    next >
Text File  |  1990-11-01  |  48KB  |  1,750 lines

  1. *** e:\tmp/RCSt1006154    Sat Oct 27 09:53:50 1990
  2. --- builtin.c    Sat Oct 27 09:35:08 1990
  3. ***************
  4. *** 16,21 ****
  5. --- 16,34 ----
  6.    * along with this program; if not, write to the Free Software
  7.    * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  8.    */
  9. + /*
  10. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  11. +  * This port is also distributed under the terms of the
  12. +  * GNU General Public License as published by the
  13. +  * Free Software Foundation.
  14. +  *
  15. +  * Please note that this file is not identical to the
  16. +  * original GNU release, you should have received this
  17. +  * code as patch to the official release.
  18. +  *
  19. +  * $Header: e:/gnu/m4/RCS/builtin.c 0.5.1.0 90/09/28 18:34:53 tho Exp $
  20. +  */
  21.   
  22.   /*
  23.    * Code for all builtin macros, initialisation of symbol table, and
  24. ***************
  25. *** 32,37 ****
  26. --- 45,110 ----
  27.    * "builtin_tab" is both used for initialisation, and by the "builtin"
  28.    * builtin.
  29.    */
  30. + #ifdef MSDOS
  31. + #include <process.h>
  32. + #include <errno.h>
  33. + #include <io.h>
  34. + #define M4_ARGS \
  35. +   struct obstack *obs, int argc, struct token_data **argv
  36. + builtin *find_builtin_by_name(char *name);
  37. + builtin *find_builtin_by_addr(builtin_func *func);
  38. + static char *ntoa (eval_t value, int radix);
  39. + static enum boolean bad_argc (char *name, int argc, int min, int max);
  40. + static int dumpdef_cmp (struct symbol **s1, struct symbol **s2);
  41. + static void define_builtin (char *name, struct builtin *bp,\
  42. +                 enum symbol_lookup mode);
  43. + static void define_macro (int argc, struct token_data **argv,\
  44. +               enum symbol_lookup mode);
  45. + static void dump_args (struct obstack *obs, int argc,\
  46. +                struct token_data **argv, char *sep,\
  47. +                enum boolean quoted);
  48. + static void dump_symbol (struct symbol *sym, struct dump_symbol_data *data);
  49. + static void include (int argc, struct token_data **argv, enum boolean silent);
  50. + static void m4_builtin (M4_ARGS);
  51. + static void m4_changecom (M4_ARGS);
  52. + static void m4_changequote (M4_ARGS);
  53. + static void m4_define (M4_ARGS);
  54. + static void m4_defn (M4_ARGS);
  55. + static void m4_divert (M4_ARGS);
  56. + static void m4_divnum (M4_ARGS);
  57. + static void m4_dnl (M4_ARGS);
  58. + static void m4_dumpdef (M4_ARGS);
  59. + static void m4_errprint (M4_ARGS);
  60. + static void m4_eval (M4_ARGS);
  61. + static void m4_ifdef (M4_ARGS);
  62. + static void m4_ifelse (M4_ARGS);
  63. + static void m4_include (M4_ARGS);
  64. + static void m4_index (M4_ARGS);
  65. + static void m4_len (M4_ARGS);
  66. + static void m4_m4exit (M4_ARGS);
  67. + static void m4_m4wrap (M4_ARGS);
  68. + static void m4_maketemp (M4_ARGS);
  69. + static void m4_popdef (M4_ARGS);
  70. + static void m4_pushdef (M4_ARGS);
  71. + static void m4_shift (M4_ARGS);
  72. + static void m4_sinclude (M4_ARGS);
  73. + static void m4_substr (M4_ARGS);
  74. + static void m4_syscmd (M4_ARGS);
  75. + static void m4_sysval (M4_ARGS);
  76. + static void m4_traceoff (M4_ARGS);
  77. + static void m4_traceon (M4_ARGS);
  78. + static void m4_translit (M4_ARGS);
  79. + static void m4_undefine (M4_ARGS);
  80. + static void m4_undivert (M4_ARGS);
  81. + static void set_trace (struct symbol *sym, char *data);
  82. + static void shipout_int (struct obstack *obs, int val);
  83. + #else /* not MSDOS */
  84.   static void m4_builtin();
  85.   static void m4_changecom();
  86.   static void m4_changequote();
  87. ***************
  88. *** 64,69 ****
  89. --- 137,144 ----
  90.   static void m4_undefine();
  91.   static void m4_undivert();
  92.   
  93. + #endif /* not MSDOS */
  94.   static builtin
  95.   builtin_tab[] = {
  96.   
  97. ***************
  98. *** 273,279 ****
  99.       if (quoted)
  100.           obstack_1grow(obs, rquote);
  101.       }
  102. -    
  103.   }
  104.   
  105.   
  106. --- 348,353 ----
  107. ***************
  108. *** 448,454 ****
  109. --- 522,533 ----
  110.       if (!sym->shadowed) {
  111.       obstack_blank(data->obs, sizeof(symbol*));
  112.       data->base = (symbol **)obstack_base(data->obs);
  113. + #if defined(_MSC_VER) && (_MSC_VER == 600)
  114. +     /* Work around an optimizer bug.  */
  115. +     { int tmp = data->size++; data->base[tmp] = sym; }
  116. + #else
  117.       data->base[data->size++] = sym;
  118. + #endif
  119.       }
  120.   }
  121.   
  122. ***************
  123. *** 487,493 ****
  124. --- 566,576 ----
  125.       for (i = 1; i < argc; i++) {
  126.           s = lookup_symbol(TOKEN_DATA_TEXT(argv[i]), SYMBOL_LOOKUP);
  127.           if (s != nil)
  128. + #ifdef MSDOS
  129. +         dump_symbol(s, &data);
  130. + #else /* not MSDOS */
  131.           dump_symbol(s, (char *)&data);
  132. + #endif /* not MSDOS */
  133.           else
  134.           error("Undefined name %s", TOKEN_DATA_TEXT(argv[i]));
  135.       }
  136. ***************
  137. *** 512,517 ****
  138. --- 595,606 ----
  139.           break;
  140.       }
  141.       }
  142. + #ifdef MSDOS            /* but it's a genuine bug.  */
  143. +   /* Or is the intention to finalize the object?
  144. +      (cf. m4_errprint (), which could also free the object)  */
  145. +   obstack_free (obs, obstack_base (obs));
  146. + #endif
  147.   }
  148.   
  149.   /*
  150. ***************
  151. *** 589,597 ****
  152. --- 678,729 ----
  153.       int argc;
  154.       token_data **argv;
  155.   {
  156. + #ifdef MSDOS
  157. +   /* The system function from the MSC runtime lib doesn't return
  158. +      the exit code, so we have to hack one ourselves.  */
  159. +   char *sysargv[4];
  160. +   char *p = NULL;
  161. +   if (bad_argc(TOKEN_DATA_TEXT(argv[0]), argc, 2, 2))
  162. +     return;
  163. +   /* Find $SHELL or $COMSPEC, assuming the former is a UNIX style
  164. +      shell (preferred) and the latter is a DOS style command
  165. +      processor.  */
  166. +   sysargv[0] = getenv ("SHELL");
  167. +   if (sysargv[0])
  168. +     sysargv[1] = "-c";
  169. +   else
  170. +     {
  171. +       sysargv[0] = getenv ("COMSPEC");
  172. +       if (sysargv[0])
  173. +     sysargv[1] = "/c";
  174. +       else
  175. +     {
  176. +       errno = ENOENT;
  177. +       sysval = (-1) << 8;
  178. +       return;
  179. +     }
  180. +     }
  181. +   /* Let the shell execute COMMAND.  */
  182. +   sysargv[2] = ARG(1);
  183. +   sysargv[3] = NULL;
  184. +   /* Precompensate the ">> 8" from m4_sysval ()  */
  185. +   sysval = spawnvpe (P_WAIT, sysargv[0], sysargv, NULL) << 8;
  186. + #else /* not MSDOS */
  187.       if (bad_argc(TOKEN_DATA_TEXT(argv[0]), argc, 2, 2))
  188.       return;
  189.       sysval = system(ARG(1));
  190. + #endif /* not MSDOS */
  191.   }
  192.   
  193.   static void
  194. ***************
  195. *** 615,624 ****
  196.   
  197.   static char *
  198.   ntoa(value, radix)
  199. !     register int value;
  200.       int radix;
  201.   {
  202.       unsigned int uvalue;
  203.       static char str[256];
  204.       register char *s = &str[sizeof str];
  205.       boolean negative = false;
  206. --- 747,760 ----
  207.   
  208.   static char *
  209.   ntoa(value, radix)
  210. !     register eval_t value;
  211.       int radix;
  212.   {
  213. + #ifdef MSDOS
  214. +     unsigned long uvalue;
  215. + #else
  216.       unsigned int uvalue;
  217. + #endif
  218.       static char str[256];
  219.       register char *s = &str[sizeof str];
  220.       boolean negative = false;
  221. ***************
  222. *** 631,637 ****
  223. --- 767,777 ----
  224.       negative = true;
  225.       value = -(value+1);
  226.   
  227. + #ifdef MSDOS            /* shut up the compiler.  */
  228. +     tmp = (int) (value%radix);
  229. + #else
  230.       tmp = value%radix;
  231. + #endif
  232.       if (tmp == radix - 1) {
  233.           *--s = '0';
  234.           value = value/radix + 1;
  235. ***************
  236. *** 645,651 ****
  237. --- 785,796 ----
  238.       }
  239.       }
  240.   
  241. + #ifdef MSDOS
  242. +     uvalue = (unsigned long)value;
  243. + #else
  244.       uvalue = (unsigned int)value;
  245. + #endif
  246.       do {
  247.       *--s = digits[uvalue%radix];
  248.       uvalue /= radix;
  249. ***************
  250. *** 662,668 ****
  251.       int argc;
  252.       token_data **argv;
  253.   {
  254. !     int value;
  255.       int radix = 10;
  256.       int min = 1;
  257.       char *s;
  258. --- 807,813 ----
  259.       int argc;
  260.       token_data **argv;
  261.   {
  262. !     eval_t value;
  263.       int radix = 10;
  264.       int min = 1;
  265.       char *s;
  266. ***************
  267. *** 915,920 ****
  268. --- 1060,1068 ----
  269.       token_data **argv;
  270.   {
  271.       dump_args(obs, argc, argv, " ", false);
  272. + #ifdef MSDOS            /* but it's a genuine bug.  */
  273. +     obstack_1grow(obs, '\0');
  274. + #endif
  275.       fprintf(stderr, "%s", obstack_finish(obs));
  276.       fflush(stderr);
  277.   }
  278. ***************
  279. *** 960,965 ****
  280. --- 1108,1116 ----
  281.       obstack_grow(obs, ARG(1), strlen(ARG(1)));
  282.       } else
  283.       dump_args(obs, argc, argv, " ", false);
  284. + #ifdef MSDOS            /* but it's a genuine bug.  */
  285. +     obstack_1grow(obs, '\0');
  286. + #endif
  287.       push_wrapup(obstack_finish(obs));
  288.   }
  289.   
  290. *** e:\tmp/RCSt1006154    Sat Oct 27 09:53:52 1990
  291. --- eval.c    Sat Oct 27 09:37:30 1990
  292. ***************
  293. *** 16,21 ****
  294. --- 16,34 ----
  295.    * along with this program; if not, write to the Free Software
  296.    * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  297.    */
  298. + /*
  299. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  300. +  * This port is also distributed under the terms of the
  301. +  * GNU General Public License as published by the
  302. +  * Free Software Foundation.
  303. +  *
  304. +  * Please note that this file is not identical to the
  305. +  * original GNU release, you should have received this
  306. +  * code as patch to the official release.
  307. +  *
  308. +  * $Header: e:/gnu/m4/RCS/eval.c 0.5.1.0 90/09/28 18:34:58 tho Exp $
  309. +  */
  310.   
  311.   /* 
  312.    * This file contains teh functions to evaluate integer expressions for
  313. ***************
  314. *** 54,59 ****
  315. --- 67,91 ----
  316.       MODULO_ZERO,
  317.   } eval_error;
  318.   
  319. + #ifdef MSDOS
  320. + static enum eval_error add_term (enum eval_token et, eval_t *v1);
  321. + static enum eval_error and_term (enum eval_token et, eval_t *v1);
  322. + static enum eval_error cmp_term (enum eval_token et, eval_t *v1);
  323. + static enum eval_error exp_term (enum eval_token et, eval_t *v1);
  324. + static enum eval_error logical_and_term (enum eval_token et, eval_t *v1);
  325. + static enum eval_error logical_or_term (enum eval_token et, eval_t *v1);
  326. + static enum eval_error mult_term (enum eval_token et, eval_t *v1);
  327. + static enum eval_error not_term (enum eval_token et, eval_t *v1);
  328. + static enum eval_error or_term (enum eval_token et, eval_t *v1);
  329. + static enum eval_error simple_term (enum eval_token et, eval_t *v1);
  330. + static enum eval_error unary_term (enum eval_token et, eval_t *v1);
  331. + static enum eval_token eval_lex (eval_t *val);
  332. + static void eval_init_lex (char *text);
  333. + static void eval_undo (void);
  334. + #else /* not MSDOS */
  335.   static eval_error logical_or_term();
  336.   static eval_error logical_and_term();
  337.   static eval_error or_term();
  338. ***************
  339. *** 66,71 ****
  340. --- 98,105 ----
  341.   static eval_error unary_term();
  342.   static eval_error simple_term();
  343.   
  344. + #endif /* not MSDOS */
  345.   /* 
  346.    * Lexical functions.
  347.    */
  348. ***************
  349. *** 93,99 ****
  350.   
  351.   static eval_token 
  352.   eval_lex(val)
  353. !     int *val;                /* numerical value, if any */
  354.   {
  355.       while (isspace(*eval_text))
  356.       eval_text++;
  357. --- 127,133 ----
  358.   
  359.   static eval_token 
  360.   eval_lex(val)
  361. !     eval_t *val;                /* numerical value, if any */
  362.   {
  363.       while (isspace(*eval_text))
  364.       eval_text++;
  365. ***************
  366. *** 194,200 ****
  367.   boolean 
  368.   evaluate(expr, val)
  369.       char *expr;
  370. !     int *val;
  371.   {
  372.       eval_token et;
  373.       eval_error err;
  374. --- 228,234 ----
  375.   boolean 
  376.   evaluate(expr, val)
  377.       char *expr;
  378. !     eval_t *val;
  379.   {
  380.       eval_token et;
  381.       eval_error err;
  382. ***************
  383. *** 235,243 ****
  384.   static eval_error 
  385.   logical_or_term(et, v1)
  386.       eval_token et;
  387. !     int *v1;
  388.   {
  389. !     int v2;
  390.       eval_error er;
  391.   
  392.       if (er = logical_and_term(et, v1))
  393. --- 269,277 ----
  394.   static eval_error 
  395.   logical_or_term(et, v1)
  396.       eval_token et;
  397. !     eval_t *v1;
  398.   {
  399. !     eval_t v2;
  400.       eval_error er;
  401.   
  402.       if (er = logical_and_term(et, v1))
  403. ***************
  404. *** 263,271 ****
  405.   static eval_error 
  406.   logical_and_term(et, v1)
  407.       eval_token et;
  408. !     int *v1;
  409.   {
  410. !     int v2;
  411.       eval_error er;
  412.      
  413.       if (er = or_term(et, v1))
  414. --- 297,305 ----
  415.   static eval_error 
  416.   logical_and_term(et, v1)
  417.       eval_token et;
  418. !     eval_t *v1;
  419.   {
  420. !     eval_t v2;
  421.       eval_error er;
  422.      
  423.       if (er = or_term(et, v1))
  424. ***************
  425. *** 291,299 ****
  426.   static eval_error 
  427.   or_term(et, v1)
  428.       eval_token et;
  429. !     int *v1;
  430.   {
  431. !     int v2;
  432.       eval_error er;
  433.   
  434.       if (er = and_term(et, v1))
  435. --- 325,333 ----
  436.   static eval_error 
  437.   or_term(et, v1)
  438.       eval_token et;
  439. !     eval_t *v1;
  440.   {
  441. !     eval_t v2;
  442.       eval_error er;
  443.   
  444.       if (er = and_term(et, v1))
  445. ***************
  446. *** 319,327 ****
  447.   static eval_error 
  448.   and_term(et, v1)
  449.       eval_token et;
  450. !     int *v1;
  451.   {
  452. !     int v2;
  453.       eval_error er;
  454.   
  455.       if (er = not_term(et, v1))
  456. --- 353,361 ----
  457.   static eval_error 
  458.   and_term(et, v1)
  459.       eval_token et;
  460. !     eval_t *v1;
  461.   {
  462. !     eval_t v2;
  463.       eval_error er;
  464.   
  465.       if (er = not_term(et, v1))
  466. ***************
  467. *** 347,353 ****
  468.   static eval_error 
  469.   not_term(et, v1)
  470.       eval_token et;
  471. !     int *v1;
  472.   {
  473.       eval_error er;
  474.   
  475. --- 381,387 ----
  476.   static eval_error 
  477.   not_term(et, v1)
  478.       eval_token et;
  479. !     eval_t *v1;
  480.   {
  481.       eval_error er;
  482.   
  483. ***************
  484. *** 369,378 ****
  485.   static eval_error 
  486.   cmp_term(et, v1)
  487.       eval_token et;
  488. !     int *v1;
  489.   {
  490.       eval_token op;
  491. !     int v2;
  492.       eval_error er;
  493.   
  494.       if (er = add_term(et, v1))
  495. --- 403,412 ----
  496.   static eval_error 
  497.   cmp_term(et, v1)
  498.       eval_token et;
  499. !     eval_t *v1;
  500.   {
  501.       eval_token op;
  502. !     eval_t v2;
  503.       eval_error er;
  504.   
  505.       if (er = add_term(et, v1))
  506. ***************
  507. *** 423,432 ****
  508.   static eval_error 
  509.   add_term(et, v1)
  510.       eval_token et;
  511. !     int *v1;
  512.   {
  513.       eval_token op;
  514. !     int v2;
  515.       eval_error er;
  516.   
  517.       if (er = mult_term(et, v1))
  518. --- 457,466 ----
  519.   static eval_error 
  520.   add_term(et, v1)
  521.       eval_token et;
  522. !     eval_t *v1;
  523.   {
  524.       eval_token op;
  525. !     eval_t v2;
  526.       eval_error er;
  527.   
  528.       if (er = mult_term(et, v1))
  529. ***************
  530. *** 455,464 ****
  531.   static eval_error 
  532.   mult_term(et, v1)
  533.       eval_token et;
  534. !     int *v1;
  535.   {
  536.       eval_token op;
  537. !     int v2;
  538.       eval_error er;
  539.   
  540.       if (er = exp_term(et, v1))
  541. --- 489,498 ----
  542.   static eval_error 
  543.   mult_term(et, v1)
  544.       eval_token et;
  545. !     eval_t *v1;
  546.   {
  547.       eval_token op;
  548. !     eval_t v2;
  549.       eval_error er;
  550.   
  551.       if (er = exp_term(et, v1))
  552. ***************
  553. *** 503,512 ****
  554.   static eval_error 
  555.   exp_term(et, v1)
  556.       eval_token et;
  557. !     int *v1;
  558.   {
  559. !     register int result;
  560. !     int v2;
  561.       eval_error er;
  562.   
  563.       if (er = unary_term(et, v1))
  564. --- 537,546 ----
  565.   static eval_error 
  566.   exp_term(et, v1)
  567.       eval_token et;
  568. !     eval_t *v1;
  569.   {
  570. !     register eval_t result;
  571. !     eval_t v2;
  572.       eval_error er;
  573.   
  574.       if (er = unary_term(et, v1))
  575. ***************
  576. *** 536,542 ****
  577.   static eval_error 
  578.   unary_term(et, v1)
  579.       eval_token et;
  580. !     int *v1;
  581.   {
  582.       eval_token et2 = et;
  583.       eval_error er;
  584. --- 570,576 ----
  585.   static eval_error 
  586.   unary_term(et, v1)
  587.       eval_token et;
  588. !     eval_t *v1;
  589.   {
  590.       eval_token et2 = et;
  591.       eval_error er;
  592. ***************
  593. *** 561,569 ****
  594.   static eval_error 
  595.   simple_term(et, v1)
  596.       eval_token et;
  597. !     int *v1;
  598.   {
  599. !     int v2;
  600.       eval_error er;
  601.   
  602.       switch (et) {
  603. --- 595,603 ----
  604.   static eval_error 
  605.   simple_term(et, v1)
  606.       eval_token et;
  607. !     eval_t *v1;
  608.   {
  609. !     eval_t v2;
  610.       eval_error er;
  611.   
  612.       switch (et) {
  613. *** e:\tmp/RCSt1006154    Sat Oct 27 09:53:56 1990
  614. --- input.c    Sat Oct 27 09:33:40 1990
  615. ***************
  616. *** 16,21 ****
  617. --- 16,34 ----
  618.    * along with this program; if not, write to the Free Software
  619.    * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  620.    */
  621. + /*
  622. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  623. +  * This port is also distributed under the terms of the
  624. +  * GNU General Public License as published by the
  625. +  * Free Software Foundation.
  626. +  *
  627. +  * Please note that this file is not identical to the
  628. +  * original GNU release, you should have received this
  629. +  * code as patch to the official release.
  630. +  *
  631. +  * $Header: e:/gnu/m4/RCS/input.c 0.5.1.0 90/09/28 18:35:00 tho Exp $
  632. +  */
  633.   
  634.   /* 
  635.    * Handling of different input sources, and lexical analysis.
  636. ***************
  637. *** 130,135 ****
  638. --- 143,155 ----
  639.   char bcomm;
  640.   char ecomm;
  641.   
  642. + #ifdef MSDOS
  643. + static int next_char (void);
  644. + static void (*get_macro_func (void)) ();
  645. + static void advance_input (void);
  646. + static void pop_input (void);
  647. + #endif /* MSDOS */
  648.   
  649.   
  650.   /* 
  651. *** e:\tmp/RCSt1006154    Sat Oct 27 09:53:58 1990
  652. --- m4.c    Sat Oct 27 09:17:50 1990
  653. ***************
  654. *** 16,21 ****
  655. --- 16,34 ----
  656.    * along with this program; if not, write to the Free Software
  657.    * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  658.    */
  659. + /*
  660. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  661. +  * This port is also distributed under the terms of the
  662. +  * GNU General Public License as published by the
  663. +  * Free Software Foundation.
  664. +  *
  665. +  * Please note that this file is not identical to the
  666. +  * original GNU release, you should have received this
  667. +  * code as patch to the official release.
  668. +  *
  669. +  * $Header: e:/gnu/m4/RCS/m4.c 0.5.1.0 90/09/28 18:35:03 tho Exp $
  670. +  */
  671.   
  672.   #include "m4.h"
  673.   #include "version.h"
  674. ***************
  675. *** 37,42 ****
  676. --- 50,68 ----
  677.   /* Disable GNU extensions (-G) */
  678.   int no_gnu_extensions = 0;
  679.   
  680. + #ifdef TRACE_MEMORY_USAGE
  681. + /* Look where m4 eats up the memory (-t) */
  682. + int trace_memory_usage = 0;
  683. + #endif /* TRACE_MEMORY_USAGE */
  684. + #ifdef MSDOS
  685. + extern int main (int argc, char **argv);
  686. + static void vmesg(char *level, char *fmt, va_list args);
  687. + static void no_memory (void);
  688. + static void usage (void);
  689. + #endif /* MSDOS */
  690.   
  691.   /* 
  692.    * usage --- Print usage message on stderr.
  693. ***************
  694. *** 71,80 ****
  695. --- 97,115 ----
  696.   
  697.       case 'V':
  698.           fprintf(stderr,
  699. + #ifdef MSDOS
  700. +             "\
  701. + GNU m4 %s, Copyright (C) 1989, 1990 Free Software Foundation, Inc.\n\
  702. + There is ABSOLUTELY NO WARRANTY for GNU m4.  See the file\n\
  703. + COPYING in the source distribution for more details.\n\
  704. + $Header: e:/gnu/m4/RCS/m4.c 0.5.1.0 90/09/28 18:35:03 tho Exp $\n\
  705. + (compiled " __DATE__ " " __TIME__ " MS-DOS)\n",
  706. + #else /* not MSDOS */
  707.               "\
  708.   GNU m4 %s, Copyright (C) 1989, 1990 Free Software Foundation, Inc.\n\
  709.   There is ABSOLUTELY NO WARRANTY for GNU m4.  See the file\n\
  710.   COPYING in the source distribution for more details.\n",
  711. + #endif /* not MSDOS */
  712.               version);
  713.           break;
  714.   
  715. ***************
  716. *** 103,108 ****
  717. --- 138,149 ----
  718.       case 'T':
  719.           break;
  720.   
  721. + #ifdef TRACE_MEMORY_USAGE
  722. +     case 't':
  723. +         trace_memory_usage++;
  724. +         break;
  725. + #endif /* TRACE_MEMORY_USAGE */
  726.       default:
  727.           usage();
  728.   
  729. ***************
  730. *** 203,209 ****
  731. --- 244,322 ----
  732.    * allocation.
  733.    */
  734.   
  735. + #ifdef MSDOS            /* <stdarg.h> */
  736. + /* Basic varargs function for all error output */
  737. + void 
  738. + vmesg(char *level, char *fmt, va_list args)
  739. + {
  740. +   fflush(stdout);
  741. +   fprintf(stderr, "%s: %d: ", current_file, current_line);
  742. +   if (level != nil)
  743. +     fprintf(stderr, "%s: ", level);
  744. +   vfprintf(stderr, fmt, args);
  745. +   putc('\n', stderr);
  746. + }
  747. + /* Internal errors -- print and dump core */
  748. + void 
  749. + internal_error (char *fmt, ...)
  750. + {
  751. +   va_list args;
  752. +   va_start (args, fmt);
  753. +   vmesg ("internal error", fmt, args);
  754. +   va_end (args);
  755. +   abort();
  756. + }
  757. + /* Fatal error -- print and exit */
  758. + void 
  759. + fatal (char *fmt, ...)
  760. + {
  761. +   va_list args;
  762. +   va_start (args, fmt);
  763. +   vmesg ("fatal error", fmt, args);
  764. +   va_end (args);
  765. +   exit (1);
  766. + }
  767. + /* "Normal" error -- just complain */
  768. + void 
  769. + error (char *fmt, ...)
  770. + {
  771. +   va_list args;
  772. +   va_start (args, fmt);
  773. +   vmesg ((char *)nil, fmt, args);
  774. +   va_end (args);
  775. + }
  776. + /* Warning --- for potential trouble */
  777. + void 
  778. + warning (char *fmt, ...)
  779. + {
  780. +   va_list args;
  781. +   va_start (args, fmt);
  782. +   vmesg ("warning", fmt, args);
  783. +   va_end (args);
  784. + }
  785. + #else /* not MSDOS */
  786.   /* Basic varargs function for all error output */
  787.   void 
  788.   vmesg(level, args)
  789.       char *level;
  790. ***************
  791. *** 272,277 ****
  792. --- 385,392 ----
  793.       va_end(args);
  794.   }
  795.   
  796. + #endif /* not MSDOS */
  797.   
  798.   /* 
  799.    * Memory allocation functions
  800. ***************
  801. *** 289,294 ****
  802. --- 404,413 ----
  803.   xfree(p)
  804.       char *p;
  805.   {
  806. + #ifdef TRACE_MEMORY_USAGE
  807. +     if (trace_memory_usage)
  808. +       fprintf (stderr, "freeing @%Fp.\n", (void _far *) p);
  809. + #endif /* TRACE_MEMORY_USAGE */
  810.       free(p);
  811.   }
  812.   
  813. ***************
  814. *** 298,303 ****
  815. --- 417,432 ----
  816.       unsigned int size;
  817.   {
  818.       register char *cp = malloc(size);
  819. + #ifdef TRACE_MEMORY_USAGE
  820. +     if (trace_memory_usage)
  821. +       {
  822. +     fprintf (stderr, "allocating %5u (%04x) bytes ", size, size);
  823. +     if (cp == nil)
  824. +       fprintf (stderr, "failed.\n");
  825. +     else
  826. +       fprintf (stderr, "@%Fp.\n", (void _far *) cp);
  827. +       }
  828. + #endif /* TRACE_MEMORY_USAGE */
  829.       if (cp == nil)
  830.       no_memory();
  831.       return cp;
  832. *** e:\tmp/RCSt1006154    Sat Oct 27 09:54:00 1990
  833. --- m4.h    Sat Oct 27 09:33:16 1990
  834. ***************
  835. *** 16,33 ****
  836. --- 16,54 ----
  837.    * along with this program; if not, write to the Free Software
  838.    * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  839.    */
  840. + /*
  841. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  842. +  * This port is also distributed under the terms of the
  843. +  * GNU General Public License as published by the
  844. +  * Free Software Foundation.
  845. +  *
  846. +  * Please note that this file is not identical to the
  847. +  * original GNU release, you should have received this
  848. +  * code as patch to the official release.
  849. +  *
  850. +  * $Header: e:/gnu/m4/RCS/m4.h 0.5.1.0 90/09/28 18:35:05 tho Exp $
  851. +  */
  852.   
  853.   #include <stdio.h>
  854.   #include <ctype.h>
  855. + #ifdef MSDOS
  856. + #include <stdarg.h>
  857. + #else
  858.   #include <varargs.h>
  859. + #endif
  860.   
  861.   #include "obstack.h"
  862.   
  863. + #ifdef MSDOS
  864. + #include <stdlib.h>
  865. + #else /* not MSDOS */
  866.   extern char *malloc();
  867.   extern char *realloc();
  868.   extern void free();
  869.   extern char *mktemp();
  870.   extern int mkstemp();
  871. + #endif /* not MSDOS */
  872.   
  873.   #ifdef USG
  874.   #include <string.h>
  875. ***************
  876. *** 54,62 ****
  877. --- 75,85 ----
  878.   
  879.   typedef enum boolean { false = 0, true = 1 } boolean;
  880.   
  881. + #ifndef MSDOS
  882.   extern int errno;
  883.   extern int sys_nerr;
  884.   extern char *sys_errlist[];
  885. + #endif /* not MSDOS */
  886.   
  887.   #define syserr() ((errno > 0 && errno < sys_nerr) ? sys_errlist[errno] : "Unknown error")
  888.   
  889. ***************
  890. *** 75,90 ****
  891. --- 98,126 ----
  892.   extern int no_gnu_extensions;        /* -g */
  893.   
  894.   /* Error handling */
  895. + #ifdef MSDOS
  896. + extern void warning (char *fmt, ...);
  897. + extern void error (char *fmt, ...);
  898. + extern void fatal (char *fmt, ...);
  899. + extern void internal_error (char *fmt, ...);
  900. + #else /* not MSDOS */
  901.   extern void warning();
  902.   extern void error();
  903.   extern void fatal();
  904.   extern void internal_error();
  905. + #endif /* not MSDOS */
  906.   
  907.   /* Memory allocation */
  908. + #ifdef MSDOS
  909. + extern char *xmalloc (unsigned int size);
  910. + extern void xfree (char *p);
  911. + extern char *xstrdup (char *s);
  912. + #else /* not MSDOS */
  913.   extern char *xmalloc();
  914.   extern char *xrealloc();
  915.   extern void xfree();
  916.   extern char *xstrdup();
  917. + #endif /* not MSDOS */
  918.   
  919.   
  920.   /* File: input.c  --- lexical definitions */
  921. ***************
  922. *** 121,141 ****
  923.   typedef enum token_data_type token_data_type;
  924.   typedef struct token_data token_data;
  925.   
  926.   extern void input_init();
  927.   extern int peek_input();
  928.   extern token_type next_token();
  929.   extern void skip_line();
  930.   
  931.   /* push back input */
  932.   extern void push_file();
  933.   extern void push_macro();
  934.   extern void push_string();
  935.   extern struct obstack *push_string_init();
  936.   extern char *push_string_finish();
  937.   extern void push_wrapup();
  938.   extern boolean pop_wrapup();
  939.   
  940.   /* current input file, and line */
  941.   extern char *current_file;
  942. --- 157,191 ----
  943.   typedef enum token_data_type token_data_type;
  944.   typedef struct token_data token_data;
  945.   
  946. + #ifdef MSDOS
  947. + extern void input_init (void);
  948. + extern int peek_input (void);
  949. + extern enum token_type next_token (struct token_data *td);
  950. + extern void skip_line (void);
  951. + #else /* not MSDOS */
  952.   extern void input_init();
  953.   extern int peek_input();
  954.   extern token_type next_token();
  955.   extern void skip_line();
  956. + #endif /* not MSDOS */
  957.   
  958.   /* push back input */
  959. + #ifdef MSDOS
  960. + extern void push_file (FILE *fp, char *title);
  961. + extern void push_macro (void (*func) ());
  962. + extern struct obstack *push_string_init (void);
  963. + extern char *push_string_finish (void);
  964. + extern void push_wrapup (char *s);
  965. + extern enum boolean pop_wrapup (void);
  966. + #else /* not MSDOS */
  967.   extern void push_file();
  968.   extern void push_macro();
  969.   extern void push_string();
  970.   extern struct obstack *push_string_init();
  971.   extern char *push_string_finish();
  972.   extern void push_wrapup();
  973.   extern boolean pop_wrapup();
  974. + #endif /* not MSDOS */
  975.   
  976.   /* current input file, and line */
  977.   extern char *current_file;
  978. ***************
  979. *** 154,164 ****
  980. --- 204,222 ----
  981.   extern int output_lines;
  982.   extern int output_current_line;
  983.   
  984. + #ifdef MSDOS
  985. + extern void output_init (void);
  986. + extern void sync_line (int line, char *file);
  987. + extern void shipout_text (struct obstack *obs, char *text);
  988. + extern void make_divertion (int divnum);
  989. + extern void insert_divertion (int divnum);
  990. + #else /* not MSDOS */
  991.   extern void output_init();
  992.   extern void sync_line();
  993.   extern void shipout_text();
  994.   extern void make_divertion();
  995.   extern void insert_divertion();
  996. + #endif /* not MSDOS */
  997.   
  998.   
  999.   /* File symtab.c  --- symbol table definitions */
  1000. ***************
  1001. *** 194,214 ****
  1002.   
  1003.   typedef enum symbol_lookup symbol_lookup;
  1004.   typedef struct symbol symbol;
  1005.   typedef void hack_symbol();
  1006.   
  1007.   #define HASHMAX 509            /* Default, overridden by -Hsize */
  1008.   
  1009.   extern symbol **symtab;
  1010.   
  1011.   extern void symtab_init();
  1012.   extern symbol *lookup_symbol();
  1013. ! extern void hack_all_symbols();
  1014.   
  1015.   
  1016.   /* File: macro.c  --- macro expansion */
  1017.   
  1018.   extern void expand_input();
  1019.   
  1020.   
  1021.   /* File: builtin.c  --- builtins */
  1022. --- 252,285 ----
  1023.   
  1024.   typedef enum symbol_lookup symbol_lookup;
  1025.   typedef struct symbol symbol;
  1026. + #ifdef MSDOS
  1027. + typedef void hack_symbol(symbol *sym, char *data);
  1028. + #else /* not MSDOS */
  1029.   typedef void hack_symbol();
  1030. + #endif /* not MSDOS */
  1031.   
  1032.   #define HASHMAX 509            /* Default, overridden by -Hsize */
  1033.   
  1034.   extern symbol **symtab;
  1035.   
  1036. + #ifdef MSDOS
  1037. + extern void symtab_init (void);
  1038. + extern struct symbol *lookup_symbol (char *name, enum symbol_lookup mode);
  1039. + extern void hack_all_symbols (hack_symbol *func, char *data);
  1040. + #else /* not MSDOS */
  1041.   extern void symtab_init();
  1042.   extern symbol *lookup_symbol();
  1043. ! extern hack_symbol hack_all_symbols();
  1044. ! #endif /* not MSDOS */
  1045.   
  1046.   
  1047.   /* File: macro.c  --- macro expansion */
  1048.   
  1049. + #ifdef MSDOS
  1050. + extern void expand_input (void);
  1051. + #else /* not MSDOS */
  1052.   extern void expand_input();
  1053. + #endif /* not MSDOS */
  1054.   
  1055.   
  1056.   /* File: builtin.c  --- builtins */
  1057. ***************
  1058. *** 229,243 ****
  1059. --- 300,329 ----
  1060.   typedef struct builtin builtin;
  1061.   typedef struct predefined predefined;
  1062.   
  1063. + #ifdef MSDOS
  1064. + extern void builtin_init (void);
  1065. + extern void define_user_macro (char *name, char *text,\
  1066. +                    enum symbol_lookup mode);
  1067. + extern void undivert_all (void);
  1068. + extern void expand_user_macro (struct obstack *obs, struct symbol *sym,\
  1069. +                    int argc, struct token_data **argv);
  1070. + #else /* not MSDOS */
  1071.   extern void builtin_init();
  1072.   extern void define_user_macro();
  1073.   extern void undivert_all();
  1074.   extern void expand_user_macro();
  1075. + #endif /* not MSDOS */
  1076.   
  1077.   
  1078.   /* File: eval.c  --- expression evaluation */
  1079.   
  1080. + #ifdef MSDOS
  1081. + typedef long eval_t;        /* use 32-bit arithmetic */
  1082. + extern enum boolean evaluate (char *expr, eval_t *val);        /* eval.c */
  1083. + #else /* not MSDOS */
  1084. + typedef int eval_t;
  1085.   extern boolean evaluate();
  1086. + #endif /* not MSDOS */
  1087.   
  1088.   
  1089.   /* Debug stuff */
  1090. ***************
  1091. *** 248,250 ****
  1092. --- 334,349 ----
  1093.   #define DEBUG_SYM
  1094.   
  1095.   #endif
  1096. + /* Obstack stuff.  */
  1097. + #ifdef MSDOS
  1098. + extern void _obstack_free (struct obstack *h, void *obj);
  1099. + extern void _obstack_begin (struct obstack *h, int size, int alignment,\
  1100. +                 void * (*chunkfun) (unsigned int size),\
  1101. +                 void (*freefun) (char *p));
  1102. + extern void _obstack_newchunk (struct obstack *h, int length);
  1103. + extern int _obstack_allocated_p (struct obstack *h, void *obj);
  1104. + #endif /* MSDOS */
  1105. *** e:\tmp/RCSt1006154    Sat Oct 27 09:54:02 1990
  1106. --- macro.c    Sat Oct 27 09:36:54 1990
  1107. ***************
  1108. *** 16,21 ****
  1109. --- 16,34 ----
  1110.    * along with this program; if not, write to the Free Software
  1111.    * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1112.    */
  1113. + /*
  1114. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  1115. +  * This port is also distributed under the terms of the
  1116. +  * GNU General Public License as published by the
  1117. +  * Free Software Foundation.
  1118. +  *
  1119. +  * Please note that this file is not identical to the
  1120. +  * original GNU release, you should have received this
  1121. +  * code as patch to the official release.
  1122. +  *
  1123. +  * $Header: e:/gnu/m4/RCS/macro.c 0.5.1.0 90/09/28 18:35:07 tho Exp $
  1124. +  */
  1125.   
  1126.   /* 
  1127.    * This file contains the functions, that performs the basic argument
  1128. ***************
  1129. *** 24,31 ****
  1130. --- 37,52 ----
  1131.   
  1132.   #include "m4.h"
  1133.   
  1134. + #ifdef MSDOS
  1135. + static enum boolean expand_argument (struct obstack *obs,\
  1136. +                      struct token_data *argp);
  1137. + static void expand_macro (struct symbol *sym);
  1138. + static void expand_token (struct obstack *obs, enum token_type t,\
  1139. +               struct token_data *td);
  1140. + #else /* not MSDOS */
  1141.   static void expand_token();
  1142.   static void expand_macro();
  1143. + #endif /* not MSDOS */
  1144.   
  1145.   /* 
  1146.    * This function read all input, and expands each token, one at a time.
  1147. *** e:\tmp/RCSt1006154    Sat Oct 27 09:54:04 1990
  1148. --- obstack.c    Sat Oct 27 09:38:10 1990
  1149. ***************
  1150. *** 21,26 ****
  1151. --- 21,40 ----
  1152.   what you give them.   Help stamp out software-hoarding!  */
  1153.   
  1154.   
  1155. + /* MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  1156. + WARNING: This is still a beta version of the port, proper functioning
  1157. + with far pointers has not yet been verified completely.
  1158. + This port is also distributed under the terms of the GNU General Public
  1159. + License as published by the Free Software Foundation.
  1160. + Please note that this file is not identical to the original GNU release,
  1161. + you should have received this code as patch to the official release.
  1162. + $Header: e:/gnu/m4/RCS/obstack.c 0.5.1.0 90/09/28 18:36:23 tho Exp $  */
  1163.   #include "obstack.h"
  1164.   
  1165.   #ifdef __STDC__
  1166. ***************
  1167. *** 29,34 ****
  1168. --- 43,64 ----
  1169.   #define POINTER char *
  1170.   #endif
  1171.   
  1172. + #ifdef MSDOS
  1173. + #include <stdlib.h>
  1174. + #ifndef MALLOC_PAGE
  1175. + #define MALLOC_PAGE 0x0100
  1176. + #endif
  1177. + void _obstack_begin (struct obstack *h, int size, int alignment, \
  1178. +              POINTER (*chunkfun) (SIZE_T size),\
  1179. +              void (*freefun) (char *p));
  1180. + void _obstack_newchunk (struct obstack *h, int length);
  1181. + int _obstack_allocated_p (struct obstack *h, POINTER obj);
  1182. + void _obstack_free (struct obstack *h, POINTER obj);
  1183. + #endif /* MSDOS */
  1184.   /* Determine default alignment.  */
  1185.   struct fooalign {char x; double d;};
  1186.   #define DEFAULT_ALIGNMENT ((char *)&((struct fooalign *) 0)->d - (char *)0)
  1187. ***************
  1188. *** 61,68 ****
  1189. --- 91,103 ----
  1190.        struct obstack *h;
  1191.        int size;
  1192.        int alignment;
  1193. + #ifdef MSDOS
  1194. +      POINTER (*chunkfun) (SIZE_T size);
  1195. +      void (*freefun) (char *p);
  1196. + #else /* not MSDOS */
  1197.        POINTER (*chunkfun) ();
  1198.        void (*freefun) ();
  1199. + #endif /* not MSDOS */
  1200.   {
  1201.     register struct _obstack_chunk* chunk; /* points to new chunk */
  1202.   
  1203. ***************
  1204. *** 76,90 ****
  1205. --- 111,134 ----
  1206.         int extra = 4;
  1207.         if (extra < DEFAULT_ROUNDING)
  1208.       extra = DEFAULT_ROUNDING;
  1209. + #ifdef MSDOS
  1210. +       size = MALLOC_PAGE - extra;
  1211. + #else /* not MSDOS */
  1212.         size = 4096 - extra;
  1213. + #endif /* not MSDOS */
  1214.       }
  1215.   
  1216. + #ifdef MSDOS
  1217. +   h->chunkfun = (struct _obstack_chunk * (*)(size_t size)) chunkfun;
  1218. + #else /* not MSDOS */
  1219.     h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
  1220. + #endif /* not MSDOS */
  1221.     h->freefun = freefun;
  1222.     h->chunk_size = size;
  1223.     h->alignment_mask = alignment - 1;
  1224.   
  1225.     chunk    = h->chunk = (*h->chunkfun) (h->chunk_size);
  1226.     h->next_free = h->object_base = chunk->contents;
  1227.     h->chunk_limit = chunk->limit
  1228.      = (char *) chunk + h->chunk_size;
  1229. ***************
  1230. *** 104,110 ****
  1231.   {
  1232.     register struct _obstack_chunk*    old_chunk = h->chunk;
  1233.     register struct _obstack_chunk*    new_chunk;
  1234. !   register long    new_size;
  1235.     register int obj_size = h->next_free - h->object_base;
  1236.     register int i;
  1237.   
  1238. --- 148,154 ----
  1239.   {
  1240.     register struct _obstack_chunk*    old_chunk = h->chunk;
  1241.     register struct _obstack_chunk*    new_chunk;
  1242. !   register SIZE_T new_size;
  1243.     register int obj_size = h->next_free - h->object_base;
  1244.     register int i;
  1245.   
  1246. ***************
  1247. *** 171,177 ****
  1248. --- 215,225 ----
  1249.     while (lp != 0 && ((POINTER)lp > obj || (POINTER)(lp)->limit < obj))
  1250.       {
  1251.         plp = lp -> prev;
  1252. + #ifdef MSDOS
  1253. +       (*h->freefun) ((char *)lp);
  1254. + #else /* not MSDOS */
  1255.         (*h->freefun) (lp);
  1256. + #endif /* not MSDOS */
  1257.         lp = plp;
  1258.       }
  1259.     if (lp)
  1260. *** e:\tmp/RCSt1006154    Sat Oct 27 09:54:06 1990
  1261. --- obstack.h    Sat Oct 27 09:33:16 1990
  1262. ***************
  1263. *** 21,26 ****
  1264. --- 21,40 ----
  1265.   what you give them.   Help stamp out software-hoarding!  */
  1266.   
  1267.   
  1268. + /* MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  1269. + WARNING: This is still a beta version of the port, proper functioning
  1270. + with far pointers has not yet been verified completely.
  1271. + This port is also distributed under the terms of the GNU General Public
  1272. + License as published by the Free Software Foundation.
  1273. + Please note that this file is not identical to the original GNU release,
  1274. + you should have received this code as patch to the official release.
  1275. + $Header: e:/gnu/m4/RCS/obstack.h 0.5.1.0 90/09/28 18:36:25 tho Exp $  */
  1276.   /* Summary:
  1277.   
  1278.   All the apparent functions defined here are macros. The idea
  1279. ***************
  1280. *** 109,125 ****
  1281. --- 123,175 ----
  1282.   #ifndef __OBSTACKS__
  1283.   #define __OBSTACKS__
  1284.   
  1285. + #ifdef MSDOS
  1286. + #ifndef FILE
  1287. + #include <stdio.h>
  1288. + #endif
  1289. + #define temp16    tmp._16
  1290. + #define temp32    tmp._32
  1291. + #if defined(M_I86CM) || defined(M_I86LM)    /* Intel 80x86, _far pointers.  */
  1292. + #define LONG    long
  1293. + #define SIZE_T    size_t
  1294. + #define HUGE    _huge
  1295. + #define PDIFF(p1, p2) \
  1296. +   ((long)((char HUGE *) (p1) - (char HUGE *) (p2)))
  1297. + #else                        /* Intel 80x86, _near pointers.  */
  1298. + #define LONG    int
  1299. + #define SIZE_T    size_t
  1300. + #define HUGE
  1301. + #define PDIFF(p1, p2) ((char *) (p1) - (char *) (p2))
  1302. + #endif
  1303. + #else /* not MSDOS */                /* `real' computers ...  */
  1304. + #define temp16    temp
  1305. + #define temp32    temp
  1306. + #define LONG    int
  1307. + #define SIZE_T    long
  1308. + #define HUGE
  1309. + #define PDIFF(p1, p2) ((char *) (p1) - (char *) (p2))
  1310. + #endif /* not MSDOS */
  1311.   /* We use subtraction of (char *)0 instead of casting to int
  1312.      because on word-addressable machines a simple cast to int
  1313.      may ignore the byte-within-word field of the pointer.  */
  1314.   
  1315.   #ifndef __PTR_TO_INT
  1316. + #ifdef MSDOS
  1317. + #define __PTR_TO_INT(P) ((LONG)(P))
  1318. + #else
  1319.   #define __PTR_TO_INT(P) ((P) - (char *)0)
  1320.   #endif
  1321. + #endif
  1322.   
  1323.   #ifndef __INT_TO_PTR
  1324. + #ifdef MSDOS
  1325. + #define __INT_TO_PTR(P) ((char HUGE *)(P))
  1326. + #else
  1327.   #define __INT_TO_PTR(P) ((P) + (char *)0)
  1328.   #endif
  1329. + #endif
  1330.   
  1331.   struct _obstack_chunk        /* Lives at front of each chunk. */
  1332.   {
  1333. ***************
  1334. *** 130,144 ****
  1335.   
  1336.   struct obstack        /* control current object in current chunk */
  1337.   {
  1338. !   long    chunk_size;        /* preferred size to allocate chunks in */
  1339.     struct _obstack_chunk* chunk;    /* address of current struct obstack_chunk */
  1340.     char    *object_base;        /* address of object we are building */
  1341.     char    *next_free;        /* where to add next char to current object */
  1342.     char    *chunk_limit;        /* address of char after current chunk */
  1343.     int    temp;            /* Temporary for some macros.  */
  1344.     int   alignment_mask;        /* Mask of alignment for each object. */
  1345.     struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk.  */
  1346.     void (*freefun) ();        /* User's function to free a chunk.  */
  1347.   };
  1348.   
  1349.   #ifdef __STDC__
  1350. --- 180,206 ----
  1351.   
  1352.   struct obstack        /* control current object in current chunk */
  1353.   {
  1354. !   SIZE_T chunk_size;        /* preferred size to allocate chunks in */
  1355.     struct _obstack_chunk* chunk;    /* address of current struct obstack_chunk */
  1356.     char    *object_base;        /* address of object we are building */
  1357.     char    *next_free;        /* where to add next char to current object */
  1358.     char    *chunk_limit;        /* address of char after current chunk */
  1359. + #ifdef MSDOS
  1360. +   union                /* Temporary for some macros.  */
  1361. +     {
  1362. +       LONG _32;            /* 32 bit for _far pointer differences */
  1363. +       size_t _16;        /* 16 bit for malloc()  */
  1364. +     } tmp;
  1365. +   LONG  alignment_mask;        /* Mask of alignment for each object. */
  1366. +   struct _obstack_chunk *(*chunkfun) (unsigned int size);
  1367. +                 /* User's fcn to allocate a chunk.  */
  1368. +   void (*freefun) (char *p);    /* User's function to free a chunk.  */
  1369. + #else /* not MSDOS */
  1370.     int temp;            /* Temporary for some macros.  */
  1371.     int alignment_mask;        /* Mask of alignment for each object. */
  1372.     struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk.  */
  1373.     void (*freefun) ();        /* User's function to free a chunk.  */
  1374. + #endif /* not MSDOS */
  1375.   };
  1376.   
  1377.   #ifdef __STDC__
  1378. ***************
  1379. *** 299,334 ****
  1380.   extern struct obstack *_obstack;
  1381.   
  1382.   #define obstack_object_size(h) \
  1383. !  (unsigned) (_obstack = (h), (h)->next_free - (h)->object_base)
  1384.   
  1385.   #define obstack_room(h)        \
  1386. !  (unsigned) (_obstack = (h), (h)->chunk_limit - (h)->next_free)
  1387.   
  1388.   #define obstack_grow(h,where,length)                    \
  1389. ! ( (h)->temp = (length),                            \
  1390. !   (((h)->next_free + (h)->temp > (h)->chunk_limit)            \
  1391. !    ? _obstack_newchunk ((h), (h)->temp) : 0),                \
  1392. !   bcopy (where, (h)->next_free, (h)->temp),                \
  1393. !   (h)->next_free += (h)->temp)
  1394.   
  1395.   #define obstack_grow0(h,where,length)                    \
  1396. ! ( (h)->temp = (length),                            \
  1397. !   (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)            \
  1398. !    ? _obstack_newchunk ((h), (h)->temp + 1) : 0),                \
  1399. !   bcopy (where, (h)->next_free, (h)->temp),                \
  1400. !   (h)->next_free += (h)->temp,                        \
  1401.     *((h)->next_free)++ = 0)
  1402.   
  1403.   #define obstack_1grow(h,datum)                        \
  1404.   ( (((h)->next_free + 1 > (h)->chunk_limit)                \
  1405.      ? _obstack_newchunk ((h), 1) : 0),                    \
  1406. !   *((h)->next_free)++ = (datum))
  1407.   
  1408.   #define obstack_blank(h,length)                        \
  1409. ! ( (h)->temp = (length),                            \
  1410. !   (((h)->next_free + (h)->temp > (h)->chunk_limit)            \
  1411. !    ? _obstack_newchunk ((h), (h)->temp) : 0),                \
  1412. !   (h)->next_free += (h)->temp)
  1413.   
  1414.   #define obstack_alloc(h,length)                        \
  1415.    (obstack_blank ((h), (length)), obstack_finish ((h)))
  1416. --- 361,396 ----
  1417.   extern struct obstack *_obstack;
  1418.   
  1419.   #define obstack_object_size(h) \
  1420. !  (unsigned) (_obstack = (h), PDIFF ((h)->next_free, (h)->object_base))
  1421.   
  1422.   #define obstack_room(h)        \
  1423. !  (unsigned) (_obstack = (h), PDIFF ((h)->chunk_limit, (h)->next_free))
  1424.   
  1425.   #define obstack_grow(h,where,length)                    \
  1426. ! ( (h)->temp16 = (length),                        \
  1427. !   (((h)->next_free + (h)->temp16 > (h)->chunk_limit)            \
  1428. !    ? _obstack_newchunk ((h), (h)->temp16) : 0),                \
  1429. !   bcopy (where, (h)->next_free, (h)->temp16),                \
  1430. !   (h)->next_free += (h)->temp16)
  1431.   
  1432.   #define obstack_grow0(h,where,length)                    \
  1433. ! ( (h)->temp16 = (length),                        \
  1434. !   (((h)->next_free + (h)->temp16 + 1 > (h)->chunk_limit)        \
  1435. !    ? _obstack_newchunk ((h), (h)->temp16 + 1) : 0),            \
  1436. !   bcopy (where, (h)->next_free, (h)->temp16),                \
  1437. !   (h)->next_free += (h)->temp16,                    \
  1438.     *((h)->next_free)++ = 0)
  1439.   
  1440.   #define obstack_1grow(h,datum)                        \
  1441.   ( (((h)->next_free + 1 > (h)->chunk_limit)                \
  1442.      ? _obstack_newchunk ((h), 1) : 0),                    \
  1443. !   *((h)->next_free)++ = (char) (datum))
  1444.   
  1445.   #define obstack_blank(h,length)                        \
  1446. ! ( (h)->temp16 = (length),                        \
  1447. !   (((h)->next_free + (h)->temp16 > (h)->chunk_limit)            \
  1448. !    ? _obstack_newchunk ((h), (h)->temp16) : 0),                \
  1449. !   (h)->next_free += (h)->temp16)
  1450.   
  1451.   #define obstack_alloc(h,length)                        \
  1452.    (obstack_blank ((h), (length)), obstack_finish ((h)))
  1453. ***************
  1454. *** 340,372 ****
  1455.    (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
  1456.   
  1457.   #define obstack_finish(h)                          \
  1458. ! ( (h)->temp = __PTR_TO_INT ((h)->object_base),                \
  1459.     (h)->next_free                            \
  1460.       = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask)    \
  1461.               & ~ ((h)->alignment_mask)),                \
  1462. !   (((h)->next_free - (char *)(h)->chunk                    \
  1463. !     > (h)->chunk_limit - (char *)(h)->chunk)                \
  1464.      ? ((h)->next_free = (h)->chunk_limit) : 0),                \
  1465.     (h)->object_base = (h)->next_free,                    \
  1466. !   __INT_TO_PTR ((h)->temp))
  1467.   
  1468.   #ifdef __STDC__
  1469.   #define obstack_free(h,obj)                        \
  1470. ! ( (h)->temp = (char *)(obj) - (char *) (h)->chunk,            \
  1471. !   (((h)->temp >= 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
  1472.      ? (int) ((h)->next_free = (h)->object_base                \
  1473. !         = (h)->temp + (char *) (h)->chunk)                \
  1474. !    : ((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0)))
  1475.   #else
  1476.   #define obstack_free(h,obj)                        \
  1477. ! ( (h)->temp = (char *)(obj) - (char *) (h)->chunk,            \
  1478. !   (((h)->temp >= 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
  1479.      ? (int) ((h)->next_free = (h)->object_base                \
  1480. !         = (h)->temp + (char *) (h)->chunk)                \
  1481. !    : (int) _obstack_free ((h), (h)->temp + (char *) (h)->chunk)))
  1482.   #endif
  1483.   
  1484.   #endif /* not __GNUC__ or not __STDC__ */
  1485.   
  1486.   #endif /* not __OBSTACKS__ */
  1487.   
  1488. --- 402,460 ----
  1489.    (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
  1490.   
  1491.   #define obstack_finish(h)                          \
  1492. ! ( (h)->temp32 = __PTR_TO_INT ((h)->object_base),            \
  1493.     (h)->next_free                            \
  1494.       = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask)    \
  1495.               & ~ ((h)->alignment_mask)),                \
  1496. !   ((PDIFF ((h)->next_free, (h)->chunk)                    \
  1497. !     > PDIFF ((h)->chunk_limit, (h)->chunk))                \
  1498.      ? ((h)->next_free = (h)->chunk_limit) : 0),                \
  1499.     (h)->object_base = (h)->next_free,                    \
  1500. !   __INT_TO_PTR ((h)->temp32))
  1501. ! #if defined(M_I86CM) || defined(M_I86LM)    /* Intel 80x86, far pointers.   */
  1502. ! /* We assume here that
  1503. !      (char *)(obj) ==
  1504. !     ((char *)(obj) - (char *) (h)->chunk) + (char *) (h)->chunk)
  1505. !    Which might be not true because of alignment (???), but this
  1506. !    avoids a pointer subtraction, which is always a problem in segmented
  1507. !    architecture .... */
  1508.   
  1509. + #define obstack_free(h,obj)                        \
  1510. + ( (h)->temp32 = PDIFF (obj, (h)->chunk),                \
  1511. +   (((h)->temp32 >= 0 && (h)->temp32                    \
  1512. +     < PDIFF ((h)->chunk_limit, (h)->chunk))                \
  1513. +    ? (LONG) ((h)->next_free = (h)->object_base = (char *) (obj))    \
  1514. +    : ((obstack_free) ((h), (char *) (obj)), 0)))
  1515. + #else /* not  (M_I86CM || M_I86LM) */
  1516.   #ifdef __STDC__
  1517.   #define obstack_free(h,obj)                        \
  1518. ! ( (h)->temp32 = PDIFF (obj, (h)->chunk),                \
  1519. !   (((h)->temp32 >= 0 && (h)->temp32                    \
  1520. !     < PDIFF ((h)->chunk_limit, (h)->chunk))                \
  1521.      ? (int) ((h)->next_free = (h)->object_base                \
  1522. !         = (h)->temp32 + (char HUGE *) (h)->chunk)            \
  1523. !    : ((obstack_free) ((h), (h)->temp32 + (char HUGE *) (h)->chunk), 0)))
  1524.   #else
  1525.   #define obstack_free(h,obj)                        \
  1526. ! ( (h)->temp32 = (char *)(obj) - (char *) (h)->chunk,            \
  1527. !   (((h)->temp32 >= 0 && (h)->temp32                    \
  1528. !     < (h)->chunk_limit - (char *) (h)->chunk)                \
  1529.      ? (int) ((h)->next_free = (h)->object_base                \
  1530. !         = (h)->temp32 + (char *) (h)->chunk)            \
  1531. !    : (int) _obstack_free ((h), (h)->temp32 + (char *) (h)->chunk)))
  1532.   #endif
  1533.   
  1534. + #endif /* not  (M_I86CM || M_I86LM) */
  1535.   #endif /* not __GNUC__ or not __STDC__ */
  1536.   
  1537.   #endif /* not __OBSTACKS__ */
  1538.   
  1539. *** e:\tmp/RCSt1006154    Sat Oct 27 09:54:08 1990
  1540. --- output.c    Sat Oct 27 09:34:26 1990
  1541. ***************
  1542. *** 16,24 ****
  1543. --- 16,43 ----
  1544.    * along with this program; if not, write to the Free Software
  1545.    * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1546.    */
  1547. + /*
  1548. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  1549. +  * This port is also distributed under the terms of the
  1550. +  * GNU General Public License as published by the
  1551. +  * Free Software Foundation.
  1552. +  *
  1553. +  * Please note that this file is not identical to the
  1554. +  * original GNU release, you should have received this
  1555. +  * code as patch to the official release.
  1556. +  *
  1557. +  * $Header: e:/gnu/m4/RCS/output.c 0.5.1.0 90/09/28 18:36:42 tho Exp $
  1558. +  */
  1559.   
  1560.   #include "m4.h"
  1561.   
  1562. + #ifdef MSDOS
  1563. + #include <io.h>
  1564. + #include <malloc.h>
  1565. + int mkstemp (char *tmpl);
  1566. + #endif /* MSDOS */
  1567.   /* 
  1568.    * Output functions.  Most of the complexity is for handling cpp like
  1569.    * sync lines.
  1570. ***************
  1571. *** 152,157 ****
  1572. --- 171,182 ----
  1573.   }
  1574.   #endif /* USG */
  1575.   
  1576. + #ifdef MSDOS
  1577. + char template_base[] = "/m4%02dXXXXXX";
  1578. + char *template;
  1579. + #endif /* MSDOS */
  1580.   /* 
  1581.    * Make a file for diversion DIVNUM, and install it in the diversion
  1582.    * table "divtab".  The file is opened read-write, so we can unlink it
  1583. ***************
  1584. *** 173,179 ****
  1585. --- 198,227 ----
  1586.       }
  1587.   
  1588.       if (divtab[divnum] == nil) {
  1589. + #ifdef MSDOS
  1590. +       {
  1591. +         char *p;
  1592. +         if ((p = getenv ("TMP")) || (p = getenv ("TEMP")))
  1593. +           {
  1594. +         int len = strlen (p);
  1595. +         template = (char *) alloca (sizeof (template_base) + len + 1);
  1596. +         strcpy (template, p);
  1597. +         p = template + len - 1;
  1598. +         if (*p == '/' || *p == '\\')    /*  strip trailing slash */
  1599. +           *p = '\0';
  1600. +           }
  1601. +         else
  1602. +           {
  1603. +         template = (char *) alloca (sizeof (template_base) + 2);
  1604. +         strcpy (template, ".");
  1605. +           }
  1606. +         strcat (template, template_base);
  1607. +       }
  1608. +         sprintf(buf, template, divnum);
  1609. + #else /* not MSDOS */
  1610.       sprintf(buf, "/tmp/m4.%02d.XXXXXX", divnum);
  1611. + #endif /* not MSDOS */
  1612.       fd = mkstemp(buf);
  1613.       if (fd < 0)
  1614.           fatal("can't create file for diversion: %s", syserr());
  1615. *** e:\tmp/RCSt1006154    Sat Oct 27 09:54:10 1990
  1616. --- symtab.c    Sat Oct 27 09:34:48 1990
  1617. ***************
  1618. *** 16,21 ****
  1619. --- 16,34 ----
  1620.    * along with this program; if not, write to the Free Software
  1621.    * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1622.    */
  1623. + /*
  1624. +  * MS-DOS port (c) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  1625. +  * This port is also distributed under the terms of the
  1626. +  * GNU General Public License as published by the
  1627. +  * Free Software Foundation.
  1628. +  *
  1629. +  * Please note that this file is not identical to the
  1630. +  * original GNU release, you should have received this
  1631. +  * code as patch to the official release.
  1632. +  *
  1633. +  * $Header: e:/gnu/m4/RCS/symtab.c 0.5.1.0 90/09/28 18:36:45 tho Exp $
  1634. +  */
  1635.   
  1636.   /* 
  1637.    * This file handles all the low level work around the symbol table.
  1638. ***************
  1639. *** 31,36 ****
  1640. --- 44,54 ----
  1641.    * The current definition will then always be the first found.
  1642.    */
  1643.   #include "m4.h"
  1644. + #ifdef MSDOS
  1645. + static int hash (char *s);
  1646. + static void free_symbol (struct symbol *sym);
  1647. + #endif /* MSDOS */
  1648.   
  1649.   /* 
  1650.    * Initialise the symbol table, by allocating the necessary storage, and
  1651.