[comp.text.tex] TeX 3.1 and Metafont 2.7 also runs on Atari ST's

ridderbusch.pad@nixdorf.com (Frank Ridderbusch, PXD-S4) (11/20/90)

Hallo TeXperts and TeXnicians.

In TeXhax digest 90 Karl Berry announced, that he had released web2c
version 5.8a (that's TeX 3.1 + Metafont 2.7). This version also works
for the Atari ST with very minor changes. I build the Atari version
with a GNU cross compiler on my local UN*X box. I don't know, if all
files will compile on every ST (due to lack of memory); I recompiled
only two or three files on my ST, which is equipped with 2,5 MB.
People with 4 MB should have no problems at all. In every case, the
conversion from WEB to C should be done a UN*X system.

You have to build a normal sized TeX and Metafont. Metafont
additionally requires to decrease some constants. The resulting object
have the following sizes.

tex/initex:
	text size	202840
	data size	1228
	bss size	1125404
	symbol size	16954
	File is relocatable
tex/virtex:
	text size	187828
	data size	1228
	bss size	681552
	symbol size	16548
	File is relocatable
mf/inimf:
	text size	201992
	data size	1268
	bss size	291232
	symbol size	16660
	File is relocatable
mf/virmf:
	text size	194020
	data size	1268
	bss size	291228
	symbol size	16562
	File is relocatable

I used the GNU C library from J.R. Bammi and E.R.Smith (thanks to both
of them for their good work) with patchlevel 58. The required getl()
routine in the library contains a bug, because a variable is anded
with 0xff instead with 0xffff. The following is the correct version.

long getl(fp)
register FILE *fp;
{
	register long n, c;
	if((c = getw(fp)) == EOF)
		return(EOF);
	n = (c << 16);
	if((c = getw(fp)) == EOF)
		return(EOF);
	n |= (c & 0xFFFF);  	/* the original contained 0xff */
	return(n);
}

Following are the contex diffs to the original web2c 5.8a. BTW, you
should be aware of the setting of the UNIXMODE environment variable.
I've set it, so that all path specifications are given with a device
prefix (/dev/F/tex or /dev/D/metafont/mfinputs/cmr) and the default
open mode is binary.

And now have fun.
-------------------- cut here --------------------
*** /tmp/,RCSt1a00206	Tue Nov 20 09:36:05 1990
--- extra.c	Thu Nov 15 11:03:14 1990
***************
*** 666,674 ****
    
    make_c_string (&name);
  
!   if (*name == '/'
!       || (*name == '.' && *(name + 1) == '/')
!       || (*name == '.' && *(name + 1) == '.' && *(name + 2) == '/'))
      ok = READABLE_FILE (name); 
    else
      {
--- 673,684 ----
  
    make_c_string (&name);
  
!   if ((*name == '/' || *name == '\\')
!       || (*name == '.' && (*(name + 1) == '/' || *(name + 1) == '\\'))
!       || (*name == '.' && *(name + 1) == '.' 
! 	  && (*(name + 2) == '/' || *(name + 2) == '\\'))
!       || (((*name >= 'a' && *name <= 'z')
! 	   || (*name >= 'A' && *name <= 'Z')) && *(name + 1) == ':'))
      ok = READABLE_FILE (name);
    else
      {
*** /tmp/,RCSt1a00206	Tue Nov 20 09:36:06 1990
--- fileio.c	Tue Nov 20 08:49:37 1990
***************
*** 86,92 ****
        /* If we found the file in the current directory, don't leave the
           `./' at the beginning of `nameoffile', since it looks dumb when
           TeX says `(./foo.tex ... )', and analogously for Metafont.  */
!       if (nameoffile[1] == '.' && nameoffile[2] == '/')
          {
            unsigned i;
            for (i = 1; nameoffile[i]; i++)
--- 86,93 ----
        /* If we found the file in the current directory, don't leave the
           `./' at the beginning of `nameoffile', since it looks dumb when
           TeX says `(./foo.tex ... )', and analogously for Metafont.  */
!       if (nameoffile[1] == '.' && (nameoffile[2] == '/'
! 				   || nameoffile[2] == '\\'))
          {
            unsigned i;
            for (i = 1; nameoffile[i]; i++)
*** /tmp/,RCSt1a00206	Tue Nov 20 09:36:07 1990
--- main.c	Thu Nov 15 15:17:29 1990
***************
*** 10,15 ****
--- 10,18 ----
  /* Referenced from the Pascal, so not static.  */
  integer argc;
  
+ #ifdef atarist
+ int _stksize = -1L;
+ #endif
  
  /* The entry point for all the programs except TeX and Metafont, which
     have more to do.  We just have to set up the command line.  Pascal's
*** /tmp/,RCSt1a00206	Tue Nov 20 09:36:08 1990
--- texmf.c	Tue Nov 20 08:49:44 1990
***************
*** 60,65 ****
--- 60,69 ----
  
  
  
+ #ifdef atarist
+ int _stksize = -1L;
+ #endif
+ 
  /* The main program, etc.  */
  
  /* What we were invoked as and with.  */
***************
*** 207,213 ****
--- 211,220 ----
  #endif
  
    while (last < bufsize && (i = getc (f)) != EOF && i != '\n') 
+     {
+       if (i == '\r') continue;
        buffer[last++] = i;
+     }
  
    if (i == EOF && last == first)
        return false;
*** /tmp/,RCSt1a00206	Tue Nov 20 09:36:10 1990
--- texmf.h	Mon Nov 19 10:23:18 1990
***************
*** 119,126 ****
--- 119,131 ----
                                           sizeof (x_val), 1, dump_file); }
  #define	undumpint(x)	fread ((char *) &(x), sizeof (x), 1, dump_file)
  #else
+ #ifdef atarist
+ #define	dumpint(x)	(void) putl ((int) (x), dump_file)
+ #define	undumpint(x)	(x) = getl (dump_file)
+ #else
  #define	dumpint(x)	(void) putw ((int) (x), dump_file)
  #define	undumpint(x)	(x) = getw (dump_file)
+ #endif
  #endif
  
*** /tmp/,RCSt1a00228	Tue Nov 20 09:44:11 1990
--- cmf.ch	Mon Nov 19 10:11:30 1990
***************
*** 143,149 ****
  @d file_name_size == FILENAMESIZE {Get value from \.{site.h}.}
  
  @<Constants...@>=
! @!mem_max=60000; {greatest index in \MF's internal |mem| array;
    must be strictly less than |max_halfword|;
    must be equal to |mem_top| in \.{INIMF}, otherwise |>=mem_top|}
  @!max_internal=100; {maximum number of internal quantities}
--- 143,149 ----
  @d file_name_size == FILENAMESIZE {Get value from \.{site.h}.}
  
  @<Constants...@>=
! @!mem_max=30000; {greatest index in \MF's internal |mem| array;
    must be strictly less than |max_halfword|;
    must be equal to |mem_top| in \.{INIMF}, otherwise |>=mem_top|}
  @!max_internal=100; {maximum number of internal quantities}
***************
*** 166,172 ****
    length of \MF's own strings, which is currently about 22000}
  @!move_size=5000; {space for storing moves in a single octant}
  @!max_wiggle=300; {number of autorounded points per cycle}
! @!gf_buf_size=16384; {size of the output buffer, must be a multiple of 8}
  @!pool_name='mf.pool';
    {string of length |file_name_size|; tells where the string pool appears}
  @!path_size=300; {maximum number of knots between breakpoints of a path}
--- 166,172 ----
    length of \MF's own strings, which is currently about 22000}
  @!move_size=5000; {space for storing moves in a single octant}
  @!max_wiggle=300; {number of autorounded points per cycle}
! @!gf_buf_size=4096; {size of the output buffer, must be a multiple of 8}
  @!pool_name='mf.pool';
    {string of length |file_name_size|; tells where the string pool appears}
  @!path_size=300; {maximum number of knots between breakpoints of a path}
***************
*** 177,183 ****
    at least 255 and at most 32510}
  @!max_kerns=500; {maximum number of distinct kern amounts}
  @!max_font_dimen=50; {maximum number of \&{fontdimen} parameters}
! @!mem_top=60000; {largest index in the |mem| array dumped by \.{INIMF};
    must be substantially larger than |mem_min|
    and not greater than |mem_max|}
  @z
--- 177,183 ----
    at least 255 and at most 32510}
  @!max_kerns=500; {maximum number of distinct kern amounts}
  @!max_font_dimen=50; {maximum number of \&{fontdimen} parameters}
! @!mem_top=30000; {largest index in the |mem| array dumped by \.{INIMF};
    must be substantially larger than |mem_min|
    and not greater than |mem_max|}
  @z
-------------------- cut here --------------------
--
MfG/Regards

     /====                          Siemens Nixdorf Informationssysteme AG
    /   Ridderbusch, STO    / ,    Heinz Nixdorf Ring
   /                       /./    4790 Paderborn, West Germany
  /=== /,== ,===/  /,==,  //     Tel.: (+49) 5251/104685
 /    //   /   /  //   / / \    NERV:ridderbusch.pad
/    /     `==/\ /    / /   \  BIX:fridder   BTX:0525467066-0001
UUCP: !USA:  ridderbusch.pad@nixdorf.de
       USA:  ridderbusch.pad@nixdorf.com