TeX in C
Explore TeX with modern c compiler.
mem.h
浏览该文件的文档.
1 #ifndef INC_MEM_H
2 
3 #define INC_MEM_H
4 #include "global.h"
5 #include "tex_constant.h" // [const] MEM_MAX, MEM_MIN, MEM_BOT, MEM_TOP, HYPH_SIZE, MAX_QUARTER_WORD, MAX_HALF_WORD
6 
7 
13 #define null 0
14 
16 #define link(x) (mem[(x)].hh.rh)
18 #define info(x) (mem[(x)].hh.UU.lh)
19 
21 #define empty_flag MAX_HALF_WORD
23 #define is_empty(x) (link(x) == empty_flag)
25 #define node_size info
27 #define llink(x) info(x+1)
29 #define rlink(x) link(x+1)
30 
31 #ifdef tt_STAT
34 #define FREE_AVAIL(x) (link(x) = avail, avail = (x), dyn_used -= CHAR_NODE_SIZE)
35 
37 #define FAST_GET_AVAIL(x) \
38  do { \
39  if (((x) = avail) != null) { \
40  type(x) = charnodetype; \
41  avail = link(x); \
42  link(x) = null; \
43  dyn_used += CHAR_NODE_SIZE; \
44  } else { \
45  (x) = get_avail(); \
46  } \
47  } while (0)
48 // end #define FAST_GET_AVAIL(x)
49 #else
50 // not defined(tt_STAT)
51 
52 #define FREE_AVAIL(x) (link(x) = avail, avail = (x))
53 
54 #define FAST_GET_AVAIL(x) \
55  do { \
56  if (((x) = avail)) { \
57  type(x) = charnodetype; \
58  avail = link(x); \
59  link(x) = 0; \
60  } else { \
61  (x) = get_avail(); \
62  } \
63  } while (0)
64 // end #define FAST_GET_AVAIL(x)
65 #endif // #121,122: tt_STAT // end group S115x132_P44x49
67 
68 /* P2C compatibility */
69 #define P_clrbits_B(trie, idx, z, w) trie[(idx) >> 3] &= ~(1 << ((idx)&7))
70 #define P_getbits_UB(trie, h, z, w) (trie[(h) >> 3] & (1 << ((h)&7)))
71 #define P_putbits_UB(trie, h, y, z, w) trie[(h) >> 3] |= 1 << ((h)&7)
72 
77 #define zeroglue MEM_BOT
79 #define filglue (zeroglue + gluespecsize)
81 #define fillglue (filglue + gluespecsize)
83 #define ssglue (fillglue + gluespecsize)
85 #define filnegglue (ssglue + gluespecsize)
87 #define lomemstatmax (filnegglue + gluespecsize - 1)
88 
90 #define pageinshead (MEM_TOP-CHAR_NODE_SIZE+1)
92 #define contribhead (pageinshead-CHAR_NODE_SIZE)
94 #define pagehead (contribhead-CHAR_NODE_SIZE)
96 #define temphead (pagehead-CHAR_NODE_SIZE)
98 #define holdhead (temphead-CHAR_NODE_SIZE)
100 #define adjusthead (holdhead-CHAR_NODE_SIZE)
102 #define active (adjusthead-CHAR_NODE_SIZE-CHAR_NODE_SIZE)
104 #define alignhead (active-CHAR_NODE_SIZE)
106 #define endspan (alignhead-CHAR_NODE_SIZE)
108 #define omittemplate (endspan-CHAR_NODE_SIZE)
110 #define nulllist (omittemplate-CHAR_NODE_SIZE)
112 #define ligtrick (nulllist-CHAR_NODE_SIZE)
114 #define garbage (ligtrick)
116 #define backuphead (ligtrick-CHAR_NODE_SIZE)
118 #define himemstatmin (backuphead)
122 #define himemstatusage 14 // end group S162x172_P58x61
124 
125 
126 // tex only
127 extern Pointer temp_ptr;
128 extern Integer var_used;
129 extern Integer dyn_used;
130 extern Pointer avail; // tex/expand
131 extern Pointer rover;
132 
133 // tex, lexer
134 extern Pointer lo_mem_max;
135 extern Pointer hi_mem_min;
136 extern Pointer mem_end;
137 
138 // tex|texmac|tex_inc, scan,
139 extern MemoryWord mem[MEM_MAX - MEM_MIN + 1];
140 
141 // [ #162~172: MEMORY LAYOUT ]
142 #ifdef tt_DEBUG
143 extern UChar free_cells[(MEM_MAX - MEM_MIN + 8) / 8];
144 extern UChar was_free[(MEM_MAX - MEM_MIN + 8) / 8];
146 extern Boolean panicking;
147 #endif // #165: tt_DEBUG
148 
149 
150 extern Pointer get_lo_mem_max(void);
151 extern Pointer get_avail(void);
152 extern void flush_list(HalfWord p);
153 extern HalfWord get_node(Integer s);
154 extern void free_node(Pointer p, HalfWord s);
155 extern void sort_avail(void);
156 
157 // tex only
158 extern void check_mem(Boolean printlocs);
159 extern void search_mem(Pointer p);
160 extern void mem_init_once();
161 extern void mem_var_init();
162 
163 #endif /* INC_MEM_H */
uint32_t HalfWord
[p43#113]: HalfWord(16=>32) .
Definition: tex_types.h:127
HalfWord get_node(Integer s)
[p47#125] variable-size node allocation
Definition: mem.c:91
Integer dyn_used
[#117] how much memory is in use.
Definition: mem.c:26
Pointer lo_mem_max
[#116] the largest location of variable-size memory.
Definition: mem.c:24
MemoryWord mem[MEM_MAX - MEM_MIN+1]
[#116] the big dynamic storage area.
Definition: mem.c:23
void sort_avail(void)
p49#131: sorts the available variable-size nodes by location used at #1311
Definition: mem.c:213
Pointer rover
[#124] points to some node in the list of empties.
Definition: mem.c:29
Pointer get_lo_mem_max(void)
Definition: mem.c:32
void free_node(Pointer p, HalfWord s)
[p48#130]: variable-size node liberation
Definition: mem.c:191
Pointer temp_ptr
[#115] for occasional emergency use.
Definition: mem.c:22
Pointer get_avail(void)
[p45#120]: single-word node allocation.
Definition: mem.c:36
Pointer hi_mem_min
[#116] the smallest location of one-word memory.
Definition: mem.c:25
Pointer avail
[#118] head of the list of available one-word nodes.
Definition: mem.c:27
void flush_list(HalfWord p)
[p46#123]: makes list of single-word nodes available
Definition: mem.c:70
Pointer mem_end
[#118] the last one-word node used in mem.
Definition: mem.c:28
Integer var_used
Definition: mem.c:26
UChar was_free[(MEM_MAX - MEM_MIN+8)/8]
[#165] previously free cells, 以 byte(8) 分配,按位取用.
Definition: mem.c:263
void mem_init_once()
[#164]
Definition: mem.c:455
UChar free_cells[(MEM_MAX - MEM_MIN+8)/8]
[#165] free: free cells, 以 byte(8) 分配,按位取用.
Definition: mem.c:261
void mem_var_init()
[p59#166]
Definition: mem.c:524
Boolean panicking
[#165] do we want to check memory constantly?
Definition: mem.c:267
void search_mem(Pointer p)
p61#172
Definition: mem.c:397
void check_mem(Boolean printlocs)
p60#167
Definition: mem.c:272
Pointer was_mem_end
[#165] previous mem_end, lo_mem_max, and hi_mem_min.
Definition: mem.c:265
#define MEM_MAX
[#11] greatest index in TeX's internal mem array.
Definition: tex_constant.h:37
#define MEM_MIN
[#11] smallest index in TeX's internal mem array.
Definition: tex_constant.h:43
Pointer was_hi_min
Definition: mem.h:145
Pointer was_lo_max
Definition: mem.h:145
int64_t Integer
Integer(64) =
Definition: tex_types.h:42
size_t Pointer
Pointer::size_t(64), a flag or a location in mem or eqtb.
Definition: tex_types.h:45
bool Boolean
布尔类型定义
Definition: tex_types.h:11
uint8_t UChar
UChar(8) = [0, 255]
Definition: tex_types.h:38
[p43#113]: MemoryWord(64) .
Definition: tex_types.h:164