diff options
Diffstat (limited to 'macros/text1/vax_vms/vmssort.pas')
-rw-r--r-- | macros/text1/vax_vms/vmssort.pas | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/macros/text1/vax_vms/vmssort.pas b/macros/text1/vax_vms/vmssort.pas new file mode 100644 index 0000000000..064cef2593 --- /dev/null +++ b/macros/text1/vax_vms/vmssort.pas @@ -0,0 +1,78 @@ +[environment('sortcall')] + +module vmssort(output); +procedure vmssort(var sort_rc:integer); +label RETURN; + +const + max_pn_alpha=20; + max_field = 300; + SS$_NORMAL = 1; + DSC$K_DTYPE_L = 8; (* Longword Integer. 32-bit signed *) + DSC$K_DTYPE_T = 14; (* Character-coded text. A single 8-bit character *) + sor$gk_record = 1; + +type + word_integer = [word] 0..65535; + byte_integer = [byte] 0..255; + pn_alpha_type=packed array[1..max_pn_alpha] of char; + field_array = packed array[1..max_field] of char; + field_type = packed record + field_lngth :integer; + field_level :field_array; + end; + sort_type = packed record + record_type :char; + page_number :integer; + abs_page_number :integer; + page_string :pn_alpha_type; + sort_part :packed array[1..3] of field_type; + print :packed array[1..3] of field_type; + end; + + +var + sort_stat: integer; + key_info:array[1..21] of word_integer + := (5,DSC$K_DTYPE_T,0,33,300, + DSC$K_DTYPE_T,0,337,300, + DSC$K_DTYPE_T,0,641,300, + DSC$K_DTYPE_L,1,5,4, + DSC$K_DTYPE_L,0,1,4); + vmssort_type:byte_integer := sor$gk_record; + + +function sor$pass_files( + in_file: [class_s] packed array [l..u:integer] of char; + out_file: [class_s] packed array [a..b:integer] of char) + : integer; extern; + +function sor$begin_sort( + %REF key_data: array [l..u:integer] of word_integer; + long_rec: word_integer := %IMMED 0; + options: integer := %IMMED 0; + in_file_size: integer := %IMMED 0; + user_compare: integer := %IMMED 0; + user_equal: integer := %IMMED 0; + s_type: byte_integer; + work_files: byte_integer := %IMMED 0; + context : integer := %IMMED 0): integer; extern; + +function sor$sort_merge: integer; extern; + +function sor$end_sort: integer; extern; + +begin + sort_stat:=sor$pass_files(in_file:='TEXT1$$.INSORT', + out_file:='TEXT1$$.OUTSORT'); + if not odd(sort_stat) then goto RETURN; + sort_stat:=sor$begin_sort(key_data:=key_info, + s_type:=vmssort_type); + if not odd(sort_stat) then goto RETURN; + sort_stat:=sor$sort_merge; + if not odd(sort_stat) then goto RETURN; + sort_stat:=sor$end_sort; +RETURN: + sort_rc:=sort_stat; +end; +end. |