summaryrefslogtreecommitdiff
path: root/macros/text1/vax_vms/vmssort.pas
diff options
context:
space:
mode:
Diffstat (limited to 'macros/text1/vax_vms/vmssort.pas')
-rw-r--r--macros/text1/vax_vms/vmssort.pas78
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.