From 487ca4806cc046076293cf6cc5fbba0db282bac7 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 17 Jan 2006 21:41:51 +0000 Subject: texk 1 git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/web2c/texmfmem.h | 250 +++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 Build/source/texk/web2c/texmfmem.h (limited to 'Build/source/texk/web2c/texmfmem.h') diff --git a/Build/source/texk/web2c/texmfmem.h b/Build/source/texk/web2c/texmfmem.h new file mode 100644 index 00000000000..32c41e08215 --- /dev/null +++ b/Build/source/texk/web2c/texmfmem.h @@ -0,0 +1,250 @@ +/* texmfmem.h: the memory_word type, which is too hard to translate + automatically from Pascal. We have to make sure the byte-swapping + that the (un)dumping routines do suffices to put things in the right + place in memory. + + A memory_word can be broken up into a `twohalves' or a + `fourquarters', and a `twohalves' can be further broken up. Here is + a picture. ..._M = most significant byte, ..._L = least significant + byte. + + The halfword fields are four bytes if we are building a big TeX or MF; + this leads to further complications: + + BigEndian: + twohalves.v: RH_MM RH_ML RH_LM RH_LL LH_MM LH_ML LH_LM LH_LL + twohalves.u: ---------JUNK---------- B0 B1 + fourquarters: B0 B1 B2 B3 + + LittleEndian: + twohalves.v: LH_LL LH_LM LH_ML LH_MM RH_LL RH_LM RH_ML RH_MM + twohalves.u: B1 B0 + fourquarters: ---------JUNK---------- B3 B2 B1 B0 + + I guess TeX and Metafont never refer to the B1 and B0 in the + fourquarters structure as the B1 and B0 in the twohalves.u structure. + + The B0 and B1 fields are declared short instead of quarterword, + because they are used in character nodes to store a font number and a + character. If left as a quarterword (which is a single byte), we + couldn't support more than 256 fonts. (If shorts aren't two bytes, + this will lose.) + + In the old four-byte memory structure (something more needs to be + done to handle >256 fonts): + + If BigEndian: + twohalves.v: RH_M RH_L LH_M LH_L + twohalves.u: JNK1 JNK2 B0 B1 + fourquarters: B0 B1 B2 B3 + + If LittleEndian: + twohalves.v: LH_L LH_M RH_L RH_M + twohalves.u: B1 B0 JNK1 JNK2 + fourquarters: B3 B2 B1 B0 + + In Omega, quarterwords are two octets, so the picture becomes simpler: + + BigEndian: + twohalves.v: RH_MM RH_ML RH_LM RH_LL LH_MM LH_ML LH_LM LH_LL + twohalves.u: ---------JUNK---------- ----B0----- ----B1----- + fourquarters: ----B0----- ----B1----- ----B2----- ----B3----- + twoints: ---------CINT0--------- ---------CINT1--------- + + LittleEndian: + twohalves.v: LH_LL LH_LM LH_ML LH_MM RH_LL RH_LM RH_ML RH_MM + twohalves.u: ----B1----- ----B0----- + fourquarters: ----B3----- ----B2----- ----B1----- ----B0----- + twoints: ---------CINT1--------- ---------CINT0--------- + + This file can't be part of texmf.h, because texmf.h gets included by + {tex,mf,mp}d.h before the `halfword' etc. types are defined. So we + include it from the change file instead. +*/ + +/* Omega is sufficiently different to separate the definition. */ +#if !defined(Omega) && !defined(eOmega) && !defined(Aleph) + +typedef union +{ + struct + { +#ifdef WORDS_BIGENDIAN + halfword RH, LH; +#else + halfword LH, RH; +#endif + } v; + + struct + { /* Make B0,B1 overlap the most significant bytes of LH. */ +#ifdef WORDS_BIGENDIAN + halfword junk; + short B0, B1; +#else /* not WORDS_BIGENDIAN */ + /* If 32-bit memory words, have to do something. */ +#if defined (SMALLTeX) || defined (SMALLMF) || defined (SMALLMP) + fixme +#else + short B1, B0; +#endif /* big memory words */ +#endif /* LittleEndian */ + } u; +} twohalves; + +typedef struct +{ + struct + { +#ifdef WORDS_BIGENDIAN + quarterword B0, B1, B2, B3; +#else + quarterword B3, B2, B1, B0; +#endif + } u; +} fourquarters; + +typedef union +{ +#ifdef TeX + glueratio gr; + twohalves hh; +#else + twohalves hhfield; +#endif +#ifdef WORDS_BIGENDIAN + integer cint; + fourquarters qqqq; +#else /* not WORDS_BIGENDIAN */ + struct + { +#if defined (TeX) && !defined (SMALLTeX) || defined (MF) && !defined (SMALLMF) || defined (MP) && !defined (SMALLMP) + halfword junk; +#endif /* big {TeX,MF,MP} */ + integer CINT; + } u; + + struct + { +#if defined (TeX) && !defined (SMALLTeX) || defined (MF) && !defined (SMALLMF) || defined (MP) && !defined (SMALLMP) + halfword junk; +#endif /* big {TeX,MF,MP} */ + fourquarters QQQQ; + } v; +#endif /* not WORDS_BIGENDIAN */ +} memoryword; + + +/* fmemory_word for font_list; needs to be only four bytes. This saves + significant space in the .fmt files. */ + +typedef union +{ +#ifdef WORDS_BIGENDIAN + integer cint; + fourquarters qqqq; +#else /* not WORDS_BIGENDIAN */ + struct + { + integer CINT; + } u; + + struct + { + fourquarters QQQQ; + } v; +#endif /* not WORDS_BIGENDIAN */ +} fmemoryword; + +/* To keep the original structure accesses working, we must go through + the extra names C forced us to introduce. */ +#define b0 u.B0 +#define b1 u.B1 +#define b2 u.B2 +#define b3 u.B3 + +#define rh v.RH +#define lhfield v.LH + +#ifndef WORDS_BIGENDIAN +#define cint u.CINT +#define qqqq v.QQQQ +#endif + +#else /* Omega || eOmega || Aleph */ + +typedef union +{ + struct + { +#ifdef WORDS_BIGENDIAN + halfword RH, LH; +#else + halfword LH, RH; +#endif + } v; + + struct + { /* Make B0,B1 overlap the most significant bytes of LH. */ +#ifdef WORDS_BIGENDIAN + halfword junk; + quarterword B0, B1; +#else /* not WORDS_BIGENDIAN */ + /* If 32-bit memory words, have to do something. */ +#if defined (SMALLTeX) || defined (SMALLMF) || defined (SMALLMP) + fixme +#else + quarterword B1, B0; +#endif /* big memory words */ +#endif /* LittleEndian */ + } u; +} twohalves; + +typedef struct +{ + struct + { +#ifdef WORDS_BIGENDIAN + quarterword B0, B1, B2, B3; +#else + quarterword B3, B2, B1, B0; +#endif + } u; +} fourquarters; + +typedef struct +{ +#ifdef WORDS_BIGENDIAN + integer CINT0, CINT1; +#else + integer CINT1, CINT0; +#endif +} twoints; + +typedef struct +{ + glueratio GLUE; +} glues; + +typedef union +{ + twohalves hh; + fourquarters qqqq; + twoints ii; + glues gg; +} memoryword; + +#define b0 u.B0 +#define b1 u.B1 +#define b2 u.B2 +#define b3 u.B3 + +#define rh v.RH +#define lhfield v.LH + +#define cint ii.CINT0 +#define cint1 ii.CINT1 + +#define gr gg.GLUE + +#endif /* Omega || eOmega || Aleph */ -- cgit v1.2.3