summaryrefslogtreecommitdiff
path: root/Ganlib/src/DRVREC.f
blob: b9cdd4a2ab923452758c10fcec09aa148b0af4b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
*DECK DRVREC
      SUBROUTINE DRVREC(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover one or many LCM objects.
*
*Copyright:
* Copyright (C) 1994 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version
*
*Author(s): A. Hebert
*
*Parameters: input/output
* NENTRY  number of LCM objects or files used by the operator.
* HENTRY  name of each LCM object or file:
*         HENTRY(1): read-only or modification type(VECTOR).
* IENTRY  type of each LCM object or file:
*         =1 LCM memory object; =2 XSM file; =3 sequential binary file;
*         =4 sequential ascii file.
* JENTRY  access of each LCM object or file:
*         =0 the LCM object or file is created;
*         =1 the LCM object or file is open for modifications;
*         =2 the LCM object or file is open in read-only mode.
* KENTRY  LCM object address or file unit number.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
      TYPE(C_PTR) KENTRY(NENTRY)
      CHARACTER HENTRY(NENTRY)*12
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) IPLIST,JPLIST,KPLIST
      CHARACTER HMEDIA*12,TEXT12*12,TEXT4*4,NAMT*12
      DOUBLE PRECISION DFLOTT
*
      IF(NENTRY.LE.1) CALL XABORT('DRVREC: TWO PARAMETERS EXPECTED.')
      ITYPE=0
      JPLIST=C_NULL_PTR
      DO 10 I=1,NENTRY
      IF(JENTRY(I).EQ.2) THEN
         ITYPE=IENTRY(I)
         IPLIST=KENTRY(I)
         HMEDIA=HENTRY(I)
         IF((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2)) CALL XABORT('DRVREC:'
     1   //' RHS LINKED LIST OR XSM FILE EXPECTED.')
         GO TO 20
      ENDIF
   10 CONTINUE
      CALL XABORT('DRVREC: UNABLE TO FIND A BACKUP MEDIA OPEN IN READ-O'
     1 //'NLY MODE.')
*
   20 IMPX=1
      IPOS=0
   30 CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT)
      IF(INDIC.EQ.10) GO TO 40
      IF(INDIC.NE.3) CALL XABORT('DRVREC: CHARACTER DATA EXPECTED.')
      IF(TEXT4.EQ.'EDIT') THEN
         CALL REDGET(INDIC,IMPX,FLOTT,TEXT4,DFLOTT)
         IF(INDIC.NE.1) CALL XABORT('DRVREC: INTEGER DATA EXPECTED.')
      ELSE IF(TEXT4.EQ.'ITEM') THEN
         CALL REDGET(INDIC,IPOS,FLOTT,TEXT4,DFLOTT)
         IF(INDIC.NE.1) CALL XABORT('DRVREC: INTEGER DATA EXPECTED.')
      ELSE IF(TEXT4.EQ.'STEP') THEN
*        CHANGE THE HIERARCHICAL LEVEL ON THE LCM OBJECT.
         IF(ITYPE.GT.2) CALL XABORT('DRVREC: UNABLE TO STEP INTO A SE'
     1   //'QUENTIAL FILE.')
         CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT)
         IF(INDIC.NE.3) CALL XABORT('DRVREC: CHARACTER DATA EXPECTED.')
         IF(TEXT4.EQ.'UP') THEN
            CALL REDGET(INDIC,NITMA,FLOTT,NAMT,DFLOTT)
            IF(INDIC.NE.3) CALL XABORT('DRVREC: CHARACTER DATA EXPECT'
     1      //'ED.')
            IF(IMPX.GT.0) WRITE (6,100) NAMT
            JPLIST=LCMGID(IPLIST,NAMT)
         ELSE IF(TEXT4.EQ.'AT') THEN
            CALL REDGET(INDIC,NITMA,FLOTT,NAMT,DFLOTT)
            IF(INDIC.NE.1) CALL XABORT('DRVREC: INTEGER EXPECTED.')
            IF(IMPX.GT.0) WRITE (6,110) NITMA
            JPLIST=LCMGIL(IPLIST,NITMA)
         ELSE
            CALL XABORT('DRVREC: UP OR AT EXPECTED.')
         ENDIF
         IPLIST=JPLIST
      ELSE IF(TEXT4.EQ.';') THEN
         GO TO 40
      ELSE
         CALL XABORT('DRVREC: '//TEXT4//' IS AN INVALID KEY WORD.')
      ENDIF
      GO TO 30
*
   40 CALL LCMGTC(IPLIST,'SIGNATURE',12,TEXT12)
      IF(TEXT12.NE.'L_ARCHIVE') THEN
         CALL XABORT('DRVREC: SIGNATURE OF '//HMEDIA//' IS '//TEXT12//
     1   '. L_ARCHIVE EXPECTED.')
      ENDIF
      DO 50 I=1,NENTRY-1
      IF((JENTRY(I).EQ.0).OR.(JENTRY(I).EQ.1)) THEN
         IF(IENTRY(I).GT.2) CALL XABORT('DRVREC: LHS LINKED LIST OR XSM'
     1   //' FILE EXPECTED.')
         IF(IMPX.GT.0) THEN
           IF(IPOS.EQ.0) THEN
             WRITE (6,'(/18H DRVREC: RECOVER '',A,8H'' FROM '',A,
     1       2H''.)') TRIM(HENTRY(I)),TRIM(HMEDIA)
           ELSE
             WRITE (6,'(/22H DRVREC: RECOVER ITEM=,I5,5H OF '',A,
     1       8H'' FROM '',A,2H''.)') IPOS,TRIM(HENTRY(I)),TRIM(HMEDIA)
           ENDIF
         ENDIF
         TEXT12=HENTRY(I)
         CALL LCMLEN(IPLIST,TEXT12,ILEN,ITYLCM)
         IF(ILEN.EQ.0) THEN
            CALL LCMLIB(IPLIST)
            CALL XABORT('DRVREC: UNABLE TO FIND '//TEXT12//' ON THE BA'
     1      //'CKUP MEDIA NAMED '//HMEDIA//'.')
         ELSE IF(ITYLCM.EQ.0) THEN
            IF(IPOS.NE.0) CALL XABORT('DRVREC: RECORD '//TEXT12//' ON '
     1      //'THE BACKUP MEDIA NAMED '//HMEDIA//' IS NOT A DIRECTORY.')
            CALL LCMSIX(IPLIST,HENTRY(I),1)
            CALL LCMEQU(IPLIST,KENTRY(I))
            CALL LCMSIX(IPLIST,' ',2)
         ELSE IF(ITYLCM.EQ.10) THEN
            IF(IPOS.EQ.0) CALL XABORT('DRVREC: RECORD '//TEXT12//' ON '
     1      //'THE BACKUP MEDIA NAMED '//HMEDIA//' IS NOT A LIST.')
            JPLIST=LCMGID(IPLIST,HENTRY(I))
            KPLIST=LCMGIL(JPLIST,IPOS)
            CALL LCMEQU(KPLIST,KENTRY(I))
         ELSE
            CALL LCMLIB(IPLIST)
            CALL XABORT('DRVREC: RECORD '//TEXT12//' ON THE BACKUP MED'
     1      //'IA NAMED '//HMEDIA//' CANNOT BE COPIED.')
         ENDIF
      ENDIF
   50 CONTINUE
      RETURN
*
  100 FORMAT (/27H DRVREC: STEP UP TO LEVEL ',A12,2H'.)
  110 FORMAT (/26H DRVREC: STEP AT COMPONENT,I6,1H.)
      END