1
C===========================================================================
2
C Copyright (C) 1995-2010 European Southern Observatory (ESO)
5
C This program is free software; you can redistribute it and/or
6
C modify it under the terms of the GNU General Public License as
7
C published by the Free Software Foundation; either version 2 of
8
C the License, or (at your option) any later version.
10
C This program is distributed in the hope that it will be useful,
11
C but WITHOUT ANY WARRANTY; without even the implied warranty of
12
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
C GNU General Public License for more details.
15
C You should have received a copy of the GNU General Public
16
C License along with this program; if not, write to the Free
17
C Software Foundation, Inc., 675 Massachusetts Ave, Cambridge,
20
C Correspondence concerning ESO-MIDAS should be addressed as follows:
21
C Internet e-mail: midas@eso.org
22
C Postal address: European Southern Observatory
23
C Data Management Division
24
C Karl-Schwarzschild-Strasse 2
25
C D 85748 Garching bei Muenchen
27
C===========================================================================
31
C++++++++++++++++++++++++++++++++++++++++++++++++++
33
C.LANGUAGE: F77+ESOext
38
C program DESCR version 3.50 861003
44
C read/write or delete descriptors
47
C use MIDAS interfaces to do the job
50
C the following keys are used:
51
C IN_A/C/1/120 name of data frame (input)
52
C "cleaned" name (output)
53
C ACTION/C/1/2 (1) up to 6 different action flags
54
C = R, for reading a complete descriptor
55
C = W, for writing a descriptor
56
C = D, for deleting a descriptor
57
C = P, for printing a complete descriptor
58
C = C, for copying all descriptors
59
C = S, for showing all existing descriptors
60
C (2) display flag for READ option
61
C = F, for full display
62
C = B, for brief display
63
C = H, for display of data only (no header line)
64
C or hidden flag for SHOW option
65
C = H, for hidden display
66
C P2/C/1/80 for (W) descriptor/type/1.elem./novals
67
C or as default descriptor => has to exist
68
C 1.elem. = 1 + fill as much as is there
69
C for (C) *,MASK with MASK as defined in STDCOP
70
C only descriptor(s) separated by a comma (R,D,P)LINE
71
C P3/C/1/60 data values in ASCII (W)
72
C P4/C/1/3 = ALL, if complete descr. should be filled (W)
73
C INPUTI/I/10/1 dsc_process_flag for dest_descr's:
74
C 2 = No Overwrite, 1 = clean first exisiting descr
76
C OUT_A/C/1/120 name of output frame (C)
78
C for option READ, PRINT + SHOW the integer keyword OUTPUTI(1-4) is set to
79
C (1) 1/0 if descr exists or not
80
C (2) 1/2/3/4 for int, real, char, double descr.
81
C (3) noelem, (4) bytelem of descr
86
C--------------------------------------------------
90
INTEGER ACTVAL,BYTELM,DSCMSK,DSCVERS
91
INTEGER FIRST,FLAG,I,IAV,IOFF
92
INTEGER LL,N,NOELEM,CLEN
93
INTEGER SLEN,START,STAT,MAXNO
95
INTEGER IMNO,RIMNO,ALLFLG
96
INTEGER EC,EL,ED,LINLEN
97
INTEGER UNIT(1),NULLO,MADRID(1)
99
CHARACTER LINE*120,OUTPUT*120,ACTION*2
100
CHARACTER FRAME*120,RESFRA*120,DSCR*80,TYPE*20
101
CHARACTER INSTRM*1,COMPAR(6)*1,DTYPE*1
103
INTEGER IBUF(65535) !descr data buffers
104
INTEGER*8 SBUF(65535)
107
DOUBLE PRECISION DBUF(65535)
109
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
113
EQUIVALENCE (IBUF,DBUF),(RBUF,DBUF),(SBUF,DBUF)
115
DATA COMPAR /'R','W','D','P','C','S'/
117
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
120
CALL STSPRO('DESCR ')
123
C get frame + open it (do not extract subframe data...)
124
CALL STKRDC('IN_A',1,1,120,IAV,FRAME,UNIT,NULLO,STAT)
125
CALL STFINF(FRAME,9,IBUF,STAT)
126
IF (STAT .NE. 0) then
127
CALL STETER(5,'could not read (FITS) file header...')
129
IF (IBUF(2).EQ.F_TBL_TYPE) THEN
130
CALL TBTOPN(FRAME,F_I_MODE,IMNO,STAT)
132
CALL STFOPN(FRAME,D_OLD_FORMAT,0,F_OLD_TYPE,IMNO,STAT)
135
CALL STFINF(FRAME,-6,IBUF,STAT) !we reuse IMNO with flag < 0
136
DSCVERS = IBUF(3) !get descr. format version
138
C get action flag ( ACTION(2:2) = display flag )
139
CALL STKRDC('ACTION',1,1,2,IAV,ACTION,UNIT,NULLO,STAT)
140
CALL UPCAS(ACTION,ACTION)
142
IF (ACTION(1:1).EQ.COMPAR(N)) THEN
147
CALL STETER(23,'module DESCR: invalid option...')
149
C branch according to desired action
150
200 GOTO (1000,2000,3500,1000,5000,1000),FLAG
152
C read, show or print descriptor (all values)
154
1000 CALL STKRDC('P2',1,1,80,LINLEN,LINE,UNIT,NULLO,STAT)
155
IF (ACTION(2:2).NE.'H') CALL FRAMOU(FRAME) !show frame and data type
157
IF (LINE(1:1).EQ.'*') THEN !all descriptors?
158
IF ((LINE(2:2).EQ.' ') .OR. (LINE(2:2).EQ.','))
160
IF (DSCVERS.EQ.0) THEN
161
CALL ODSCLS(IMNO,LINE(1:80),IBUF,RBUF,CBUF,DBUF,ACTION)
163
CALL DSCLIS(IMNO,LINE(1:80),IBUF,RBUF,CBUF,DBUF,SBUF,ACTION)
168
CALL LOWCAS(LINE,LINE) !check for ASCII file
169
N = INDEX(LINE,'.ascii')
171
N = INDEX(LINE,' ') - 1 !cut off trailing blanks
172
IF (N.LT.1) N = LEN(LINE)
173
OPEN(UNIT=33,FILE=LINE(1:N),STATUS='OLD',ERR=1090)
176
READ(33,10000,END=1080) LINE
178
1060 CALL EXTRSS(LINE,',',START,DSCR,SLEN)
180
IF (DSCVERS.EQ.0) THEN
181
CALL ODSCLS(IMNO,LINE,IBUF,RBUF,CBUF,DBUF,ACTION)
183
CALL DSCLIS(IMNO,LINE,IBUF,RBUF,CBUF,DBUF,SBUF,ACTION)
187
GOTO 1050 !read next line
192
1090 CALL STETER(4,'could not open ASCII file...')
196
C extract descriptor(s) separated by a comma from single line
198
1100 CALL EXTRSS(LINE(1:LINLEN),',',START,DSCR,SLEN)
202
IF (DSCVERS.EQ.0) THEN
203
CALL ODSCLS(IMNO,DSCR,IBUF,RBUF,CBUF,DBUF,ACTION)
205
CALL DSCLIS(IMNO,DSCR,IBUF,RBUF,CBUF,DBUF,SBUF,ACTION)
210
C write descriptor (not necessarily all values)
212
2000 CALL STKRDC('P2',1,1,80,IAV,LINE,UNIT,NULLO,STAT)
213
CALL STKRDC('P4',1,1,1,IAV,CBUF,UNIT,NULLO,STAT)
214
IF ((CBUF(1:1).EQ.'A') .OR.
215
+ (CBUF(1:1).EQ.'a')) THEN
220
CBUF(1:81) = ' ' !we need [81] if "..."
221
CALL STKRDC('P3',1,1,80,IAV,CBUF,UNIT,NULLO,STAT) !get data string
223
C either use defaults (1. element,...)
224
C test, if default is used
227
START = 0 !set START to the "wrong" value = 0, to remember
230
CALL STDFND(IMNO,DSCR,DTYPE,NOELEM,BYTELM,STAT)
232
IF (DTYPE.EQ.' ') CALL STETER
233
+ (1,'default option invalid - descriptor does not exist... ')
235
C or extract specific info about starting element, etc.
238
CALL EXTRSS(LINE,'/',START,DSCR,SLEN)
239
CALL EXTRSS(LINE,'/',START,TYPE,SLEN)
240
CALL DTCHK(TYPE,DTYPE,BYTELM,MAXNO)
241
C wrong type given...
242
IF (DTYPE.EQ.' ') GOTO 8900
244
CALL EXTRSS(LINE,'/',START,OUTPUT,SLEN)
245
CALL GENCNV(OUTPUT,1,1,FIRST,RBUF,DBUF,LL)
246
IF (LL.LT.1) GOTO 8900
247
CALL EXTRSS(LINE,'/',START,OUTPUT,SLEN)
248
CALL GENCNV(OUTPUT,1,1,NOELEM,RBUF,DBUF,LL)
249
IF (LL.LT.1) GOTO 8900
250
IF (NOELEM .GT. MAXNO) THEN
252
WRITE(OUTPUT,10005) NOELEM
253
CALL STTPUT(OUTPUT,STAT)
258
CALL STKRDC('MID$IN',1,1,120,IAV,OUTPUT,UNIT,NULLO,STAT)
260
IF (INSTRM.EQ.'F') GOTO 2660
263
IF (DTYPE.EQ.'I') THEN
264
IF (ALLFLG.EQ.1) THEN
265
CALL GENCNV(CBUF(1:20),1,1,IBUF,RBUF,DBUF,LL)
266
IF (LL.LE.0) GOTO 8800
272
CALL GENCNV(CBUF(1:80),1,NOELEM,IBUF,RBUF,DBUF,ACTVAL)
273
IF (ACTVAL.LE.0) GOTO 8800
275
CALL STDWRI(IMNO,DSCR,IBUF,FIRST,ACTVAL,UNIT,STAT)
278
ELSE IF (DTYPE.EQ.'R') THEN
279
IF (ALLFLG.EQ.1) THEN
280
CALL GENCNV(CBUF(1:20),2,1,IBUF,RBUF,DBUF,LL)
281
IF (LL.LE.0) GOTO 8800
287
CALL GENCNV(CBUF(1:80),2,NOELEM,IBUF,RBUF,DBUF,ACTVAL)
288
IF (ACTVAL.LE.0) GOTO 8800
290
CALL STDWRR(IMNO,DSCR,RBUF,FIRST,ACTVAL,UNIT,STAT)
292
C character descriptor
293
ELSE IF ((DTYPE.EQ.'C') .OR. (DTYPE.EQ.'H')) THEN
294
LL = 80 !cut off trailing blanks
296
IF (CBUF(I:I).NE.' ') THEN
302
2310 IF ((START.EQ.0) .AND. (ALLFLG.EQ.0)) NOELEM = CLEN
304
C now look for " ... "
306
IF ((CBUF(1:1).EQ.'"') .AND.
307
+ (CBUF(CLEN:CLEN).EQ.'"') .AND.
308
+ (CLEN.GT.2)) THEN !only possible for CLEN > 2
310
CBUF(CLEN:CLEN) = ' '
311
IF ((START.EQ.0) .AND. (ALLFLG.EQ.0))
312
+ NOELEM = NOELEM - 2
316
IF (BYTELM.GT.1) THEN
317
IF (ALLFLG.EQ.1) THEN
318
C this makes it work for only 1 element, too
321
CBUF(LL:LL+BYTELM-1) = CBUF(IOFF:IOFF+BYTELM-1)
326
CALL STDWRC(IMNO,DSCR,BYTELM,CBUF(IOFF:),FIRST,NOELEM,
329
C flat character string
331
IF (ALLFLG.EQ.1) THEN
333
CBUF(N:N) = CBUF(IOFF:IOFF)
337
IF (DTYPE.EQ.'H') THEN
338
CALL STDWRH(IMNO,DSCR,CBUF(IOFF:),FIRST,NOELEM,STAT)
340
CALL STDWRC(IMNO,DSCR,1,CBUF(IOFF:),FIRST,NOELEM,
346
C double prec. descriptor
347
ELSE IF (DTYPE.EQ.'D') THEN
348
IF (ALLFLG.EQ.1) THEN
349
CALL GENCNV(CBUF(1:40),4,1,IBUF,RBUF,DBUF,LL)
350
IF (LL.LE.0) GOTO 8800
356
CALL GENCNV(CBUF(1:80),4,NOELEM,IBUF,RBUF,DBUF,ACTVAL)
357
IF (ACTVAL.LE.0) GOTO 8800
359
CALL STDWRD(IMNO,DSCR,DBUF,FIRST,ACTVAL,UNIT,STAT)
362
ELSE IF (DTYPE.EQ.'L') THEN
363
IF (ALLFLG.EQ.1) THEN
364
IF ((CBUF(1:1).EQ.'T') .OR. (CBUF(1:1).EQ.'t')) THEN
366
ELSE IF ((CBUF(1:1).EQ.'F') .OR. (CBUF(1:1).EQ.'f')) THEN
369
CALL GENCNV(CBUF(1:20),1,1,IBUF,RBUF,DBUF,LL)
370
IF (LL.LE.0) GOTO 8800
377
ACTVAL = 1 !for single value, also T(rue), F(alse) is o.k.
378
IF ((CBUF(1:1).EQ.'T') .OR. (CBUF(1:1).EQ.'t')) THEN
380
ELSE IF ((CBUF(1:1).EQ.'F') .OR. (CBUF(1:1).EQ.'f')) THEN
383
CALL GENCNV(CBUF(1:80),1,NOELEM,IBUF,RBUF,DBUF,ACTVAL)
384
IF (ACTVAL.LE.0) GOTO 8800
387
CALL STDWRL(IMNO,DSCR,IBUF,FIRST,ACTVAL,UNIT,STAT)
391
C come here, if we read the data from file
392
C get data from file used as input stream in MIDAS into temporary buffer
397
IF (DTYPE.EQ.'I') THEN
398
CALL CNTDAT(OUTPUT(3:),'NUM',ACTVAL) !count data in file
400
+ CALL STETER(22,'Invalid integer input file...')
402
CALL STFXMP(ACTVAL,D_I4_FORMAT,WPNTR2,STAT)
403
CALL DATFIL(OUTPUT(3:),1,ACTVAL,MADRID(WPNTR2),MADRID(WPNTR2),
404
+ 0,RBUF(1),RBUF(2)) !now get the integer data
405
CALL STDWRI(IMNO,DSCR,MADRID(WPNTR2),FIRST,ACTVAL,UNIT,STAT)
408
ELSE IF (DTYPE.EQ.'R') THEN
409
CALL CNTDAT(OUTPUT(3:),'NUM',ACTVAL) !count data in file
410
IF (ACTVAL.LE.0) CALL STETER(22,'Invalid real input file...')
412
CALL STFXMP(ACTVAL,D_R4_FORMAT,WPNTR2,STAT)
413
CALL DATFIL(OUTPUT(3:),2,ACTVAL,MADRID(WPNTR2),MADRID(WPNTR2),
414
+ 0,RBUF(1),RBUF(2)) !now get the real data
415
CALL STDWRR(IMNO,DSCR,MADRID(WPNTR2),FIRST,ACTVAL,UNIT,STAT)
418
ELSE IF ((DTYPE.EQ.'C') .OR. (DTYPE.EQ.'H')) THEN
419
CALL CNTDAT(OUTPUT(3:),'CHAR',ACTVAL) !count chars. in file
420
IF (ACTVAL.LE.0) CALL STETER(22,'Invalid char. input file...')
423
CALL STFXMP(N,D_I4_FORMAT,WPNTR2,STAT)
424
CALL CARFIL(OUTPUT(3:),ACTVAL,MADRID(WPNTR2)) !now get the characters
425
IF (DTYPE.EQ.'H') THEN
426
CALL STDWRH(IMNO,DSCR,MADRID(WPNTR2),FIRST,ACTVAL,STAT)
428
CALL STDWRC(IMNO,DSCR,BYTELM,MADRID(WPNTR2),
429
+ FIRST,ACTVAL,UNIT,STAT)
433
ELSE IF (DTYPE.EQ.'D') THEN
434
CALL CNTDAT(OUTPUT(3:),'NUM',ACTVAL) !count data in file
435
IF (ACTVAL.LE.0) CALL STETER(22,'Invalid double input file...')
437
CALL STFXMP(ACTVAL,D_R8_FORMAT,WPNTR2,STAT)
438
CALL DATFIL(OUTPUT(3:),4,ACTVAL,MADRID(WPNTR2),MADRID(WPNTR2),
439
+ 0,RBUF(1),RBUF(2)) !now get the real data
440
CALL STDWRD(IMNO,DSCR,MADRID(WPNTR2),FIRST,ACTVAL,UNIT,STAT)
443
ELSE IF (DTYPE.EQ.'L') THEN
444
CALL CNTDAT(OUTPUT(3:),'NUM',ACTVAL) !count data in file
446
+ CALL STETER(22,'Invalid logical input file...')
448
CALL STFXMP(ACTVAL,D_I4_FORMAT,WPNTR2,STAT)
449
CALL DATFIL(OUTPUT(3:),1,ACTVAL,MADRID(WPNTR2),MADRID(WPNTR2),
450
+ 0,RBUF(1),RBUF(2)) !now get the integer data
451
CALL STDWRL(IMNO,DSCR,MADRID(WPNTR2),FIRST,ACTVAL,UNIT,STAT)
457
3500 CALL STKRDC('P2',1,1,80,IAV,DSCR,UNIT,NULLO,STAT)
458
CALL STKRDC('P3',1,1,4,IAV,TYPE,UNIT,NULLO,STAT) !TYPE = stopflag
459
IF (TYPE(1:1).EQ.'n') TYPE(1:1) = 'N'
460
IF (DSCR(1:2).EQ.'* ') THEN
461
CALL STDDEL(IMNO,DSCR,STAT)
464
CALL STECNT('GET',EC,EL,ED)
465
IF (TYPE(1:1).EQ.'N') CALL STECNT('PUT',1,0,0)
467
C extract descriptor(s) separated by a comma from single line
470
3550 CALL EXTRSS(DSCR,',',START,OUTPUT,SLEN)
472
N = INDEX(OUTPUT,'*')
473
IF (N.GT.0) THEN !we have a pattern
474
IF (DSCVERS.EQ.0) THEN
475
CALL ODSCDL(IMNO,OUTPUT,IAV)
477
CALL DSCDEL(IMNO,OUTPUT,IAV)
479
ACTVAL = ACTVAL + IAV
481
CALL STDDEL(IMNO,OUTPUT,STAT) !delete single descr
486
CALL STECNT('PUT',EC,EL,ED)
487
CALL STKWRI('OUTPUTI',ACTVAL,1,1,UNIT,STAT)
493
5000 CALL STKRDC('OUT_A',1,1,120,IAV,RESFRA,UNIT,NULLO,STAT)
494
CALL STFOPN(RESFRA,D_OLD_FORMAT,0,F_OLD_TYPE,RIMNO,STAT)
495
C get *,1 *,2 *,3, ... or just *
496
CALL STKRDC('P2',1,1,100,IAV,CBUF,UNIT,NULLO,STAT)
498
LL = INDEX(CBUF(1:100),' ') !find end of buffer
499
IF (LL.LT.1) LL = 100
500
IF (CBUF(2:2).EQ.',') THEN
501
CALL GENCNV(CBUF(3:3),1,1,DSCMSK,RBUF,DBUF,IAV)
503
+ CALL STETER(12,'wrong flag in COPY/DD ...')
505
IF (CBUF(4:4).EQ.',') THEN !*,n,descrNOT,descrNOT,...
506
CBUF(1:LL) = CBUF(5:LL) //' '
507
DSCMSK = DSCMSK + 5 !update the copy-mask
512
ELSE IF (CBUF(1:1).EQ.'?') THEN
513
CBUF(1:LL) = CBUF(2:LL)//' '
514
DSCMSK = 4 !we have descnames or patterns
515
5100 N = INDEX(CBUF(1:LL),'*')
517
IAV = INDEX(CBUF(1:LL),',')
519
CBUF(101:200) = CBUF(1:IAV-1)//' '
520
CBUF(1:LL) = CBUF(IAV+1:LL)//' '
521
CALL STDCOP(IMNO,RIMNO,DSCMSK,CBUF(101:200),STAT)
522
LL = INDEX(CBUF(1:),' ') !we do have a ' '
527
C get descr_process_flag and copy all descriptors
528
CALL STKRDI('INPUTI',10,1,IAV,N,UNIT,NULLO,STAT)
529
IF (N.GT.0) DSCMSK = DSCMSK + (N*100) !include dsc_process_flag
530
CALL STDCOP(IMNO,RIMNO,DSCMSK,CBUF(1:LL),STAT)
532
C we're done without problems
536
C here, if syntax error in data string
537
8800 CALL STETER(2,'wrong syntax in data string... ')
539
C here for syntax errors detected while reading stuff...
540
8900 CALL STETER(3,'wrong syntax in descriptor string... ')
544
10005 FORMAT('Warning: only ',I5,
545
+ ' descriptor elements written in one go ...')
549
SUBROUTINE DSCLIS(IMNO,INDSC,IVALS,RVALS,CVALS,DVALS,SVALS,FLAG)
551
C+++++++++++++++++++++++++++++++++++++++++++++++++
554
C subroutine DSCLIS version 3.50 090323
555
C K. Banse ESO - Garching
561
C display contents of one or all descriptors of a bulk data frame
564
C read all existing descriptor names + display their contents
567
C call as DSCLIS(IMNO,INDSC,IVALS,RVALS,CVALS,DVALS,SVALS,FLAG)
569
C IMNO: I*4 frame no. of data frame
570
C INDSC: char.exp. descriptor to be displayed
571
C if = ' ', all descriptors are displayed
572
C IVALS: I*4 array integer buffer
573
C RVALS: R*4 array real buffer
574
C CVALS: char.exp. character buffer
575
C DVALS: R*8 array double precision buffer
576
C SVALS: I*8 array size_t buffer
577
C FLAG: char.exp. 2-char. flag:
578
C (1) = R(ead), P(rint) or S(how)
579
C (2) = F(ull), B(rief) or H(idden)
581
C-------------------------------------------------
585
INTEGER IMNO,IVALS(*)
587
INTEGER BYTELM,NOELEM,NPOS
588
INTEGER DSCNO(2),DSCLEN,IAV,IOFF,ITY,L,LL,M,MM,N,KCASE
589
INTEGER NDI,STAT,IJK(5),NPT
590
INTEGER EL1,NEL2,NOTDS,HNC
591
INTEGER OPTIO,UNIT(1),NULLO,XLONG
597
CHARACTER LF*1,TYPE*1
598
CHARACTER DISCR*80,DSCDIR*24,DSCTYP*24
599
CHARACTER NOTDSC(4)*72,OUTPUT*80,CCC*14,CBUF*80
600
CHARACTER CC(7)*12,CTYPE*4,CHTYP*14,BLANK*20
604
DOUBLE PRECISION DVALS(*)
606
DATA CC/'integer ','real ','character ','double prec.',
607
+ ' ','logical ','size_t '/
608
DATA CHTYP /'character* '/
609
DATA LIM /6,4,60,2,1,10,2/
610
DATA BLANK /' '/, CCC /' '/
612
LF = CHAR(10) !LineFeed character ( \n in C)
613
DSCNO(1) = 0 !for descriptor
614
DSCNO(2) = -1 !for help text of descriptor
617
DSCDIR = 'DESCRIPTOR.DIRECTORY'
621
C clean + convert to uppercase
623
CALL UPCAS(INDSC,DISCR)
624
IF (DISCR.EQ.DSCDIR) THEN
625
OPTIO = -1 !descr. directory
627
CALL STDRDZ(IMNO,NOELEM,DSCNO(1),STAT)
630
ELSE IF (DISCR(1:1).EQ.' ') THEN
631
IF ((DISCR(2:2).EQ.',') .OR. !descriptors NOT to display
632
+ (DISCR(2:2).EQ.'|')) THEN
635
110 N = INDEX(DISCR,',')
637
NOTDSC(NOTDS)(1:) = DISCR(3:N-1)//' '
638
DISCR(3:) = DISCR(N+1:)
644
NOTDSC(NOTDS)(1:) = DISCR(3:)
646
N = INDEX(NOTDSC(1),'*')
648
CALL PATTST(1,NOTDSC(1),STAT)
656
OPTIO = 1 !all descriptors
658
CALL STDRDX(IMNO,1,DISCR,DSCTYP,BYTELM,NOELEM,HNC,STAT) !get dscdir
659
CALL STDRDX(IMNO,10,DISCR,DSCTYP,BYTELM,NOELEM,HNC,STAT) !get 1.dsc
660
IF (DISCR(1:1).EQ.' ') GOTO 9000
661
DSCNO(1) = 2 !at least 1 descr. + directory
665
IF (N.GT.0) THEN !we have a pattern
667
IF (N.GT.1) THEN !is it incl-patrn | excl-patrn?
669
CALL PATTST(1,DISCR(1:N-1),STAT) !save the two patterns
670
CALL PATTST(11,DISCR(N+1:),STAT)
673
CALL PATTST(1,DISCR,STAT)
676
CALL STDRDX(IMNO,1,DISCR,DSCTYP,BYTELM,NOELEM,HNC,STAT)
681
OPTIO = 0 !single descriptor
683
N = INDEX(DISCR,'/') !see, if it's descr/type/f/no
685
CBUF(1:) = DISCR(N+1:)
688
CALL STDFND(IMNO,DISCR,DSCTYP,NOELEM,BYTELM,STAT)
691
N = INDEX(CBUF,'/') !skip type
693
CBUF(1:) = CBUF(N+1:)
695
IF (CBUF(N:N).EQ.'/') THEN
697
CALL GENCNV(CBUF,1,2,IVALS,RVALS,DVALS,LL)
711
C loop through descr. list
713
500 IF (OPTIO.GE.2) THEN !we have pattern(s)
714
CALL PATTST(2,DISCR,STAT)
715
IF (STAT.EQ.0) GOTO 8000 !no match
718
CALL PATTST(12,DISCR,STAT)
719
IF (STAT.EQ.1) GOTO 8000 !it's an excluded descr
721
NPT = NPT + 1 !matching descr. found
723
ELSE IF (OPTIO.EQ.1) THEN
725
IF (NOTDS.GT.0) THEN !loop thru excluded descrs
727
IF (DISCR.EQ.NOTDSC(N)) THEN
728
DSCNO(1) = DSCNO(1) - 1
733
CALL PATTST(2,DISCR,STAT)
735
DSCNO(1) = DSCNO(1) - 1
742
IF (NEL2.GT.0) NOELEM = NEL2
744
DSCLEN = INDEX(DISCR,' ') - 1 !real length of descr name
746
IF (TYPE.EQ.' ') THEN
748
IF (FLAG(2:2).NE.'H') THEN
749
OUTPUT(1:) = 'descriptor '//DISCR(1:DSCLEN)//
751
CALL STTPUT(OUTPUT,STAT)
759
IF (NOELEM.GT.65535) THEN
760
XLONG = NOELEM - 65535
761
NOELEM = 65535 !ojo: synchronize with MAIN ...
765
700 IF (TYPE.EQ.'I') THEN
767
IF (FLAG(1:1).NE.'S') CALL STDRDI
768
+ (IMNO,DISCR,EL1,NOELEM,IAV,IVALS,UNIT,NULLO,STAT)
771
ELSE IF (TYPE.EQ.'R') THEN
773
IF (FLAG(1:1).NE.'S') CALL STDRDR
774
+ (IMNO,DISCR,EL1,NOELEM,IAV,RVALS,UNIT,NULLO,STAT)
777
ELSE IF (TYPE.EQ.'C') THEN
778
IF (BYTELM.GT.1) THEN
780
WRITE(CTYPE,30000) BYTELM
781
C omit leading blanks...
783
IF (CTYPE(LL:LL).NE.' ') GOTO 1000
786
1000 CHTYP(11:) = CTYPE(LL:)
787
IF (FLAG(1:1).NE.'S')
788
+ CALL STDRDC(IMNO,DISCR,BYTELM,EL1,NOELEM,
789
+ IAV,CVALS,UNIT,NULLO,STAT)
792
IF (FLAG(1:1).NE.'S')
793
+ CALL STDRDC(IMNO,DISCR,1,EL1,NOELEM,
794
+ IAV,CVALS,UNIT,NULLO,STAT)
797
C get double prec. data
798
ELSE IF (TYPE.EQ.'D') THEN
800
IF (FLAG(1:1).NE.'S')
801
+ CALL STDRDD(IMNO,DISCR,EL1,NOELEM,
802
+ IAV,DVALS,UNIT,NULLO,STAT)
804
C get size_t data (as I*4 or I*8)
805
ELSE IF (TYPE.EQ.'S') THEN
807
IF (FLAG(1:1).NE.'S')
808
+ CALL STDRDS(IMNO,DISCR,EL1,NOELEM,
809
+ IAV,SVALS,UNIT,NULLO,STAT)
812
ELSE IF (TYPE.EQ.'L') THEN
814
IF (FLAG(1:1).NE.'S')
815
+ CALL STDRDL(IMNO,DISCR,EL1,NOELEM,
816
+ IAV,IVALS,UNIT,NULLO,STAT)
819
C return, if problems with reading descriptors
821
WRITE(OUTPUT,10000) DISCR(1:DSCLEN)
822
CALL STTPUT(OUTPUT,STAT)
835
C display header line - except for display_flag = H or B
836
IF (FLAG(2:2).EQ.'H') THEN
837
IF (FLAG(1:1) .EQ. 'S') THEN
838
GOTO 8000 !nothing to do for SHOW/DESCR
840
GOTO (5500,5600,5700,5800,5700,5900),ITY !only display data
843
ELSE IF (FLAG(2:2).NE.'B') THEN
844
IF (DSCLEN .LE. 15) THEN
845
WRITE(OUTPUT,10001) DISCR(1:15) !help text begins at 15
847
WRITE(OUTPUT,10001) DISCR(1:DSCLEN)
849
MM = INDEX(OUTPUT,'( ') + 1 !find end of text
852
CALL STTPUT(OUTPUT,STAT)
856
LL = 77 - MM !LL = 53 for short descr
858
CALL STDRDH(IMNO,DISCR,1,72,IAV,CBUF,HNC,STAT)
859
IF (HNC.GT.0) THEN !Yes, there is help
860
DO 1600, M=IAV,1,-1 !get rid of trailing blanks
861
IF (CBUF(M:M) .NE. ' ') THEN
866
1660 IF (IAV.GT.LL) THEN
868
CALL STTPUT(OUTPUT,STAT) !print name on one line
869
OUTPUT(1:) = '( ' !help text on next line
872
OUTPUT(MM:) = CBUF(1:IAV)//') '
874
OUTPUT(MM:) = '...) '
876
DSCNO(2) = HNC !save size of help text
877
CALL STTPUT(OUTPUT,STAT)
879
IF (FLAG(1:1).EQ.'S') THEN !SHOW/DESCR
880
WRITE(OUTPUT,10004) CCC,(XLONG+NOELEM)
881
CALL STTPUT(OUTPUT,STAT)
884
IF (NOELEM .GT. 99999) THEN
885
WRITE(OUTPUT,10004) CCC,NOELEM
887
WRITE(OUTPUT,10005) CCC,NOELEM
889
CALL STTPUT(OUTPUT,STAT)
891
GOTO (5500,5600,5700,5800,5700,5900,6000),ITY
896
IF ((TYPE.EQ.'C') .AND.
897
+ (DISCR(1:6).EQ.'IDENT ')) THEN !truncate IDENT
901
IF (CVALS(M:M).NE.' ') THEN
902
MM = M !mark last char.
906
3050 IF (MM.EQ.0) THEN !only blanks
913
DISCR(DSCLEN+1:) = ': '
914
IF ( (DSCLEN .GT. 15) .OR.
915
+ (NOELEM.GT.LIM(ITY)) .OR.
917
CALL STTPUT(DISCR,STAT)
918
GOTO (5500,5600,5700,5800,5700,5900,6000),ITY
920
GOTO (5550,5650,5790,5850,5790,5950,6050),ITY
924
C here the output of the descr. values
926
5500 DO 5510, M=1,NOELEM,8
928
WRITE(OUTPUT,10002) (IVALS(L),L=M,MM)
929
CALL STTPUT(OUTPUT,STAT)
933
5550 WRITE(OUTPUT,10002) (IVALS(L),L=1,NOELEM)
935
CBUF(1:) = DISCR(1:17)//OUTPUT(1:LL)//' '
936
CALL STTPUT(CBUF,STAT)
939
5600 DO 5610, M=1,NOELEM,5
941
WRITE(OUTPUT,20002) (RVALS(L),L=M,MM)
942
CALL STTPUT(OUTPUT,STAT)
946
5650 WRITE(OUTPUT,20002) (RVALS(L),L=1,NOELEM)
948
CBUF(1:) = DISCR(1:17)//OUTPUT(1:LL)//' '
949
CALL STTPUT(CBUF,STAT)
952
C character data has to be treated specially
953
5700 IF (BYTELM.GT.1) THEN
957
DO 5710, IOFF=LL,MM,80
960
OUTPUT(1:) = CVALS(IOFF:M)//' '
961
CALL STTPUT(OUTPUT,STAT)
968
M = 1 !chop up in pieces of 80 chars
970
IF (MM.GE.NOELEM) THEN
971
KCASE = 0 !indicate that we reached the end
977
OUTPUT(1:) = CVALS(M:MM)//' '
978
5750 CALL STTPUT(OUTPUT,STAT)
979
5760 IF (KCASE.EQ.1) THEN
980
M = MM + 1 !move to after current end
981
IF (M.LE.NOELEM) GOTO 5730
986
5790 OUTPUT(1:) = DISCR(1:17)//CVALS(1:NOELEM)//' '
987
CALL STTPUT(OUTPUT,STAT)
990
5800 DO 5810, M=1,NOELEM,3
992
WRITE(OUTPUT,20003) (DVALS(L),L=M,MM)
993
CALL STTPUT(OUTPUT,STAT)
997
5850 WRITE(OUTPUT,20004) (DVALS(L),L=1,NOELEM)
999
CBUF(1:) = DISCR(1:17)//OUTPUT(1:LL)//' '
1000
CALL STTPUT(CBUF,STAT)
1003
5900 DO 5910, M=1,NOELEM,8
1004
MM = MIN(NOELEM,M+7)
1005
WRITE(OUTPUT,10002) (IVALS(L),L=M,MM)
1006
CALL STTPUT(OUTPUT,STAT)
1010
5950 WRITE(OUTPUT,10002) (IVALS(L),L=1,NOELEM)
1012
CBUF(1:) = DISCR(1:17)//OUTPUT(1:LL)//' '
1013
CALL STTPUT(CBUF,STAT)
1016
6000 DO 6010, M=1,NOELEM,3
1017
MM = MIN(NOELEM,M+2)
1018
WRITE(OUTPUT,30003) (SVALS(L),L=M,MM)
1019
CALL STTPUT(OUTPUT,STAT)
1023
6050 WRITE(OUTPUT,30004) (SVALS(L),L=1,NOELEM)
1025
CBUF(1:) = DISCR(1:17)//OUTPUT(1:LL)//' '
1026
CALL STTPUT(CBUF,STAT)
1029
7700 IF (XLONG.GT.0) THEN
1031
IF (XLONG.LE.65535) NOELEM = XLONG
1032
XLONG = XLONG - 65535
1033
DISCR(DSCLEN+1:) = ' ' !remove ':' again
1037
C increment counter + loop if there are more descriptors
1039
8000 DISCR(1:) = ' '
1040
IF (OPTIO.NE.0) THEN
1041
CALL STDRDX(IMNO,10,DISCR,DSCTYP,BYTELM,NOELEM,HNC,STAT)
1042
IF (DISCR(1:1).NE.' ') THEN
1043
DSCNO(1) = DSCNO(1) + 1
1048
9000 IF (OPTIO.EQ.0) THEN !single descriptor
1049
IF (IJK(1).EQ.1) THEN
1054
CALL STKWRI('OUTPUTI',IJK,1,5,UNIT,STAT)
1056
IF (OPTIO.EQ.1) THEN !all descr's
1057
DSCNO(1) = DSCNO(1) - 1 !avoid descr. directory itself
1061
WRITE(OUTPUT,40000) DSCNO(1)
1062
CALL STTPUT(OUTPUT,STAT)
1063
CALL STKWRI('OUTPUTI',DSCNO,1,1,UNIT,STAT)
1066
C That's it folks ...
1070
10000 FORMAT('Problems reading descriptor: ',A)
1071
10001 FORMAT('name: ',A,' ( ')
1073
10004 FORMAT('type: ',A,' no. of elements:',I8)
1074
10005 FORMAT('type: ',A,' no. of elements:',I5)
1075
20002 FORMAT(5G15.7)
1076
20003 FORMAT(3G24.14)
1077
20004 FORMAT(2G24.14)
1081
33000 FORMAT('Descriptor directory: total length =',I8,
1082
+ ' => no. of decriptors =',I6)
1083
40000 FORMAT('total no. of descriptors:',I6)
1086
SUBROUTINE DTCHK(INTYP,OUTTYP,BYTELM,MAXNO)
1088
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1091
C subroutine DTCHK version 1.50 841114
1092
C K. Banse ESO - Garching
1093
C 1.60 860226 1.70 871027 1.80 900215
1099
C check given data type + return cleaned type and no. of bytes per element
1105
C call as DTCHK(INTYP,OUTTYP,BYTELM,MAXNO)
1108
C INTYP: char.exp. type of keyword/descr
1111
C OUTTYP: char*1 type of keyword/descr
1112
C currently I,R,C,D,H, L are recognized for
1113
C I*4,R*4,CHAR*n,R*8 or Double or HELP
1114
C set to ' ', if invalid INTYP given
1115
C BYTELM: I*4 no. of bytes per element of keyword/descr data
1116
C MAXNO: I*4 max. no. of elements which can be written
1117
C (= size of internal buffer)
1120
C 1.60 also allow LOGICAL*4 type - will be converted to I*4
1121
C 1.70 add output par. MAXNO
1123
C----------------------------------------------------------------------------
1136
CHARACTER OUTTYP*1,TEST*1
1138
DATA LIMES /65535,65535,65535/
1140
MAXNO = 0 !default to no_success ...
1142
CALL UPCAS(INTYP(1:1),TEST)
1144
C first look for type CHAR*len
1145
IF (TEST.EQ.'C') THEN
1146
LL = INDEX(INTYP,'*')
1151
CALL GENCNV(INTYP(LL+1:),1,1,BYTELM,RR,DD,LL)
1152
IF (LL.GT.0) OUTTYP = 'C'
1154
MAXNO = LIMES(3) / BYTELM
1156
C then for integer, real + double precision
1157
ELSE IF (TEST.EQ.'I') THEN
1161
ELSE IF (TEST.EQ.'R') THEN
1162
IF (INDEX(INTYP,'*8').GT.0) THEN
1171
ELSE IF (TEST.EQ.'D') THEN
1175
ELSE IF (TEST.EQ.'H') THEN
1179
ELSE IF (TEST.EQ.'L') THEN
1185
C OUTTYP only set, if correct type was entered
1189
SUBROUTINE PATTST(FLAG,STR,STAT)
1191
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1194
C subroutine PATTST version 1.0 980421
1195
C K. Banse ESO - Garching
1201
C check if descriptor name matches a given pattern
1205
C support two patterns patternA, patternB
1208
C call as PATTST(FLAG,STR,STAT)
1211
C FLAG: I*4 flag = 1 (11), for saving patternA/B
1212
C = 2 (12), for checking patternA/B
1213
C < 10 for patternA, > 10 for patternB
1214
C STR: char.exp. pattern string (FLAG=1,11)
1215
C descr. name (FLAG=2,12)
1218
C STAT: I*4 = 1, if matching, else = 0
1223
C----------------------------------------------------------------------------
1229
INTEGER IPT,IPTA,PATFLG
1230
INTEGER JPT,JPTA,QATFLG
1233
CHARACTER PATTRN*80,PATTRA*80
1234
CHARACTER QATTRN*80,QATTRA*80
1238
SAVE PATFLG,IPT,IPTA
1239
SAVE QATFLG,JPT,JPTA
1243
IF (FLAG.LT.10) THEN
1246
C extract pattern for patternA
1248
M = INDEX(STR,' ') - 1 !real length
1249
IF (M.LT.1) M = LEN(STR)
1253
IF (STR(M:M).EQ.'*') THEN
1254
PATTRN(1:) = STR(2:M-1)//' '
1256
PATFLG = 4 ! = 4, for checking *pattern*
1258
PATTRN(1:) = STR(2:)//' '
1259
IPT = INDEX(PATTRN,' ') - 1
1260
IF (IPT.LT.1) IPT = LEN(PATTRN)
1261
PATFLG = 1 ! = 1, for checking *pattern
1264
IF ((M.EQ.N) .OR. (STR(N+1:N+1).EQ.' ')) THEN
1266
PATTRN(1:) = STR(1:IPT)//' '
1267
PATFLG = 2 ! = 2, for checking pattern*
1269
PATTRN(1:) = STR(1:N-1)//' '
1270
IPT = INDEX(PATTRN,' ') - 1
1271
IF (IPT.LT.1) IPT = LEN(PATTRN)
1272
PATTRA(1:) = STR(N+1:)//' '
1273
IPTA = INDEX(PATTRA,' ') - 1
1274
IF (IPTA.LT.1) IPTA = LEN(PATTRA)
1275
PATFLG = 3 ! = 3, for checking pattr1*pattr2
1282
N = INDEX(STR,' ') - 1
1283
IF (N.LT.1) N = LEN(STR)
1285
IF (PATFLG.EQ.1) THEN !*pattern
1288
IF (STR(M:N).EQ.PATTRN(1:IPT)) STAT = 1
1290
ELSE IF (PATFLG.EQ.2) THEN !pattern*
1291
IF (STR(1:IPT).EQ.PATTRN(1:IPT)) STAT = 1
1292
ELSE IF (PATFLG.EQ.3) THEN !pattr1*pattr2
1293
IF (N.GE.(IPT+IPTA)) THEN
1295
IF ((STR(1:IPT).EQ.PATTRN(1:IPT)) .AND.
1296
+ (STR(M:N).EQ.PATTRA(1:IPTA))) STAT = 1
1299
IF (INDEX(STR,PATTRN(1:IPT)).GT.0) STAT = 1
1304
IF (FLAG.EQ.11) THEN
1306
C extract pattern for patternB
1308
M = INDEX(STR,' ') - 1 !real length
1309
IF (M.LT.1) M = LEN(STR)
1313
IF (STR(M:M).EQ.'*') THEN
1314
QATTRN(1:) = STR(2:M-1)//' '
1316
QATFLG = 4 ! = 4, for checking *pattern*
1318
QATTRN(1:) = STR(2:)//' '
1319
JPT = INDEX(QATTRN,' ') - 1
1320
IF (JPT.LT.1) JPT = LEN(QATTRN)
1321
QATFLG = 1 ! = 1, for checking *pattern
1324
IF ((M.EQ.N) .OR. (STR(N+1:N+1).EQ.' ')) THEN
1326
QATTRN(1:) = STR(1:JPT)//' '
1327
QATFLG = 2 ! = 2, for checking pattern*
1329
QATTRN(1:) = STR(1:N-1)//' '
1330
JPT = INDEX(QATTRN,' ') - 1
1331
IF (JPT.LT.1) JPT = LEN(QATTRN)
1332
QATTRA(1:) = STR(N+1:)//' '
1333
JPTA = INDEX(QATTRA,' ') - 1
1334
IF (JPTA.LT.1) JPTA = LEN(QATTRA)
1335
QATFLG = 3 ! = 3, for checking pattr1*pattr2
1342
N = INDEX(STR,' ') - 1
1343
IF (N.LT.1) N = LEN(STR)
1345
IF (QATFLG.EQ.1) THEN !*pattern
1348
IF (STR(M:N).EQ.QATTRN(1:JPT)) STAT = 1
1350
ELSE IF (QATFLG.EQ.2) THEN !pattern*
1351
IF (STR(1:JPT).EQ.QATTRN(1:JPT)) STAT = 1
1352
ELSE IF (QATFLG.EQ.3) THEN !pattr1*pattr2
1353
IF (N.GE.(JPT+JPTA)) THEN
1355
IF ((STR(1:JPT).EQ.QATTRN(1:JPT)) .AND.
1356
+ (STR(M:N).EQ.QATTRA(1:JPTA))) STAT = 1
1359
IF (INDEX(STR,QATTRN(1:JPT)).GT.0) STAT = 1
1367
SUBROUTINE DSCDEL(IMNO,INDSC,DELCNT)
1369
C+++++++++++++++++++++++++++++++++++++++++++++++++
1372
C subroutine DSCDEL 990114
1373
C K. Banse ESO - Garching
1379
C delete descriptors matching a pattern
1382
C read all existing descriptors + delete if pattern match
1385
C call as DSCDEL(IMNO,INDSC,DELCNT)
1388
C IMNO: I*4 frame no. of data frame
1389
C INDSC: char.exp. pattern of descriptors to be deleted
1391
C DELCNT: I*4 no. of deleted descriptors
1393
C-------------------------------------------------
1397
INTEGER IMNO,DELCNT,HNC
1398
INTEGER STAT,NOELEM,BYTELM
1401
CHARACTER DISCR*80,DSCTYP*24
1404
CALL UPCAS(INDSC,DISCR)
1405
CALL PATTST(1,DISCR,STAT) !store the pattern(s)
1408
CALL STDRDX(IMNO,1,DISCR,DSCTYP,BYTELM,NOELEM,HNC,STAT)
1409
CALL STDRDX(IMNO,10,DISCR,DSCTYP,BYTELM,NOELEM,HNC,STAT) !skip dscdir
1411
C loop through descr. list
1413
CALL STDRDX(IMNO,10,DISCR,DSCTYP,BYTELM,NOELEM,HNC,STAT)
1414
IF (DISCR(1:1).EQ.' ') RETURN
1416
C increment counter + loop if there are more descriptors
1417
CALL PATTST(2,DISCR,STAT)
1419
DELCNT = DELCNT + 1 !matching descr. found
1420
CALL STDDEL(IMNO,DISCR,STAT)
1422
GOTO 500 !look for more