[comp.sys.atari.st] String.c

RDROYA01@ULKYVX.BITNET (Robert Royar) (05/27/87)

This is a repost.  The file I sent two weeks ago never got through.  Could
someone on BITNET send me a message to RDROYA01@ULKYVX detailing an address
path to comp.sys.atari.st using bitnet or arpanet gateways?

The routines in this file serve three purposes.  They give Alcyon programmers
who don't need all of the GEMLIB startup stuff or other baggage some useful
string routines.  Many are in GEMLIB already, but you can use these in very
small TOS programs, such as auto folder programs.  The second purpose is to
provide the additional routines strpos, strrpos, strpbrk, strrpbrk, strscn,
and strcscn which are not part of the Alcyon distribution.  The last purpose
is to fix a bug in the Atari/DRI index strchr routine.  As written in the
startup.s file, it does not return a pointer to the end of string when given
the following:
index("hello",'\0');
Harbison and Steele say that index/strchr should return a pointer to the
NULL at the end of "hello" rather than a NULL pointer in this case.  The bug
was added by DRI and perpetuated by Atari.  The Alcyon library's versions of
strchr and strrchr both return pointers to the NULL at the end of "hello"
when given the input above.  I wonder if Atari can spell hermeneutics?

And now, two questions.

1.  Does anyone have the proper definition of the __fds structure that the
Alcyon file ops use for each file?  I know there is a definition in OSIF.H,
but it refers to CP/M specific stuff like user numbers and passwords which
don't seem to correspond to anything under GEM.  Under the CP/M system you
can get at the low level file handle for streams by working with the fds
(note that fileno(fp) != file handle of the file).  Note also that the Atari
written low level C open routine fails to check for the file type (i.e. RO
RW).  If you've used the stack a bit and try to open a RO file for reading,
the open will fail, simply because xopen fails to push the mode onto the
stack.  It would be relatively easy to replace xopen knowing the real __fds
structure, a lot easier than rewriting the entire stream package.

2.  Does anyone have a TOS-based font loader?  I'd like something that will
reset the default font and will allow the new font to be used by TOS-based
programs.  Is this impossible?  It seems all that would be needed would be
to load a new font, reset the old pointers (via linea), and Ptermres().

Anyway here's the string manipulation code:

                           O O
                            x (cut here)
---------------------------/-\------------------------------------------


#include <string.h>

/* return length of str excluding the NULL */
strlen(str)
register char *str;
{
        register int len;

        len = 0;
        while(*str)
                {
                ++str;
                ++len;
                }
        return(len);
}

/* append str2 to str1, returning the beginning of str1 */
char *
strcat(str1,str2)
register char *str1, *str2;
{
        register char *sptr;

        sptr = str1;
        while(*str1)
                ++str1;
        while(*str2)
                *str1++ = *str2++;
        *str1 = '\0';
        return(sptr);
}

/* copy str2 to str1, returning the beginning of str1 */
char *
strcpy(dest,src)
register char *dest, *src;
{
        register char *sptr;

        sptr = dest;
        while(*src)
                *dest++ = *src++;
        *dest = '\0';
        return(sptr);
}

/* is str1 == str2? 0==yes; -#== str2 > str1; +#== str1 > str2 */
strcmp(str1,str2)
register char *str1, *str2;
{

        while(*str1)
                {
                if(*str1 != *str2)
                        return(*str1-*str2);
                ++str1;
                ++str2;
                }
        if(*str2=='\0')
                return(0);
        else
                return(-1);
}

/* not in GEMLIB */
/* index 0 position of first occurence c in string str. -1 if c is not in str */
strpos(str, c)
register char *str;
register char c;
{
        register int pos;

        pos = 0;
        while(*str)
                {
                if (*str++ == c)
                        return(pos);
                ++pos;
                }
        if (c == '\0')
                return(pos);
        else
                return(-1);
}

/* Not in GEMLIB */
/* index 0 of position of last occurence of c in str.  -1 if c not in str */
strrpos(str, c)
register char *str;
register char c;
{
        register int pos;

        pos = 0;
        while(*str)
                {
                ++str;
                ++pos;
                }
        if (c == '\0')
                return(pos);
        while(pos >= 0)
                {
                if (*str-- == c)
                        return(pos);
                --pos;
                }
        return(-1);
}

/* Not in GEMLIB */
/* find first occurence (in str) of one of the characters in set.  Return
 * a pointer to it or NULL on failure.
 */
char *
strpbrk(str, set)
register char *str, *set;
{
        register char *ptr;

        while(*set)
                if ((ptr=index(str,*set++))!=NULL)
                        return(ptr);
        return(NULL);
}

/* Not in GEMLIB */
/* same as strpbrk, but find last occurence */
char *
strrpbrk(str, set)
register char *str, *set;
{
        register char *rptr;

        while(*set)
                if ((rptr=rindex(str,*set++))!=NULL)
                        return(rptr);
        return(NULL);
}

/* Not in GEMLIB */
/* search str for the first occurence of a character not in set.  Return
 * the position of the last character in str in the set, or strlen if
 * all of set are in str.
 */
strspn(str, set)
register char *str, *set;
{
        register char *ptr;
        /* set is empty so the first char of str will not be in it */
        if (*set == '\0')
                return(0);
        ptr = str;
        while(*str)
                {
                if (index(set,*str)==NULL)
                        return(strpos(ptr,*str));
                ++str;
                }
        return(strlen(ptr));
}

/* Not in GEMLIB */
/* find first occurence of char in str that is included in set. Return
 * its position.
 */
strcspn(str, set)
register char *str, *set;
{
        register char *ptr;

        ptr = str;
        while(*str)
                {
                if (index(set,*str))
                        return(strpos(ptr,*str));
                ++str;
                }
        return(strlen(ptr));
}

/* return pointer to last occurence of c in str.  (AKA strrchr). */
char *
rindex(str, c)
register char *str;
register char c;
{
        register char *sptr;

        sptr = str;
        while(*sptr)
                ++sptr;
        if (c == '\0')
                return(sptr);
        while(str != sptr)
                if (*sptr-- == c)
                        return(++sptr);
        return(NULL);
}

/* strcat with max */
char *
strncat(str1,str2,len)
register char *str1, *str2;
register int len;
{
        register char *sptr;

        if (len <= 0)
                return(str1);
        sptr = str1;
        while(*sptr)
                ++sptr;
        while(*str2)
                {
                *sptr++ = *str2++;
                if (!--len)
                        break;
                }
        *sptr = '\0';
        return(str1);
}

/* strcpy with MAX */
char *
strncpy(dest,src,len)
register char *dest, *src;
register int len;
{
        register char *sptr;

        if (len <= 0)
                return(dest);
        sptr = dest;
        while(*src)
                {
                *sptr++ = *src++;
                if (!--len)
                        break;
                }
        if (len)
                while(len-- > 0)
                        *sptr++ = '\0';
        return(dest);
}

/* compare len chars of str1 to len chars of str2 */
strncmp(str1,str2,len)
register char *str1, *str2;
register int len;
{

        if (len <= 0)
                return(0);
        while(*str1)
                {
                if(*str1 != *str2)
                        return(*str1-*str2);
                ++str1;
                ++str2;
                if (!--len)
                        break;
                }
        if (!len)
                return(0);
        if(*str2=='\0')
                return(0);
        else
                return(-1);
}

/*      As supplied the index function does not return a pointer to
*       the EOS when the requested character (in d0) was a '\0'.
*       Harbison and Steele (p. 262) say that a pointer to the NULL
*       should return if the indexed character is a '\0'.  Replace
*       the index routine in your startup file with this routine.
*       Index function to find out if a particular character is in a string.
*
        .globl  _index
        .globl  _strchr
_index:
_strchr:
        move.l  4(a7),a0        * a0 -> String
        move.w  8(a7),d0        * D0 = desired character
xindex: tst.b   (a0)            * EOS?
        bne     notend          * No, continue to look
        tst.b   d0              * Are we looking for the NULL ?
        bne     out2            * Go around
        move.l  a0,d0           * Load D0 with end of string
        rts
out2:   clr.l   d0              * Not found
        rts                     * Quit
notend: cmp.b   (a0)+,d0        * check for character
        bne     xindex          *
        move.l  a0,d0           * Found it
        subq.l  #1,d0           * set return pointer
        rts

*/

john@viper.UUCP (06/07/87)

In <8705271729.AA20883@ucbvax.Berkeley.EDU> 
RDROYA01@ULKYVX.BITNET (Robert Royar) asks:
 >
 >2.  Does anyone have a TOS-based font loader?  I'd like something that will
 >reset the default font and will allow the new font to be used by TOS-based
 >programs.  Is this impossible?  It seems all that would be needed would be
 >to load a new font, reset the old pointers (via linea), and Ptrmres().
 >

  Yes!  A friend of mine wrote up just exactly what you asked for with
the additional feature that you could auto folder load an alternate
character set.  His program works only with Degas .FNT files for
fonts and allows you to specify fewer scan-lines per character if
you wished which allows using alternate 50/40/etc line character fonts
and the version of Emacs we hacked allows using the extended lines for
editing.  (Using a Courier font to edit C code looks almost exactly
like the font used in K&R... :)

  I'll ask him for permission to post to the net.  If you're in a hurry
you could check CI$ in ataridev or atari16 for FONTLOAD.ARC which contains
a slightly older, but functional version.  Let me know if you want it.
If I get enough interest, I'll post it to comp.sys.atari.st....

  There is also a desk accessory called FONTTRIX which changes the 
default character set for all applications (fontload only changes 
the character set for TOS/TTP applications) but I've only seen it
used, I have no idea who wrote it, if it's PD or anything else about 
it....

--- 
John Stanley (john@viper.UUCP)
Software Consultant - DynaSoft Systems
UUCP: ...{amdahl,ihnp4,rutgers}!{meccts,dayton}!viper!john

bammi@cwruecmp.UUCP (06/12/87)

In article <1102@viper.Lynx.MN.ORG> john@viper.UUCP (John Stanley) writes:
>In <8705271729.AA20883@ucbvax.Berkeley.EDU> 
>RDROYA01@ULKYVX.BITNET (Robert Royar) asks:
> >
> >2.  Does anyone have a TOS-based font loader?  I'd like something that will
> >reset the default font and will allow the new font to be used by TOS-based
> >programs.  Is this impossible?  It seems all that would be needed would be
> >to load a new font, reset the old pointers (via linea), and Ptrmres().
> >

	Here is one that i did (in three parts). It lets you load and use
a Gdos font with Bconout()/Putchar etc. The Gdos font has to be mono-spaced
and 8 wide. It can be any height. A sample Gdos font is included.
BTW - in case anyone is interested, i wrote a little vfont (see man 5 vfont)
to Gdos font converter (handles fixed width fonts only at present time), and
will be glad to mail it to anyone interested. Using this, and another
PD Mac utility that goes Mac->vfont, you can get all the nice PD Mac
fonts in Gdos format. It handles Sun's fixed width fonts too.

