16
22
extern halfword insert_complex_discretionary ( halfword t, lang_variables *lan,
17
23
halfword pre, halfword post, halfword replace);
18
24
extern halfword insert_character ( halfword t, int n);
25
extern void set_disc_field (halfword f, halfword t);
21
28
#define max_halfword 0x3FFFFFFF
23
#define null -0x3FFFFFFF
25
32
#define null_flag -0x40000000
26
33
#define zero_glue 0
29
36
#define vinfo(a) varmem[(a)].hh.v.LH
30
#define node_size(a) varmem[(a)].hh.v.LH
31
37
#define vlink(a) varmem[(a)].hh.v.RH
32
38
#define type(a) varmem[(a)].hh.u.B0
33
39
#define subtype(a) varmem[(a)].hh.u.B1
34
40
#define node_attr(a) vinfo((a)+1)
35
41
#define alink(a) vlink((a)+1)
43
#define node_size(a) varmem[(a)].hh.v.LH
37
45
#define rlink(a) vlink((a)+1) /* aka alink() */
38
46
#define llink(a) vinfo((a)+1) /* overlaps with node_attr() */
48
#define add_glue_ref(a) glue_ref_count(a)++ /* new reference to a glue spec */
41
50
/* really special head node pointers that only need links */
43
52
#define temp_node_size 2
45
54
/* attribute lists */
56
/* it is convenient to have attribute list nodes and attribute node
46
60
#define attribute_node_size 2
47
#define attribute_list_node_size 2
49
#define attr_list_ref(a) vinfo((a)+1)
50
#define attribute_id(a) vlink((a)+1)
51
#define attribute_value(a) vinfo((a)+1)
62
#define attr_list_ref(a) vinfo((a)+1) /* the reference count */
63
#define attribute_id(a) vinfo((a)+1)
64
#define attribute_value(a) vlink((a)+1)
66
#define cache_disabled max_halfword
67
#define add_node_attr_ref(a) { if (a!=null) attr_list_ref((a))++; }
69
#define replace_attribute_list(a,b) do { \
70
delete_attribute_ref(node_attr(a)); \
74
extern void update_attribute_cache (void) ;
75
extern halfword copy_attribute_list(halfword n) ;
76
extern halfword do_set_attribute(halfword p, int i, int val);
54
80
#define glue_spec_size 4
77
103
#define pdf_action_tokens(a) vinfo((a) + 3)
78
104
#define pdf_action_refcount(a) vlink((a) + 3)
106
/*increase count of references to this action*/
107
#define add_action_ref(a) pdf_action_refcount((a))++
109
/* decrease count of references to this
110
action; free it if there is no reference to this action*/
112
#define delete_action_ref(a) { \
113
if (pdf_action_refcount(a) == null) { \
114
if (pdf_action_type(a) == pdf_action_user) { \
115
delete_token_ref(pdf_action_tokens(a)); \
117
if (pdf_action_file(a) != null) \
118
delete_token_ref(pdf_action_file(a)); \
119
if (pdf_action_type(a) == pdf_action_page) \
120
delete_token_ref(pdf_action_tokens(a)); \
121
else if (pdf_action_named_id(a) > 0) \
122
delete_token_ref(pdf_action_id(a)); \
124
free_node(a, pdf_action_size); \
126
decr(pdf_action_refcount(a)); \
80
132
/* normal nodes */
82
134
#define inf_bad 10000 /* infinitely bad value */
197
271
unset_node, /* 13 */
200
margin_kern_node = 40,
290
margin_kern_node = 32,
292
align_record_node = 34,
293
pseudo_file_node = 35,
294
pseudo_line_node = 36,
202
300
attribute_node = 42,
203
301
glue_spec_node = 43,
204
302
attribute_list_node = 44,
205
last_known_node = 45, /* used by \lastnodetype */
305
align_stack_node = 47,
206
308
unhyphenated_node = 50,
207
309
hyphenated_node = 51,
209
passive_node = 53 } node_types ;
312
shape_node = 54 } node_types ;
314
#define last_known_node temp_node /* used by \lastnodetype */
316
#define movement_node_size 3
317
#define expr_node_size 3
318
#define if_node_size 2
319
#define align_stack_node_size 6
320
#define nesting_node_size 2
322
#define span_node_size 3
323
#define span_span(a) vlink((a)+1)
324
#define span_link(a) vinfo((a)+1)
326
#define pseudo_file_node_size 2
327
#define pseudo_lines(a) vlink((a)+1)
329
#define nodetype_has_attributes(t) ((t)<=glyph_node)
331
#define style_node_size 4 /* number of words in a style node*/
332
#define radical_noad_size 6 /*number of |mem| words in a radical noad*/
333
#define accent_noad_size 6 /*number of |mem| words in an accent noad*/
336
#define display_mlist(a) vinfo((a)+2) /* mlist to be used in display style*/
337
#define text_mlist(a) vlink((a)+2) /* mlist to be used in text style */
338
#define script_mlist(a) vinfo((a)+3) /* mlist to be used in script style */
339
#define script_script_mlist(a) vlink((a)+3) /* mlist to be used in scriptscript style */
341
#define noad_size 5 /*number of words in a normal noad*/
342
#define nucleus(a) (a)+2 /* the |nucleus| field of a noad */
343
#define supscr(a) (a)+3 /* the |supscr| field of a noad */
344
#define subscr(a) (a)+4 /* the |subscr| field of a noad */
345
#define math_type vlink /* a |quarterword| in |mem| */
346
#define fam(a) type((a)) /* a |quarterword| in |mem| */
348
#define fraction_noad_size 7 /*number of |mem| words in a fraction noad*/
349
#define numerator supscr /*|numerator| field in a fraction noad*/
350
#define denominator subscr /*|denominator| field in a fraction noad*/
353
math_char=1, /* |math_type| when the attribute is simple */
354
sub_box, /* |math_type| when the attribute is a box */
355
sub_mlist, /* |math_type| when the attribute is a formula */
356
math_text_char /* |math_type| when italic correction is dubious */
289
441
#define set_is_rightghost(p) { set_to_ghost(p); subtype(p) |= GLYPH_RIGHT; }
292
#define open_node_size 4
293
#define write_node_size 3
294
#define close_node_size 3
295
444
#define special_node_size 3
296
#define language_node_size 4
297
#define dir_node_size 5
446
#define dir_node_size 4
299
447
#define dir_dir(a) vinfo((a)+2)
300
448
#define dir_level(a) vlink((a)+2)
301
449
#define dir_dvi_ptr(a) vinfo((a)+3)
302
450
#define dir_dvi_h(a) vlink((a)+3)
303
#define what_lang(a) vlink((a)+2)
304
#define what_lhm(a) type((a)+2)
305
#define what_rhm(a) subtype((a)+2)
452
#define write_node_size 3
453
#define close_node_size 3
306
454
#define write_tokens(a) vlink(a+2)
307
455
#define write_stream(a) vinfo(a+2)
457
#define open_node_size 4
308
458
#define open_name(a) vlink((a)+2)
309
459
#define open_area(a) vinfo((a)+3)
310
460
#define open_ext(a) vlink((a)+3)
395
547
subst_ex_font /* substitute fonts */
396
548
} hpack_subtypes;
398
#define active_node_size 5 /*number of words in extended active nodes*/
550
#define active_node_size 4 /*number of words in extended active nodes*/
399
551
#define fitness subtype /*|very_loose_fit..tight_fit| on final line for this break*/
400
552
#define break_node(a) vlink((a)+1) /*pointer to the corresponding passive node */
401
553
#define line_number(a) vinfo((a)+1) /*line that begins at this breakpoint*/
402
554
#define total_demerits(a) varmem[(a)+2].cint /* the quantity that \TeX\ minimizes*/
403
#define active_short(a) varmem[(a)+3].cint /* |shortfall| of this line */
404
#define active_glue(a) varmem[(a)+4].cint /*corresponding glue stretch or shrink*/
406
#define passive_node_size 8
407
#define cur_break rlink /*in passive node, points to position of this breakpoint*/
408
#define prev_break llink /*points to passive node that should precede this one */
409
#define passive_pen_inter(a) varmem[((a)+2)].cint
410
#define passive_pen_broken(a) varmem[((a)+3)].cint
411
#define passive_left_box(a) vlink((a)+4)
412
#define passive_left_box_width(a) vinfo((a)+4)
413
#define passive_last_left_box(a) vlink((a)+5)
414
#define passive_last_left_box_width(a) vinfo((a)+5)
415
#define passive_right_box(a) vlink((a)+6)
416
#define passive_right_box_width(a) vinfo((a)+6)
417
#define serial(a) vlink((a)+7) /* serial number for symbolic identification*/
419
#define delta_node_size 11
555
#define active_short(a) vinfo(a+3) /* |shortfall| of this line */
556
#define active_glue(a) vlink(a+3) /*corresponding glue stretch or shrink*/
558
#define passive_node_size 7
559
#define cur_break(a) vlink((a)+1) /*in passive node, points to position of this breakpoint*/
560
#define prev_break(a) vinfo((a)+1) /*points to passive node that should precede this one */
561
#define passive_pen_inter(a) vinfo((a)+2)
562
#define passive_pen_broken(a) vlink((a)+2)
563
#define passive_left_box(a) vlink((a)+3)
564
#define passive_left_box_width(a) vinfo((a)+3)
565
#define passive_last_left_box(a) vlink((a)+4)
566
#define passive_last_left_box_width(a) vinfo((a)+4)
567
#define passive_right_box(a) vlink((a)+5)
568
#define passive_right_box_width(a) vinfo((a)+5)
569
#define serial(a) vlink((a)+6) /* serial number for symbolic identification*/
571
#define delta_node_size 10 /* 8 fields, stored in a+1..9 */
421
573
#define couple_nodes(a,b) {assert(b!=null);vlink(a)=b;alink(b)=a;}
422
574
#define try_couple_nodes(a,b) if (b==null) vlink(a)=b; else {couple_nodes(a,b);}
423
575
#define uncouple_node(a) {assert(a!=null);vlink(a)=null;alink(a)=null;}
577
#define cache_disabled max_halfword
579
extern void delete_attribute_ref(halfword b) ;
580
extern void build_attribute_list(halfword b) ;
582
extern int unset_attribute(halfword n, int c, int w);
583
extern void set_attribute(halfword n, int c, int w);
584
extern int has_attribute(halfword n, int c, int w);
586
extern halfword new_span_node (halfword n, int c, scaled w);
587
extern halfword string_to_pseudo(integer l,integer pool_ptr, integer nl);
425
589
/* TH: these two defines still need checking. The node ordering in luatex is not
426
590
quite the same as in tex82 */
428
#define precedes_break(a) (type((a))<math_node)
592
#define precedes_break(a) (type((a))<math_node && (type(a)!=whatsit_node || subtype(a)!=dir_node))
429
593
#define non_discardable(a) (type((a))<math_node)
431
#define NODE_METATABLE "luatex.node"
433
#define check_isnode(L,b) (halfword *)luaL_checkudata(L,b,NODE_METATABLE)
435
595
/* from luanode.c */
437
extern char * node_names[];
438
extern char * whatsit_node_names[];
439
extern halfword lua_node_new(int i, int j);
597
typedef struct _node_info {
604
extern node_info node_data[];
605
extern node_info whatsit_node_data[];
606
extern halfword new_node(int i, int j);
607
extern void flush_node_list(halfword);
608
extern void flush_node(halfword);
609
extern halfword copy_node_list(halfword);
610
extern halfword copy_node(halfword);
611
extern void check_node(halfword);
612
extern void check_node_mem (void);
613
extern void fix_node_list (halfword);
614
extern int fix_node_lists;
615
extern char *sprint_node_mem_usage (void) ;
616
extern halfword raw_glyph_node(void) ;
617
extern halfword new_glyph_node(void);
618
extern int valid_node(halfword);
620
#define unity 0x10000
441
628
#define zero_glue 0
442
629
#define sfi_glue zero_glue+glue_spec_size