LISTING OF "DIORAND"
SHOWING EXTENDED RANDOM ACCESS CALLS
PL/I-80 V1.0, COMPILATION OF: DIORAND
L: List Source Program
%include 'diomod.dcl';
%include 'fcb.dcl';
NO ERROR(S) IN PASS 1
NO ERROR(S) IN PASS 2
PL/I-80 V1.0, COMPILATION OF: DIORAND
1 a 0000 diorand:
2 a 0006 proc options(main);
3 a 0006 /* random access tests for 2.0 and 2.2 */
4 a 0006
5+c 0006 dcl
6+c 0006 memptr entry returns (ptr),
7+c 0006 memsiz entry returns (fixed(15)),
8+c 0006 memwds entry returns (fixed(15)),
9+c 0006 dfcb0 entry returns (ptr),
10+c 0006 dfcb1 entry returns (ptr),
11+c 0006 dbuff entry returns (ptr),
12+c 0006 reboot entry,
13+c 0006 rdcon entry returns (char(1)),
14+c 0006 wrcon entry (char(1)),
15+c 0006 rdrdr entry returns (char(1)),
16+c 0006 wrpun entry (char(1)),
17+c 0006 wrlst entry (char(1)),
18+c 0006 coninp entry returns (char(1)),
19+c 0006 conout entry (char(1)),
20+c 0006 rdstat entry returns (bit(1)),
21+c 0006 getio entry returns (bit(8)),
22+c 0006 setio entry (bit(8)),
23+c 0006 wrstr entry (ptr),
24+c 0006 rdbuf entry (ptr),
25+c 0006 break entry returns (bit(1)),
26+c 0006 vers entry returns (bit(16)),
27+c 0006 reset entry,
28+c 0006 select entry (fixed(7)),
29+c 0006 open entry (ptr) returns (fixed(7)),
30+c 0006 close entry (ptr) returns (fixed(7)),
31+c 0006 sear entry (ptr) returns (fixed(7)),
32+c 0006 searn entry returns (fixed(7)),
33+c 0006 delete entry (ptr),
34+c 0006 rdseq entry (ptr) returns (fixed(7)),
35+c 0006 wrseq entry (ptr) returns (fixed(7)),
36+c 0006 make entry (ptr) returns (fixed(7)),
37+c 0006 rename entry (ptr),
38+c 0006 logvec entry returns (bit(16)),
39+c 0006 curdsk entry returns (fixed(7)),
40+c 0006 setdma entry (ptr),
41+c 0006 allvec entry returns (ptr),
42+c 0006 wpdisk entry,
43+c 0006 rovec entry returns (bit(16)),
44+c 0006 filatt entry (ptr),
45+c 0006 getdpb entry returns (ptr),
46+c 0006 getusr entry returns (fixed(7)),
47+c 0006 setusr entry (fixed(7)),
48+c 0006 rdran entry (ptr) returns (fixed(7)),
49+c 0006 wrran entry (ptr) returns (fixed(7)),
50+c 0006 filsiz entry (ptr),
51+c 0006 setrec entry (ptr),
52+c 0006 resdrv entry (bit(16)),
53+c 0006 wrranz entry (ptr) returns (fixed(7));
54 c 0006
55 c 0006 dcl
56 c 0006 1 database,
57+c 0006 2 name1,
58+c 0006 3 drive fixed(7), /* drive number */
59+c 0006 3 fname char(8), /* file name */
60+c 0006 3 ftype char(3), /* file type */
61+c 0006 3 fext fixed(7), /* file extent */
62+c 0006 3 space (3) bit(8),/* filler */
63+c 0006 2 name2, /* used in rename */
64+c 0006 3 drive2 fixed(7),
65+c 0006 3 fname2 char(8),
66+c 0006 3 ftype2 char(3),
67+c 0006 3 fext2 fixed(7),
68+c 0006 3 space2 (3) bit(8),
69+c 0006 2 crec fixed(7), /* current record */
70+c 0006 2 rrec fixed(15), /* random record */
71+c 0006 2 rovf fixed(7); /* random rec overflow */
72 c 0006
73 c 0006 dcl
74 c 0006 lower char(26) static initial
75 c 0006 ('abcdefghijklmnopqrstuvwxyz'),
76 c 0006 upper char(26) static initial
77 c 0006 ('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
78 c 0006
79 c 0006 dcl
80 c 0006 /* simple variables */
81 c 0006 i fixed,
82 c 0006 fn char(20),
83 c 0006 c char(1),
84 c 0006 code fixed(7),
85 c 0006 mode fixed(2),
86 c 0006 zerofill bit(1),
87 c 0006 version bit(16);
88 c 0006
89 c 0006 dcl
90 c 0006 /* overlays on default buffer */
91 c 0006 bitbuf (128) bit(8) based(dbuff()),
92 c 0006 buffer char(127) var based(dbuff());
93 c 0006
94 c 0006 put skip list('Random Access Test');
95 c 0022 /* check version number for 2.0 */
96 c 0022 version = vers();
97 c 0028 if substr(version,9,8) < '20'b4 then
98 c 0031 do;
99 c 0031 put skip list('You Need Version 2');
100 c 004D stop;
101 c 0050 end;
102 c 0050 put skip list('Zero Record Fill?');
103 c 006C get list(c);
104 c 0086 zerofill = (c = 'Y' ! c = 'y') &
105 c 00B5 substr(version,9,8) >= '22'b4;
106 c 00B5
107 c 00B5 /* read and process file name */
108 c 00B5 put skip list('Data Base Name: ');
109 c 00D1 get list(fn);
110 c 00EB fn = translate(fn,upper,lower);
111 c 0110
112 c 0110 /* process optional drive prefix */
113 c 0110 i = index(fn,':');
114 c 0120 if i = 0 then
115 c 0129 drive = 0;
116 c 0131 else
117 c 0131 if i = 2 then
118 c 013B do;
119 c 013B /* convert character to drive code */
120 c 013B drive = index(upper,substr(fn,1,1));
121 c 0153 if drive = 0 ! drive > 16 then
122 c 016C do;
123 c 016C put skip list('Bad Drive Name');
124 c 0188 stop;
125 c 018B end;
126 c 018B fn = substr(fn,i+1);
127 c 01A4 end;
128 c 01A4
129 c 01A4 /* get file name and optional type */
130 c 01A4 i = index(fn,'.');
131 c 01B4 if i = 0 then
132 c 01BD do;
133 c 01BD /* no file type specified, use .DAT */
134 c 01BD fname = fn;
135 c 01CA ftype = 'DAT';
136 c 01D9 end;
137 c 01D9 else
138 c 01D9 do;
139 c 01D9 fname = substr(fn,1,i-1);
140 c 01F5 ftype = substr(fn,i+1);
141 c 020F end;
142 c 020F
143 c 020F /* clear the extent field */
144 c 020F fext = 0;
145 c 0214
146 c 0214 if open(addr(database)) = -1 then
147 c 0225 do;
148 c 0225 put skip list('Creating New Database');
149 c 0241 if make(addr(database)) = -1 then
150 c 0252 do;
151 c 0252 put skip list('No Directory Space');
152 c 026E stop;
153 c 0274 end;
154 c 0274 end;
155 c 0274 else
156 c 0274 do;
157 c 0274 call filsiz(addr(database));
158 c 0280 put skip list('File Size:',rrec,' Records');
159 c 02B2 end;
160 c 02B2
161 c 02B2 /* main processing loop */
162 c 02B2 do while('1'b);
163 c 02B2 call setrec(addr(database));
164 c 02BE put skip list('Current Record',rrec);
165 c 02E5 put skip list('Read(0),Write(1),Quit(2)? ');
166 c 0301 get list(mode);
167 c 031A if mode < 2 then
168 c 0322 do;
169 c 0322 put skip list('Record Number? ');
170 c 033E get list(rrec);
171 c 035B rovf = 0;
172 c 0360 end;
173 c 0360 if mode = 0 then
174 c 0367 do;
175 c 0367 code = rdran(addr(database));
176 c 0376 if code = 0 then
177 c 037D do;
178 c 037D if bitbuf(1) = '00'b4 then
179 c 0386 put skip list('Zero Record');
180 c 03A5 else
181 c 03A5 put skip list(buffer);
182 c 03C2 end;
183 c 03C2 else
184 c 03C2 put skip list('Return Code',code);
185 c 03F0 end;
186 c 03F0 else
187 c 03F0 if mode = 1 then
188 c 03F7 do;
189 c 03F7 put skip list('Data: ');
190 c 0413 get list(buffer);
191 c 042F if zerofill then
192 c 0436 code = wrranz(addr(database));
193 c 0448 else
194 c 0448 code = wrran (addr(database));
195 c 0457 if code ^= 0 then
196 c 045E put skip list('Return Code',code);
197 c 048C end;
198 c 048C else
199 c 048C if mode = 2 then
200 c 0494 do;
201 c 0494 if close(addr(database)) = -1 then
202 c 04A5 put skip list('Read/Only');
203 c 04C1 stop;
204 c 04C7 end;
205 c 04C7 end;
206 a 04C7 end diorand;
CODE SIZE = 04C7
DATA AREA = 0183
END COMPILATION