usenet: {decvax,cbosgd,sun}!cwruecmp!bammi	jwahar r. bammi
csnet:       bammi@cwru.edu   <---------Please note change of address
arpa:        bammi@cwru.edu   <---------Please note change of address
compuServe:  71515,155
--

------------------cut here ------- TOS font switcher part 1 of 3 ----------
#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	afona.uue
#	alglobal.c
#	compiler.h
#	init.c
#	makefile
#	makefile.alc
#	switchf.c
# This archive created: Fri Jun 12 01:44:15 1987
# By:	Jwahar R. Bammi(Case Western Reserve University)
#  Uucp:	 {decvax,sun,cbosgd}!cwruecmp!bammi
# Csnet:	 bammi@cwru.edu
#  Arpa:	 bammi@cwru.edu
#
export PATH; PATH=/bin:$PATH
echo shar: extracting "'afona.uue'" '(2646 characters)'
if test -f 'afona.uue'
then
	echo shar: over-writing existing file "'afona.uue'"
fi
sed 's/^X//' << \SHAR_EOF > 'afona.uue'
Xtable
X !"#$%&'()*+,-./0123456789:;<=>?
X@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
Xbegin 644 afont.fnt
XM6@ 0 $%&3TY44RXQ-                               ( !^ !  #0 *a
XM  (    (  @  0 !  $  0!55555  !8    6    !@!  !@ !          a
XM"  0 !@ (  H #  . !  $@ 4 !8 &  : !P '@ @ "( )  F "@ *@ L "Xa
XM ,  R #0 -@ X #H /  ^    0@!$ $8 2 !* $P 3@!0 %( 5 !6 %@ 6@!a
XM< %X 8 !B &0 9@!H &H ; !N '  <@!T '8 > !Z 'P ?@!  (( A "& (@a
XM B@", (X D "2 )0 E@"8 )H G "> *  H@"D *8 J "J *P K@"P +( M "a
XMV +@ N@"\ +X @                                              a
XM                                                            a
XM                           (    !"        $                 a
XM                                        /$ \                a
XM                       ."'     ()"0(,!@$"!        (<"#P<##X,a
XM?CP\   " $ \&                                   (" $   0 &  a
XM!@ . & (!& X         !         0" @    ()"0^2"0$$ @(      (Ba
XM&$(B%" P0D)&   $ "!B)#A\&GQ_?QIW/C]S<(.'''X<?#I_YW?C=W=^(" $a
XM"  0 "   @ 1 " (!" (         !         0" @R   ()"1"22 ($ @(a
XM"     0B*$("%" @ D)"   ( !!"0@@B)B(A(28B" 0B($)")B$F(D9)0B)!a
XM(B)"(! $%  ( "   @ 0 "   " (         !         0" A:   ()'Y a
XM2B 0( 1K"     0B" (")"! !$)"&!@0  @"3A0B0B$@($(B" 0D($9B0B%"a
XM(D))0B))%"($(! $(@ $'"P:&AQ\&RPX/"8(DFP<;!MN/GQF=^-W=WX0" A,a
XM   ( "0P-!  ( 0^"     @B" 0<)#Q<!#Q&&!@@?@0$4A0B0"$D)$ B" 0Ha
XM(&920B%"(C (0A1)%!0(( @$    (C(F)B80)C((!"0(;3(B,B8Q0A B(D$Ba
XM(D00" @    ( "0,""D ( 0<?P!^  @B" @"1 )B"$(Z  !   ((4B(\0"$\a
XM/$ ^" 0X(&I20CY"/ P(0A15"!00( @$     B%"0D(00B((!"@(22)!(4(@a
XM0! B(DD4(@A@  8      'X"%D8 ( 0V"    ! B"! "?@)""$("   @?@08a
XM3"(B0"$D)$<B"$0D(%I*0B!") ((0A0V% @@( 0$    /B% 0GX00B((!#@(a
XM22)!(4(@/! B%%T(%! 0" @      "1"*40 ( 0B"    ! B""!"!$)"$$($a
XM   0  @ 0#XA02$@($(B"$0D(5)*0B!"(D((0@@B% A"( 0$    0B% 0D 0a
XM0B((!"0(22)!(4(@ A B%#84%" 0" @    ( "1B24X $ @ "!@ &" B"$)Ba
XM!&)B$$(,&!@( !  (D$A(B(A("(B"$0B(4)&9"!D(F(() @B(@A"( ($    a
XM1C(B)B(0)B((!"((22(B,B8@0A(F""(B"$(0" @    ( "1<"3D $ @  !@ a
XM&" </GX\#CP\$#PP&!@$ " 8'.-^''Q_>!QW/CAS?^?B.'@X<UP^& @B=SY^a
XM( ($    .VP<&QQ\&G<^!&<^27<<+!IX? P;"")W"'X0" @        (!@  a
XM"!    @  $                @" $                         0    a
XM        ( $$ '\          @  !       ( (         $  0" @     a
XM   (    !"   !                   !                          a
XM   L            /  \            !   "       ( (         $  .a
XM"'                   "                   "                  a
XM           #                            .   <       < <     a
XM    >                                                       a
XM                                                            a
X1                      H a
X a
Xend
SHAR_EOF
if test 2646 -ne "`wc -c 'afona.uue'`"
then
	echo shar: error transmitting "'afona.uue'" '(should have been 2646 characters)'
fi
echo shar: extracting "'alglobal.c'" '(920 characters)'
if test -f 'alglobal.c'
then
	echo shar: over-writing existing file "'alglobal.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'alglobal.c'
X
X		/***********************************************\
X		*						*
X		*       	  alglobal.c			*
X		*	Global variables for C interface	*
X		*     declared here. Extern eveywhere else.     *
X		*						*
X		*	J.R. Bammi				*
X		*	  decvax!cwruecmp!bammi			*
X		*	  bammi%cwru.edu.ARPA			*
X		*	  bammi@cwru.edi.CSNET			*
X		*	  CIS: 71515,155			*
X		*						*
X		\***********************************************/
X
X
X#define ALGLOBAL
X
X#include "aline.h"
X
X
XLINEA *aline;	     /* Pointer to line a parameter block returned by init */
X
XNLINEA *naline;	     /* Pointer to line a parameters at negative offsets  */
X
XFONT  **fonts;       /* Array of pointers to the three system font headers */
X		     /* returned by init (in register A1)    	           */
X
XWORD  (**funcs)();    /* Array of pointers to the 15 line a functions      */
X		      /* returned by init (in register A2)	           */
X		      /* only valid in ROM'ed TOS		           */
SHAR_EOF
if test 920 -ne "`wc -c 'alglobal.c'`"
then
	echo shar: error transmitting "'alglobal.c'" '(should have been 920 characters)'
fi
echo shar: extracting "'compiler.h'" '(1647 characters)'
if test -f 'compiler.h'
then
	echo shar: over-writing existing file "'compiler.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'compiler.h'
X
X		/***********************************************\
X		*						*
X		*       	  compiler.h			*
X		*	Compiler dependent defines		*
X		*						*
X		*	J.R. Bammi				*
X		*	  decvax!cwruecmp!bammi			*
X		*	  bammi@cwru.edu.ARPA			*
X		*	  bammi@cwru.edu.CSNET			*
X		*	  CIS: 71515,155			*
X		*						*
X		\***********************************************/
X
X	/*
X	 * Assumptions:
X	 *	Type 'long' == 32 bit integer
X	 *	Type 'char' ==  8 bit integer
X	 *
X	 * Compiler Dependant defines:
X	 *	Type 'WORD'  == 16 bit   signed int
X	 *	Type 'UWORD' == 16 bit unsigned int
X	 *	Type 'VOID'  == nothing
X	 */
X
X/*
X * Define one of the following
X */
X/* #define ALCYON  */
X/* #define MEGAMAX */
X/* #define LATTICE */
X/* #define MWC     */
X
X
X/************************** The rest 'should' be  ok **************************/
X
X
X/*
X * Alcyon C
X */
X#ifdef ALCYON
X
Xtypedef int		WORD;
Xtypedef unsigned int	UWORD;
X#define VOID		void	/* can't typedef void in alcyon (bug) */
X
X#endif /* ALCYON */
X
X
X/*
X * Megamax C
X */
X#ifdef MEGAMAX
X
Xtypedef int		WORD;
Xtypedef unsigned 	UWORD;		/* Check this */
Xtypedef int		VOID;		/* yech !!    */
X
X#endif /* MEGAMAX */
X
X/*
X * Lattice C
X *	I don't have a copy so ......
X */
X#ifdef LATTICE
X
Xtypedef short		WORD;
Xtypedef unsigned short	UWORD;	/* Is'nt lattice braindamaged like Megamax,
X				 * in that it defines unsigned as a type 
X				 * instead of a type modifier ?? if so
X				 * unsigned short is incorrect, and i 
X				 * don't know what it should be!
X				 */
Xtypedef void		VOID;	/* what should this be ?? */
X
X#endif /* LATTICE */
X
X/*
X * Mark Williams C
X */
X#ifdef MWC
X
Xtypedef int		WORD;
Xtypedef unsigned int	UWORD;
Xtypedef void		VOID;
X
X#endif	/* MWC */
SHAR_EOF
if test 1647 -ne "`wc -c 'compiler.h'`"
then
	echo shar: error transmitting "'compiler.h'" '(should have been 1647 characters)'
fi
echo shar: extracting "'init.c'" '(1352 characters)'
if test -f 'init.c'
then
	echo shar: over-writing existing file "'init.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'init.c'
X		/***********************************************\
X		*						*
X		*       	     init.h			*
X		*	Common file for C interface		*
X		*	to low level Line A calls		*
X		*						*
X		*	J.R. Bammi				*
X		*	  decvax!cwruecmp!bammi			*
X		*	  bammi%cwru.edu.CSNET			*
X		*	  bammi@cwru.edu.ARPA			*
X		*	  CIS: 71515,155			*
X		*						*
X		\***********************************************/
X
X#include "aline.h"
X
X		/*  A L C Y O N  */
X#ifdef ALCYON
XVOID init_aline()
X{
X	asm(".dc.w    $a000");		/* Line A Init                  */
X	asm("move.l    a0, _aline");	/* Address of param block       */
X	asm("move.l    a1, _fonts");	/* Array of system font headers */
X	asm("move.l    a2, _funcs");	/* Pointers to line a functions */
X
X	naline = ((NLINEA *)aline) - 1; /* Pointer to negative offset parms */
X
X}
X#endif /* ALCYON */
X
X		/*  M A R K   W I L L I A M S  */
X#ifdef MWC
X#include <linea.h>
X
XVOID init_aline()
X{
X	linea0();
X	aline = (LINEA *)(la_init.li_a0);
X	fonts = (FONT **)(la_init.li_a1);
X	funcs = la_init.li_a2;
X	naline = ((NLINEA *)aline) - 1;
X}
X
X#endif /* MWC */
X
X	
X		/*  M E G A M A X  */
X		/* CAUTION --- NOT TESTED */
X#ifdef MEGAMAX
Xinit_aline()
X{
X	asm
X	{
X		dc.w	 0XA000
X		movea.l  A0,aline
X		movea.l  A1,fonts
X		movea.l  A2,funcs
X	}
X	naline = ((NLINEA *)aline) - 1;
X}
X#endif /* MEGAMAX */
X
X#ifdef LATTICE
X	/* Someone fill this in */
X#endif /* LATTICE */
X
X/** EOF **/
SHAR_EOF
if test 1352 -ne "`wc -c 'init.c'`"
then
	echo shar: error transmitting "'init.c'" '(should have been 1352 characters)'
fi
echo shar: extracting "'makefile'" '(244 characters)'
if test -f 'makefile'
then
	echo shar: over-writing existing file "'makefile'"
fi
sed 's/^X//' << \SHAR_EOF > 'makefile'
X#
X# Test out switchf.c
X#	MWC version
X#
XCFLAGS = -O -V -DMWC -DTEST
X
Xswitchf.prg : switchf.o alglobal.o init.o
X	cc -o switchf.prg switchf.o init.o alglobal.o -s -V -x
X
Xswitchf.o alglobal.o init.o : aline.h compiler.h
X
Xclean:
X	rm *.o switchf.prg
SHAR_EOF
if test 244 -ne "`wc -c 'makefile'`"
then
	echo shar: error transmitting "'makefile'" '(should have been 244 characters)'
fi
echo shar: extracting "'makefile.alc'" '(495 characters)'
if test -f 'makefile.alc'
then
	echo shar: over-writing existing file "'makefile.alc'"
fi
sed 's/^X//' << \SHAR_EOF > 'makefile.alc'
X#
X# Test out switchf.c
X#	Alcyon version (V2.14 required)
X#	for 'make' as distributed to this net.
X#
X# Include directory
XINCLUDE = c:\include
X# Library
XLIB = c:\lib
X# LINKER
XLINKER = c:\bin\lo68.prg
X
XCPFLAGS = -i $(INCLUDE)\ -DALCYON -DTEST
X
Xswitchf.prg : switchf.o alglobal.o init.o
X	$(LINKER) -r -s -o switchf.68k $(LIB)\gemstart.o switchf.o \
Xalglobal.o init.o $(LIB)\gemlib $(LIB)\libf
X	$(RELMOD) switchf
X
Xswitchf.o alglobal.o init.o : aline.h compiler.h
X
Xclean:
X	$(RM) *.o *.68k switchf.prg
SHAR_EOF
if test 495 -ne "`wc -c 'makefile.alc'`"
then
	echo shar: error transmitting "'makefile.alc'" '(should have been 495 characters)'
fi
echo shar: extracting "'switchf.c'" '(5497 characters)'
if test -f 'switchf.c'
then
	echo shar: over-writing existing file "'switchf.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'switchf.c'
X
X		/***************************************\
X		*					*
X		*	switchf.c			*
X		*	 Gdos-less Gdos font switcher	*
X		*	 soon to appear in Gulam, Xmdm  *
X		*	 and Zmdm			*
X		*					*
X		*		Jwahar R. Bammi		*
X		*  {decvax,cbosgd,sun}!cwruecmp!bammi   *
X		*  CSnet,Arpa: bammi@cwru.edu		*
X		*  CIS:        71515,155		*
X		*					*
X		\***************************************/
X
X
X#include <stdio.h>
X#include "aline.h"
X
X#define SCREENFONT 2	/* index of 8x16 monochrome system default font	*/
X
X	/* Possible Errors */
X#define ENO_ERROR	0	/* No error				*/
X#define EOPEN_FAIL	1	/* Error opening font file		*/
X#define EHEAD_READ	2	/* Error reading font header		*/
X#define EFORM_READ	3	/* Error reading font form		*/
X#define EOFF_READ	4	/* Error reading offset table		*/
X#define EMEMORY		5	/* Outa memory				*/
X
X	/* Globals */
XFONT *system_font;	/* pointer to default system font */
Xint  ferr;		/* error # if any		  */
X
X
X/*
X * Init aline & get system font pointer
X */
Xinit()
X{
X	init_aline();
X	system_font = fonts[SCREENFONT];	/* save it */
X}
X
X/*
X * Switch to given Gdos font (pointer)
X * Acknowledgements to 
X *	Martin Minow
X *		minow%thundr.dec@decwrl.dec.com
X *		decvax!minow
X * for discovering the info in the routine below. thanks!
X */
Xswitch_font(fp)
XFONT *fp;
X{
X	/* See aline.h for description of fields */
X
X	naline->V_CEL_HT = fp->form_height;
X	naline->V_CEL_WR = aline->VWRAP * fp->form_height;
X	naline->V_CEL_MY = (naline->V_Y_MAX / fp->form_height) - 1;
X	naline->V_CEL_MX = (naline->V_X_MAX / fp->max_cell_width) - 1;
X	naline->V_FNT_WR = fp->form_width;
X	naline->V_FNT_ST = fp->first_ade;
X	naline->V_FNT_ND = fp->last_ade;
X	naline->V_OFF_AD = fp->off_table;
X	naline->V_FNT_AD =  fp->dat_table;
X}
X
X/*
X * Swap bytes of a word
X */
Xstatic VOID Swap(p)
Xunsigned char p[];
X{
X	register unsigned char t;
X
X	t = p[0];
X	p[0] = p[1];
X	p[1] = t;
X
X}
X
X
X/*
X * Swap all entries in Intel format to MC68K format WORDs
X *
X */
Xstatic VOID fix_font(font)
Xregister FONT *font;
X{
X	
X	Swap(&font->font_id);
X	Swap(&font->size);
X	Swap(&font->first_ade);
X	Swap(&font->last_ade);
X	Swap(&font->top);
X	Swap(&font->ascent);
X	Swap(&font->half);
X	Swap(&font->descent);
X	Swap(&font->bottom);
X	Swap(&font->max_char_width);
X	Swap(&font->max_cell_width);
X	Swap(&font->left_offset);
X	Swap(&font->right_offset);
X	Swap(&font->thicken);
X	Swap(&font->ul_size);
X	Swap(&font->lighten);
X	Swap(&font->skew);
X	Swap(&font->flags);
X	Swap(&font->form_width);
X	Swap(&font->form_height);
X
X	/* init only */
X	font->h_table = (char *)NULL;
X	font->next_font = (FONT *)NULL;
X}
X
X
X
X/*
X * Load a font, return font pointer
X * On error: ferr contains error # and pointer returned is NULL
X */
XFONT *load_font(name)
Xchar *name;
X{
X	register WORD i,j;
X	register FONT *font;
X	WORD *otable;
X	WORD ndata, nchar;
X	FILE *fp;
X	extern char *malloc();
X#ifdef ALCYON
X	extern FILE *fopenb();
X#else
X	extern FILE *fopen();
X#endif
X
X	ferr = ENO_ERROR;
X
X	/* open it up */
X#ifdef ALCYON
X	if((fp = fopenb(name, "r")) == (FILE *)NULL)
X#else
X	if((fp = fopen(name, "rb")) == (FILE *)NULL)
X#endif
X	{
X		ferr = EOPEN_FAIL;
X		return (FONT *)NULL;
X	}
X
X	/* alloc font header */
X	if((font = (FONT *)malloc(sizeof(FONT))) == (FONT *)NULL)
X	{
X		ferr = EMEMORY;
X		return (FONT *)NULL;
X	}
X
X	if(fread(font, sizeof(FONT), 1, fp) != 1)
X	{
X		ferr = EHEAD_READ;
X		return (FONT *)NULL;
X	}
X
X	/* Fix WORD fields and init */
X	fix_font(font);
X
X	/* alloc offset table */		
X	nchar = font->last_ade - font->first_ade + 1;	/* # of chars in font */
X	/* all we are doing here is if first_ade is > 30, we are makeing
X	 * first_ade = 0, by adding 30 entries before first_ade and
X	 * moving first_ade to 0, otherwise Bconout([2,5],X) will not
X	 * work (they bomb) - Yet Another Undocumented 'Feature' :-)
X	 */
X
X	/* add one for the last offset */
X	i = (((nchar+30) < 256)? nchar+30 : nchar + (256 - nchar)) + 1;
X	if((font->off_table = (WORD *)malloc(i*2)) == (WORD *)NULL)
X	{
X		ferr = EMEMORY;
X		return (FONT *)NULL;
X	}
X	/* init it */
X	for(j = 0; j < i; j++)
X		font->off_table[j] = 0;
X
X	otable = ((nchar+30) < 256)? &font->off_table[30] :
X			 &font->off_table[(256-nchar)];
X	font->first_ade = 0;
X	
X	/* alloc font form table */
X	ndata = font->form_width * font->form_height;	/* bytes in font form */
X	if((font->dat_table = malloc(ndata)) == (char *)NULL)
X	{
X		ferr = EMEMORY;
X		return (FONT *)NULL;
X	}
X
X	/* read in offset table */
X	if(fread(otable, 2, nchar, fp) != nchar)
X	{
X		ferr = EOFF_READ;
X		return (FONT *)NULL;
X	}
X	/* swap WORDs */
X	for(i = 0; i <= nchar; i++)
X		Swap(&otable[i]);
X
X	/* read in font form */
X	if(fread(font->dat_table, 1, ndata, fp) != ndata)
X	{
X		ferr = EFORM_READ;
X		return (FONT *)NULL;
X	}
X	fclose(fp);
X
X	/* and finally return the pointer to font header */
X	return font;
X}
X
X/*
X * free up a loaded font
X */
XVOID free_font(font)
XFONT *font;
X{
X	free(font->dat_table);
X	free(font->off_table);
X	free(font);
X}
X
X#ifdef TEST
X/*
X * load and show fonts
X *
X */
Xmain(argc, argv)
XWORD argc;
Xchar **argv;
X{
X	register WORD i, j;
X	register FONT *font_ptr;
X	extern FONT *load_font();
X
X	if(argc < 2)
X	{
X		fprintf(stderr,"Usage: switchf fontfiles ....\n");
X		exit(1);
X	}
X
X	init();
X	while(--argc > 0)
X	{
X		if((font_ptr = load_font(*++argv)) == (FONT *)NULL)
X			fprintf(stderr,"Trouble Loading %s\n", *argv);
X		else
X		{
X			fprintf(stderr,"\n%s:\n", *argv);
X			switch_font(font_ptr);
X			for(j = 0, i = ' '; i < font_ptr->last_ade; i++)
X			{
X				putchar(i);
X				if((++j%8) == 0)
X					putchar('\n');
X				else
X					putchar('\t');
X			}
X			putchar('\n');
X			free(font_ptr);
X			switch_font(system_font);
X		}
X	}
X	exit(0);
X}
X
X#endif
SHAR_EOF
if test 5497 -ne "`wc -c 'switchf.c'`"
then
	echo shar: error transmitting "'switchf.c'" '(should have been 5497 characters)'
fi
#	End of shell archive
exit 0
-- 
usenet: {decvax,cbosgd,sun}!cwruecmp!bammi	jwahar r. bammi
csnet:       bammi@cwru.edu   <---------Please note change of address
arpa:        bammi@cwru.edu   <---------Please note change of address
compuServe:  71515,155

bammi@cwruecmp.UUCP (06/12/87)

-------------cut here------TOS font switcher part 2 of 3-------------------
#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	aline.h
# This archive created: Fri Jun 12 01:44:20 1987
# By:	Jwahar R. Bammi(Case Western Reserve University)
#  Uucp:	 {decvax,sun,cbosgd}!cwruecmp!bammi
# Csnet:	 bammi@cwru.edu
#  Arpa:	 bammi@cwru.edu
#
export PATH; PATH=/bin:$PATH
echo shar: extracting "'aline.h'" '(26615 characters)'
if test -f 'aline.h'
then
	echo shar: over-writing existing file "'aline.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'aline.h'
X
X		/***********************************************\
X		*						*
X		*       	     aline.h			*
X		*	Common include file for C interface	*
X		*	to low level Line A calls		*
X		*						*
X		*	J.R. Bammi				*
X		*	  decvax!cwruecmp!bammi			*
X		*	  bammi%cwru.edu.CSNET			*
X		*	  bammi@cwru.edu.ARPA			*
X		*	  CIS: 71515,155			*
X		*						*
X		\***********************************************/
X
X#include "compiler.h"		/* Compiler dependent defines	*/
X
X
X/*****************************************************************************\
X*		                                                              *
X*                                 Defines                                     *
X*									      *
X\*****************************************************************************/
X
X/*
X *  Object colors (default pallette)
X *
X */
X#define WHITE    0
X#define BLACK    1
X#define RED      2
X#define GREEN    3
X#define BLUE     4
X#define CYAN     5
X#define YELLOW   6
X#define MAGENTA  7
X#define LWHITE   8
X#define LBLACK   9
X#define LRED     10
X#define LGREEN   11
X#define LBLUE    12
X#define LCYAN    13
X#define LYELLOW  14
X#define LMAGENTA 15
X
X
X/* 
X * Vdi writing modes
X *
X */
X#define MD_REPLACE 1
X#define MD_TRANS   2
X#define MD_XOR     3
X#define MD_ERASE   4
X
X
X/*
X * Raster Op Codes
X *
X */
X#define ALL_WHITE  0
X#define S_AND_D    1
X#define	S_AND_NOTD 2
X#define S_ONLY     3
X#define NOTS_AND_D 4
X#define	D_ONLY     5
X#define S_XOR_D    6
X#define S_OR_D     7
X#define	NOT_SORD   8
X#define	NOT_SXORD  9
X#define D_INVERT  10
X#define	NOT_D     11
X#define	S_OR_NOTD 12
X#define NOTS_OR_D 13
X#define	NOT_SANDD 14
X#define ALL_BLACK 15
X
X/*
X * Sprite formats
X *
X */
X#define SP_VDI	    0
X#define SP_XOR	    1
X
X/*
X * Line A Opcodes
X *
X */
X#define	INIT		0
X#define PUTPIXEL	1
X#define GETPIXEL	2
X#define LINE		3
X#define HLINE		4
X#define RECTANGLE	5
X#define FPOLYGON	6
X#define BITBLT		7
X#define TEXTBLT		8
X#define SHOWMOUSE	9
X#define HIDEMOUSE	10
X#define TRANMOUSE	11
X#define USPRITE		12
X#define DSPRITE		13
X#define CPYRASTER	14
X#define FSEEDFILL	15	/* ROM TOS only	*/
X
X
X/*****************************************************************************\
X*		                                                              *
X*                                 Types                                       *
X*									      *
X\*****************************************************************************/
X
X	/*
X	 * Global Variables at negative offsets from the Line A parameter
X	 * block address returned by init. (I have no way of telling if this
X	 * list is complete).
X	 *
X	 */
X/* Name   Offset  Type	Description					     */
X/* --------------------------------------------------------------------------*/
X/* V_Y_MAX    -4   W	Max Y pixel value of the screen			     */
X/* V_STATUS   -6   W	Text Status byte				     */
X/* 			  Bit	Field		Zero		One	     */
X/*			  0	cursor flash    disabled	enabled	     */
X/*			  1	flash state     off		on	     */
X/*			  2	cursor visible  no		yes          */
X/*			  3     end of line     no-wrap		wrap	     */
X/*			  4     inverse video   on              off          */
X/*                        5     cursor saved    false           true	     */
X/* V_OFF_AD  -10   L	Font offset table address			     */
X/* V_X_MAX   -12   W	Max X pixel value				     */
X/* V_FNT_WR  -14   W	Width of Font Form in bytes (see type FONT below)    */
X/* V_FNT_ST  -16   W	First font ASCII code (first_ade)		     */
X/* V_FNT_ND  -18   W	Last  font ASCII code (last_ade )                    */
X/* V_FNT_AD  -22   L	Font Form address				     */
X/*			Mono Spaced, 8 pixels wide and byte aligned, any ht. */
X/* V_CUR_TIM -23   B	Cursor countdown timer				     */
X/* V_CUR_CNT -24   B	Cursor flash interval( in frames)		     */
X/* V_CUR_CY  -26   W	Y cursor position				     */
X/* V_CUR_CX  -28   W	X cursor position				     */
X/* V_CUR_OFF -30   W	Offset from screen base to first cell (bytes)	     */
X/* V_CUR_AD  -34   L	Current cursor address				     */
X/* V_COL_FG  -36   W	Foreground color index				     */
X/* V_COL_BG  -38   W	Background color index				     */
X/* V_CEL_WR  -40   W	Offset to next vertical cell (bytes)		     */
X/* V_CEL_MY  -42   W	Max cells high - 1				     */
X/* V_CEL_MX  -44   W	Max cells across - 1				     */
X/* V_CEL_HT  -46   W	Cell height in pixels (font form's height)	     */
X/* --------------------------------------------------------------------------*/
X
X/*
X * Atari finally named these variables
X * so here they are
X *
X */
Xtypedef struct {
X	WORD	V_CEL_HT;    /* *((WORD  *)((char  *)aline - (char  *)46L)) */
X	WORD	V_CEL_MX;    /* *((WORD  *)((char  *)aline - (char  *)44L)) */
X	WORD	V_CEL_MY;    /* *((WORD  *)((char  *)aline - (char  *)42L)) */
X	WORD	V_CEL_WR;    /* *((WORD  *)((char  *)aline - (char  *)40L)) */
X	WORD	V_COL_BG;    /* *((WORD  *)((char  *)aline - (char  *)38L)) */
X	WORD	V_COL_FG;    /* *((WORD  *)((char  *)aline - (char  *)36L)) */
X	char	*V_CUR_AD;   /* *((char **)((char **)aline - (char **)34L)) */
X	WORD	V_CUR_OFF;   /* *((WORD  *)((char  *)aline - (char  *)30L)) */
X	WORD	V_CUR_CX;    /* *((WORD  *)((char  *)aline - (char  *)28L)) */
X	WORD	V_CUR_CY;    /* *((WORD  *)((char  *)aline - (char  *)26L)) */
X	WORD	V_CUR_CNT;   /* *((char  *)((char  *)aline - (char  *)24L)) */
X/*	char	V_CUR_TIM;    *((char  *)((char  *)aline - (char  *)23L))   */
X	char	**V_FNT_AD;  /* *((char **)((char **)aline - (char **)22L)) */
X	WORD	V_FNT_ND;    /* *((WORD  *)((char  *)aline - (char  *)18L)) */
X	WORD	V_FNT_ST;    /* *((WORD  *)((char  *)aline - (char  *)16L)) */
X	WORD	V_FNT_WR;    /* *((WORD  *)((char  *)aline - (char  *)14L)) */
X	WORD	V_X_MAX;     /* *((WORD  *)((char  *)aline - (char  *)12L)) */
X	char	**V_OFF_AD;  /* *((char **)((char **)aline - (char **)10L)) */
X	WORD	V_STATUS;    /* *((WORD  *)((char  *)aline - (char  *) 6L)) */
X	WORD	V_Y_MAX;     /* *((WORD  *)((char  *)aline - (char  *) 4L)) */
X	WORD	xxdummy;     /* *((WORD  *)((char  *)aline - (char  *) 2L)) */
X} NLINEA;
X
X
X	/* A pointer to the type LINEA is returned by the Line A init call
X	 * ($A000), in registers A0 and D0.
X         * This pointer is saved in the global variable 'aline'.
X	 *
X	 */
Xtypedef struct {
X
X/* Type    Name       Offset   Function		    Comments		     */
X/* ------------------------------------------------------------------------- */
X   WORD   VPLANES;    /*  0  # of Planes	 Also see CurrRez            */
X   WORD	  VWRAP;      /*  2  Bytes / scan line    "    "    "                */
X		      /*     VWRAP can be changed to implement special effect*/
X		      /*     Doubling VWRAP will skip every other scan line  */
X		      /*					             */
X		      /*                                                     */
X   WORD	  *CONTRL;    /*  4  Ptr to CONTRL Array  Contrl gets set to this    */
X   WORD	  *INTIN;     /*  8  Ptr to INTIN  Array  Intin  gets set to this    */
X   WORD	  *PTSIN;     /* 12  Ptr to PTSIN  Array  Ptsin  gets set to this    */
X   WORD   *INTOUT;    /* 16  Ptr to INTOUT Array  Intout gets set to this    */
X   WORD   *PTSOUT;    /* 20  Ptr to PTSOUT Array  Ptsout gets set to this    */
X		      /*     CONTRL is the control array		     */
X		      /*     INTIN is the array of input parameters	     */
X		      /*     PTSIN is the array of input coordinates         */
X		      /*	  Even entrys are X coordinate		     */
X		      /* 	  Odd  entrys are corresponding Y coodinates */
X		      /*     INTOUT is the array of output parameters        */
X		      /*     PTSOUT is the array of output coordinates       */
X		      /*	organizes like PTSIN.			     */
X		      /*					             */
X   WORD   COLBIT0;    /* 24  Plane 0 Color Value  All Three Rez's	     */
X   WORD   COLBIT1;    /* 26  Plane 1 Color Value  Med and Low Rez only	     */
X   WORD	  COLBIT2;    /* 28  Plane 2 Color Value  Low Rez only 		     */
X   WORD   COLBIT3;    /* 30  Plane 3 Color Value  Low Rez Only 		     */
X		      /*     Foreground color COLBIT0 + 2*COLBIT1 + 4*COLBIT2*/
X		      /*	              + 8*COLBIT3		     */
X		      /*					             */
X		      /*                                                     */
X   WORD	  LSTLIN;     /* 32  Always set to -1, Done for you in init_aline()  */
X		      /*     Does anyone know what it is supposed to be?     */
X		      /*					             */
X   WORD   LNMASK;     /* 34  Linemask used when drawing lines, same as Vdi's */
X		      /*     line style                                      */
X		      /*					             */
X   WORD	  WMODE;      /* 36  Writing mode                                    */
X		      /*     0=Replace Mode-Replace all bits in Dest with src*/
X		      /*     1=Trans. Mode-Only additional bits in src set(OR*/
X		      /*     2=Xor Mode- Src XOR Dest			     */
X		      /*     3=Inverse Trans.- (NOT src) Or Dest             */
X		      /*     Values upto 16 are permitted                    */
X		      /*					             */
X   WORD   X1;	      /* 38  X1 coordinate used in various calls             */
X		      /*					             */
X   WORD   Y1;         /* 40  Y1 coordinate used in various calls             */
X		      /*					             */
X   WORD   X2;         /* 42  X2 coordinate used in various calls             */
X		      /*					             */
X   WORD   Y2;         /* 44  Y2 coordinate used in various calls             */
X		      /*					             */
X		      /*                                                     */
X   WORD   *PATPTR;    /* 46  Pointer to current fill pattern                 */
X                      /*     Must be integral power of 2 (words) in length   */
X   WORD   PATMSK;     /* 50  I don't know why they call it a mask. It is in  */
X		      /*     reality the length in words of the current patt.*/
X   WORD   MFILL;      /* 52  Multi Plane fill flag 1 == Current fill Pattern */
X		      /*     is for Muti Plane.                              */
X		      /*                                                     */
X		      /*                                                     */
X   WORD   CLIP;       /* 54  Clipping Flag 1 == TRUE                         */
X   WORD   XMINCL;     /* 56  Min X of clipping window			     */
X   WORD   YMINCL;     /* 58  Min Y of clipping window                        */
X   WORD   XMAXCL;     /* 60  Max X of clipping window			     */
X   WORD   YMAXCL;     /* 62  Max Y of clipping window                        */
X		      /*                                                     */
X		      /*                                                     */
X   WORD   XDDA;       /* 64  Accumulator for Scaling, Must be set to 0x08000 */
X                      /*     before each call to Text Blt. Done for you in   */
X		      /*     in aline_text()                                 */
X   WORD   DDAINC;     /* 66  Scaling factor - Fractional amount to scale char*/
X		      /*     When scaling up = 256 *(Size-Textsize)/Textsize */
X		      /*     When scaling down = 256*(Size)/Textsize         */
X		      /*     scaling down does not work                      */
X   WORD   SCALDIR;    /* 68  Scaling direction 0 == down                     */
X   WORD   MONO;       /* 70  Mono flag 0== current font is a propotional font*/
X		      /*     Its Ok for Thickening to increase the width of  */
X		      /*     the current character.                          */
X		      /*     1 == current font is mono spaced, so thickening */
X		      /*     may not increase the width of the current char  */
X		      /*                                                     */
X   WORD   SOURCEX;    /* 72  X coordinate of character in the font form      */
X		      /*     SOURCEX is caluclated from info in the font     */
X		      /*     header for the current font (see FONT type)     */
X		      /*     SOURCEX = off_table[char-first_ade]	     */
X		      /*     SOURCEX is calculated for you in aline_text()   */
X		      /*     The pointer to a table of font header for the   */
X		      /*     internal fonts is returned in A2 on init (A000) */
X   WORD   SOURCEY;    /* 74  Y coodinate of character in the font form       */
X		      /*     Typically set to 0 (top line of font form)	     */
X   WORD   DESTX;      /* 76  X coordinate of character on screen             */
X   WORD   DESTY;      /* 78  Y coordinate of character on screen             */
X   WORD   DELX;       /* 80  Width of Character				     */
X		      /*     Difference between two SOURCEX's	             */
X   WORD   DELY;       /* 82  Height of Character                             */
X		      /*     form_height field of FONT_HEAD of current font  */
X   WORD   *FBASE;     /* 84  Pointer to start of font form                   */
X   WORD   FWIDTH;     /* 88  Width of the current font's form                */
X		      /*                                                     */
X   WORD   STYLE;      /* 90  Vector of style flags			     */
X		      /*     Bit 0 = Thicken Flag			     */
X		      /*     Bit 1 = Lighten Flag			     */
X		      /*     Bit 2 = Skewing Flag			     */
X		      /*     Bit 3 = Underline Flag (ignored)		     */
X		      /*     Bit 4 = Outline Flag			     */
X		      /*                                                     */
X   WORD   LITEMASK;   /* 92  Mask used for lightening text      	     */
X		      /*     The Mask is picked up from the font header      */
X   WORD   SKEWMASK;   /* 94  Mask used for skewing text			     */
X		      /*     The Mask is picked up from the font header      */
X   WORD   WEIGHT;     /* 96  The number of bits by which to thicken text     */
X		      /*     The number is picked up from the font header    */
X   WORD   ROFF;       /* 98  Offset above baseline when skewing              */
X                      /*     Again picked up from the font header            */
X		      /*						     */
X   WORD   LOFF;       /* 100 Offset below character baseline when skewing    */
X                      /*     Again picked up from the font header            */
X		      /*                                                     */
X   WORD   SCALE;      /* 102 Scaling Flag 1 == true                          */
X		      /*                                                     */
X   WORD   CHUP;	      /* 104 Character rotation vector.                      */
X   		      /*     0 = normal (0 degrees)			     */
X		      /*     1800 = 180 degrees				     */
X      		      /*     2700 = 270 degrees                              */
X		      /*                                                     */
X   WORD   TEXTFG;     /* 106 Text foreground color			     */
X		      /*                                                     */
X   char   *SCRTCHP;   /* 108 Address of buffer required for creating special */
X		      /*     text effects. The size of this buffer should be */
X		      /*     1K according the Internals. The Atari document  */
X		      /*     of course does not talk about such things :-)   */
X                      /*                                                     */
X   WORD   SCRPT2;     /* 112 The offset of the scaling buffer buffer in above*/
X                      /*     buffer. Internals suggests an offset of 0x0040  */
X                      /*     As usual the Atari document does'nt say a thing */
X                      /*                                                     */
X   WORD   TEXTBG;     /* 114 Text background color (Ram Vdi only)            */
X                      /*     used for the BitBlt writing modes (4-19) only   */
X                      /*                                                     */
X   WORD   COPYTRAN;   /* 116 Copy raster form type flag (Ram vdi only)       */
X                      /*     0 => Opaque type                                */
X                      /*          n-plane source  ->  n-plane dest           */
X                      /*              BitBlt writing modes (4-19)            */
X                      /*    ~0 => Transparent type                           */
X                      /*          1-plane source  ->  n-plane dest           */
X                      /*              Vdi writing modes (1-3)                */
X                      /*                                                     */
X   WORD(*SEEDABORT)();/* 118 Pointer to function returning int, which is     */
X                      /*     called by the fill logic to allow the fill to   */
X                      /*     be aborted. If the routine returns FALSE (0)    */
X                      /*     the fill is not aborted. If it returns TRUE (~0)*/
X                      /*     the fill is aborted                             */
X/* ------------------------------------------------------------------------- */
X
X} LINEA;             /*       P H E W !!!!!                                  */
X
X
X
X	/* A pointer to array of type FONT is returned by the Line A init call
X	 * ($A000), in regsister A1.
X         * This pointer is saved in the global array variable 'fonts[]'.
X	 *
X	 */
X
Xtypedef struct _font {
X
X/* Type    Name       Offset   Function		    Comments		     */
X/* ------------------------------------------------------------------------- */
X   WORD   font_id;    /*  0 Font face identifier  1 == system font           */
X                      /*                                                     */
X   WORD   size;       /*  2 Font size in points                              */
X                      /*                                                     */
X   char   name[32];   /*  4 Face name                                        */
X                      /*                                                     */
X   WORD   first_ade;  /* 36 Lowest ADE value in the face (lowest ASCII value */
X                      /*    of displayable character).                       */
X                      /*                                                     */
X   WORD   last_ade;   /* 38 Highest ADE value in the face (highest ASCII valu*/
X                      /*    of displayable character).                       */
X                      /*                                                     */
X   WORD   top;        /* 40 Distance of top line relative to baseline        */
X                      /*                                                     */
X   WORD   ascent;     /* 42 Distance of ascent line relative to baseline     */
X                      /*                                                     */
X   WORD   half;       /* 44 Distance of half line relative to baseline       */
X                      /*                                                     */
X   WORD   descent;    /* 46 Distance of decent line relative to baseline     */
X                      /*                                                     */
X   WORD   bottom;     /* 48 Distance of bottom line relative to baseline     */
X                      /*    All distances are measured in absolute values    */
X                      /*    rather than as offsets. They are always +ve      */
X                      /*                                                     */
X WORD max_char_width; /* 50 Width of the widest character in font            */
X                      /*                                                     */
X WORD max_cell_width; /* 52 Width of the widest cell character cell in face  */
X                      /*                                                     */
X   WORD left_offset;  /* 54 Left Offset see Vdi appendix G                   */
X                      /*                                                     */
X   WORD right_offset; /* 56 Right offset   "      "     "                    */
X                      /*                                                     */
X   WORD   thicken;    /* 58 Number of pixels by which to thicken characters  */
X                      /*                                                     */
X   WORD   ul_size;    /* 60 Width in  pixels of the underline                */
X                      /*                                                     */
X   WORD   lighten;    /* 62 The mask used to lighten characters              */
X                      /*                                                     */
X   WORD   skew;       /* 64 The mask used to determine when to perform       */
X                      /*    additional rotation on the character to perform  */
X                      /*    skewing                                          */
X                      /*                                                     */
X   WORD   flags;      /* 66 Flags                                            */
X                      /*      bit 0 set if default system font               */
X                      /*      bit 1 set if horiz offset table should be used */
X                      /*      bit 2 byte-swap flag (thanks to Intel idiots)  */
X                      /*      bit 3 set if mono spaced font                  */
X                      /*                                                     */
X   char   *h_table;   /* 68 Pointer to horizontal offset table               */
X                      /*                                                     */
X   WORD   *off_table; /* 72 Pointer to character offset table                */
X                      /*                                                     */
X   char   *dat_table; /* 76 Pointer to font data                             */
X                      /*                                                     */
X   WORD   form_width; /* 80 Form width (#of bytes /scanline in font data)    */
X                      /*                                                     */
X   WORD   form_height;/* 82 Form height (#of scanlines in font data)         */
X                      /*                                                     */
X struct _font *next_font;  /* 84 Pointer to next font in face                */
X                      /*                                                     */
X/* ------------------------------------------------------------------------- */
X} FONT;
X
X	
X	/*
X	 * OP_TAB type required for Bit Blt parameter block.
X	 * each entry defines the logic operation to apply for
X	 * the 4 Fore/Back ground bit combinations
X	 */
Xtypedef struct {
X
X/* Type    Name       Offset   Function		    Comments		     */
X/* ------------------------------------------------------------------------- */
X   char   fg0bg0;     /* 0	Logic op to employ when both FG and BG are 0 */
X   char   fg0bg1;     /* 1	Logic op to employ when FG = 0 and BG = 1    */
X   char   fg1bg0;     /* 2	Logic op to employ when FG = 1 and BG = 0    */
X   char   fg1bg1;     /* 3	Logic op to employ when both FG and BG are 1 */
X/* ------------------------------------------------------------------------- */
X} OP_TAB;
X
X
X/*
X * Source and destination description blocks
X */
Xtypedef struct  {
X	WORD	bl_xmin;		/* Minimum x			*/
X	WORD	bl_ymin;		/* Minimum y 			*/
X	char	*bl_form;		/* Word aligned memory form 	*/
X	WORD	bl_nxwd;		/* Offset to next word in line  */
X	WORD 	bl_nxln;		/* Offset to next line in plane */
X	WORD 	bl_nxpl;		/* Offset to next plane 	*/
X}SDDB;
X
X	/* Offsets to next word in plane */
X#define HI_NXWD		2
X#define MED_NXWD	4
X#define LOW_NXWD	8
X
X	/* Scan line widths of the screen */
X#define HI_NXLN		80
X#define MED_NXLN	160
X#define LOW_NXLN	160
X
X	/*
X	 * Offsets between planes - always the same due to
X	 * the way the STs video memory is laid out
X         */
X#define NXPL		2
X
X	/* 
X	 * Bit Blt Parameter Block Type (for function $A007)
X	 *
X	 */
X
Xtypedef struct {
X
X/* Type    Name           Offset   Function		    Comments	     */
X/* ------------------------------------------------------------------------- */
X   WORD	   bb_b_wd;     /*	 width of block in pixels 		     */
X   WORD	   bb_b_ht;     /*	 height of block in pixels		     */
X   WORD	   bb_plane_ct; /*	 number of planes to blit 		     */
X   WORD	   bb_fg_col;   /*	 foreground color 			     */
X   WORD	   bb_bg_col;   /*	 back	ground color 			     */
X   OP_TAB  bb_op_tab;   /*	 logic for fg x bg combination 		     */
X   SDDB	   bb_s;        /*	 source info block			     */
X   SDDB	   bb_d;        /*	 destination info block 		     */
X   WORD	   *bb_p_addr;  /*	 pattern buffer address 		     */
X   WORD	   bb_p_nxln;   /*	 offset to next line in pattern 	     */
X   WORD	   bb_p_nxpl;   /*	 offset to next plane in pattern 	     */
X   WORD	   bb_p_mask;   /*	 pattern index mask 			     */
X   char	   bb_fill[24];	/*	 work space				     */
X/* ------------------------------------------------------------------------- */
X} BBPB;
X
X
X/*
X * Memory Form Definition Block
X *
X */
Xtypedef struct
X{
X	char		*fd_addr;    /* Addrerss of upper left corner of firs*/
X                                     /* plane of raster area. If NULL then   */
X                                     /* MFDB is for a physical device        */
X	WORD		fd_w;	     /* Form Width in Pixels                 */
X	WORD		fd_h;        /* Form Height in Pixels                */
X	WORD		fd_wdwidth;  /* Form Width in words (fd_w/sizeof(int)*/
X	WORD		fd_stand;    /* Form format 0= device spec 1=standard*/
X	WORD		fd_nplanes;  /* Number of memory planes              */
X	WORD		fd_r1;       /* Reserved                             */
X	WORD		fd_r2;       /* Reserved                             */
X	WORD		fd_r3;       /* Reserved                             */
X} MFDB;
X
X
X
X
X/*
X * Sprite definition block
X *
X */
Xtypedef struct
X{
X	WORD	sp_xhot;		/* Offset to X hot spot		*/
X	WORD	sp_yhot;		/* Offset to Y hot spot		*/
X	WORD	sp_format;		/* Format SP_VDI or SP_XOR 	*/
X	WORD	sp_bg;			/* Background color		*/
X	WORD	sp_fg;			/* Foregroud color		*/
X	WORD	sp_data[32];		/* Sprite data - 		*/
X					/* Alternating words of back/fore */
X					/* ground data			  */
X					/* Note that:			  */
X					/*   sprite save block is         */
X					/*  10+VPLANES*64 bytes long	  */
X
X} SFORM;
X
X
X
X/*****************************************************************************\
X*		                                                              *
X*                             Global Variables				      *
X*		                                                              *
X\*****************************************************************************/
X
X	/*
X	 * Global Variables are defined in alglobal.c, extern every where else
X	 *
X	 */
X#ifndef ALGLOBAL
X
X	/* global vars */
Xextern LINEA *aline;	/* Pointer to line a parameter block returned by init*/
X
Xextern NLINEA *naline;  /* Pointer to line a parameters at negative offsets  */
X
Xextern FONT  **fonts;	/* Array of pointers to the three system font headers*/
X			/* returned by init (in register A1)    	     */
X
Xextern WORD  (**funcs)();  /* Array of pointers to the 15 line a functions   */
X			   /* returned by init (in register A2)		     */
X			   /* only valid in ROM'ed TOS			     */
X
X	/* Functions */
Xextern VOID init_aline();
X#endif /* ALGLOBAL */
SHAR_EOF
if test 26615 -ne "`wc -c 'aline.h'`"
then
	echo shar: error transmitting "'aline.h'" '(should have been 26615 characters)'
fi
#	End of shell archive
exit 0
-- 
usenet: {decvax,cbosgd,sun}!cwruecmp!bammi	jwahar r. bammi
csnet:       bammi@cwru.edu   <---------Please note change of address
arpa:        bammi@cwru.edu   <---------Please note change of address
compuServe:  71515,155

bammi@cwruecmp.UUCP (06/12/87)

------------------cut here ------- TOS font switcher part 3 of 3 ----------
#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	switcha.uue
# This archive created: Fri Jun 12 01:44:21 1987
# By:	Jwahar R. Bammi(Case Western Reserve University)
#  Uucp:	 {decvax,sun,cbosgd}!cwruecmp!bammi
# Csnet:	 bammi@cwru.edu
#  Arpa:	 bammi@cwru.edu
#
export PATH; PATH=/bin:$PATH
echo shar: extracting "'switcha.uue'" '(11661 characters)'
if test -f 'switcha.uue'
then
	echo shar: over-writing existing file "'switcha.uue'"
fi
sed 's/^X//' << \SHAR_EOF > 'switcha.uue'
Xtable
X !"#$%&'()*+,-./0123456789:;<=>?
X@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
Xbegin 644 switchf.ttp
XM8!H  !S.   "     'H                  "IO  0@;0 8T>T '"1M "Q"a
XM@")(2A)G4"**)DHD64H:9OPBBDH29SP,&P!!9NP,&P!29N8,&P!'9N ,&P!6a
XM9MH,&P ]9@I*$V<&(\L  !ZF0ID@"2**)DHD64H:9OPBBDH29O(F &8R0ID@a
XM"2+\   >R$7M ( 4&DB"0C(@ '(@%!IG%K0!9_A32B+*%!IG"K0!9OA"*O__a
XM8.9"F2()T_D  ![*(\$  ![*+DDK20 $+PTCR   '5HO""\ DH#D@5-!/P&3a
XMS2\)+PU"9S\\ $I.0=[\  Q*@V8N/SP !#\\  ).N0  %ZH^@$ZY   7^#]\a
XM  (  D)73KD  !>J/H!.N0  %_A83YS.3KD   40WOP "C\ 3KD  !:>/SP a
XM3$Y!3E8  $ZY   &.B!Y   ?,B/H  @  !\\3EY.=4Y6   B;@ (('D  !\Xa
XM,*D 4B)N  @@>0  'T P*  "P>D 4B!Y   ?.#%   8B;@ (('D  !\X,"@ a
XM*DC @>D 4E- ('D  !\X,4  !")N  @@>0  'S@P*  B2,"!Z0 T4T @>0  a
XM'S@Q0  "(FX ""!Y   ?.#%I %  (")N  @@>0  'S@Q:0 D !XB;@ (('D a
XM !\X,6D )@ <(FX ""!Y   ?."%I $@ )")N  @@>0  'S@A:0!, !A.7DYUa
XM3E;__"\'(&X "!X0(FX ""!N  @0J0 !0D 0!R!N  @10  !+A].7DYU3E;_a
XM_"\-*FX ""\-3KD   ( 6$](;0 "3KD   ( 6$](;0 D3KD   ( 6$](;0 Fa
XM3KD   ( 6$](;0 H3KD   ( 6$](;0 J3KD   ( 6$](;0 L3KD   ( 6$](a
XM;0 N3KD   ( 6$](;0 P3KD   ( 6$](;0 R3KD   ( 6$](;0 T3KD   ( a
XM6$](;0 V3KD   ( 6$](;0 X3KD   ( 6$](;0 Z3KD   ( 6$](;0 \3KD a
XM  ( 6$](;0 ^3KD   ( 6$](;0! 3KD   ( 6$](;0!"3KD   ( 6$](;0!0a
XM3KD   ( 6$](;0!23KD   ( 6$]"K0!$0JT 5"I?3EY.=4Y6_^A(UR# 0GD a
XM !\V+SP  !U>+RX "$ZY   -6E!/+4#_]&8.< $SP   'S9"@&   7)P6#\ a
XM3KD   @,5$\J0" -9@1P!6#>+R[_]' !/P!P6#\ +PU.N0  #:C>_  ,#$  a
XM 6<$< )@O"\-3KD   (J6$\P+0 FD&T )%) /4#_^# N__@&0  >#$ ! &P*a
XM,"[_^ 9  !Y@## \ 0"0;O_XT&[_^%) /@ P!^-(/P!.N0  " Q43RM  $AGa
XMAGP O$=L$C &2,#CB"! T>T 2$)04D9@ZC N__@&0  >#$ ! &P,("T 2 : a
XM    /& 0,#P! )!N__A(P..(T*T 2"U __Q";0 D,"T 4,'M %(]0/_Z/R[_a
XM^DZY   (#%1/*T  3&< _QXO+O_T/R[_^' "/P O+O_\3KD   VHWOP #+!Na
XM__AG!G $8 #^VGX OF[_^&X8, =(P..(T*[__"\ 3KD   ( 6$]21V#B+R[_a
XM]#\N__IP 3\ +RT 3$ZY   -J-[\  RP;O_Z9P9P V  _I0O+O_T3KD  !(Da
XM6$\@#4S7(,!.7DYU3E8  "!N  @O* !,3KD   @D6$\@;@ (+R@ 2$ZY   (a
XM)%A/+RX "$ZY   ()%A/3EY.=4Y6__1(UR# #&X  @ (;" O/   '6$O/   a
XM'?1.N0  ")103W !/P!.N0  %IY43TZY   !(E-N  AO  #<6*X "B!N  HOa
XM$$ZY   #,%A/*D @#68>(&X "B\0+SP  !V +SP  !WT3KD   B4WOP #&#"a
XM(&X "B\0+SP  !V4+SP  !WT3KD   B4WOP #"\-3KD   $^6$]\ 'X@OFT a
XM)FQ$+SP  !W:/P<@>0  '>Q.D%Q/4D8P!DC @?P "$A 2D!F"B\\   =VG *a
XM8 @O/   '=IP"3\ ('D  !WL3I!<3U)'8+8O/   '=IP"C\ ('D  !WL3I!<a
XM3R\-3KD   @D6$\O.0  'SQ.N0   3Y83V  _R!"9TZY   6GE1/3-<@P$Y>a
XM3G5.5@  3KD  !NX(_D  !\F   ?0"/Y   ?*@  'S(C^0  'RX  !]$(#D a
XM !] !(     N(\   !\X3EY.=4Y6__!(USB +BX "%"'#(< ___@8@  A@R'a
XM   ( &0&+CP   @ +P=.N0  &@Y83RI ($VQ_/____]G8$JY   =O&82)DT@a
XM"R/    =GB/    =FF F('D  !V\L<UF"E&-4(<F;0 $8!(H>0  ';Q1C"!,a
XM)F@ !"E-  0@!U&  $   2J ( ?0C2/    =O"A 48P@3$*0*4L !$S7.(!.a
XM7DYU3E;_\$C7,,!^ " N  A<@%.  D#__BP O*X "&0&0H!@  #&F<PJ>0  a
XM'9H@#6=R(!4N  *      6=(( QG#B ' D#__M&4(!0N "I,*$V^AF,RGH8@a
XM!PR     !&0*(!4"0/_^*H!@%"J&( ;0C2/    =FB!Y   =FB"'( U8@&!Da
XMF<Q*AV<,( <"0/_^T(TJ0& $*FT !+OY   =FF:.( QG!B/,   =FE)Y   =a
XMHC Y   =H@Q   )E"E-Y   =HF  _U@O!DZY   &>%A/+RX "$ZY   ''%A/a
XM*D!3>0  ':(@#4S7,,!.7DYU3E8  '  ,"X ""\ 3KD   <<6$].7DYU3E;_a
XM^$C7(( @+@ (68 J0$J59C1^ #!'T?P  !VD2A!G(# '4D<P0-'\   =I! 0a
XM2( _ ' "/P!P S\ 3DU<3V#43KD  !;H )4    !3-<@@$Y>3G5.5@  2&X a
XM""\\   =VDZY   (Z%!/3EY.=4Y6  !(;@ ,+RX "$ZY   (Z%!/3EY.=4Y6a
XM_^9(;O_F/SR  "\N  A.N0  #_S>_  *2&X #$AN_^9.N0  ".A03TAN_^9"a
XM9R!N__A.D%Q/3EY.=4Y6_Y1(US" +6X #/_\(&[__"A06*[__! <2( ^  Q a
XM "5G&DI'9P #9B\N  @_!R!N  @@:  23I!<3V#:<" ]0/_P</\]0/_L</\]a
XM0/_N$!Q(@#X #$< +68.< $]0/_R$!Q(@#X 8 1";O_R#$< ,&8,<# ]0/_Pa
XM$!Q(@#X #$< *F8F(&[__%2N__P]4/_L;!!P 3U __(P+O_L1$ ]0/_L$!Q(a
XM@#X 8"I";O_L#$< ,&T@#$< .6X:,"[_[,'\  K01P1  # ]0/_L$!Q(@#X a
XM8-H,1P N9DH0'$B /@ ,1P J9A0@;O_\5*[__#U0_^X0'$B /@!@*D)N_^X,a
XM1P P;2 ,1P Y;AHP+O_NP?P "M!'!$  ,#U _^X0'$B /@!@V@Q' &QF)A <a
XM2( ^  Q' &1G$@Q' &]G# Q' '5G!@Q' 'AF"# ' D#_WSX ( X$@    & Ma
XM0/_T*D!P 3U _^@P!R!\   <UC(\  Y@ EA(L%A7R?_Z(%!.T&   4H@;O_\a
XM5*[__#U0_^!*;O_@; XP+O_@1$ ]0/_@<"T:P' */P _+O_@+PU.N0  #'Y0a
XM3RI 8  !$G */P @;O_\5*[__#\08.!P"&#N<!!@ZB!N__PM4/_@6*[__$JNa
XM_^!L#B N_^!$@"U _^!P+1K < H_ "\N_^ O#4ZY   ,ZM[\  I@K' */P @a
XM;O_\+Q O#4ZY   ,ZM[\  HJ0%BN__Q@  "D< A@WG 08-H@;O_\(! B*  $a
XM+4#_X"U!_^10KO_\+PT_+O_N+R[_Y"\N_^ _!TZY   6N-[\ !!@ /]20F[_a
XMZ"!N__PM4/_X9@@M?   ',[_^%BN__P@+O_X+4#_]"I 2AUG$DIN_^YM]B -a
XMD*[_^+!N_^YOZE.-8"A";O_H(&[__%2N__PP$!K 8!8@;O_\+Q O+@ (3KD a
XM  CH4$]@ /]8("[_]"\ ,"[_[$C T9<@'Y"-/4#_ZFP$0F[_ZDIN__)F3$INa
XM_^AG, QN ##_\&8H(&[_] P0 "UF'B\N  @@;O_T4J[_]! 02( _ "!N  @@a
XM:  23I!<3S N_^I3;O_J2D!G"B\N  @_+O_P8-X@;O_TL<UD("\N  @@;O_Ta
XM4J[_]! 02( _ "!N  @@:  23I!<3V#82F[_\F< _+ P+O_J4V[_ZDI 9P#\a
XMHB\N  @_+O_P(&X ""!H !).D%Q/8-Q,US" 3EY.=4Y6_^I(UR# /BX #"I.a
XM0B4P!P*   #__X#N  X\ &<B, <"@   __^ [@ .2$!(0$) 2$ @0-'\   =a
XM,!L0/@9@SC\'0F<@7]'\   =,!L02A5G#"!N  A2K@ ($)U@\" N  A,UR# a
XM3EY.=4Y6_^)(US" *FX "#XN !!)[O__0B1P # '+P O+@ ,3KD  !P.4$\Ma
XM0/_N9R1P # '+P O+@ ,3KD  !Q44$\@0-'\   =,!D0+6[_[@ ,8,0@;@ ,a
XMT?P  !TP&1!*%&<$&MQ@^" -3-<P@$Y>3G5.5O_\+PTJ?   '@Z[_   'EYDa
XM,DJ59PX@51 H !9(@ )   %F''#_/P O%2\N  PO+@ (3KD   YBWOP #BJ a
XM8 98C6#&0H J7TY>3G5.5O_R2-<P@"IN  @H;@ 0,"X #L'N  P]0/_^$"P a
XM%DB  D  !&<0+PP@;  .3I!83QK 4V[__DJL  AF#! L !9(@ )   )F($INa
XM__YG3"\,(&P #DZ06$\^  Q __]G.AK'4V[__F#@/R[__B\-$"P %TB /P!.a
XMN0  &/Q03SX ;P:?;O_^8!)*1V8( "P "  68 8 +  0 !8P+@ .P>X #)!Na
XM__X"@   __^ [@ ,3-<P@$Y>3G5.5O_H2-<@X"IN ! ^+@ 4? %";O_^0F[_a
XM_' !/4#_^B!N  Q2K@ ,&A!P<AU __@0!4B #$  <F8  11\ '!W'4#_^"!Na
XM  P:$&<L$ 5(@ Q  &)F  $<0F[_^E*N  P@;@ ,&A!G$! %2( ,0 !B9@ !a
XM'D)N__I*1VP62F[__F80/P8O+@ (3KD  !B87$\^ $I';$!*;O_^9@9*;O_\a
XM9S0_/ &V+RX "$ZY   72%Q//@!M( Q&  %G&C\'3KD  !;\5$\_!B\N  A.a
XMN0  &)A<3SX 2D=M  "V2F[__&<0< (_ $*G/P=.N0  &'!03R -9AYP&C\ a
XM3KD   @,5$\J0" -9@P_!TZY   6_%1/8'QP 1M  !9*;O_Z9P8 +0 @ !9Pa
XM "M   0J@"M   A";0 ,*WP  !&D  XK?   $<@ $AM' !<@#6!$$ 5(@ Q a
XM '=F"%)N__Y@ /[F$ 5(@ Q  &%F)E)N__Q@ /[4$ 5(@ Q  "MG#A(N__A(a
XM@1 %2("P068&? )@ /[.0H!,UR#@3EY.=4Y6__PO#2IN  X@+@ (*H K0  (a
XM*WP  !"0  Y"+0 6,"X #$1 .T  # QM@ $ #&P0.WQ__P ,*WP  !!V !)@a
XM""M\   03@ 2( TJ7TY>3G5.5O_\+PTJ;@ *4VT #&P(0FT #'#_8 H@55*5a
XM,"X "!" *E].7DYU3E;__"\-*FX "B!54I4P+@ ($( J7TY>3G5.5O_\+PTJa
XM;@ (4FT #&\(0FT #'#_8 @@55*50D 0$"I?3EY.=4Y6__PO#2IN  A*K0 (a
XM9C 0+0 62( "0  "9A(_/ ( 3KD   @,5$\K0  (9A(K?   $_8 #BM\   5a
XM$  28&X0+0 62( "0  "9C(0+0 72( _ $ZY   84%1/2D!G'KO\   =VF86a
XM*WP  !,4  XK?   %;( $B M  A@)BM\   3%  .*WP  !2> !(0+0 72( _a
XM $ZY   1:E1/2,#0K0 (*H K0  $0FT #"I?3EY.=4Y6__PO!W !/P!"IS\Na
XM  A.N0  &'!03RX #(#_____9@1"0& ., <"@   __^ _ ( 2$ N'TY>3G5.a
XM5O_\+PTJ;@ (+PU.N0  $+983R\-(&T #DZ06$\J7TY>3G5.5O_X2-<@@#XNa
XM  @J;@ *+PU.N0  $+983R\-/P<@;0 23I!<3TS7((!.7DYU3E;__"\-*GP a
XM !Y>68T@3;'\   >#F402I5G\"\53KD  !(D6$]@Y"I?3EY.=4Y6__A(UR" a
XM*FX "! M !9(@ )   %F!'#_8$ O#4ZY   2B%A//@ 0+0 72( _ $ZY   6a
XM_%1/2JT "&<8$"T %DB  D   F8,+RT "$ZY   ()%A/0BT %C '3-<@@$Y>a
XM3G5.5O_X2-<@@"IN  A";0 ,$"T %DB  D  $&9F(!60K0 $/@!O&C\'+RT a
XM!! M !=(@#\ 3KD  !IV4$^P1V8D2D=M'"!M  A!Z ( L=5F#" M  @J@"M a
XM  1@!"M5  1"0& @,#D  !U82, ,@    "!F"$)Y   =6& & "T $  6</],a
XMUR" 3EY.=4Y6__A(UR" *FX "%)M  QO  "2+PU.N0  $HA83TI 9@  M@RYa
XM   5L@  '>QF#B\\   =VDZY   2B%A/("T " :    " )"M  0_ "\M  00a
XM+0 72( _ $ZY   8_%!/1$ [0  ,#$   69>,#D  !U82, ,@    "!F"$)Ya
XM   =6& & "T $  60FT #&!&,"T #%)M  P@;0 $D, K2  $(%52E4) $! ^a
XM ! M !9(@ )  "!G#@Q'  UG /],#$< &F<*, =@#DIM  QFP  M  @ %G#_a
XM3-<@@$Y>3G5.5O_Z+PTJ;@ (#+D  !6R   =[&8.+SP  !W:3KD  !*(6$]"a
XM;0 ,< $_ $AN__X0+0 72( _ $ZY   8_%!/#$#__V<T2D!G4 PN !K__F8,a
XM$"T %DB  D  (&8\#"X #?_^9@P0+0 62( "0  @9K9"0! N__Y@*# Y   =a
XM6$C #(     @9@A">0  '5A@#@ M !  %F & "T "  6</\J7TY>3G5.5O_Xa
XM2-<@@#XN  @J;@ *#$< "F8D$"T %DB  D  (&<8+PUP#3\ 3KD  !2>7$\,a
XM0/__9@1P_V P4VT #&PB+PU.N0  %C!83TI 9N@@+0 (!H    ( D*T !%- a
XM.T  #"!54I4P!Q" 3-<@@$Y>3G5.5O_V2-<@@#XN  @J;@ *'4?__@Q'  IFa
XM(! M !9(@ )  "!G%"\-< T_ $ZY   5$%Q/#$#__V=>0FT #! M !9(@ ) a
XM !!F3B\-3KD  !8P6$]*0&9 < $_ $AN__X0+0 72( _ $ZY   :=E!/#$  a
XM 68$, =@(# Y   =6$C #(     @9@A">0  '5A@!@ M !  %G#_3-<@@$Y>a
XM3G5.5O_X2-<@@#XN  @J;@ *#$< "F8D$"T %DB  D  (&<8+PUP#3\ 3KD a
XM !6R7$\,0/__9@1P_V \0FT #"!M  A!Z ( L=5F#B\-3KD  !*(6$]*0&;>a
XM(%52E3 '$( ,0  *9@XO#4ZY   2B%A/2D!FPC '3-<@@$Y>3G5.5O_\+PTJa
XM;@ ($"T %DB  D  !&<*+PT@;0 .3I!83R!M  2QU6(,+PU.N0  $HA83V Ta
XM< $_ " 5D*T !$C +P 0+0 72( _ $ZY   8<%!/#(#_____9@1P_V **U4 a
XM!$)M  Q"0"I?3EY.=4Y6  !.N0  $?8_+@ (3KD  !;H5$].7DYU3E8  "\\a
XM   >7DZY   <C%A/< $_ $ZY   6GE1/3EY.=4Y6  !.N0  %KA.7DYU3E8 a
XM #\N  AP3#\ 3D%83TY>3G5.5@  #&X !0 (;A(_+@ (3KD  !JB5$\,0 !#a
XM9RAP/S\ /RX "$ZY   :^EA//RX "' ^/P!.05A/+P!.N0  &Y983V "0D!.a
XM7DYU3E;__"\'0F<O+@ (<#P_ $Y!4$\N &TZ, =(P"X ;1)P1C\ , <_ $ZYa
XM   :^EA/8" ,A_____UM& R'_____VX0, <_ $ZY   ;+E1/2, N "\'3KD a
XM !N66$\N'TY>3G5.5O_\+P<_+@ (<$4_ $Y!6$\^ &P0, =(P"\ 3KD  !N6a
XM6$]@(C\N  A.N0  &J)43SU   AM#C\N  @_!TZY   :^EA/, <N'TY>3G5.a
XM5O_\+P<_+@ (/RX "G)&/P%.05Q//@!*0&8H/RX "$ZY   :HE1//4  "&T6a
XM/RX "#\N  I.N0  &OI83S N  I@#C '2, O $ZY   ;EEA/+A].7DYU3E8 a
XM #\N  A.N0  &J)43PQ  $-F!' !8 )"0$Y>3G5.5@  /RX #C\N  @O+@ *a
XM<$(_ $Y!WOP "B\ 3KD  !N66$].7DYU3E;__"\'/RX #"\N  AP/3\ 3D%0a
XM3RX ;3HP!TC +@!M$G!&/P P!S\ 3KD  !KZ6$]@( R'_____6T8#(?_____a
XM;A P!S\ 3KD  !LN5$](P"X +P=.N0  &Y983RX?3EY.=4Y6__!(UR#@/RX a
XM"$ZY   :HE1/#$  0V8  ,Q\ ! Y   >STB /@ 0.0  'LY(@$C !H   ![.a
XM*D!3;@ .;0  CE-';&1P41/    >SD(Y   >SR\\   >SG */P!.05Q//@!La
XM"# '2,!@  "4< H_ ' "/P!P S\ 3DU<3W "$\   ![.$#D  ![/2( ^ ! Ya
XM   >SDB 2, &@   'LXJ0#!'T<UP"A" $!U(@#H #$4 &F8$?@!@%"!N  I2a
XMK@ *$(521@Q%  IF /]N( T$@   'LX3P   'LX3QP  'L\P!F D+RX "C Na
XM  Y(P"\ /RX "' _/P!.0=[\  PO $ZY   ;EEA/3-<@X$Y>3G5.5O_X2-< a
XMP"XN  A*AVP((#S_____8#!*AV8((#G___\$8"12AR ' D#__BX +P=P2#\ a
XM3D%<3RP 9]0@!M"'(\#___\$( 9,UP# 3EY.=4Y6   P+@ (2, O $ZY   :a
XM#EA/3EY.=4Y6   O+@ *,"X #DC +P _+@ (<$ _ $Y!WOP #"\ 3KD  !N6a
XM6$].7DYU3E;_^$C7(( ^+@ (, =60 Q   )B'.5(,$#1_   '4 @4$[08"IPa
XM4& F<$%@(G!#8!Y*1VT.*GD  !ZF4T=M"$H=9OAP_V (2A5G^! 52(!,UR" a
XM3EY.=4Y6__A(UR" /BX "$I';0XJ>0  'J931VT(2AUF^'#_8 I*%6?X,"X a
XM"AJ 3-<@@$Y>3G5.5O_X2-<@@#XN  @P!U9 #$   F)(Y4@P0-'\   =3"!0a
XM3M J>0  'J80%4B L$=G#$H59@1PW6 F4HU@[" -D+D  !ZF/P!.N0  %ZI4a
XM3V .?D-@SGY!8,I^4&#&<-M,UR" 3EY.=4Y6  !*K@ (;! @+@ (1( SP   a
XM'5AP_V $("X "$Y>3G65RJ  ( IF!$7I_\1(^0<!   ?(DYU(F\ "& $0^\ a
XM""(O  1J D2!)!%J D2"0?H !F   'Q*+P $:@Q*@6<"4H!*$6L(8 1*$6H"a
XM1(!.=2)O  A@!$/O  @B+P $)!%!^@ &8   2DYU(F\ "& $0^\ ""01:@)$a
XM@B(O  1!^@ &8   +" !9PI*+P $:@24@" "3G4B;P (8 1#[P ()!$B+P $a
XM0?H !& $( %.=7#_2H)F!G  3M#BB+*"8P;CBF3VXI*2@F0"TH+CD&3T1H!.a
XMT$Y6__PO#2IN  A*%6<:+SP  !W:$!5(@#\ ('D  !WL3I!<3U*-8.(O/   a
XM'=IP"C\ ('D  !WL3I!<3RI?3EY.=7M.54Q,?0   $0   J\ $\   L2 %4 a
XM  KR %@   L6 &,   N, &0   IL &4   L: &8   L: &<   L: &\   JTa
XM '(   N> ',   M. '4   JD '@   JX $0   D2,#$R,S0U-C<X.4%"0T1%a
XM1@  &L@  !K,   :T   &X@  !N$   ;@        ')B %5S86=E.B!S=VETa
XM8VAF(&9O;G1F:6QE<R N+BXN"@!4<F]U8FQE($QO861I;F<@)7,*  HE<SH*a
XM              !"860@<&]I;G1E<B!I;B!F<F5E+@T*                a
XM             !&D   1R"$                         $:0  !'((0$ a
XM                       1I   $<@C @     =P   '=H  !WT        a
XM                                                            a
XM                      !9;W4@;75S="!C;VUP:6QE('=I=&@@=&AE("UFa
XM(&]P=&EO;B!T;R!I;F-L=61E('!R:6YT9B@I(&9L;V%T:6YG('!O:6YT    a
XM !ZJ0T-!4#\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/P        @     3"(Ra
XM!@XP" X("@P0!@@2#@X.$@X2#A 0$!!&# P,# P,# P,# P,# P,# P,#!X&a
XM"A 0(!9$:" J'!H>$ P<!@8,"!@4!@82!@8,$@@:"@H."@P(!@X4!@0&! 8$a
XM!@PR% P&"!0@0$H&) P&!@P,# H<)! :' 88'!(!A$90&$(<3 $.$D08"A0@a
XM!BB2RB(4#AX0$"P(<"0*F X('@P(" X($"XV*B(*#BX2'DHP$"X.! @&)!00a
XM;@0(!AQ"$$8:7" <$A! )!Q ("@*$ 8,$"X6%C@>#BH.%# 6%!8T-AX.&A(*a
XM"A8&!BP&"@HV!@8F+"0<+"8<,CX*' @P(-0,#@H8!@8&!@8&!@8&!@8&!@84a
XM! 0$! 1Z!!8$%@0(! 20  <!$ $* #    #.'             "*    =@$ a
X3 'H                       $*a
X a
Xend
SHAR_EOF
if test 11661 -ne "`wc -c 'switcha.uue'`"
then
	echo shar: error transmitting "'switcha.uue'" '(should have been 11661 characters)'
fi
#	End of shell archive
exit 0
-- 
usenet: {decvax,cbosgd,sun}!cwruecmp!bammi	jwahar r. bammi
csnet:       bammi@cwru.edu   <---------Please note change of address
arpa:        bammi@cwru.edu   <---------Please note change of address
compuServe:  71515,155

bammi@cwruecmp.UUCP (06/12/87)

In article <2152@cwruecmp.UUCP> bammi@cwruecmp.UUCP (Jwahar R. Bammi) writes:
>------------------cut here ------- TOS font switcher part 3 of 3 ----------

	Sorry i forgot to mention that the font switcher has been tested
with Mark Williams C (V2.0) and Alcyon C (V4.14) only. 
-- 
usenet: {decvax,cbosgd,sun}!cwruecmp!bammi	jwahar r. bammi
csnet:       bammi@cwru.edu   <---------Please note change of address
arpa:        bammi@cwru.edu   <---------Please note change of address
compuServe:  71515,155

pes@ux63.bath.ac.uk (Paul Smee) (06/17/87)

Haven't actually tried this yet, but one of your comments in the C code,
about Lattice C, caught my eye as I was scanning thru it.  Unlike Megamax
(or at least, unlike how you say Megamax works, since I've never tried it)
Lattice C does properly implement 'unsigned' as a type modifier.  So you can
have 'unsigned long', 'unsigned short', and 'unsigned char'...