summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/alephdir/eo16bit.ch
diff options
context:
space:
mode:
authorDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
committerDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
commitc6101f91d071883b48b1b4b51e5eba0f36d9a78d (patch)
tree1bf7f5a881d7a4f5c5bf59d0b2821943dd822372 /Build/source/texk/web2c/alephdir/eo16bit.ch
parent07ee7222e389b0777456b427a55c22d0e6ffd267 (diff)
French translation for tlmgr updated
git-svn-id: svn://tug.org/texlive/trunk@57912 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/alephdir/eo16bit.ch')
-rw-r--r--Build/source/texk/web2c/alephdir/eo16bit.ch696
1 files changed, 0 insertions, 696 deletions
diff --git a/Build/source/texk/web2c/alephdir/eo16bit.ch b/Build/source/texk/web2c/alephdir/eo16bit.ch
deleted file mode 100644
index d3749c3aff5..00000000000
--- a/Build/source/texk/web2c/alephdir/eo16bit.ch
+++ /dev/null
@@ -1,696 +0,0 @@
-% This is an \Aleph change file; it brings \eTeX register numbers
-% from 32767 ($2^{15}-1$) to 65535 ($2^{16}-1), to bring it on line
-% with \Omega
-% Noticeably, since Omega has 16-bit quarterwords, it is possible
-% to do so without changing much.
-% Notice that we do this for marks register: everything else is
-% brought to level with Omega in eomem.ch
-%----------------------------------------
-@x Section 53a onwards l.4600
-@ @<Initialize variables for \eTeX\ ext...@>=
-max_reg_num:=32767;
-max_reg_help_line:="A register number must be between 0 and 32767.";
-@y
-@ @<Initialize variables for \eTeX\ ext...@>=
-max_reg_num:=65535;
-max_reg_help_line:="A register number must be between 0 and 65535.";
-@z
-%----------------------------------------
-@x l.4607
-@ There are seven almost identical doubly linked trees, one for the
-sparse array of the up to 32512 additional registers of each kind and
-one for the sparse array of the up to 32767 additional mark classes.
-The root of each such tree, if it exists, is an index node containing 16
-pointers to subtrees for 4096 consecutive array elements. Similar index
-nodes are the starting points for all nonempty subtrees for 4096, 256,
-and 16 consecutive array elements. These four levels of index nodes are
-followed by a fifth level with nodes for the individual array elements.
-
-Each index node is nine words long. The pointers to the 16 possible
-subtrees or are kept in the |info| and |link| fields of the last eight
-words. (It would be both elegant and efficient to declare them as
-array, unfortunately \PASCAL\ doesn't allow this.)
-
-The fields in the first word of each index node and in the nodes for the
-array elements are closely related. The |link| field points to the next
-lower index node and the |sa_index| field contains four bits (one
-hexadecimal digit) of the register number or mark class. For the lowest
-index node the |link| field is |null| and the |sa_index| field indicates
-the type of quantity (|int_avl|, |dimen_val|, |glue_val|, |mu_val|,
-|box_val|, |tok_val|, or |mark_val|). The |sa_used| field in the index
-nodes counts how many of the 16 pointers are non-null.
-@y
-@ There is one doubly linked tree, to handle the sparse array of the up
-to 65535 additional mark classes.
-The root of the tree, if it exists, is an index node containing 16
-pointers to subtrees for 4096 consecutive array elements. Similar index
-nodes are the starting points for all nonempty subtrees for 4096, 256,
-and 16 consecutive array elements. These four levels of index nodes are
-followed by a fifth level with nodes for the individual array elements.
-
-Each index node is nine words long. The pointers to the 16 possible
-subtrees are kept in the |info| and |link| fields of the last eight
-words. (It would be both elegant and efficient to declare them as
-array, unfortunately \PASCAL\ doesn't allow this.)
-
-The fields in the first word of each index node and in the nodes for the
-array elements are closely related. The |link| field points to the next
-lower index node and the |sa_index| field contains eight bits (two
-hexadecimal digits) of the mark class. For the lowest
-index node the |link| field is |null| and the |sa_index| field indicates
-the type of quantity (which is always |mark_val|). The |sa_used| field in the
-index nodes counts how many of the 16 pointers are non-null.
-@z
-%----------------------------------------
-@x l.4630
-The |sa_index| field in the nodes for array elements contains the four
-bits plus 16 times the type. Therefore such a node represents a count
-or dimen register if and only if |sa_index<dimen_val_limit|; it
-represents a skip or muskip register if and only if
-|dimen_val_limit<=sa_index<mu_val_limit|; it represents a box register
-if and only if |mu_val_limit<=sa_index<box_val_limit|; it represents a
-token list register if and only if
-|box_val_limit<=sa_index<tok_val_limit|; finally it represents a mark
-class if and only if |tok_val_limit<=sa_index|.
-
-The |new_index| procedure creates an index node (returned in |cur_ptr|)
-having given contents of the |sa_index| and |link| fields.
-
-@d box_val==4 {the additional box registers}
-@d mark_val=6 {the additional mark classes}
-@#
-@d dimen_val_limit=@"20 {$2^4\cdot(|dimen_val|+1)$}
-@d mu_val_limit=@"40 {$2^4\cdot(|mu_val|+1)$}
-@d box_val_limit=@"50 {$2^4\cdot(|box_val|+1)$}
-@d tok_val_limit=@"60 {$2^4\cdot(|tok_val|+1)$}
-@y
-The |sa_index| field in the nodes for array elements contains the eight
-bits plus 256 times the type. The type field is actually ignored,
-since we only use this hoop-jumpings for marks registers (the code
-will probably get a rewrite to get in line with the rest of the
-(e-)Omega stuf, anyway, so \dots)
-
-The |new_index| procedure creates an index node (returned in |cur_ptr|)
-having given contents of the |sa_index| and |link| fields.
-
-@d box_val==7 {the additional box registers}
-@d mark_val=8 {the additional mark classes}
-@z
-%----------------------------------------
-@x
-@ The roots of the seven trees for the additional registers and mark
-classes are kept in the |sa_root| array. The first six locations must
-be dumped and undumped; the last one is also known as |sa_mark|.
-
-@d sa_mark==sa_root[mark_val] {root for mark classes}
-
-@<Glob...@>=
-@!sa_root:array[int_val..mark_val] of pointer; {roots of sparse arrays}
-@!cur_ptr:pointer; {value returned by |new_index| and |find_sa_element|}
-@!sa_null:memory_word; {two |null| pointers}
-
-@ @<Set init...@>=
-sa_mark:=null; sa_null.hh.lh:=null; sa_null.hh.rh:=null;
-
-@ @<Initialize table...@>=
-for i:=int_val to tok_val do sa_root[i]:=null;
-@y
-@ The root of the tree for the additional mark classes is kept
-in |sa_mark|.
-
-@<Glob...@>=
-@!sa_mark:pointer; {pointer to sparse array of marks}
-@!cur_ptr:pointer; {value returned by |new_index| and |find_sa_element|}
-@!sa_null:memory_word; {two |null| pointers}
-
-@ @<Set init...@>=
-sa_mark:=null; sa_null.hh.lh:=null; sa_null.hh.rh:=null;
-@z
-%----------------------------------------
-@x l.4681
-@ Given a type |t| and a sixteen-bit number |n|, the |find_sa_element|
-procedure returns (in |cur_ptr|) a pointer to the node for the
-corresponding array element, or |null| when no such element exists. The
-third parameter |w| is set |true| if the element must exist, e.g.,
-because it is about to be modified. The procedure has two main
-branches: one follows the existing tree structure, the other (only used
-when |w| is |true|) creates the missing nodes.
-
-We use macros to extract the four-bit pieces from a sixteen-bit register
-number or mark class and to fetch or store one of the 16 pointers from
-an index node.
-
-@d if_cur_ptr_is_null_then_return_or_goto(#)== {some tree element is missing}
- begin if cur_ptr=null then
- if w then goto #@+else return;
- end
-@#
-@d hex_dig1(#)==# div 4096 {the fourth lowest hexadecimal digit}
-@d hex_dig2(#)==(# div 256) mod 16 {the third lowest hexadecimal digit}
-@d hex_dig3(#)==(# div 16) mod 16 {the second lowest hexadecimal digit}
-@d hex_dig4(#)==# mod 16 {the lowest hexadecimal digit}
-@#
-@d get_sa_ptr==if odd(i) then cur_ptr:=link(q+(i div 2)+1)
- else cur_ptr:=info(q+(i div 2)+1)
- {set |cur_ptr| to the pointer indexed by |i| from index node |q|}
-@d put_sa_ptr(#)==if odd(i) then link(q+(i div 2)+1):=#
- else info(q+(i div 2)+1):=#
- {store the pointer indexed by |i| in index node |q|}
-@d add_sa_ptr==begin put_sa_ptr(cur_ptr); incr(sa_used(q));
- end {add |cur_ptr| as the pointer indexed by |i| in index node |q|}
-@d delete_sa_ptr==begin put_sa_ptr(null); decr(sa_used(q));
- end {delete the pointer indexed by |i| in index node |q|}
-
-@<Declare \eTeX\ procedures for ex...@>=
-procedure find_sa_element(@!t:small_number;@!n:halfword;@!w:boolean);
- {sets |cur_val| to sparse array element location or |null|}
-label not_found,not_found1,not_found2,not_found3,not_found4,exit;
-var q:pointer; {for list manipulations}
-@!i:small_number; {a four bit index}
-begin cur_ptr:=sa_root[t];
-if_cur_ptr_is_null_then_return_or_goto(not_found);@/
-q:=cur_ptr; i:=hex_dig1(n); get_sa_ptr;
-if_cur_ptr_is_null_then_return_or_goto(not_found1);@/
-q:=cur_ptr; i:=hex_dig2(n); get_sa_ptr;
-if_cur_ptr_is_null_then_return_or_goto(not_found2);@/
-q:=cur_ptr; i:=hex_dig3(n); get_sa_ptr;
-if_cur_ptr_is_null_then_return_or_goto(not_found3);@/
-q:=cur_ptr; i:=hex_dig4(n); get_sa_ptr;
-if (cur_ptr=null)and w then goto not_found4;
-return;
-not_found: new_index(t,null); {create first level index node}
-sa_root[t]:=cur_ptr; q:=cur_ptr; i:=hex_dig1(n);
-not_found1: new_index(i,q); {create second level index node}
-add_sa_ptr; q:=cur_ptr; i:=hex_dig2(n);
-not_found2: new_index(i,q); {create third level index node}
-add_sa_ptr; q:=cur_ptr; i:=hex_dig3(n);
-not_found3: new_index(i,q); {create fourth level index node}
-add_sa_ptr; q:=cur_ptr; i:=hex_dig4(n);
-not_found4: @<Create a new array element of type |t| with index |i|@>;
-link(cur_ptr):=q; add_sa_ptr;
-exit:end;
-
-@ The array elements for registers are subject to grouping and have an
-|sa_lev| field (quite analogous to |eq_level|) instead of |sa_used|.
-Since saved values as well as shorthand definitions (created by e.g.,
-\.{\\countdef}) refer to the location of the respective array element,
-we need a reference count that is kept in the |sa_ref| field. An array
-element can be deleted (together with all references to it) when its
-|sa_ref| value is |null| and its value is the default value.
-@^reference counts@>
-
-Skip, muskip, box, and token registers use two word nodes, their values
-are stored in the |sa_ptr| field.
-Count and dimen registers use three word nodes, their
-values are stored in the |sa_int| resp.\ |sa_dim| field in the third
-word; the |sa_ptr| field is used under the name |sa_num| to store
-the register number. Mark classes use four word nodes. The last three
-words contain the five types of current marks
-
-@d sa_lev==sa_used {grouping level for the current value}
-@d pointer_node_size=2 {size of an element with a pointer value}
-@d sa_type(#)==(sa_index(#) div 16) {type part of combined type/index}
-@d sa_ref(#)==info(#+1) {reference count of a sparse array element}
-@d sa_ptr(#)==link(#+1) {a pointer value}
-@#
-@d word_node_size=3 {size of an element with a word value}
-@d sa_num==sa_ptr {the register number}
-@d sa_int(#)==mem[#+2].int {an integer}
-@d sa_dim(#)==mem[#+2].sc {a dimension (a somewhat esotheric distinction)}
-@#
-@d mark_class_node_size=4 {size of an element for a mark class}
-@#
-@d fetch_box(#)== {fetch |box(cur_val)|}
- if cur_val<256 then #:=box(cur_val)
- else begin find_sa_element(box_val,cur_val,false);
- if cur_ptr=null then #:=null@+else #:=sa_ptr(cur_ptr);
- end
-
-@<Create a new array element...@>=
-if t=mark_val then {a mark class}
- begin cur_ptr:=get_node(mark_class_node_size);
- mem[cur_ptr+1]:=sa_null; mem[cur_ptr+2]:=sa_null; mem[cur_ptr+3]:=sa_null;
- end
-else begin if t<=dimen_val then {a count or dimen register}
- begin cur_ptr:=get_node(word_node_size); sa_int(cur_ptr):=0;
- sa_num(cur_ptr):=n;
- end
- else begin cur_ptr:=get_node(pointer_node_size);
- if t<=mu_val then {a skip or muskip register}
- begin sa_ptr(cur_ptr):=zero_glue; add_glue_ref(zero_glue);
- end
- else sa_ptr(cur_ptr):=null; {a box or token list register}
- end;
- sa_ref(cur_ptr):=null; {all registers have a reference count}
- end;
-sa_index(cur_ptr):=16*t+i; sa_lev(cur_ptr):=level_one
-
-@ The |delete_sa_ref| procedure is called when a pointer to an array
-element representing a register is being removed; this means that the
-reference count should be decreased by one. If the reduced reference
-count is |null| and the register has been (globally) assigned its
-default value the array element should disappear, possibly together with
-some index nodes. This procedure will never be used for mark class
-nodes.
-@^reference counts@>
-
-@d add_sa_ref(#)==incr(sa_ref(#)) {increase reference count}
-@#
-@d change_box(#)== {change |box(cur_val)|, the |eq_level| stays the same}
- if cur_val<256 then set_equiv(box_base+cur_val,#)@+else set_sa_box(#)
-@#
-
-{ FIXME: needs debugging (sparse arrays) }
-@d set_sa_box(#)==begin find_sa_element(box_val,cur_val,false);
- if cur_ptr<>0 then
- begin
- set_equiv(sa_ptr(cur_ptr),#);
- add_sa_ref(cur_ptr);
- delete_sa_ref(cur_ptr);
- end;
- end
-
-@<Declare \eTeX\ procedures for tr...@>=
-procedure delete_sa_ref(@!q:pointer); {reduce reference count}
-label exit;
-var p:pointer; {for list manipulations}
-@!i:small_number; {a four bit index}
-@!s:small_number; {size of a node}
-begin decr(sa_ref(q));
-if sa_ref(q)<>null then return;
-if sa_index(q)<dimen_val_limit then
- if sa_int(q)=0 then s:=word_node_size
- else return
-else begin if sa_index(q)<mu_val_limit then
- if sa_ptr(q)=zero_glue then delete_glue_ref(zero_glue)
- else return
- else if sa_ptr(q)<>null then return;
- s:=pointer_node_size;
- end;
-repeat i:=hex_dig4(sa_index(q)); p:=q; q:=link(p); free_node(p,s);
-if q=null then {the whole tree has been freed}
- begin sa_root[i]:=null; return;
- end;
-delete_sa_ptr; s:=index_node_size; {node |q| is an index node}
-until sa_used(q)>0;
-exit:end;
-
-@ The |print_sa_num| procedure prints the register number corresponding
-to an array element.
-
-@<Basic print...@>=
-procedure print_sa_num(@!q:pointer); {print register number}
-var @!n:halfword; {the register number}
-begin if sa_index(q)<dimen_val_limit then n:=sa_num(q) {the easy case}
-else begin n:=hex_dig4(sa_index(q)); q:=link(q); n:=n+16*sa_index(q);
- q:=link(q); n:=n+256*(sa_index(q)+16*sa_index(link(q)));
- end;
-print_int(n);
-end;
-
-@ Here is a procedure that displays the contents of an array element
-symbolically. It is used under similar circumstances as is
-|restore_trace| (together with |show_eqtb|) for the quantities kept in
-the |eqtb| array.
-
-@<Declare \eTeX\ procedures for tr...@>=
-@!stat procedure show_sa(@!p:pointer;@!s:str_number);
-var t:small_number; {the type of element}
-begin begin_diagnostic; print_char("{"); print(s); print_char(" ");
-if p=null then print_char("?") {this can't happen}
-else begin t:=sa_type(p);
- if t<box_val then print_cmd_chr(register,p)
- else if t=box_val then
- begin print_esc("box"); print_sa_num(p);
- end
- else if t=tok_val then print_cmd_chr(toks_register,p)
- else print_char("?"); {this can't happen either}
- print_char("=");
- if t=int_val then print_int(sa_int(p))
- else if t=dimen_val then
- begin print_scaled(sa_dim(p)); print("pt");
- end
- else begin p:=sa_ptr(p);
- if t=glue_val then print_spec(p,"pt")
- else if t=mu_val then print_spec(p,"mu")
- else if t=box_val then
- if p=null then print("void")
- else begin depth_threshold:=0; breadth_max:=1; show_node_list(p);
- end
- else if t=tok_val then
- begin if p<>null then show_token_list(link(p),null,32);
- end
- else print_char("?"); {this can't happen either}
- end;
- end;
-print_char("}"); end_diagnostic(false);
-end;
-tats
-@y
-@ Given a type |t| (which is always |mark_val|) and a sixteen-bit number |n|,
-the |find_sa_element| procedure returns (in |cur_ptr|) a pointer to the node
-for the corresponding array element, or |null| when no such element exists.
-The third parameter |w| is set |true| if the element must exist, e.g., because
-it is about to be modified. The procedure has two main branches: one follows
-the existing tree structure, the other (only used when |w| is |true|) creates
-the missing nodes.
-
-We use macros to extract the four-bit pieces from a sixteen-bit register
-number or mark class and to fetch or store one of the 16 pointers from
-an index node.
-
-@d if_cur_ptr_is_null_then_return_or_goto(#)== {some tree element is missing}
- begin if cur_ptr=null then
- if w then goto #@+else return;
- end
-@#
-{FIXME: needs debugging}
-@d hex_dig1(#)==# div 4096 {the fourth lowest hexadecimal digit}
-@d hex_dig2(#)==(# div 256) mod 16 {the third lowest hexadecimal digit}
-@d hex_dig3(#)==(# div 16) mod 16 {the second lowest hexadecimal digit}
-@d hex_dig4(#)==# mod 16 {the lowest hexadecimal digit}
-@#
-@d get_sa_ptr==if odd(i) then cur_ptr:=link(q+(i div 2)+1)
- else cur_ptr:=info(q+(i div 2)+1)
- {set |cur_ptr| to the pointer indexed by |i| from index node |q|}
-@d put_sa_ptr(#)==if odd(i) then link(q+(i div 2)+1):=#
- else info(q+(i div 2)+1):=#
- {store the pointer indexed by |i| in index node |q|}
-@d add_sa_ptr==begin put_sa_ptr(cur_ptr); incr(sa_used(q));
- end {add |cur_ptr| as the pointer indexed by |i| in index node |q|}
-@d delete_sa_ptr==begin put_sa_ptr(null); decr(sa_used(q));
- end {delete the pointer indexed by |i| in index node |q|}
-
-@<Declare \eTeX\ procedures for ex...@>=
-procedure find_sa_element(@!t:small_number;@!n:halfword;@!w:boolean);
- {sets |cur_val| to sparse array element location or |null|}
-label not_found,not_found1,not_found2,not_found3,not_found4,exit;
-var q:pointer; {for list manipulations}
-@!i:small_number; {a four bit index}
-begin
-begin if t<>mark_val then begin
- cur_ptr:=null;
- return;
-end; end;
-cur_ptr:=sa_mark;
-if_cur_ptr_is_null_then_return_or_goto(not_found);@/
-q:=cur_ptr; i:=hex_dig1(n); get_sa_ptr;
-if_cur_ptr_is_null_then_return_or_goto(not_found1);@/
-q:=cur_ptr; i:=hex_dig2(n); get_sa_ptr;
-if_cur_ptr_is_null_then_return_or_goto(not_found2);@/
-q:=cur_ptr; i:=hex_dig3(n); get_sa_ptr;
-if_cur_ptr_is_null_then_return_or_goto(not_found3);@/
-q:=cur_ptr; i:=hex_dig4(n); get_sa_ptr;
-if (cur_ptr=null)and w then goto not_found4;
-return;
-not_found: new_index(t,null); {create first level index node}
-sa_mark:=cur_ptr; q:=cur_ptr; i:=hex_dig1(n);
-not_found1: new_index(i,q); {create second level index node}
-add_sa_ptr; q:=cur_ptr; i:=hex_dig2(n);
-not_found2: new_index(i,q); {create third level index node}
-add_sa_ptr; q:=cur_ptr; i:=hex_dig3(n);
-not_found3: new_index(i,q); {create fourth level index node}
-add_sa_ptr; q:=cur_ptr; i:=hex_dig4(n);
-not_found4: @<Create a new array element of type |t| with index |i|@>;
-link(cur_ptr):=q; add_sa_ptr;
-exit:end;
-
-@ FIXME OBSOLETE The array elements for registers are subject to grouping and have an
-|sa_lev| field (quite analogous to |eq_level|) instead of |sa_used|.
-Since saved values as well as shorthand definitions (created by e.g.,
-\.{\\countdef}) refer to the location of the respective array element,
-we need a reference count that is kept in the |sa_ref| field. An array
-element can be deleted (together with all references to it) when its
-|sa_ref| value is |null| and its value is the default value.
-@^reference counts@>
-
-Skip, muskip, box, and token registers use two word nodes, their values
-are stored in the |sa_ptr| field.
-Count and dimen registers use three word nodes, their
-values are stored in the |sa_int| resp.\ |sa_dim| field in the third
-word; the |sa_ptr| field is used under the name |sa_num| to store
-the register number.
-
-@ Mark classes use four word nodes. The last three
-words contain the five types of current marks
-
-@d sa_lev==sa_used {grouping level for the current value}
-@d pointer_node_size=2 {size of an element with a pointer value}
-@d sa_type(#)==(sa_index(#) div 256) {type part of combined type/index}
-@d sa_ref(#)==info(#+1) {reference count of a sparse array element}
-@d sa_ptr(#)==link(#+1) {a pointer value}
-@#
-{FIXME: will be removed}
-@d word_node_size=3 {size of an element with a word value}
-@d sa_num==sa_ptr {the register number}
-@d sa_int(#)==mem[#+2].int {an integer}
-@d sa_dim(#)==mem[#+2].sc {a dimension (a somewhat esotheric distinction)}
-@#
-@d mark_class_node_size=4 {size of an element for a mark class}
-@#
-{FIXME: will be removed}
-@d fetch_box(#)== {fetch |box(cur_val)|}
- if cur_val<number_regs then #:=box(cur_val)
- else begin find_sa_element(box_val,cur_val,false);
- if cur_ptr=null then #:=null@+else #:=sa_ptr(cur_ptr);
- end
-
-@<Create a new array element...@>=
-if t=mark_val then {a mark class}
- begin cur_ptr:=get_node(mark_class_node_size);
- mem[cur_ptr+1]:=sa_null; mem[cur_ptr+2]:=sa_null; mem[cur_ptr+3]:=sa_null;
- end;
-{
-|else begin if t<=dimen_val then| {a count or dimen register}
-| begin cur_ptr:=get_node(word_node_size); sa_int(cur_ptr):=0;|
-| sa_num(cur_ptr):=n;|
-| end|
-| else begin cur_ptr:=get_node(pointer_node_size);|
-| if t<=mu_val then| {a skip or muskip register}
-| begin sa_ptr(cur_ptr):=zero_glue; add_glue_ref(zero_glue);|
-| end|
-| else sa_ptr(cur_ptr):=null; |{a box or token list register}
-| end;|
-| sa_ref(cur_ptr):=null;| {all registers have a reference count}
-| end;|
-}
-sa_index(cur_ptr):=256*t+i; sa_lev(cur_ptr):=level_one
-
-@ The |delete_sa_ref| procedure is called when a pointer to an array
-element representing a register is being removed; this means that the
-reference count should be decreased by one. If the reduced reference
-count is |null| and the register has been (globally) assigned its
-default value the array element should disappear, possibly together with
-some index nodes. This procedure will never be used for mark class
-nodes.
-@^reference counts@>
-
-@d add_sa_ref(#)==incr(sa_ref(#)) {increase reference count}
-@#
-@d change_box(#)== {change |box(cur_val)|, the |eq_level| stays the same}
- set_equiv(box_base+cur_val,#)
-@#
-
-{FIXME: will be removed}
-@d set_sa_box(#)==begin find_sa_element(box_val,cur_val,false);
- if cur_ptr<>0 then
- begin
- set_equiv(sa_ptr(cur_ptr),#);
- add_sa_ref(cur_ptr);
- delete_sa_ref(cur_ptr);
- end;
- end
-
-@<Declare \eTeX\ procedures for tr...@>=
-procedure delete_sa_ref(@!q:pointer); {reduce reference count}
-label exit;
-var p:pointer; {for list manipulations}
-@!i:small_number; {a four bit index}
-@!s:small_number; {size of a node}
-begin decr(sa_ref(q));
-if sa_ref(q)<>null then return;
-if false then {was |if sa_index(q)<dimen_val_limit then|}
- if sa_int(q)=0 then s:=word_node_size
- else return
-else begin if false then {was |sa_index(q)<mu_val_limit then|}
- if sa_ptr(q)=zero_glue then delete_glue_ref(zero_glue)
- else return
- else if sa_ptr(q)<>null then return;
- s:=pointer_node_size;
- end;
-repeat i:=hex_dig4(sa_index(q)); p:=q; q:=link(p); free_node(p,s);
-if q=null then {the whole tree has been freed}
- begin
- sa_mark:=null {was |sa_root[i]:=null|}; return;
- end;
-delete_sa_ptr; s:=index_node_size; {node |q| is an index node}
-until sa_used(q)>0;
-exit:end;
-
-@ The |print_sa_num| procedure prints the register number corresponding
-to an array element.
-
-@<Basic print...@>=
-procedure print_sa_num(@!q:pointer); {print register number}
-var @!n:halfword; {the register number}
-begin if false {was |sa_index(q)<dimen_val_limit|} then n:=sa_num(q) {the easy case}
-else begin n:=hex_dig4(sa_index(q)); q:=link(q); n:=n+16*sa_index(q);
- q:=link(q); n:=n+256*(sa_index(q)+16*sa_index(link(q)));
- end;
-print_int(n);
-end;
-
-@ Here is a procedure that displays the contents of an array element
-symbolically. It is used under similar circumstances as is
-|restore_trace| (together with |show_eqtb|) for the quantities kept in
-the |eqtb| array.
-
-@<Declare \eTeX\ procedures for tr...@>=
-@!stat procedure show_sa(@!p:pointer;@!s:str_number);
-{|var t:small_number;|} {the type of element}
-begin begin_diagnostic; print_char("{"); print(s); print_char(" ");
-{
-|if p=null then print_char("?")| {this can't happen}
-|else begin t:=sa_type(p);|
-| if t<box_val then print_cmd_chr(register,p)|
-| else if t=box_val then|
-| begin print_esc("box"); print_sa_num(p);|
-| end|
-| else if t=tok_val then print_cmd_chr(toks_register,p)|
-| else print_char("?");| {this can't happen either}
-| print_char("=");|
-| if t=int_val then print_int(sa_int(p))|
-| else if t=dimen_val then|
-| begin print_scaled(sa_dim(p)); print("pt");|
-| end|
-| else begin p:=sa_ptr(p);|
-| if t=glue_val then print_spec(p,"pt")|
-| else if t=mu_val then print_spec(p,"mu")|
-| else if t=box_val then|
-| if p=null then print("void")|
-| else begin depth_threshold:=0; breadth_max:=1; show_node_list(p);|
-| end|
-| else if t=tok_val then|
-| begin if p<>null then show_token_list(link(p),null,32);|
-| end|
-| else print_char("?");| {this can't happen either}
-| end;|
-| end;|
-}
-print_char("}"); end_diagnostic(false);
-end;
-tats
-@z
-%----------------------------------------
-% TODO: l.5029+: will the simply be removed?
-% (i.e.: cases which cannot happen (anymore)?)
-%----------------------------------------
-@x
-procedure sa_save(@!p:pointer); {saves value of |p|}
-var q:pointer; {the new save node}
-@!i:quarterword; {index field of node}
-begin if cur_level<>sa_level then
- begin check_full_save_stack; save_type(save_ptr):=restore_sa;
- save_level(save_ptr):=sa_level; save_index(save_ptr):=sa_chain;
- incr(save_ptr); sa_chain:=null; sa_level:=cur_level;
- end;
-i:=sa_index(p);
-if i<dimen_val_limit then
- begin if sa_int(p)=0 then
- begin q:=get_node(pointer_node_size); i:=tok_val_limit;
- end
- else begin q:=get_node(word_node_size); sa_int(q):=sa_int(p);
- end;
- sa_ptr(q):=null;
- end
-else begin q:=get_node(pointer_node_size); sa_ptr(q):=sa_ptr(p);
- end;
-sa_loc(q):=p; sa_index(q):=i; sa_lev(q):=sa_lev(p);
-link(q):=sa_chain; sa_chain:=q; add_sa_ref(p);
-end;
-
-@ @<Declare \eTeX\ procedures for tr...@>=
-procedure sa_destroy(@!p:pointer); {destroy value of |p|}
-begin if sa_index(p)<mu_val_limit then delete_glue_ref(sa_ptr(p))
-else if sa_ptr(p)<>null then
- if sa_index(p)<box_val_limit then flush_node_list(sa_ptr(p))
- else delete_token_ref(sa_ptr(p));
-end;
-@y
-procedure sa_save(@!p:pointer); {saves value of |p|}
-var q:pointer; {the new save node}
-@!i:quarterword; {index field of node}
-begin if cur_level<>sa_level then
- begin check_full_save_stack; save_type(save_ptr):=restore_sa;
- save_level(save_ptr):=sa_level; save_index(save_ptr):=sa_chain;
- incr(save_ptr); sa_chain:=null; sa_level:=cur_level;
- end;
-i:=sa_index(p);
-if false {was |i<dimen_val_limit|} then
- begin if sa_int(p)=0 then
- begin q:=get_node(pointer_node_size); i:=i {was |i:=tok_val_limit|};
- end
- else begin q:=get_node(word_node_size); sa_int(q):=sa_int(p);
- end;
- sa_ptr(q):=null;
- end
-else begin q:=get_node(pointer_node_size); sa_ptr(q):=sa_ptr(p);
- end;
-sa_loc(q):=p; sa_index(q):=i; sa_lev(q):=sa_lev(p);
-link(q):=sa_chain; sa_chain:=q; add_sa_ref(p);
-end;
-
-@ @<Declare \eTeX\ procedures for tr...@>=
-procedure sa_destroy(@!p:pointer); {destroy value of |p|}
-begin if false {was |sa_index(p)<mu_val_limit|} then delete_glue_ref(sa_ptr(p))
-else if sa_ptr(p)<>null then
- if false {was |sa_index(p)<box_val_limit|} then flush_node_list(sa_ptr(p))
- else delete_token_ref(sa_ptr(p));
-end;
-@z
-%----------------------------------------
-@x
-procedure sa_restore;
-var p:pointer; {sparse array element}
-begin repeat p:=sa_loc(sa_chain);
-if sa_lev(p)=level_one then
- begin if sa_index(p)>=dimen_val_limit then sa_destroy(sa_chain);
- @!stat if tracing_restores>0 then show_sa(p,"retaining");@+tats@;@/
- end
-else begin if sa_index(p)<dimen_val_limit then
- if sa_index(sa_chain)<dimen_val_limit then sa_int(p):=sa_int(sa_chain)
- else sa_int(p):=0
- else begin sa_destroy(p); sa_ptr(p):=sa_ptr(sa_chain);
- end;
- sa_lev(p):=sa_lev(sa_chain);
- @!stat if tracing_restores>0 then show_sa(p,"restoring");@+tats@;@/
- end;
-delete_sa_ref(p);
-p:=sa_chain; sa_chain:=link(p);
-if sa_index(p)<dimen_val_limit then free_node(p,word_node_size)
-else free_node(p,pointer_node_size);
-until sa_chain=null;
-end;
-@y
-procedure sa_restore;
-var p:pointer; {sparse array element}
-begin repeat p:=sa_loc(sa_chain);
-if sa_lev(p)=level_one then
- begin {|if sa_index(p)>=dimen_val_limit then|} sa_destroy(sa_chain);
- @!stat if tracing_restores>0 then show_sa(p,"retaining");@+tats@;@/
- end
-else begin if false {was |sa_index(p)<dimen_val_limit|} then
- if false {was |sa_index(sa_chain)<dimen_val_limit|} then sa_int(p):=sa_int(sa_chain)
- else sa_int(p):=0
- else begin sa_destroy(p); sa_ptr(p):=sa_ptr(sa_chain);
- end;
- sa_lev(p):=sa_lev(sa_chain);
- @!stat if tracing_restores>0 then show_sa(p,"restoring");@+tats@;@/
- end;
-delete_sa_ref(p);
-p:=sa_chain; sa_chain:=link(p);
-if false {was |sa_index(p)<dimen_val_limit|} then free_node(p,word_node_size)
-else free_node(p,pointer_node_size);
-until sa_chain=null;
-end;
-@z