summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/texmfmem.h
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
commit487ca4806cc046076293cf6cc5fbba0db282bac7 (patch)
tree847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/web2c/texmfmem.h
parenta3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff)
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/texmfmem.h')
-rw-r--r--Build/source/texk/web2c/texmfmem.h250
1 files changed, 250 insertions, 0 deletions
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 */