]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | * |
2 | * $Id$ | |
3 | * | |
4 | * $Log$ | |
5 | * Revision 1.1.1.1 1996/03/06 10:47:26 mclareni | |
6 | * Zebra | |
7 | * | |
8 | * | |
9 | #include "zebra/pilot.h" | |
10 | SUBROUTINE RZPATH(CHPATH) | |
11 | ************************************************************************ | |
12 | * | |
13 | * RZPATH will decode the character string CHPATH into a character | |
14 | * array CHPAT(1),,CHPAT(NLPAT) | |
15 | * where NLPAT is the number of levels starting from the root directory | |
16 | * | |
17 | * Input: | |
18 | * *CHPATH* Character variable specifying the pathname | |
19 | * | |
20 | * Called by RZCDIR,RZCOPY,RZLDIR,RZNDIR | |
21 | * | |
22 | * Author : R.Brun DD/US/PD | |
23 | * Written : 01.04.86 | |
24 | * Last mod: 15.11.91 J.Shiers Support Unix-style .. as well as \ | |
25 | * | |
26 | ************************************************************************ | |
27 | #include "zebra/zbcdch.inc" | |
28 | CHARACTER*1 BSLASH,KTILDE | |
29 | #include "zebra/zunit.inc" | |
30 | #include "zebra/rzdir.inc" | |
31 | CHARACTER*(*) CHPATH | |
32 | CHARACTER*1 CH1 | |
33 | CHARACTER*2 CH2 | |
34 | * | |
35 | *----------------------------------------------------------------------- | |
36 | * | |
37 | BSLASH=CQALLC(61:61) | |
38 | KTILDE=CQALLC(94:94) | |
39 | NCHP=LEN(CHPATH) | |
40 | NLPAT=0 | |
41 | 10 IF(CHPATH(NCHP:NCHP).EQ.' ')THEN | |
42 | NCHP=NCHP-1 | |
43 | IF(NCHP.GT.0)GO TO 10 | |
44 | NLPAT=NLCDIR | |
45 | DO 20 I=1,NLCDIR | |
46 | CHPAT(I)=CHCDIR(I) | |
47 | 20 CONTINUE | |
48 | GO TO 99 | |
49 | ENDIF | |
50 | * | |
51 | IS1=1 | |
52 | 30 IF(CHPATH(IS1:IS1).EQ.' ')THEN | |
53 | IS1=IS1+1 | |
54 | GO TO 30 | |
55 | ENDIF | |
56 | * | |
57 | CH1=CHPATH(IS1:IS1) | |
58 | CH2=CHPATH(IS1:IS1+1) | |
59 | IF(CH1.EQ.'/')THEN | |
60 | IF(CHPATH(IS1+1:IS1+1).EQ.'/')THEN | |
61 | * | |
62 | * Case where Path starts with //Topdirectory | |
63 | * | |
64 | IS=IS1+2 | |
65 | IF(IS.GT.NCHP)GO TO 99 | |
66 | 40 IF(CHPATH(IS:IS).EQ.'/')THEN | |
67 | IF(IS.EQ.IS1+2)GO TO 90 | |
68 | NLPAT=1 | |
69 | CHPAT(1)=CHPATH(IS1+2:IS-1) | |
70 | IS1=IS+1 | |
71 | IS=IS1 | |
72 | GO TO 50 | |
73 | ELSE | |
74 | IS=IS+1 | |
75 | IF(IS.LT.NCHP)GO TO 40 | |
76 | NLPAT=1 | |
77 | CHPAT(1)=CHPATH(IS1+2:IS) | |
78 | GO TO 99 | |
79 | ENDIF | |
80 | ENDIF | |
81 | * | |
82 | * Case where Path starts just below topdirectory /a/b/c | |
83 | * | |
84 | IF(CHPATH(IS1+1:IS1+1).EQ.BSLASH)GO TO 90 | |
85 | IF(CHPATH(IS1+1:IS1+1).EQ.KTILDE)GO TO 90 | |
86 | NLPAT=1 | |
87 | CHPAT(1)=CHCDIR(1) | |
88 | IS=IS1+1 | |
89 | IS1=IS | |
90 | * | |
91 | 50 IF(IS.EQ.NCHP)THEN | |
92 | IF(CHPATH(IS1:IS).NE.'..'.AND. | |
93 | + CHPATH(IS1:IS).NE.BSLASH) THEN | |
94 | NLPAT=NLPAT+1 | |
95 | IF(NLPAT.GT.NLPATM)GO TO 90 | |
96 | CHPAT(NLPAT)=CHPATH(IS1:IS) | |
97 | ELSE | |
98 | NLPAT = NLPAT -1 | |
99 | ENDIF | |
100 | GO TO 99 | |
101 | ELSE | |
102 | IF(CHPATH(IS:IS).EQ.'/')THEN | |
103 | IF(NLPAT.GT.NLPATM)GO TO 90 | |
104 | IF(CHPATH(IS1:IS-1).NE.'..'.AND. | |
105 | + CHPATH(IS1:IS-1).NE.BSLASH) THEN | |
106 | NLPAT=NLPAT+1 | |
107 | CHPAT(NLPAT)=CHPATH(IS1:IS-1) | |
108 | ELSE | |
109 | NLPAT = NLPAT - 1 | |
110 | ENDIF | |
111 | IS1=IS+1 | |
112 | ENDIF | |
113 | IS=IS+1 | |
114 | GO TO 50 | |
115 | ENDIF | |
116 | ENDIF | |
117 | * | |
118 | * Case where Path is relative to the naming directory | |
119 | * | |
120 | IF(CH1.EQ.KTILDE)THEN | |
121 | NLPAT=NLNDIR | |
122 | DO 60 I=1,NLNDIR | |
123 | CHPAT(I)=CHNDIR(I) | |
124 | 60 CONTINUE | |
125 | IF(IS1.EQ.NCHP)GO TO 99 | |
126 | IS1=IS1+1 | |
127 | CH1=CHPATH(IS1:IS1) | |
128 | GO TO 75 | |
129 | ENDIF | |
130 | * | |
131 | * Case where Path is relative to the working directory | |
132 | * | |
133 | DO 70 I=1,NLCDIR | |
134 | CHPAT(I)=CHCDIR(I) | |
135 | 70 CONTINUE | |
136 | NLPAT=NLCDIR | |
137 | * | |
138 | 75 IF(CH1.EQ.BSLASH)THEN | |
139 | NLPAT=NLPAT-1 | |
140 | IF(NLPAT.EQ.0)NLPAT=1 | |
141 | IF(IS1.EQ.NCHP)GO TO 99 | |
142 | IS1=IS1+1 | |
143 | CH1=CHPATH(IS1:IS1) | |
144 | GO TO 75 | |
145 | ENDIF | |
146 | * | |
147 | IS=IS1 | |
148 | 76 IF(CH2.EQ.'..')THEN | |
149 | NLPAT=NLPAT-1 | |
150 | IF(NLPAT.EQ.0)NLPAT=1 | |
151 | IF(IS1+1.EQ.NCHP)GO TO 99 | |
152 | IF(CHPATH(IS1+2:IS1+2).NE.'/') GOTO 90 | |
153 | IS =IS1 | |
154 | IS1=IS1+3 | |
155 | CH2=CHPATH(IS1:IS1+1) | |
156 | GO TO 76 | |
157 | ENDIF | |
158 | * | |
159 | 80 IF(IS.EQ.NCHP)THEN | |
160 | NLPAT=NLPAT+1 | |
161 | IF(NLPAT.GT.NLPATM)GO TO 90 | |
162 | CHPAT(NLPAT)=CHPATH(IS1:IS) | |
163 | GO TO 99 | |
164 | ELSE | |
165 | IF(CHPATH(IS:IS).EQ.'/')THEN | |
166 | IF(IS.GT.IS1)THEN | |
167 | NLPAT=NLPAT+1 | |
168 | IF(NLPAT.GT.NLPATM)GO TO 90 | |
169 | CHPAT(NLPAT)=CHPATH(IS1:IS-1) | |
170 | ENDIF | |
171 | IS1=IS+1 | |
172 | ENDIF | |
173 | IS=IS+1 | |
174 | GO TO 80 | |
175 | ENDIF | |
176 | * | |
177 | * Error in Pathname | |
178 | * | |
179 | 90 NLPAT=0 | |
180 | * | |
181 | 99 RETURN | |
182 | END |