2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / libf2c / libU77 / u77-test.f
blob3c8151c533df15a47cee02bb6779d815550ba4b9
1 *** Some random stuff for testing libU77. Should be done better. It's
2 * hard to test things where you can't guarantee the result. Have a
3 * good squint at what it prints, though detected errors will cause
4 * starred messages.
6 * Currently not tested:
7 * ALARM
8 * CHDIR (func)
9 * CHMOD (func)
10 * FGET (func/subr)
11 * FGETC (func)
12 * FPUT (func/subr)
13 * FPUTC (func)
14 * FSTAT (subr)
15 * GETCWD (subr)
16 * HOSTNM (subr)
17 * IRAND
18 * KILL
19 * LINK (func)
20 * LSTAT (subr)
21 * RENAME (func/subr)
22 * SIGNAL (subr)
23 * SRAND
24 * STAT (subr)
25 * SYMLNK (func/subr)
26 * UMASK (func)
27 * UNLINK (func)
29 * NOTE! This is the libU77 version, so it should be a bit more
30 * "interactive" than the testsuite version, which is in
31 * gcc/testsuite/g77.f-torture/execute/u77-test.f.
32 * This version purposely exits with a "failure" status, to test
33 * returning of non-zero status, and it doesn't call the ABORT
34 * intrinsic (it substitutes an EXTERNAL stub, so the code can be
35 * kept nearly the same in both copies). Also, it goes ahead and
36 * tests the HOSTNM intrinsic. Please keep the other copy up-to-date when
37 * you modify this one.
39 implicit none
41 * external hostnm
42 intrinsic hostnm
43 integer hostnm
45 integer i, j, k, ltarray (9), idat (3), count, rate, count_max,
46 + pid, mask
47 real tarray1(2), tarray2(2), r1, r2
48 double precision d1
49 integer(kind=2) bigi
50 logical issum
51 intrinsic getpid, getuid, getgid, ierrno, gerror, time8,
52 + fnum, isatty, getarg, access, unlink, fstat, iargc,
53 + stat, lstat, getcwd, gmtime, etime, chmod, itime, date,
54 + chdir, fgetc, fputc, system_clock, second, idate, secnds,
55 + time, ctime, fdate, ttynam, date_and_time, mclock, mclock8,
56 + cpu_time, dtime, ftell, abort
57 external lenstr, ctrlc
58 integer lenstr
59 logical l
60 character gerr*80, c*1
61 character ctim*25, line*80, lognam*20, wd*1000, line2*80,
62 + ddate*8, ttime*10, zone*5, ctim2*25
63 integer fstatb (13), statb (13)
64 integer *2 i2zero
65 integer values(8)
66 integer(kind=7) sigret
68 i = time ()
69 ctim = ctime (i)
70 WRITE (6,'(A/)') '1 GNU libU77 test at: ' // ctim(:lenstr (ctim))
71 write (6,'(A,I3,'', '',I3)')
72 + ' Logical units 5 and 6 correspond (FNUM) to'
73 + // ' Unix i/o units ', fnum(5), fnum(6)
74 if (lnblnk('foo ').ne.3 .or. len_trim('foo ').ne.3) then
75 print *, 'LNBLNK or LEN_TRIM failed'
76 call abort
77 end if
79 bigi = time8 ()
81 call ctime (i, ctim2)
82 if (ctim .ne. ctim2) then
83 write (6, *) '*** CALL CTIME disagrees with CTIME(): ',
84 + ctim2(:lenstr (ctim2)), ' vs. ', ctim(:lenstr (ctim))
85 call doabort
86 end if
88 j = time ()
89 if (i .gt. bigi .or. bigi .gt. j) then
90 write (6, *) '*** TIME/TIME8/TIME sequence failures: ',
91 + i, bigi, j
92 call doabort
93 end if
95 print *, 'Command-line arguments: ', iargc ()
96 do i = 0, iargc ()
97 call getarg (i, line)
98 print *, 'Arg ', i, ' is: ', line(:lenstr (line))
99 end do
101 l= isatty(6)
102 line2 = ttynam(6)
103 if (l) then
104 line = 'and 6 is a tty device (ISATTY) named '//line2
105 else
106 line = 'and 6 isn''t a tty device (ISATTY)'
107 end if
108 write (6,'(1X,A)') line(:lenstr(line))
109 call ttynam (6, line)
110 if (line .ne. line2) then
111 print *, '*** CALL TTYNAM disagrees with TTYNAM: ',
112 + line(:lenstr (line))
113 call doabort
114 end if
116 * regression test for compiler crash fixed by JCB 1998-08-04 com.c
117 sigret = signal(2, ctrlc)
119 pid = getpid()
120 WRITE (6,'(A,I10)') ' Process id (GETPID): ', pid
121 WRITE (6,'(A,I10)') ' User id (GETUID): ', GETUID ()
122 WRITE (6,'(A,I10)') ' Group id (GETGID): ', GETGID ()
123 WRITE (6, *) 'If you have the `id'' program, the following call'
124 write (6, *) 'of SYSTEM should agree with the above:'
125 call flush(6)
126 CALL SYSTEM ('echo " " `id`')
127 call flush
129 lognam = 'blahblahblah'
130 call getlog (lognam)
131 write (6,*) 'Login name (GETLOG): ', lognam(:lenstr (lognam))
133 wd = 'blahblahblah'
134 call getenv ('LOGNAME', wd)
135 write (6,*) 'Login name (GETENV of LOGNAME): ', wd(:lenstr (wd))
137 call umask(0, mask)
138 write(6,*) 'UMASK returns', mask
139 call umask(mask)
141 ctim = fdate()
142 write (6,*) 'FDATE returns: ', ctim(:lenstr (ctim))
143 call fdate (ctim)
144 write (6,*) 'CALL FDATE returns: ', ctim(:lenstr (ctim))
146 j=time()
147 call ltime (j, ltarray)
148 write (6,'(1x,a,9i4)') 'LTIME returns:', ltarray
149 call gmtime (j, ltarray)
150 write (6,'(1x,a,9i4)') 'GMTIME returns:', ltarray
152 call system_clock(count) ! omitting optional args
153 call system_clock(count, rate, count_max)
154 write(6,*) 'SYSTEM_CLOCK returns: ', count, rate, count_max
156 call date_and_time(ddate) ! omitting optional args
157 call date_and_time(ddate, ttime, zone, values)
158 write(6, *) 'DATE_AND_TIME returns: ', ddate, ' ', ttime, ' ',
159 + zone, ' ', values
161 write (6,*) 'Sleeping for 1 second (SLEEP) ...'
162 call sleep (1)
164 c consistency-check etime vs. dtime for first call
165 r1 = etime (tarray1)
166 r2 = dtime (tarray2)
167 if (abs (r1-r2).gt.1.0) then
168 write (6,*)
169 + 'Results of ETIME and DTIME differ by more than a second:',
170 + r1, r2
171 call doabort
172 end if
173 if (.not. issum (r1, tarray1(1), tarray1(2))) then
174 write (6,*) '*** ETIME didn''t return sum of the array: ',
175 + r1, ' /= ', tarray1(1), '+', tarray1(2)
176 call doabort
177 end if
178 if (.not. issum (r2, tarray2(1), tarray2(2))) then
179 write (6,*) '*** DTIME didn''t return sum of the array: ',
180 + r2, ' /= ', tarray2(1), '+', tarray2(2)
181 call doabort
182 end if
183 write (6, '(A,3F10.3)')
184 + ' Elapsed total, user, system time (ETIME): ',
185 + r1, tarray1
187 c now try to get times to change enough to see in etime/dtime
188 write (6,*) 'Looping until clock ticks at least once...'
189 do i = 1,1000
190 do j = 1,1000
191 end do
192 call dtime (tarray2, r2)
193 if (tarray2(1) .ne. 0. .or. tarray2(2) .ne. 0.) exit
194 end do
195 call etime (tarray1, r1)
196 if (.not. issum (r1, tarray1(1), tarray1(2))) then
197 write (6,*) '*** ETIME didn''t return sum of the array: ',
198 + r1, ' /= ', tarray1(1), '+', tarray1(2)
199 call doabort
200 end if
201 if (.not. issum (r2, tarray2(1), tarray2(2))) then
202 write (6,*) '*** DTIME didn''t return sum of the array: ',
203 + r2, ' /= ', tarray2(1), '+', tarray2(2)
204 call doabort
205 end if
206 write (6, '(A,3F10.3)')
207 + ' Differences in total, user, system time (DTIME): ',
208 + r2, tarray2
209 write (6, '(A,3F10.3)')
210 + ' Elapsed total, user, system time (ETIME): ',
211 + r1, tarray1
212 write (6, *) '(Clock-tick detected after ', i, ' 1K loops.)'
214 call idate (i,j,k)
215 call idate (idat)
216 write (6,*) 'IDATE (date,month,year): ',idat
217 print *, '... and the VXT version (month,date,year): ', i,j,k
218 if (i/=idat(2) .or. j/=idat(1) .or. k/=mod(idat(3),100)) then
219 print *, '*** VXT and U77 versions don''t agree'
220 call doabort
221 end if
223 call date (ctim)
224 write (6,*) 'DATE (dd-mmm-yy): ', ctim(:lenstr (ctim))
226 call itime (idat)
227 write (6,*) 'ITIME (hour,minutes,seconds): ', idat
229 call time(line(:8))
230 print *, 'TIME: ', line(:8)
232 write (6,*) 'SECNDS(0.0) returns: ',secnds(0.0)
234 write (6,*) 'SECOND returns: ', second()
235 call dumdum(r1)
236 call second(r1)
237 write (6,*) 'CALL SECOND returns: ', r1
239 * compiler crash fixed by 1998-10-01 com.c change
240 if (rand(0).lt.0.0 .or. rand(0).gt.1.0) then
241 write (6,*) '*** rand(0) error'
242 call doabort()
243 end if
245 i = getcwd(wd)
246 if (i.ne.0) then
247 call perror ('*** getcwd')
248 call doabort
249 else
250 write (6,*) 'Current directory is "'//wd(:lenstr(wd))//'"'
251 end if
252 call chdir ('.',i)
253 if (i.ne.0) then
254 write (6,*) '***CHDIR to ".": ', i
255 call doabort
256 end if
258 i=hostnm(wd)
259 if(i.ne.0) then
260 call perror ('*** hostnm')
261 call doabort
262 else
263 write (6,*) 'Host name is ', wd(:lenstr(wd))
264 end if
266 i = access('/dev/null ', 'rw')
267 if (i.ne.0) write (6,*) '***Read/write ACCESS to /dev/null: ', i
268 write (6,*) 'Creating file "foo" for testing...'
269 open (3,file='foo',status='UNKNOWN')
270 rewind 3
271 call fputc(3, 'c',i)
272 call fputc(3, 'd',j)
273 if (i+j.ne.0) write(6,*) '***FPUTC: ', i
274 C why is it necessary to reopen? (who wrote this?)
275 C the better to test with, my dear! (-- burley)
276 close(3)
277 open(3,file='foo',status='old')
278 call fseek(3,0,0,*10)
279 go to 20
280 10 write(6,*) '***FSEEK failed'
281 call doabort
282 20 call fgetc(3, c,i)
283 if (i.ne.0) then
284 write(6,*) '***FGETC: ', i
285 call doabort
286 end if
287 if (c.ne.'c') then
288 write(6,*) '***FGETC read the wrong thing: ', ichar(c)
289 call doabort
290 end if
291 i= ftell(3)
292 if (i.ne.1) then
293 write(6,*) '***FTELL offset: ', i
294 call doabort
295 end if
296 call ftell(3, i)
297 if (i.ne.1) then
298 write(6,*) '***CALL FTELL offset: ', i
299 call doabort
300 end if
301 call chmod ('foo', 'a+w',i)
302 if (i.ne.0) then
303 write (6,*) '***CHMOD of "foo": ', i
304 call doabort
305 end if
306 i = fstat (3, fstatb)
307 if (i.ne.0) then
308 write (6,*) '***FSTAT of "foo": ', i
309 call doabort
310 end if
311 i = stat ('foo', statb)
312 if (i.ne.0) then
313 write (6,*) '***STAT of "foo": ', i
314 call doabort
315 end if
316 write (6,*) ' with stat array ', statb
317 if (statb(6) .ne. getgid ()) then
318 write (6,*) 'Note: FSTAT gid wrong (happens on some systems).'
319 end if
320 if (statb(5) .ne. getuid () .or. statb(4) .ne. 1) then
321 write (6,*) '*** FSTAT uid or nlink is wrong'
322 call doabort
323 end if
324 do i=1,13
325 if (fstatb (i) .ne. statb (i)) then
326 write (6,*) '*** FSTAT and STAT don''t agree on '// '
327 + array element ', i, ' value ', fstatb (i), statb (i)
328 call doabort
329 end if
330 end do
331 i = lstat ('foo', fstatb)
332 do i=1,13
333 if (fstatb (i) .ne. statb (i)) then
334 write (6,*) '*** LSTAT and STAT don''t agree on '//
335 + 'array element ', i, ' value ', fstatb (i), statb (i)
336 call doabort
337 end if
338 end do
340 C in case it exists already:
341 call unlink ('bar',i)
342 call link ('foo ', 'bar ',i)
343 if (i.ne.0) then
344 write (6,*) '***LINK "foo" to "bar" failed: ', i
345 call doabort
346 end if
347 call unlink ('foo',i)
348 if (i.ne.0) then
349 write (6,*) '***UNLINK "foo" failed: ', i
350 call doabort
351 end if
352 call unlink ('foo',i)
353 if (i.eq.0) then
354 write (6,*) '***UNLINK "foo" again: ', i
355 call doabort
356 end if
358 call gerror (gerr)
359 i = ierrno()
360 write (6,'(A,I3,A/1X,A)') ' The current error number is: ',
361 + i,
362 + ' and the corresponding message is:', gerr(:lenstr(gerr))
363 write (6,*) 'This is sent to stderr prefixed by the program name'
364 call getarg (0, line)
365 call perror (line (:lenstr (line)))
366 call unlink ('bar')
368 print *, 'MCLOCK returns ', mclock ()
369 print *, 'MCLOCK8 returns ', mclock8 ()
371 call cpu_time (d1)
372 print *, 'CPU_TIME returns ', d1
374 WRITE (6,*) 'You should see exit status 1'
375 CALL EXIT(1)
376 99 END
378 * Return length of STR not including trailing blanks, but always > 0.
379 integer function lenstr (str)
380 character*(*) str
381 if (str.eq.' ') then
382 lenstr=1
383 else
384 lenstr = lnblnk (str)
385 end if
388 * Just make sure SECOND() doesn't "magically" work the second time.
389 subroutine dumdum(r)
390 r = 3.14159
393 * Test whether sum is approximately left+right.
394 logical function issum (sum, left, right)
395 implicit none
396 real sum, left, right
397 real mysum, delta, width
398 mysum = left + right
399 delta = abs (mysum - sum)
400 width = abs (left) + abs (right)
401 issum = (delta .le. .0001 * width)
404 * Signal handler
405 subroutine ctrlc
406 print *, 'Got ^C'
407 call doabort
410 * A problem has been noticed, so maybe abort the test.
411 subroutine doabort
412 * For this version, print out all problems noticed.
413 * intrinsic abort
414 * call abort