User Tools

Site Tools


Action unknown: copypageplugin__copy
cdc:nos2.source:opl.opl871:deck:tdutab

Deck TDUTAB

Library Member Format: MODIFY

Source

Seq #  *Modification Id* Act 
----------------------------+
00001  M00S00001.tdutab  +++|*NOSEQ
00002  M00S00002.tdutab  +++|*WIDTH 95
00003  M00S00003.tdutab  +++|MODULE tdutab;
00004  M00S00004.tdutab  +++|
00005  M00S00005.tdutab  +++|?? SET ( CHKALL := ON ), RIGHT := 110 ??
00006  M00S00006.tdutab  +++|
00007  M00S00007.tdutab  +++|{  Module :  TDUTAB }
Line S00001 Modification History
M01 (Added by) 281l803
Seq #  *Modification Id* Act 
----------------------------+
00008  M01S00001.281l803 +++|{            Copyright Control Data Systems Inc.  1992.  }
00009  M00S00008.tdutab  +++|{  Written:  1/84 by R. Lindsey  }
00010  M00S00009.tdutab  +++|{  Version:  Cyber 170/180, version 1 }
00011  M00S00010.tdutab  +++|{  Purpose:  This module encapsulates the internal tables of the TDU program. }
00012  M00S00011.tdutab  +++|{            It provides functions to add elements to the tables, to optimize }
00013  M00S00012.tdutab  +++|{            them, and to return the elements for output.  }
00014  M00S00013.tdutab  +++|{            This module has no I/O.  }
00015  M00S00014.tdutab  +++|
00016  M00S00015.tdutab  +++|  ?? PUSH ( LIST := OFF ) ??          {use this line to suppress commdeck list}
00017  M00S00016.tdutab  +++|{ ?? PUSH ( LIST := ON )  ??          {use this line to list common decks }
00018  M00S00017.tdutab  +++|?? SKIP := 4 ??
00019  M00S00018.tdutab  +++|
00020  M00S00019.tdutab  +++|?? NEWTITLE := 'ZTDTTAB' ??
00021  M00S00020.tdutab  +++|{ **************************** }
00022  M00S00021.tdutab  +++|{ common deck ZTDTTAB follows: }
00023  M00S00022.tdutab  +++|*CALL ZTDTTAB
00024  M00S00023.tdutab  +++|
00025  M00S00024.tdutab  +++|?? OLDTITLE ??
00026  M00S00025.tdutab  +++|
00027  M00S00026.tdutab  +++|{ ************************** }
00028  M00S00027.tdutab  +++|{ tdu error handler follows: }
00029  M00S00028.tdutab  +++|*CALL ZTDPERR
00030  M00S00029.tdutab  +++|*CALL ZTDCCON
00031  M00S00030.tdutab  +++|
00032  M00S00031.tdutab  +++|{ ************************* }
00033  M00S00032.tdutab  +++|{ tdu verb-table constants: }
00034  M00S00033.tdutab  +++|*CALL ZTDCVRB
00035  M00S00034.tdutab  +++|
00036  M00S00035.tdutab  +++|?? EJECT ??
00037  M00S00036.tdutab  +++|?? POP ??
00038  M00S00037.tdutab  +++|
00039  M00S00038.tdutab  +++|  VAR
00040  M00S00039.tdutab  +++|     parm_record: parameter_record,   { all parameters stored here }
00041  M00S00040.tdutab  +++|     input_list: ^input_node := NIL, { head of input list }
00042  M00S00041.tdutab  +++|     input_offset: INTEGER,
00043  M00S00042.tdutab  +++|     output_table: ARRAY [ 0 .. output_last_ordinal ] OF string_node,
00044  M00S00043.tdutab  +++|     key_name_table: ARRAY [ 0 .. key_name_last_ordinal ] OF string_node,
00045  M00S00044.tdutab  +++|     init_table: ARRAY [ 0 .. init_last_ordinal ] OF string_node,
00046  M00S00045.tdutab  +++|     appstr_table,
00047  M00S00046.tdutab  +++|     appstr_next_node_dumped,
00048  M00S00047.tdutab  +++|     appstr_latest_new_node: ^appstr_node,
00049  M00S00048.tdutab  +++|     output_total_characters,
00050  M00S00049.tdutab  +++|     key_name_total_characters,
00051  M00S00050.tdutab  +++|     init_total_characters,
00052  M00S00051.tdutab  +++|     appstr_total_sequences,
00053  M00S00052.tdutab  +++|     appstr_total_characters: INTEGER,
00054  M00S00053.tdutab  +++|     status: ost$status;
00055  M00S00054.tdutab  +++|
00056  M00S00055.tdutab  +++|  ?? NEWTITLE := 'store_ord_char_node' ??
00057  M00S00056.tdutab  +++|  ?? EJECT ??
00058  M00S00057.tdutab  +++|
00059  M00S00058.tdutab  +++|  PROCEDURE store_ord_char_node (ordinal: ordinal_type;
00060  M00S00059.tdutab  +++|        sequence_length: INTEGER;
00061  M00S00060.tdutab  +++|        char_sequence: STRING(*);
00062  M00S00061.tdutab  +++|        VAR table: ARRAY [ * ] OF string_node;
00063  M00S00062.tdutab  +++|        VAR total_characters: INTEGER;
00064  M00S00063.tdutab  +++|        VAR error_return: error_type);
00065  M00S00064.tdutab  +++|
00066  M00S00065.tdutab  +++|     error_return := no_error;
00067  M00S00066.tdutab  +++|     IF table[ordinal].length > 0 THEN
00068  M00S00067.tdutab  +++|        error_return := duplicate_error
00069  M00S00068.tdutab  +++|     ELSEIF sequence_length > 0 THEN
00070  M00S00069.tdutab  +++|        ALLOCATE table[ordinal].chars : [ sequence_length ];
00071  M00S00070.tdutab  +++|        IF table[ordinal].chars = NIL THEN
00072  M00S00071.tdutab  +++|           error_return := no_room_error;
00073  M00S00072.tdutab  +++|        ELSE
00074  M00S00073.tdutab  +++|           table[ordinal].length := sequence_length;
00075  M00S00074.tdutab  +++|           table[ordinal].chars^ := char_sequence(1,sequence_length);
00076  M00S00075.tdutab  +++|           total_characters := total_characters + sequence_length
00077  M00S00076.tdutab  +++|        IFEND
00078  M00S00077.tdutab  +++|     IFEND
00079  M00S00078.tdutab  +++|  PROCEND store_ord_char_node;
00080  M00S00079.tdutab  +++|  ?? OLDTITLE ??
Line S00001 Modification History
M01 (Added by) tdutab1
Seq #  *Modification Id* Act 
----------------------------+
00081  M01S00001.tdutab1 +++|
00082  M01S00002.tdutab1 +++|  ?? NEWTITLE := 'concatenate_sequences' ??
00083  M01S00003.tdutab1 +++|  ?? EJECT ??
00084  M01S00004.tdutab1 +++|
00085  M01S00005.tdutab1 +++|  PROCEDURE concatenate_sequences (new_seq: STRING(*);
00086  M01S00006.tdutab1 +++|        new_seq_length: INTEGER;
00087  M01S00007.tdutab1 +++|        VAR table_node: string_node;
00088  M01S00008.tdutab1 +++|        VAR total_characters: INTEGER;
00089  M01S00009.tdutab1 +++|        VAR error_return: error_type);
00090  M01S00010.tdutab1 +++|     VAR
00091  M01S00011.tdutab1 +++|        allocation_len,
00092  M01S00012.tdutab1 +++|        stringrep_len: INTEGER,
00093  M01S00013.tdutab1 +++|        old_node: string_node;
00094  M01S00014.tdutab1 +++|
00095  M01S00015.tdutab1 +++|     error_return := no_error;
00096  M01S00016.tdutab1 +++|     old_node := table_node;
00097  M01S00017.tdutab1 +++|     IF old_node.length = 0 THEN
00098  M01S00018.tdutab1 +++|        allocation_len := new_seq_length
00099  M01S00019.tdutab1 +++|     ELSE
00100  M01S00020.tdutab1 +++|        allocation_len := old_node.length + new_seq_length
00101  M01S00021.tdutab1 +++|     IFEND;
00102  M01S00022.tdutab1 +++|     table_node.length := allocation_len;
00103  M01S00023.tdutab1 +++|     IF allocation_len > 0 THEN    { can't allocate 0 }
00104  M01S00024.tdutab1 +++|        ALLOCATE table_node.chars : [ allocation_len ];
00105  M01S00025.tdutab1 +++|        IF table_node.chars = NIL THEN
00106  M01S00026.tdutab1 +++|           error_return := no_room_error;
00107  M01S00027.tdutab1 +++|        ELSE
00108  M01S00028.tdutab1 +++|           IF old_node.length = 0 THEN
00109  M01S00029.tdutab1 +++|              table_node.chars^ := new_seq(1,new_seq_length)
00110  M01S00030.tdutab1 +++|           ELSE
00111  M01S00031.tdutab1 +++|              STRINGREP(table_node.chars^, stringrep_len,
00112  M01S00032.tdutab1 +++|                 old_node.chars^(1,old_node.length),
00113  M01S00033.tdutab1 +++|                 new_seq(1,new_seq_length));
00114  M01S00034.tdutab1 +++|              FREE old_node.chars
00115  M01S00035.tdutab1 +++|           IFEND;
00116  M01S00036.tdutab1 +++|           total_characters := total_characters + new_seq_length
00117  M01S00037.tdutab1 +++|        IFEND
00118  M01S00038.tdutab1 +++|     IFEND
00119  M01S00039.tdutab1 +++|  PROCEND concatenate_sequences;
00120  M01S00040.tdutab1 +++|  ?? OLDTITLE ??
00121  M00S00080.tdutab  +++|
00122  M00S00081.tdutab  +++|  ?? NEWTITLE := 'initialize_tables' ??
00123  M00S00082.tdutab  +++|  ?? EJECT ??
00124  M00S00083.tdutab  +++|
00125  M00S00084.tdutab  +++|  PROCEDURE [XDCL] initialize_tables;
00126  M00S00085.tdutab  +++|     VAR
00127  M00S00086.tdutab  +++|        table_ndx: INTEGER;
00128  M00S00087.tdutab  +++|
00129  M00S00088.tdutab  +++|     ALLOCATE input_list : [ fail ];  { ignore no-room error, caught later }
00130  M00S00089.tdutab  +++|     IF input_list <> NIL THEN
00131  M00S00090.tdutab  +++|        input_list^.next_node := NIL;
00132  M00S00091.tdutab  +++|        input_list^.offset := 0;
00133  M00S00092.tdutab  +++|        input_list^.node_visited := FALSE
00134  M00S00093.tdutab  +++|     IFEND;
00135  M00S00094.tdutab  +++|     FOR table_ndx := 1 TO output_last_ordinal DO
00136  M00S00095.tdutab  +++|        output_table[table_ndx].length := 0;
00137  M00S00096.tdutab  +++|        output_table[table_ndx].chars := NIL
00138  M00S00097.tdutab  +++|     FOREND;
00139  M00S00098.tdutab  +++|     output_total_characters := 0;
00140  M00S00099.tdutab  +++|     FOR table_ndx := 1 TO key_name_last_ordinal DO
00141  M00S00100.tdutab  +++|        key_name_table[table_ndx].length := 0;
00142  M00S00101.tdutab  +++|        key_name_table[table_ndx].chars := NIL
00143  M00S00102.tdutab  +++|     FOREND;
00144  M00S00103.tdutab  +++|     key_name_total_characters := 0;
00145  M00S00104.tdutab  +++|     FOR table_ndx := 1 TO init_last_ordinal DO
00146  M00S00105.tdutab  +++|        init_table[table_ndx].length := 0;
00147  M00S00106.tdutab  +++|        init_table[table_ndx].chars := NIL
00148  M00S00107.tdutab  +++|     FOREND;
00149  M00S00108.tdutab  +++|     init_total_characters := 0;
00150  M00S00109.tdutab  +++|     appstr_table := NIL;
00151  M00S00110.tdutab  +++|     appstr_latest_new_node := NIL;
00152  M00S00111.tdutab  +++|     appstr_next_node_dumped := NIL;
00153  M00S00112.tdutab  +++|     appstr_total_sequences := 0;
00154  M00S00113.tdutab  +++|     appstr_total_characters := 0
00155  M00S00114.tdutab  +++|  PROCEND initialize_tables;
00156  M00S00115.tdutab  +++|  ?? OLDTITLE ??
00157  M00S00116.tdutab  +++|
00158  M00S00117.tdutab  +++|  ?? NEWTITLE := 'store_parameters' ??
00159  M00S00118.tdutab  +++|  ?? EJECT ??
00160  M00S00119.tdutab  +++|
00161  M00S00120.tdutab  +++|  PROCEDURE [XDCL] store_parameters (parm: parameter_record);
00162  M00S00121.tdutab  +++|     parm_record := parm;             { save it in my local space }
00163  M00S00122.tdutab  +++|  PROCEND store_parameters;
00164  M00S00123.tdutab  +++|  ?? OLDTITLE ??
00165  M00S00124.tdutab  +++|
00166  M00S00125.tdutab  +++|  ?? NEWTITLE := 'dump_parameters' ??
00167  M00S00126.tdutab  +++|  ?? SKIP := 4 ??
00168  M00S00127.tdutab  +++|
00169  M00S00128.tdutab  +++|  PROCEDURE [XDCL] dump_parameters (VAR parm: parameter_record);
00170  M00S00129.tdutab  +++|     parm := parm_record;             { give caller my copy }
00171  M00S00130.tdutab  +++|  PROCEND dump_parameters;
00172  M00S00131.tdutab  +++|  ?? OLDTITLE ??
00173  M00S00132.tdutab  +++|
00174  M00S00133.tdutab  +++|  ?? NEWTITLE := 'store_output_node' ??
00175  M00S00134.tdutab  +++|  ?? EJECT ??
00176  M00S00135.tdutab  +++|
00177  M00S00136.tdutab  +++|  PROCEDURE [XDCL] store_output_node (ordinal: ordinal_type;
00178  M00S00137.tdutab  +++|        sequence_length: INTEGER;
00179  M00S00138.tdutab  +++|        char_sequence: STRING(*);
00180  M00S00139.tdutab  +++|        VAR error_return: error_type);
00181  M00S00140.tdutab  +++|
00182  M00S00141.tdutab  +++|     IF ( ordinal < 0 ) OR
00183  M00S00142.tdutab  +++|        ( ordinal > output_last_ordinal ) THEN
00184  M00S00143.tdutab  +++|        error_return := no_room_error
00185  M00S00144.tdutab  +++|     ELSE
Line S00145 Modification History
M01 (Removed by) tdutab1
Seq #  *Modification Id* Act 
----------------------------+
00186  M01S00145.tdutab1 ---|        store_ord_char_node(ordinal, sequence_length, char_sequence,
00187  M01S00146.tdutab1 ---|           output_table, output_total_characters, error_return)
Line S00041 Modification History
M01 (Added by) tdutab1
Seq #  *Modification Id* Act 
----------------------------+
00188  M01S00041.tdutab1 +++|        concatenate_sequences(char_sequence, sequence_length,
00189  M01S00042.tdutab1 +++|           output_table[ordinal], output_total_characters,
00190  M01S00043.tdutab1 +++|           error_return)
00191  M00S00147.tdutab  +++|     IFEND
00192  M00S00148.tdutab  +++|  PROCEND store_output_node;
00193  M00S00149.tdutab  +++|  ?? OLDTITLE ??
00194  M00S00150.tdutab  +++|
00195  M00S00151.tdutab  +++|  ?? NEWTITLE := 'dump_output_node' ??
00196  M00S00152.tdutab  +++|  ?? SKIP := 4 ??
00197  M00S00153.tdutab  +++|
00198  M00S00154.tdutab  +++|  PROCEDURE [XDCL] dump_output_node (ordinal: ordinal_type;
00199  M00S00155.tdutab  +++|        VAR length: INTEGER;
00200  M00S00156.tdutab  +++|        VAR chars: ^STRING(*);
00201  M00S00157.tdutab  +++|        VAR total_ordinals: INTEGER;
00202  M00S00158.tdutab  +++|        VAR total_characters: INTEGER;
00203  M00S00159.tdutab  +++|        VAR node_returned: BOOLEAN);
00204  M00S00160.tdutab  +++|
00205  M00S00161.tdutab  +++|     node_returned := FALSE;
00206  M00S00162.tdutab  +++|     IF ( ordinal >= 0 ) AND
00207  M00S00163.tdutab  +++|        ( ordinal <= output_last_ordinal ) THEN
00208  M00S00164.tdutab  +++|        node_returned := TRUE;
00209  M00S00165.tdutab  +++|        total_ordinals := output_last_ordinal;
00210  M00S00166.tdutab  +++|        total_characters := output_total_characters;
00211  M00S00167.tdutab  +++|        length := output_table[ordinal].length;
00212  M00S00168.tdutab  +++|        chars := output_table[ordinal].chars
00213  M00S00169.tdutab  +++|     IFEND
00214  M00S00170.tdutab  +++|  PROCEND dump_output_node;
00215  M00S00171.tdutab  +++|  ?? OLDTITLE ??
00216  M00S00172.tdutab  +++|
00217  M00S00173.tdutab  +++|  ?? NEWTITLE := 'store_key_name_node' ??
00218  M00S00174.tdutab  +++|  ?? EJECT ??
00219  M00S00175.tdutab  +++|
00220  M00S00176.tdutab  +++|  PROCEDURE [XDCL] store_key_name_node (ordinal: ordinal_type;
00221  M00S00177.tdutab  +++|        sequence_length: INTEGER;
00222  M00S00178.tdutab  +++|        char_sequence: STRING(*);
00223  M00S00179.tdutab  +++|        VAR error_return: error_type);
00224  M00S00180.tdutab  +++|
00225  M00S00181.tdutab  +++|     IF ( ordinal < 0 ) OR
00226  M00S00182.tdutab  +++|        ( ordinal > key_name_last_ordinal ) THEN
00227  M00S00183.tdutab  +++|        error_return := no_room_error
00228  M00S00184.tdutab  +++|     ELSE
00229  M00S00185.tdutab  +++|        store_ord_char_node(ordinal, sequence_length, char_sequence,
00230  M00S00186.tdutab  +++|           key_name_table, key_name_total_characters, error_return)
00231  M00S00187.tdutab  +++|     IFEND
00232  M00S00188.tdutab  +++|  PROCEND store_key_name_node;
00233  M00S00189.tdutab  +++|  ?? OLDTITLE ??
00234  M00S00190.tdutab  +++|
00235  M00S00191.tdutab  +++|  ?? NEWTITLE := 'dump_key_name_node' ??
00236  M00S00192.tdutab  +++|  ?? SKIP := 4 ??
00237  M00S00193.tdutab  +++|
00238  M00S00194.tdutab  +++|  PROCEDURE [XDCL] dump_key_name_node(ordinal: ordinal_type;
00239  M00S00195.tdutab  +++|        VAR length: INTEGER;
00240  M00S00196.tdutab  +++|        VAR chars: ^STRING(*);
00241  M00S00197.tdutab  +++|        VAR total_ordinals: INTEGER;
00242  M00S00198.tdutab  +++|        VAR total_characters: INTEGER;
00243  M00S00199.tdutab  +++|        VAR node_returned: BOOLEAN);
00244  M00S00200.tdutab  +++|
00245  M00S00201.tdutab  +++|     node_returned := FALSE;
00246  M00S00202.tdutab  +++|     IF ( ordinal >= 0 ) AND
00247  M00S00203.tdutab  +++|        ( ordinal <= key_name_last_ordinal ) THEN
00248  M00S00204.tdutab  +++|        node_returned := TRUE;
00249  M00S00205.tdutab  +++|        total_ordinals := key_name_last_ordinal;
00250  M00S00206.tdutab  +++|        total_characters := key_name_total_characters;
00251  M00S00207.tdutab  +++|        length := key_name_table[ordinal].length;
00252  M00S00208.tdutab  +++|        chars := key_name_table[ordinal].chars
00253  M00S00209.tdutab  +++|     IFEND
00254  M00S00210.tdutab  +++|  PROCEND dump_key_name_node;
00255  M00S00211.tdutab  +++|  ?? OLDTITLE ??
00256  M00S00212.tdutab  +++|
00257  M00S00213.tdutab  +++|  ?? NEWTITLE := 'store_reset_sequence' ??
00258  M00S00214.tdutab  +++|  ?? EJECT ??
00259  M00S00215.tdutab  +++|
00260  M00S00216.tdutab  +++|  PROCEDURE [XDCL] store_reset_sequence (ordinal: ordinal_type;
00261  M00S00217.tdutab  +++|        char_seq_length: INTEGER;
00262  M00S00218.tdutab  +++|        char_seq: STRING(*);
00263  M00S00219.tdutab  +++|        VAR error_return: error_type);
00264  M00S00220.tdutab  +++|
Line S00221 Modification History
M01 (Removed by) tdutab1
Seq #  *Modification Id* Act 
----------------------------+
00265  M01S00221.tdutab1 ---|     ?? NEWTITLE := 'concatenate_init_sequence' ??
00266  M01S00222.tdutab1 ---|     ?? EJECT ??
00267  M01S00223.tdutab1 ---|
00268  M01S00224.tdutab1 ---|     PROCEDURE concatenate_init_sequence (new_seq: STRING(*);
00269  M01S00225.tdutab1 ---|           new_seq_length: INTEGER;
00270  M01S00226.tdutab1 ---|           VAR init_node: string_node;
00271  M01S00227.tdutab1 ---|           VAR error_return: error_type);
00272  M01S00228.tdutab1 ---|        VAR
00273  M01S00229.tdutab1 ---|           allocation_len,
00274  M01S00230.tdutab1 ---|           stringrep_len: INTEGER,
00275  M01S00231.tdutab1 ---|           old_node: string_node;
00276  M01S00232.tdutab1 ---|
00277  M01S00233.tdutab1 ---|        error_return := no_error;
00278  M01S00234.tdutab1 ---|        old_node := init_node;
00279  M01S00235.tdutab1 ---|        IF old_node.length = 0 THEN
00280  M01S00236.tdutab1 ---|           allocation_len := new_seq_length
00281  M01S00237.tdutab1 ---|        ELSE
00282  M01S00238.tdutab1 ---|           allocation_len := old_node.length + new_seq_length
00283  M01S00239.tdutab1 ---|        IFEND;
00284  M01S00240.tdutab1 ---|        init_node.length := allocation_len;
00285  M01S00241.tdutab1 ---|        IF allocation_len > 0 THEN    { can't allocate 0 }
00286  M01S00242.tdutab1 ---|           ALLOCATE init_node.chars : [ allocation_len ];
00287  M01S00243.tdutab1 ---|           IF init_node.chars = NIL THEN
00288  M01S00244.tdutab1 ---|              error_return := no_room_error;
00289  M01S00245.tdutab1 ---|           ELSE
00290  M01S00246.tdutab1 ---|              IF old_node.length = 0 THEN
00291  M01S00247.tdutab1 ---|                 init_node.chars^ := new_seq(1,new_seq_length)
00292  M01S00248.tdutab1 ---|              ELSE
00293  M01S00249.tdutab1 ---|                 STRINGREP(init_node.chars^, stringrep_len,
00294  M01S00250.tdutab1 ---|                    old_node.chars^(1,old_node.length),
00295  M01S00251.tdutab1 ---|                    new_seq(1,new_seq_length));
00296  M01S00252.tdutab1 ---|                 FREE old_node.chars
00297  M01S00253.tdutab1 ---|              IFEND;
00298  M01S00254.tdutab1 ---|              init_total_characters := init_total_characters + new_seq_length
00299  M01S00255.tdutab1 ---|           IFEND
00300  M01S00256.tdutab1 ---|        IFEND
00301  M01S00257.tdutab1 ---|     PROCEND concatenate_init_sequence;
00302  M01S00258.tdutab1 ---|     ?? OLDTITLE ??
00303  M01S00259.tdutab1 ---|     ?? SKIP := 4 ??
00304  M01S00260.tdutab1 ---|
00305  M00S00261.tdutab  +++|     IF ( ordinal < 0 ) OR
00306  M00S00262.tdutab  +++|        ( ordinal > init_last_ordinal ) THEN
00307  M00S00263.tdutab  +++|        error_return := no_room_error
00308  M00S00264.tdutab  +++|     ELSE
Line S00265 Modification History
M01 (Removed by) tdutab1
Seq #  *Modification Id* Act 
----------------------------+
00309  M01S00265.tdutab1 ---|        concatenate_init_sequence(char_seq, char_seq_length,
00310  M01S00266.tdutab1 ---|           init_table[ordinal], error_return);
Line S00044 Modification History
M01 (Added by) tdutab1
Seq #  *Modification Id* Act 
----------------------------+
00311  M01S00044.tdutab1 +++|        concatenate_sequences(char_seq, char_seq_length,
00312  M01S00045.tdutab1 +++|           init_table[ordinal], init_total_characters,
00313  M01S00046.tdutab1 +++|           error_return);
00314  M00S00267.tdutab  +++|     IFEND
00315  M00S00268.tdutab  +++|  PROCEND store_reset_sequence;
00316  M00S00269.tdutab  +++|  ?? OLDTITLE ??
00317  M00S00270.tdutab  +++|
00318  M00S00271.tdutab  +++|  ?? NEWTITLE := 'dump_reset_sequence' ??
00319  M00S00272.tdutab  +++|  ?? SKIP := 4 ??
00320  M00S00273.tdutab  +++|
00321  M00S00274.tdutab  +++|  PROCEDURE [XDCL] dump_reset_sequence(ordinal: ordinal_type;
00322  M00S00275.tdutab  +++|        VAR length: INTEGER;
00323  M00S00276.tdutab  +++|        VAR chars: ^STRING(*);
00324  M00S00277.tdutab  +++|        VAR total_ordinals: INTEGER;
00325  M00S00278.tdutab  +++|        VAR total_characters: INTEGER;
00326  M00S00279.tdutab  +++|        VAR node_returned: BOOLEAN);
00327  M00S00280.tdutab  +++|
00328  M00S00281.tdutab  +++|     node_returned := FALSE;
00329  M00S00282.tdutab  +++|     IF ( ordinal >= 0 ) AND
00330  M00S00283.tdutab  +++|        ( ordinal <= init_last_ordinal ) THEN
00331  M00S00284.tdutab  +++|        node_returned := TRUE;
00332  M00S00285.tdutab  +++|        total_ordinals := init_last_ordinal;
00333  M00S00286.tdutab  +++|        total_characters := init_total_characters;
00334  M00S00287.tdutab  +++|        length := init_table[ordinal].length;
00335  M00S00288.tdutab  +++|        chars := init_table[ordinal].chars
00336  M00S00289.tdutab  +++|     IFEND
00337  M00S00290.tdutab  +++|  PROCEND dump_reset_sequence;
00338  M00S00291.tdutab  +++|  ?? OLDTITLE ??
00339  M00S00292.tdutab  +++|
00340  M00S00293.tdutab  +++|  ?? NEWTITLE := 'store_appstr_node' ??
00341  M00S00294.tdutab  +++|  ?? EJECT ??
00342  M00S00295.tdutab  +++|
00343  M00S00296.tdutab  +++|  PROCEDURE [XDCL] store_appstr_node (name: STRING(*);
00344  M00S00297.tdutab  +++|        sequence_length: INTEGER;
00345  M00S00298.tdutab  +++|        char_sequence: STRING(*);
00346  M00S00299.tdutab  +++|        VAR error_return: error_type);
00347  M00S00300.tdutab  +++|     VAR
00348  M00S00301.tdutab  +++|        new_node: ^appstr_node;
00349  M00S00302.tdutab  +++|
00350  M00S00303.tdutab  +++|     error_return := no_error;
00351  M00S00304.tdutab  +++|     ALLOCATE new_node;
00352  M00S00305.tdutab  +++|     IF new_node = NIL THEN
00353  M00S00306.tdutab  +++|        error_return := no_room_error
00354  M00S00307.tdutab  +++|     ELSE
00355  M00S00308.tdutab  +++|        IF appstr_table = NIL THEN
00356  M00S00309.tdutab  +++|           appstr_table := new_node
00357  M00S00310.tdutab  +++|        ELSE
00358  M00S00311.tdutab  +++|           appstr_latest_new_node^.next_node := new_node
00359  M00S00312.tdutab  +++|        IFEND;
00360  M00S00313.tdutab  +++|        appstr_latest_new_node := new_node;
00361  M00S00314.tdutab  +++|        new_node^.next_node := NIL;
00362  M00S00315.tdutab  +++|        new_node^.name := name;
00363  M00S00316.tdutab  +++|        new_node^.value.length := sequence_length;
00364  M00S00317.tdutab  +++|        appstr_total_sequences := appstr_total_sequences + 1;
00365  M00S00318.tdutab  +++|        IF sequence_length > 0 THEN
00366  M00S00319.tdutab  +++|           ALLOCATE new_node^.value.chars : [ sequence_length ];
00367  M00S00320.tdutab  +++|           IF new_node^.value.chars = NIL THEN
00368  M00S00321.tdutab  +++|              error_return := no_room_error
00369  M00S00322.tdutab  +++|           ELSE
00370  M00S00323.tdutab  +++|              new_node^.value.chars^ := char_sequence(1,sequence_length);
00371  M00S00324.tdutab  +++|              appstr_total_characters :=
00372  M00S00325.tdutab  +++|                 appstr_total_characters + sequence_length
00373  M00S00326.tdutab  +++|           IFEND
00374  M00S00327.tdutab  +++|        IFEND
00375  M00S00328.tdutab  +++|     IFEND
00376  M00S00329.tdutab  +++|  PROCEND store_appstr_node;
00377  M00S00330.tdutab  +++|  ?? OLDTITLE ??
00378  M00S00331.tdutab  +++|
00379  M00S00332.tdutab  +++|  ?? NEWTITLE := 'reset_appstr_table' ??
00380  M00S00333.tdutab  +++|  ?? SKIP := 4 ??
00381  M00S00334.tdutab  +++|
00382  M00S00335.tdutab  +++|  PROCEDURE [XDCL] reset_appstr_table;
00383  M00S00336.tdutab  +++|     appstr_next_node_dumped := appstr_table
00384  M00S00337.tdutab  +++|  PROCEND reset_appstr_table;
00385  M00S00338.tdutab  +++|  ?? OLDTITLE ??
00386  M00S00339.tdutab  +++|
00387  M00S00340.tdutab  +++|  ?? NEWTITLE := 'dump_appstr_node' ??
00388  M00S00341.tdutab  +++|  ?? EJECT ??
00389  M00S00342.tdutab  +++|
00390  M00S00343.tdutab  +++|  PROCEDURE [XDCL] dump_appstr_node (VAR name: STRING(*);
00391  M00S00344.tdutab  +++|        VAR length: INTEGER;
00392  M00S00345.tdutab  +++|        VAR chars: ^STRING(*);
00393  M00S00346.tdutab  +++|        VAR total_sequences: INTEGER;
00394  M00S00347.tdutab  +++|        VAR total_characters: INTEGER;
00395  M00S00348.tdutab  +++|        VAR node_returned: BOOLEAN);
00396  M00S00349.tdutab  +++|
00397  M00S00350.tdutab  +++|     IF ( appstr_table = NIL ) OR
00398  M00S00351.tdutab  +++|        ( appstr_next_node_dumped = NIL ) THEN
00399  M00S00352.tdutab  +++|        node_returned := FALSE
00400  M00S00353.tdutab  +++|     ELSE
00401  M00S00354.tdutab  +++|        node_returned := TRUE;
00402  M00S00355.tdutab  +++|        name := appstr_next_node_dumped^.name;
00403  M00S00356.tdutab  +++|        length := appstr_next_node_dumped^.value.length;
00404  M00S00357.tdutab  +++|        chars := appstr_next_node_dumped^.value.chars;
00405  M00S00358.tdutab  +++|        appstr_next_node_dumped := appstr_next_node_dumped^.next_node;
00406  M00S00359.tdutab  +++|        total_sequences := appstr_total_sequences;
00407  M00S00360.tdutab  +++|        total_characters := appstr_total_characters
00408  M00S00361.tdutab  +++|     IFEND
00409  M00S00362.tdutab  +++|  PROCEND dump_appstr_node;
00410  M00S00363.tdutab  +++|  ?? OLDTITLE ??
00411  M00S00364.tdutab  +++|
00412  M00S00365.tdutab  +++|  ?? NEWTITLE := 'store_input_node' ??
00413  M00S00366.tdutab  +++|  ?? EJECT ??
00414  M00S00367.tdutab  +++|
00415  M00S00368.tdutab  +++|  PROCEDURE [XDCL] store_input_node (ordinal: ordinal_type;
00416  M00S00369.tdutab  +++|        sequence_length: INTEGER;
00417  M00S00370.tdutab  +++|        char_sequence: STRING(*);
00418  M00S00371.tdutab  +++|        VAR error_return: error_type);
00419  M00S00372.tdutab  +++|
00420  M00S00373.tdutab  +++|     { Input character recognition sequences are stored in a tree of linked }
00421  M00S00374.tdutab  +++|     {   lists.  Each character of a particular sequence occupies a node in }
00422  M00S00375.tdutab  +++|     {   a different level of the tree.  Thus, when matching a sequence in }
00423  M00S00376.tdutab  +++|     {   the tree, one would start at the first level (pointed to by   }
00424  M00S00377.tdutab  +++|     {   input_list), and search the linked list which constitutes that level }
00425  M00S00378.tdutab  +++|     {   (using search_level).  If the character is found, the process repeats}
00426  M00S00379.tdutab  +++|     {   with the next character in the sequence, and the search is of the }
00427  M00S00380.tdutab  +++|     {   level pointed to by the node which was found.  }
00428  M00S00381.tdutab  +++|     { Each level consists of a linked list of 'list' nodes, where each node }
00429  M00S00382.tdutab  +++|     {   corresponds to a single-element list in the final output format.  }
00430  M00S00383.tdutab  +++|     {   These list nodes are later combined where possible into ranges and }
00431  M00S00384.tdutab  +++|     {   single-action ranges by the optimize_tables procedure.  }
00432  M00S00385.tdutab  +++|     {   The last node in each level's linked list is always a 'fail' node. }
00433  M00S00386.tdutab  +++|
00434  M00S00387.tdutab  +++|     VAR
00435  M00S00388.tdutab  +++|        new_node,
00436  M00S00389.tdutab  +++|        pred_node,                    { predecessor to current node }
00437  M00S00390.tdutab  +++|        succ_node,                    { successor to current node }
00438  M00S00391.tdutab  +++|        prev_level,                   { previous level which points to current}
00439  M00S00392.tdutab  +++|        curr_level: ^input_node,      { start of the level to search }
00440  M00S00393.tdutab  +++|        node_found: BOOLEAN,
00441  M00S00394.tdutab  +++|        char_ndx: INTEGER;
00442  M00S00395.tdutab  +++|
00443  M00S00396.tdutab  +++|     ?? NEWTITLE := 'search_level' ??
00444  M00S00397.tdutab  +++|     ?? SKIP := 4 ??
00445  M00S00398.tdutab  +++|
00446  M00S00399.tdutab  +++|     PROCEDURE search_level (ch: CHAR; curr_level: ^input_node;
00447  M00S00400.tdutab  +++|           VAR pred_node: ^input_node; VAR succ_node: ^input_node;
00448  M00S00401.tdutab  +++|           VAR node_found: BOOLEAN);
00449  M00S00402.tdutab  +++|        { This procedure searches a particular level of the input char tree, }
00450  M00S00403.tdutab  +++|        {   looking for a node which contains the given character.  If it }
00451  M00S00404.tdutab  +++|        {   doesn't find one, it returns pointers set up to insert a new node }
00452  M00S00405.tdutab  +++|        {   for that character in its proper order. }
00453  M00S00406.tdutab  +++|
00454  M00S00407.tdutab  +++|        node_found := FALSE;
00455  M00S00408.tdutab  +++|        pred_node := NIL;
00456  M00S00409.tdutab  +++|        succ_node := curr_level;
00457  M00S00410.tdutab  +++|        WHILE ( succ_node^.opcode <> fail ) AND
00458  M00S00411.tdutab  +++|              ( node_found = FALSE ) AND
00459  M00S00412.tdutab  +++|              ( succ_node^.list_pointer^[1].character <= ch ) DO
00460  M00S00413.tdutab  +++|           IF succ_node^.list_pointer^[1].character = ch THEN
00461  M00S00414.tdutab  +++|              node_found := TRUE
00462  M00S00415.tdutab  +++|           ELSE
00463  M00S00416.tdutab  +++|              pred_node := succ_node;
00464  M00S00417.tdutab  +++|              succ_node := pred_node^.next_node
00465  M00S00418.tdutab  +++|           IFEND
00466  M00S00419.tdutab  +++|        WHILEND
00467  M00S00420.tdutab  +++|     PROCEND search_level;
00468  M00S00421.tdutab  +++|     ?? OLDTITLE ??
00469  M00S00422.tdutab  +++|     ?? EJECT ??
00470  M00S00423.tdutab  +++|
00471  M00S00424.tdutab  +++|     error_return := no_error;
00472  M00S00425.tdutab  +++|     curr_level := input_list;
00473  M00S00426.tdutab  +++|     FOR char_ndx := 1 TO sequence_length DO
00474  M00S00427.tdutab  +++|        search_level(char_sequence(char_ndx), curr_level,
00475  M00S00428.tdutab  +++|           pred_node, succ_node, node_found);
00476  M00S00429.tdutab  +++|        IF node_found THEN
00477  M00S00430.tdutab  +++|           IF succ_node^.list_pointer^[1].action.ordinal > no_ordinal THEN
00478  M00S00431.tdutab  +++|              IF char_ndx <> sequence_length THEN
00479  M00S00432.tdutab  +++|                 error_return := superset_error;
00480  M00S00433.tdutab  +++|                 RETURN
00481  M00S00434.tdutab  +++|              IFEND;
00482  M00S00435.tdutab  +++|              error_return := duplicate_input_error;
00483  M00S00436.tdutab  +++|              RETURN
00484  M00S00437.tdutab  +++|           IFEND;
00485  M00S00438.tdutab  +++|           IF char_ndx = sequence_length THEN
00486  M00S00439.tdutab  +++|              error_return := subset_error;
00487  M00S00440.tdutab  +++|              RETURN
00488  M00S00441.tdutab  +++|           IFEND;
00489  M00S00442.tdutab  +++|           prev_level := succ_node;
00490  M00S00443.tdutab  +++|           curr_level :=      { point to next level in sequence }
00491  M00S00444.tdutab  +++|              succ_node^.list_pointer^[1].action.next_level
00492  M00S00445.tdutab  +++|        ELSE                          { no match found, build a new node }
00493  M00S00446.tdutab  +++|           ALLOCATE new_node : [ list ]; { create a list node }
00494  M00S00447.tdutab  +++|           IF pred_node = NIL THEN    { never got past first node }
00495  M00S00448.tdutab  +++|              IF char_ndx = 1 THEN    { first level only }
00496  M00S00449.tdutab  +++|                 new_node^.next_node := input_list;
00497  M00S00450.tdutab  +++|                 input_list := new_node
00498  M00S00451.tdutab  +++|              ELSE                    { beyond first level }
00499  M00S00452.tdutab  +++|                 new_node^.next_node :=
00500  M00S00453.tdutab  +++|                    prev_level^.list_pointer^[1].action.next_level;
00501  M00S00454.tdutab  +++|                 prev_level^.list_pointer^[1].action.next_level := new_node
00502  M00S00455.tdutab  +++|              IFEND
00503  M00S00456.tdutab  +++|           ELSE                       { new node is in midst of existing level}
00504  M00S00457.tdutab  +++|              new_node^.next_node := pred_node^.next_node;
00505  M00S00458.tdutab  +++|              pred_node^.next_node := new_node;
00506  M00S00459.tdutab  +++|           IFEND;
00507  M00S00460.tdutab  +++|           new_node^.offset := 0;
00508  M00S00461.tdutab  +++|           new_node^.node_visited := FALSE;
00509  M00S00462.tdutab  +++|           new_node^.list_character_count := 1; { one element in list }
00510  M00S00463.tdutab  +++|           ALLOCATE new_node^.list_pointer : [ 1..1 ]; { the list itself }
00511  M00S00464.tdutab  +++|           new_node^.list_pointer^[1].character := char_sequence(char_ndx);
00512  M00S00465.tdutab  +++|           new_node^.list_pointer^[1].action.next_offset := 0;
00513  M00S00466.tdutab  +++|           IF char_ndx = sequence_length THEN
00514  M00S00467.tdutab  +++|              new_node^.list_pointer^[1].action.ordinal := ordinal;
00515  M00S00468.tdutab  +++|              new_node^.list_pointer^[1].action.next_level := NIL
00516  M00S00469.tdutab  +++|           ELSE
00517  M00S00470.tdutab  +++|              new_node^.list_pointer^[1].action.ordinal := no_ordinal;
00518  M00S00471.tdutab  +++|              ALLOCATE
00519  M00S00472.tdutab  +++|                 new_node^.list_pointer^[1].action.next_level : [ fail ];
00520  M00S00473.tdutab  +++|              new_node^.list_pointer^[1].action.next_level^.next_node := NIL;
00521  M00S00474.tdutab  +++|              new_node^.list_pointer^[1].action.next_level^.offset := 0;
00522  M00S00475.tdutab  +++|              new_node^.list_pointer^[1].action.next_level^.
00523  M00S00476.tdutab  +++|                 node_visited := FALSE;
00524  M00S00477.tdutab  +++|              prev_level := new_node;
00525  M00S00478.tdutab  +++|              curr_level :=
00526  M00S00479.tdutab  +++|                 new_node^.list_pointer^[1].action.next_level
00527  M00S00480.tdutab  +++|           IFEND
00528  M00S00481.tdutab  +++|        IFEND
00529  M00S00482.tdutab  +++|     FOREND
00530  M00S00483.tdutab  +++|  PROCEND store_input_node;
00531  M00S00484.tdutab  +++|  ?? OLDTITLE ??
00532  M00S00485.tdutab  +++|
00533  M00S00486.tdutab  +++|  ?? NEWTITLE := 'dump_input_node' ??
00534  M00S00487.tdutab  +++|  ?? SKIP := 4 ??
00535  M00S00488.tdutab  +++|
00536  M00S00489.tdutab  +++|  PROCEDURE [XDCL] dump_input_node (
00537  M00S00490.tdutab  +++|        before_procedure: ^PROCEDURE(in_nd: ^input_node) );
00538  M00S00491.tdutab  +++|
00539  M00S00492.tdutab  +++|     traverse_input_tree(input_list, before_procedure, NIL)
00540  M00S00493.tdutab  +++|  PROCEND dump_input_node;
00541  M00S00494.tdutab  +++|  ?? OLDTITLE ??
00542  M00S00495.tdutab  +++|
00543  M00S00496.tdutab  +++|  ?? NEWTITLE := 'reset_input_table' ??
00544  M00S00497.tdutab  +++|  ?? SKIP := 4 ??
00545  M00S00498.tdutab  +++|
00546  M00S00499.tdutab  +++|  PROCEDURE [XDCL] reset_input_table (VAR character_count: INTEGER);
00547  M00S00500.tdutab  +++|
00548  M00S00501.tdutab  +++|     PROCEDURE reset_node_flags(in_node: ^input_node);
00549  M00S00502.tdutab  +++|        in_node^.node_visited := FALSE;
00550  M00S00503.tdutab  +++|        calculate_input_offsets(in_node)
00551  M00S00504.tdutab  +++|     PROCEND reset_node_flags;
00552  M00S00505.tdutab  +++|
00553  M00S00506.tdutab  +++|     input_offset := 0;
00554  M00S00507.tdutab  +++|     dump_input_node(^reset_node_flags);
00555  M00S00508.tdutab  +++|     character_count := input_offset
00556  M00S00509.tdutab  +++|  PROCEND reset_input_table;
00557  M00S00510.tdutab  +++|  ?? OLDTITLE ??
00558  M00S00511.tdutab  +++|
00559  M00S00512.tdutab  +++|  ?? NEWTITLE := 'traverse_input_tree' ??
00560  M00S00513.tdutab  +++|  ?? EJECT ??
00561  M00S00514.tdutab  +++|
00562  M00S00515.tdutab  +++|  PROCEDURE traverse_input_tree (  { recursively process tree, calling proc}
00563  M00S00516.tdutab  +++|        in_node: ^input_node;
00564  M00S00517.tdutab  +++|        before_procedure: ^PROCEDURE(in_nd: ^input_node);
00565  M00S00518.tdutab  +++|        after_procedure: ^PROCEDURE(in_nd: ^input_node) );
00566  M00S00519.tdutab  +++|
00567  M00S00520.tdutab  +++|     VAR
00568  M00S00521.tdutab  +++|        action_ndx: INTEGER;
00569  M00S00522.tdutab  +++|
00570  M00S00523.tdutab  +++|     IF in_node <> NIL THEN
00571  M00S00524.tdutab  +++|        IF before_procedure <> NIL THEN
00572  M00S00525.tdutab  +++|           before_procedure^(in_node) { do whatever my caller requests }
00573  M00S00526.tdutab  +++|        IFEND;
00574  M00S00527.tdutab  +++|        CASE in_node^.opcode OF
00575  M00S00528.tdutab  +++|           = fail =
00576  M00S00529.tdutab  +++|              ;
00577  M00S00530.tdutab  +++|           = list =
00578  M00S00531.tdutab  +++|              traverse_input_tree(in_node^.next_node, { same level first }
00579  M00S00532.tdutab  +++|                 before_procedure, after_procedure);
00580  M00S00533.tdutab  +++|              FOR action_ndx := 1 TO in_node^.list_character_count DO
00581  M00S00534.tdutab  +++|                 traverse_input_tree(    { now the next level }
00582  M00S00535.tdutab  +++|                    in_node^.list_pointer^[action_ndx].
00583  M00S00536.tdutab  +++|                       action.next_level,
00584  M00S00537.tdutab  +++|                    before_procedure, after_procedure)
00585  M00S00538.tdutab  +++|              FOREND;
00586  M00S00539.tdutab  +++|           = range =
00587  M00S00540.tdutab  +++|              traverse_input_tree(in_node^.next_node,
00588  M00S00541.tdutab  +++|                 before_procedure, after_procedure);
00589  M00S00542.tdutab  +++|              FOR action_ndx := ORD(in_node^.range_lower_bound) TO
00590  M00S00543.tdutab  +++|                                ORD(in_node^.range_upper_bound) DO
00591  M00S00544.tdutab  +++|                 traverse_input_tree(
00592  M00S00545.tdutab  +++|                    in_node^.range_pointer^[action_ndx].next_level,
00593  M00S00546.tdutab  +++|                    before_procedure, after_procedure)
00594  M00S00547.tdutab  +++|              FOREND;
00595  M00S00548.tdutab  +++|           = single_action_range =
00596  M00S00549.tdutab  +++|              traverse_input_tree(in_node^.next_node,
00597  M00S00550.tdutab  +++|                 before_procedure, after_procedure);
00598  M00S00551.tdutab  +++|              traverse_input_tree(
00599  M00S00552.tdutab  +++|                 in_node^.sar_action.next_level,
00600  M00S00553.tdutab  +++|                 before_procedure, after_procedure);
00601  M00S00554.tdutab  +++|        CASEND;
00602  M00S00555.tdutab  +++|        IF after_procedure <> NIL THEN
00603  M00S00556.tdutab  +++|           after_procedure^(in_node)  { do whatever desired after traversal }
00604  M00S00557.tdutab  +++|        IFEND
00605  M00S00558.tdutab  +++|     IFEND
00606  M00S00559.tdutab  +++|  PROCEND traverse_input_tree;
00607  M00S00560.tdutab  +++|  ?? OLDTITLE ??
00608  M00S00561.tdutab  +++|
00609  M00S00562.tdutab  +++|  ?? NEWTITLE := 'calculate_input_offsets' ??
00610  M00S00563.tdutab  +++|  ?? EJECT ??
00611  M00S00564.tdutab  +++|
00612  M00S00565.tdutab  +++|  PROCEDURE calculate_input_offsets (in_node: ^input_node);
00613  M00S00566.tdutab  +++|
00614  M00S00567.tdutab  +++|     in_node^.offset := input_offset;
00615  M00S00568.tdutab  +++|     CASE in_node^.opcode OF
00616  M00S00569.tdutab  +++|        = fail =
00617  M00S00570.tdutab  +++|           input_offset := input_offset + 1;
00618  M00S00571.tdutab  +++|        = list =
00619  M00S00572.tdutab  +++|           input_offset := input_offset + 2 +
00620  M00S00573.tdutab  +++|              ( in_node^.list_character_count * 3 );
00621  M00S00574.tdutab  +++|        = range =
00622  M00S00575.tdutab  +++|           input_offset := input_offset + 3 + (
00623  M00S00576.tdutab  +++|              ( ( ORD(in_node^.range_upper_bound) -
00624  M00S00577.tdutab  +++|                  ORD(in_node^.range_lower_bound) ) + 1 ) * 2 );
00625  M00S00578.tdutab  +++|        = single_action_range =
00626  M00S00579.tdutab  +++|           input_offset := input_offset + 5;
00627  M00S00580.tdutab  +++|     CASEND
00628  M00S00581.tdutab  +++|  PROCEND calculate_input_offsets;
00629  M00S00582.tdutab  +++|  ?? OLDTITLE ??
00630  M00S00583.tdutab  +++|
00631  M00S00584.tdutab  +++|  ?? NEWTITLE := 'optimize_tables' ??
00632  M00S00585.tdutab  +++|  ?? EJECT ??
00633  M00S00586.tdutab  +++|
00634  M00S00587.tdutab  +++|  PROCEDURE [XDCL] optimize_tables;
00635  M00S00588.tdutab  +++|     VAR
00636  M00S00589.tdutab  +++|        next_ordinal: ordinal_type,
00637  M00S00590.tdutab  +++|        node_returned: BOOLEAN,
00638  M00S00591.tdutab  +++|        error_return: error_type;
00639  M00S00592.tdutab  +++|
00640  M00S00593.tdutab  +++|     ?? NEWTITLE := 'create_ranges' ??
00641  M00S00594.tdutab  +++|     ?? SKIP := 4 ??
00642  M00S00595.tdutab  +++|
00643  M00S00596.tdutab  +++|     PROCEDURE create_ranges (in_node: ^input_node);
00644  M00S00597.tdutab  +++|        VAR
00645  M00S00598.tdutab  +++|           action_ndx: INTEGER;
00646  M00S00599.tdutab  +++|
00647  M00S00600.tdutab  +++|        IF in_node <> NIL THEN
00648  M00S00601.tdutab  +++|           CASE in_node^.opcode OF
00649  M00S00602.tdutab  +++|              = fail =
00650  M00S00603.tdutab  +++|                 ;
00651  M00S00604.tdutab  +++|              = list =
00652  M00S00605.tdutab  +++|                 FOR action_ndx := 1 TO in_node^.list_character_count DO
00653  M00S00606.tdutab  +++|                    IF in_node^.list_pointer^[action_ndx].action.next_level <>
00654  M00S00607.tdutab  +++|                       NIL THEN
00655  M00S00608.tdutab  +++|                       create_range_level(
00656  M00S00609.tdutab  +++|                          in_node^.list_pointer^[action_ndx].action.next_level)
00657  M00S00610.tdutab  +++|                    IFEND
00658  M00S00611.tdutab  +++|                 FOREND;
00659  M00S00612.tdutab  +++|              = range =
00660  M00S00613.tdutab  +++|                 FOR action_ndx := ORD(in_node^.range_lower_bound) TO
00661  M00S00614.tdutab  +++|                                   ORD(in_node^.range_upper_bound) DO
00662  M00S00615.tdutab  +++|                    IF in_node^.range_pointer^[action_ndx].next_level <> NIL
00663  M00S00616.tdutab  +++|                       THEN
00664  M00S00617.tdutab  +++|                       create_range_level(
00665  M00S00618.tdutab  +++|                          in_node^.range_pointer^[action_ndx].next_level)
00666  M00S00619.tdutab  +++|                    IFEND
00667  M00S00620.tdutab  +++|                 FOREND;
00668  M00S00621.tdutab  +++|              = single_action_range =
00669  M00S00622.tdutab  +++|                 IF in_node^.sar_action.next_level <> NIL THEN
00670  M00S00623.tdutab  +++|                    create_range_level(in_node^.sar_action.next_level)
00671  M00S00624.tdutab  +++|                 IFEND
00672  M00S00625.tdutab  +++|           CASEND
00673  M00S00626.tdutab  +++|        IFEND
00674  M00S00627.tdutab  +++|     PROCEND create_ranges;
00675  M00S00628.tdutab  +++|     ?? OLDTITLE ??
00676  M00S00629.tdutab  +++|
00677  M00S00630.tdutab  +++|     ?? NEWTITLE := 'create_range_level' ??
00678  M00S00631.tdutab  +++|     ?? EJECT ??
00679  M00S00632.tdutab  +++|
00680  M00S00633.tdutab  +++|     PROCEDURE create_range_level (VAR curr_level: ^input_node);
00681  M00S00634.tdutab  +++|        { This procedure scans across a given level of the input tree, }
00682  M00S00635.tdutab  +++|        {   attempting to reduce consecutive lists of characters to ranges. }
00683  M00S00636.tdutab  +++|        { It ASSUMES it is being called as the FIRST phase of input table }
00684  M00S00637.tdutab  +++|        {   optimization, so that each level consists of single-item lists }
00685  M00S00638.tdutab  +++|        {   ONLY, and that the lists are in ASCENDING ORDER. }
00686  M00S00639.tdutab  +++|
00687  M00S00640.tdutab  +++|        VAR
00688  M00S00641.tdutab  +++|           new_node,
00689  M00S00642.tdutab  +++|           pred_node,
00690  M00S00643.tdutab  +++|           succ_node,
00691  M00S00644.tdutab  +++|           low_node,
00692  M00S00645.tdutab  +++|           low_node_pred,
00693  M00S00646.tdutab  +++|           new_low_node: ^input_node,
00694  M00S00647.tdutab  +++|           low,
00695  M00S00648.tdutab  +++|           high: CHAR,
00696  M00S00649.tdutab  +++|           range_ndx: INTEGER;
00697  M00S00650.tdutab  +++|
00698  M00S00651.tdutab  +++|        IF curr_level^.opcode = list THEN { just in case of empty table }
00699  M00S00652.tdutab  +++|           low := curr_level^.list_pointer^[1].character
00700  M00S00653.tdutab  +++|        IFEND;
00701  M00S00654.tdutab  +++|        high := low;
00702  M00S00655.tdutab  +++|        low_node := curr_level;
00703  M00S00656.tdutab  +++|        succ_node := curr_level;
00704  M00S00657.tdutab  +++|        pred_node := NIL;
00705  M00S00658.tdutab  +++|        WHILE ( succ_node <> NIL ) AND
00706  M00S00659.tdutab  +++|              ( error_return = no_error ) DO
00707  M00S00660.tdutab  +++|           IF ( succ_node^.opcode <> fail ) AND
00708  M00S00661.tdutab  +++|              ( succ_node^.list_pointer^[1].character = SUCC(high) ) THEN
00709  M00S00662.tdutab  +++|              high := succ_node^.list_pointer^[1].character { extend range }
00710  M00S00663.tdutab  +++|           ELSEIF low = high THEN     { 'orphan' list--reset search ptrs }
00711  M00S00664.tdutab  +++|              IF succ_node^.opcode = list THEN
00712  M00S00665.tdutab  +++|                 low := succ_node^.list_pointer^[1].character;
00713  M00S00666.tdutab  +++|                 high := low;
00714  M00S00667.tdutab  +++|                 low_node := succ_node;
00715  M00S00668.tdutab  +++|                 low_node_pred := pred_node
00716  M00S00669.tdutab  +++|              IFEND
00717  M00S00670.tdutab  +++|           ELSE                       { at least 2 consecutive nodes found }
00718  M00S00671.tdutab  +++|              ALLOCATE new_node : [ range ];
00719  M00S00672.tdutab  +++|              IF new_node = NIL THEN
00720  M00S00673.tdutab  +++|                 osp$set_status_abnormal(tdc_prod_code,
00721  M00S00674.tdutab  +++|                    tde_optimize_table_full, '', status);
00722  M00S00675.tdutab  +++|                 error_status(status);
00723  M00S00676.tdutab  +++|                 error_return := no_room_error;
00724  M00S00677.tdutab  +++|                 RETURN
00725  M00S00678.tdutab  +++|              IFEND;
00726  M00S00679.tdutab  +++|              new_node^.next_node := succ_node; { new range in same spot}
00727  M00S00680.tdutab  +++|              new_node^.offset := 0;
00728  M00S00681.tdutab  +++|              new_node^.node_visited := FALSE;
00729  M00S00682.tdutab  +++|              IF low_node = curr_level THEN { new node is first on level}
00730  M00S00683.tdutab  +++|                 curr_level := new_node { return pointer to my caller }
00731  M00S00684.tdutab  +++|              ELSE
00732  M00S00685.tdutab  +++|                 low_node_pred^.next_node := new_node
00733  M00S00686.tdutab  +++|              IFEND;
00734  M00S00687.tdutab  +++|              new_node^.range_lower_bound := low;
00735  M00S00688.tdutab  +++|              new_node^.range_upper_bound := high;
00736  M00S00689.tdutab  +++|              ALLOCATE new_node^.range_pointer : [ ORD(low)..ORD(high) ];
00737  M00S00690.tdutab  +++|              IF new_node^.range_pointer = NIL THEN
00738  M00S00691.tdutab  +++|                 osp$set_status_abnormal(tdc_prod_code,
00739  M00S00692.tdutab  +++|                    tde_optimize_table_full, '', status);
00740  M00S00693.tdutab  +++|                 error_status(status);
00741  M00S00694.tdutab  +++|                 error_return := no_room_error;
00742  M00S00695.tdutab  +++|                 RETURN
00743  M00S00696.tdutab  +++|              IFEND;
00744  M00S00697.tdutab  +++|              FOR range_ndx := ORD(low) TO ORD(high) DO
00745  M00S00698.tdutab  +++|                 new_node^.range_pointer^[range_ndx] :=
00746  M00S00699.tdutab  +++|                    low_node^.list_pointer^[1].action;
00747  M00S00700.tdutab  +++|                 new_low_node := low_node^.next_node;
00748  M00S00701.tdutab  +++|                 FREE low_node^.list_pointer;
00749  M00S00702.tdutab  +++|                 FREE low_node;
00750  M00S00703.tdutab  +++|                 low_node := new_low_node
00751  M00S00704.tdutab  +++|              FOREND;
00752  M00S00705.tdutab  +++|              IF succ_node^.opcode = list THEN
00753  M00S00706.tdutab  +++|                 low := succ_node^.list_pointer^[1].character;
00754  M00S00707.tdutab  +++|                 high := low;
00755  M00S00708.tdutab  +++|                 low_node := succ_node;
00756  M00S00709.tdutab  +++|                 low_node_pred := new_node
00757  M00S00710.tdutab  +++|              IFEND
00758  M00S00711.tdutab  +++|           IFEND;
00759  M00S00712.tdutab  +++|           pred_node := succ_node;
00760  M00S00713.tdutab  +++|           IF succ_node^.opcode = fail THEN
00761  M00S00714.tdutab  +++|              succ_node := NIL
00762  M00S00715.tdutab  +++|           ELSE
00763  M00S00716.tdutab  +++|              succ_node := pred_node^.next_node
00764  M00S00717.tdutab  +++|           IFEND
00765  M00S00718.tdutab  +++|        WHILEND
00766  M00S00719.tdutab  +++|     PROCEND create_range_level;
00767  M00S00720.tdutab  +++|     ?? OLDTITLE ??
00768  M00S00721.tdutab  +++|
00769  M00S00722.tdutab  +++|     ?? NEWTITLE := 'insert_remaining_chars' ??
00770  M00S00723.tdutab  +++|     ?? EJECT ??
00771  M00S00724.tdutab  +++|
00772  M00S00725.tdutab  +++|     PROCEDURE insert_remaining_chars;
00773  M00S00726.tdutab  +++|        { This procedure processes the first level of the input tree only, }
00774  M00S00727.tdutab  +++|        {   adding all characters that are not yet represented there.  This }
00775  M00S00728.tdutab  +++|        {   is necessary because we can make no assumptions about which }
00776  M00S00729.tdutab  +++|        {   characters the application program wants to see.  We will pass }
00777  M00S00730.tdutab  +++|        {   everything to the app, and let it decide what to do. }
00778  M00S00731.tdutab  +++|        { At the time this procedure is called, it ASSUMES that the first }
00779  M00S00732.tdutab  +++|        {   level consists ONLY of ranges and lists, and that everything }
00780  M00S00733.tdutab  +++|        {   is still in ASCENDING ORDER. }
00781  M00S00734.tdutab  +++|
00782  M00S00735.tdutab  +++|        VAR
00783  M00S00736.tdutab  +++|           pred_node,
00784  M00S00737.tdutab  +++|           succ_node: ^input_node,
00785  M00S00738.tdutab  +++|           first_needed: 0 .. 129;
00786  M00S00739.tdutab  +++|
00787  M00S00740.tdutab  +++|        ?? NEWTITLE := 'maybe_insert_chars' ??
00788  M00S00741.tdutab  +++|        ?? EJECT ??
00789  M00S00742.tdutab  +++|
00790  M00S00743.tdutab  +++|        PROCEDURE maybe_insert_chars (next_used: 0 .. 128;
00791  M00S00744.tdutab  +++|              succ_node: ^input_node;
00792  M00S00745.tdutab  +++|              VAR pred_node: ^input_node;
00793  M00S00746.tdutab  +++|              VAR first_needed: 0 .. 129);
00794  M00S00747.tdutab  +++|
00795  M00S00748.tdutab  +++|           VAR
00796  M00S00749.tdutab  +++|              new_node: ^input_node;
00797  M00S00750.tdutab  +++|
00798  M00S00751.tdutab  +++|           IF next_used > first_needed THEN
00799  M00S00752.tdutab  +++|              ALLOCATE new_node : [ single_action_range ];
00800  M00S00753.tdutab  +++|              IF new_node = NIL THEN
00801  M00S00754.tdutab  +++|                 osp$set_status_abnormal(tdc_prod_code,
00802  M00S00755.tdutab  +++|                    tde_optimize_table_full, '', status);
00803  M00S00756.tdutab  +++|                 error_status(status);
00804  M00S00757.tdutab  +++|                 error_return := no_room_error;
00805  M00S00758.tdutab  +++|              ELSE
00806  M00S00759.tdutab  +++|                 new_node^.next_node := succ_node;
00807  M00S00760.tdutab  +++|                 new_node^.offset := 0;
00808  M00S00761.tdutab  +++|                 new_node^.node_visited := FALSE;
00809  M00S00762.tdutab  +++|                 IF pred_node = NIL THEN
00810  M00S00763.tdutab  +++|                    input_list := new_node
00811  M00S00764.tdutab  +++|                 ELSE
00812  M00S00765.tdutab  +++|                    pred_node^.next_node := new_node
00813  M00S00766.tdutab  +++|                 IFEND;
00814  M00S00767.tdutab  +++|                 pred_node := new_node;
00815  M00S00768.tdutab  +++|                 new_node^.sar_lower_bound := CHR(first_needed);
00816  M00S00769.tdutab  +++|                 new_node^.sar_upper_bound := CHR(next_used - 1);
00817  M00S00770.tdutab  +++|                 new_node^.sar_action.ordinal := overstrike_ordinal;
00818  M00S00771.tdutab  +++|                 new_node^.sar_action.next_offset := 0;
00819  M00S00772.tdutab  +++|                 new_node^.sar_action.next_level := NIL
00820  M00S00773.tdutab  +++|              IFEND
00821  M00S00774.tdutab  +++|           IFEND;
00822  M00S00775.tdutab  +++|           first_needed := next_used + 1
00823  M00S00776.tdutab  +++|        PROCEND maybe_insert_chars;
00824  M00S00777.tdutab  +++|        ?? OLDTITLE ??
00825  M00S00778.tdutab  +++|
00826  M00S00779.tdutab  +++|        succ_node := input_list;
00827  M00S00780.tdutab  +++|        pred_node := NIL;
00828  M00S00781.tdutab  +++|        first_needed := 0;
00829  M00S00782.tdutab  +++|        WHILE first_needed < 128 DO
00830  M00S00783.tdutab  +++|           CASE succ_node^.opcode OF
00831  M00S00784.tdutab  +++|              = fail =
00832  M00S00785.tdutab  +++|                 maybe_insert_chars(128, succ_node, pred_node, first_needed);
00833  M00S00786.tdutab  +++|              = list =
00834  M00S00787.tdutab  +++|                 maybe_insert_chars(
00835  M00S00788.tdutab  +++|                    ORD(succ_node^.list_pointer^[1].character),
00836  M00S00789.tdutab  +++|                    succ_node, pred_node, first_needed);
00837  M00S00790.tdutab  +++|                 first_needed := 1 + ORD(succ_node^.list_pointer^
00838  M00S00791.tdutab  +++|                    [succ_node^.list_character_count].character);
00839  M00S00792.tdutab  +++|              = range =
00840  M00S00793.tdutab  +++|                 maybe_insert_chars(ORD(succ_node^.range_lower_bound),
00841  M00S00794.tdutab  +++|                    succ_node, pred_node, first_needed);
00842  M00S00795.tdutab  +++|                 first_needed := 1 + ORD(succ_node^.range_upper_bound);
00843  M00S00796.tdutab  +++|           CASEND;
00844  M00S00797.tdutab  +++|           pred_node := succ_node;
00845  M00S00798.tdutab  +++|           succ_node := pred_node^.next_node
00846  M00S00799.tdutab  +++|        WHILEND
00847  M00S00800.tdutab  +++|     PROCEND insert_remaining_chars;
00848  M00S00801.tdutab  +++|     ?? OLDTITLE ??
00849  M00S00802.tdutab  +++|
00850  M00S00803.tdutab  +++|     ?? NEWTITLE := 'combine_lists' ??
00851  M00S00804.tdutab  +++|     ?? EJECT ??
00852  M00S00805.tdutab  +++|
00853  M00S00806.tdutab  +++|     PROCEDURE combine_lists (in_node: ^input_node);
00854  M00S00807.tdutab  +++|        { This procedure processes all levels of the input tree, combining }
00855  M00S00808.tdutab  +++|        {   multiple list nodes at each level into a single list node. }
00856  M00S00809.tdutab  +++|        { It is called recursively by traverse_input_tree. }
00857  M00S00810.tdutab  +++|
00858  M00S00811.tdutab  +++|        VAR
00859  M00S00812.tdutab  +++|           action_ndx: INTEGER;
00860  M00S00813.tdutab  +++|
00861  M00S00814.tdutab  +++|        IF in_node <> NIL THEN
00862  M00S00815.tdutab  +++|           CASE in_node^.opcode OF
00863  M00S00816.tdutab  +++|              = fail =
00864  M00S00817.tdutab  +++|                 ;
00865  M00S00818.tdutab  +++|              = list =
00866  M00S00819.tdutab  +++|                 FOR action_ndx := 1 TO in_node^.list_character_count DO
00867  M00S00820.tdutab  +++|                    IF in_node^.list_pointer^[action_ndx].action.next_level <>
00868  M00S00821.tdutab  +++|                       NIL THEN
00869  M00S00822.tdutab  +++|                       combine_list_level(
00870  M00S00823.tdutab  +++|                          in_node^.list_pointer^[action_ndx].action.next_level)
00871  M00S00824.tdutab  +++|                    IFEND
00872  M00S00825.tdutab  +++|                 FOREND;
00873  M00S00826.tdutab  +++|              = range =
00874  M00S00827.tdutab  +++|                 FOR action_ndx := ORD(in_node^.range_lower_bound) TO
00875  M00S00828.tdutab  +++|                                   ORD(in_node^.range_upper_bound) DO
00876  M00S00829.tdutab  +++|                    IF in_node^.range_pointer^[action_ndx].next_level <> NIL
00877  M00S00830.tdutab  +++|                       THEN
00878  M00S00831.tdutab  +++|                       combine_list_level(
00879  M00S00832.tdutab  +++|                          in_node^.range_pointer^[action_ndx].next_level)
00880  M00S00833.tdutab  +++|                    IFEND
00881  M00S00834.tdutab  +++|                 FOREND;
00882  M00S00835.tdutab  +++|              = single_action_range =
00883  M00S00836.tdutab  +++|                 IF in_node^.sar_action.next_level <> NIL THEN
00884  M00S00837.tdutab  +++|                    combine_list_level(in_node^.sar_action.next_level)
00885  M00S00838.tdutab  +++|                 IFEND
00886  M00S00839.tdutab  +++|           CASEND
00887  M00S00840.tdutab  +++|        IFEND
00888  M00S00841.tdutab  +++|     PROCEND combine_lists;
00889  M00S00842.tdutab  +++|     ?? OLDTITLE ??
00890  M00S00843.tdutab  +++|
00891  M00S00844.tdutab  +++|     ?? NEWTITLE := 'combine_list_level' ??
00892  M00S00845.tdutab  +++|     ?? EJECT ??
00893  M00S00846.tdutab  +++|
00894  M00S00847.tdutab  +++|     PROCEDURE combine_list_level (VAR curr_level: ^input_node);
00895  M00S00848.tdutab  +++|        { This procedure scans across a given level of the input tree, }
00896  M00S00849.tdutab  +++|        {   combining all separate lists found at that level into a single }
00897  M00S00850.tdutab  +++|        {   list.  It doesn't really care at what phase of the optimization }
00898  M00S00851.tdutab  +++|        {   it is being called. }
00899  M00S00852.tdutab  +++|
00900  M00S00853.tdutab  +++|        VAR
00901  M00S00854.tdutab  +++|           new_node,
00902  M00S00855.tdutab  +++|           pred_node,
00903  M00S00856.tdutab  +++|           succ_node: ^input_node,
00904  M00S00857.tdutab  +++|           list_count,
00905  M00S00858.tdutab  +++|           new_ndx,
00906  M00S00859.tdutab  +++|           old_ndx: INTEGER;
00907  M00S00860.tdutab  +++|
00908  M00S00861.tdutab  +++|        succ_node := curr_level;
00909  M00S00862.tdutab  +++|        pred_node := NIL;
00910  M00S00863.tdutab  +++|        list_count := 0;
00911  M00S00864.tdutab  +++|        WHILE succ_node^.opcode <> fail DO
00912  M00S00865.tdutab  +++|           IF succ_node^.opcode = list THEN
00913  M00S00866.tdutab  +++|              list_count := list_count + succ_node^.list_character_count
00914  M00S00867.tdutab  +++|           IFEND;
00915  M00S00868.tdutab  +++|           pred_node := succ_node;
00916  M00S00869.tdutab  +++|           succ_node := succ_node^.next_node
00917  M00S00870.tdutab  +++|        WHILEND;
00918  M00S00871.tdutab  +++|        IF list_count > 0 THEN        { at least one list on this level }
00919  M00S00872.tdutab  +++|           ALLOCATE new_node : [ list ];
00920  M00S00873.tdutab  +++|           IF new_node = NIL THEN
00921  M00S00874.tdutab  +++|              error_return := no_room_error;
00922  M00S00875.tdutab  +++|              osp$set_status_abnormal(tdc_prod_code, tde_optimize_table_full,
00923  M00S00876.tdutab  +++|                 '', status);
00924  M00S00877.tdutab  +++|              error_status(status);
00925  M00S00878.tdutab  +++|              RETURN
00926  M00S00879.tdutab  +++|           IFEND;
00927  M00S00880.tdutab  +++|           new_node^.offset := 0;
00928  M00S00881.tdutab  +++|           new_node^.node_visited := FALSE;
00929  M00S00882.tdutab  +++|           new_node^.list_character_count := list_count;
00930  M00S00883.tdutab  +++|           ALLOCATE new_node^.list_pointer : [ 1 .. list_count ];
00931  M00S00884.tdutab  +++|           IF new_node^.list_pointer = NIL THEN
00932  M00S00885.tdutab  +++|              error_return := no_room_error;
00933  M00S00886.tdutab  +++|              osp$set_status_abnormal(tdc_prod_code,
00934  M00S00887.tdutab  +++|                 tde_optimize_table_full, '', status);
00935  M00S00888.tdutab  +++|              error_status(status);
00936  M00S00889.tdutab  +++|              RETURN
00937  M00S00890.tdutab  +++|           IFEND;
00938  M00S00891.tdutab  +++|           succ_node := curr_level;
00939  M00S00892.tdutab  +++|           pred_node := NIL;
00940  M00S00893.tdutab  +++|           new_ndx := 0;
00941  M00S00894.tdutab  +++|           WHILE ( succ_node <> NIL ) AND
00942  M00S00895.tdutab  +++|                 ( error_return = no_error ) DO
00943  M00S00896.tdutab  +++|              CASE succ_node^.opcode OF
00944  M00S00897.tdutab  +++|                 = list =                { old node, move pieces to new node }
00945  M00S00898.tdutab  +++|                    FOR old_ndx := 1 TO succ_node^.list_character_count DO
00946  M00S00899.tdutab  +++|                       new_ndx := new_ndx + 1;
00947  M00S00900.tdutab  +++|                       new_node^.list_pointer^[new_ndx].character :=
00948  M00S00901.tdutab  +++|                          succ_node^.list_pointer^[old_ndx].character;
00949  M00S00902.tdutab  +++|                       new_node^.list_pointer^[new_ndx].action :=
00950  M00S00903.tdutab  +++|                          succ_node^.list_pointer^[old_ndx].action
00951  M00S00904.tdutab  +++|                    FOREND;
00952  M00S00905.tdutab  +++|                    FREE succ_node^.list_pointer;
00953  M00S00906.tdutab  +++|                    IF succ_node = curr_level THEN { old list is first on lvl }
00954  M00S00907.tdutab  +++|                       curr_level := succ_node^.next_node; { link around it }
00955  M00S00908.tdutab  +++|                       FREE succ_node;
00956  M00S00909.tdutab  +++|                       succ_node := curr_level
00957  M00S00910.tdutab  +++|                    ELSE
00958  M00S00911.tdutab  +++|                       pred_node^.next_node := succ_node^.next_node;
00959  M00S00912.tdutab  +++|                       FREE succ_node;
00960  M00S00913.tdutab  +++|                       succ_node := pred_node^.next_node
00961  M00S00914.tdutab  +++|                    IFEND;
00962  M00S00915.tdutab  +++|                 = range, single_action_range =
00963  M00S00916.tdutab  +++|                    pred_node := succ_node;
00964  M00S00917.tdutab  +++|                    succ_node := pred_node^.next_node;
00965  M00S00918.tdutab  +++|                 = fail =             { at end, insert new node here }
00966  M00S00919.tdutab  +++|                    new_node^.next_node := succ_node; { new list at end }
00967  M00S00920.tdutab  +++|                    IF succ_node = curr_level THEN { new node is first on lvl }
00968  M00S00921.tdutab  +++|                       curr_level := new_node { return pointer to my caller }
00969  M00S00922.tdutab  +++|                    ELSE
00970  M00S00923.tdutab  +++|                       pred_node^.next_node := new_node
00971  M00S00924.tdutab  +++|                    IFEND;
00972  M00S00925.tdutab  +++|                    succ_node := NIL;
00973  M00S00926.tdutab  +++|              CASEND;
00974  M00S00927.tdutab  +++|           WHILEND
00975  M00S00928.tdutab  +++|        IFEND
00976  M00S00929.tdutab  +++|     PROCEND combine_list_level;
00977  M00S00930.tdutab  +++|     ?? OLDTITLE ??
00978  M00S00931.tdutab  +++|
00979  M00S00932.tdutab  +++|     ?? NEWTITLE := 'assign_input_offsets' ??
00980  M00S00933.tdutab  +++|     ?? SKIP := 2 ??
00981  M00S00934.tdutab  +++|
00982  M00S00935.tdutab  +++|     PROCEDURE assign_input_offsets (in_node: ^input_node);
00983  M00S00936.tdutab  +++|        VAR
00984  M00S00937.tdutab  +++|           action_ndx: INTEGER;
00985  M00S00938.tdutab  +++|
00986  M00S00939.tdutab  +++|        CASE in_node^.opcode OF
00987  M00S00940.tdutab  +++|           = fail =
00988  M00S00941.tdutab  +++|              ;
00989  M00S00942.tdutab  +++|           = list =
00990  M00S00943.tdutab  +++|              FOR action_ndx := 1 TO in_node^.list_character_count DO
00991  M00S00944.tdutab  +++|                 IF in_node^.list_pointer^[action_ndx].action.ordinal =
00992  M00S00945.tdutab  +++|                       no_ordinal THEN
00993  M00S00946.tdutab  +++|                    in_node^.list_pointer^[action_ndx].action.next_offset :=
00994  M00S00947.tdutab  +++|                       in_node^.list_pointer^[action_ndx].action.next_level^
00995  M00S00948.tdutab  +++|                          .offset
00996  M00S00949.tdutab  +++|                 IFEND
00997  M00S00950.tdutab  +++|              FOREND;
00998  M00S00951.tdutab  +++|           = range =
00999  M00S00952.tdutab  +++|              FOR action_ndx := ORD(in_node^.range_lower_bound) TO
01000  M00S00953.tdutab  +++|                                ORD(in_node^.range_upper_bound) DO
01001  M00S00954.tdutab  +++|                 IF in_node^.range_pointer^[action_ndx].ordinal=no_ordinal THEN
01002  M00S00955.tdutab  +++|                    in_node^.range_pointer^[action_ndx].next_offset :=
01003  M00S00956.tdutab  +++|                       in_node^.range_pointer^[action_ndx].next_level^.offset
01004  M00S00957.tdutab  +++|                 IFEND
01005  M00S00958.tdutab  +++|              FOREND;
01006  M00S00959.tdutab  +++|           = single_action_range =
01007  M00S00960.tdutab  +++|              IF in_node^.sar_action.ordinal = no_ordinal THEN
01008  M00S00961.tdutab  +++|                 in_node^.sar_action.next_offset :=
01009  M00S00962.tdutab  +++|                    in_node^.sar_action.next_level^.offset
01010  M00S00963.tdutab  +++|              IFEND
01011  M00S00964.tdutab  +++|        CASEND
01012  M00S00965.tdutab  +++|     PROCEND assign_input_offsets;
01013  M00S00966.tdutab  +++|     ?? OLDTITLE ??
01014  M00S00967.tdutab  +++|
01015  M00S00968.tdutab  +++|     ?? EJECT ??
01016  M00S00969.tdutab  +++|
01017  M00S00970.tdutab  +++|     error_return := no_error;
01018  M00S00971.tdutab  +++|     appstr_latest_new_node := appstr_table;
01019  M00S00972.tdutab  +++|
01020  M00S00973.tdutab  +++|     traverse_input_tree(input_list, NIL, ^create_ranges);
01021  M00S00974.tdutab  +++|     create_range_level(input_list);  { root level wasn't handled recursively }
01022  M00S00975.tdutab  +++|     IF error_return = no_error THEN
01023  M00S00976.tdutab  +++|        insert_remaining_chars;       { adds all chars not already in first lv}
01024  M00S00977.tdutab  +++|        IF error_return = no_error THEN
01025  M00S00978.tdutab  +++|           traverse_input_tree(input_list, NIL, ^combine_lists);
01026  M00S00979.tdutab  +++|           combine_list_level(input_list); { root level wasn't handled }
01027  M00S00980.tdutab  +++|           IF error_return = no_error THEN
01028  M00S00981.tdutab  +++|              input_offset := 0;      { assign object table offset addresses }
01029  M00S00982.tdutab  +++|              dump_input_node(^calculate_input_offsets);
01030  M00S00983.tdutab  +++|              dump_input_node(^assign_input_offsets)
01031  M00S00984.tdutab  +++|           IFEND
01032  M00S00985.tdutab  +++|        IFEND
01033  M00S00986.tdutab  +++|     IFEND
01034  M00S00987.tdutab  +++|  PROCEND optimize_tables;
01035  M00S00988.tdutab  +++|  ?? OLDTITLE ??
01036  M00S00989.tdutab  +++|
01037  M00S00990.tdutab  +++|MODEND tdutab;
cdc/nos2.source/opl.opl871/deck/tdutab.txt ยท Last modified: (external edit)