<div dir="ltr">This is a some parts of the code for implementing \beginspecial and \endspecial<br><br><br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>% [53.1344]
<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>@x
<br>@d immediate_code=4 {command modifier for \.{\\immediate}}
<br>@d set_language_code=5 {command modifier for \.{\\setlanguage}}
<br>@y
<br>@d beginspecial_node=6 {|subtype| in whatsits that represent \.{\\beginspecial}}
<br>@d endspecial_node=7 {|subtype| in whatsits that represent \.{\\endspecial}}
<br>@d LR_node=8 {|subtypes| in whatsits that represent \beginL, etc.}
<br>@d immediate_code=9 {command modifier for \.{\\immediate}}
<br>@d set_language_code=10 {command modifier for \.{\\setlanguage}}
<br>@z
<br> @x
<br>@!@:open_out_}{\.{\\openout} primitive@>
<br> @y
<br>@!@:open_out_}{\.{\\openout} primitive@>
<br> @z<br><br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>% [53.1348]
<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>@x open_R_node, eqwrite_node
<br>open_node:@<Implement \.{\\openout}@>;
<br>write_node:@<Implement \.{\\write}@>;
<br>@y
<br>open_node,open_R_node:@<Implement \.{\\openout}@>;
<br>eqwrite_node,write_node:@<Implement \.{\\write}@>;
<br>@z
<br>@x beginspecial_node, endspecial_node
<br>special_node:@<Implement \.{\\special}@>;
<br>@y
<br>special_node,beginspecial_node,endspecial_node:@<Implement \.{\\special}@>;
<br>@z<br><br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>% [53.1354]
<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>@x special_switch
<br>begin new_whatsit(special_node,write_node_size); write_stream(tail):=null;
<br>p:=scan_toks(false,true); write_tokens(tail):=def_ref;
<br>end
<br>@y
<br>begin i := cur_speech; j := cur_direction; k:=cur_chr;
<br>if not eqspcial then begin cur_speech := Lftlang; cur_direction := L_to_R;
<br> end;
<br>new_whatsit(k,write_node_size);
<br>if k = endspecial_node then
<br> if is_open_SPC then begin
<br> p := info (SPCsp); pop_SPC;
<br> write_tokens(tail):=write_stream (p);
<br> add_token_ref (write_tokens(tail));
<br> end
<br> else begin print_err("Extra \endspecial, ignored");
<br> help1("\endspecial must be match with \beginspecial.");
<br> error; write_tokens(tail):=null;
<br> end
<br>else begin p:=scan_toks(false,true); write_tokens(tail):=def_ref; end;
<br>if k = beginspecial_node then begin
<br> q:=scan_toks(false,true); write_stream(tail):=def_ref;
<br> push_SPC(tail);
<br> end
<br>else write_stream(tail):=null;
<br>cur_speech := i; cur_direction := j;
<br>end
<br> <br>@z<br><br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>% [53.1356]
<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>@x eqwrite_node
<br>write_node:begin print_write_whatsit("write",p);
<br>@y
<br>eqwrite_node,write_node:begin
<br> if subtype(p) = eqwrite_node then print_write_whatsit("eqwrite",p)
<br> else print_write_whatsit("write",p);
<br>@z
<br>@x open_R_node, LR_node, beginspecial_node and endspecial_node
<br>othercases print("whatsit?")
<br>@y
<br>@<Print LR |whatsit|@>@/
<br>othercases print("whatsit?")
<br>@z
<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>% [53.1357]
<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>@x open_R_node
<br>open_node: begin r:=get_node(open_node_size); words:=open_node_size;
<br>@y
<br>open_node,open_R_node:
<br> begin r:=get_node(open_node_size); words:=open_node_size;
<br>@z
<br>@x eqwrite_node
<br>write_node,special_node: begin r:=get_node(write_node_size);
<br>@y
<br>eqwrite_node,write_node,special_node,beginspecial_node,endspecial_node:
<br> begin r:=get_node(write_node_size);
<br> if subtype(p) = beginspecial_node then add_token_ref (write_stream(p));
<br>@z<br><br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>% [53.1358]
<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>@x open_R_node, eqwrite_node, beginspecial_node and endspecial_node
<br>open_node: free_node(p,open_node_size);
<br>write_node,special_node: begin delete_token_ref(write_tokens(p));
<br>@y
<br>open_node,open_R_node: free_node(p,open_node_size);
<br>eqwrite_node,write_node,special_node,beginspecial_node,endspecial_node:
<br> begin delete_token_ref(write_tokens(p));
<br> if subtype(p) = beginspecial_node then delete_token_ref(write_stream(p));
<br>@z
<br>@x LR_node
<br>close_node,language_node: free_node(p,small_node_size);
<br>@y
<br>close_node,language_node,LR_node: free_node(p,small_node_size);
<br>@z<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>% [53.1373]
<br>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<br>@x open_R_node, eqwrite_node
<br>open_node,write_node,close_node:@<Do some work that has been queued up
<br> for \.{\\write}@>;
<br>special_node:special_out(p);
<br>@y
<br>open_node,open_R_node,write_node,eqwrite_node,close_node:
<br> @<Do some work that has been queued up for \.{\\write}@>;
<br>beginspecial_node,endspecial_node,special_node:special_out(p);
<br>@z<br></div>