The TELEMAC-MASCARET system  trunk
carlu.f
Go to the documentation of this file.
1 ! *********************************
2  CHARACTER(LEN=PATH_LEN) FUNCTION carlu
3 ! *********************************
4 !
5  &( lcar , icol , ligne , extrem , motcle , SIZE , motign ,
6  & lonign , nmaxr , nficda , lgvar )
7 !
8 !***********************************************************************
9 ! DAMOCLES V7P0 21/08/2010
10 !***********************************************************************
11 !
12 !brief DECODES A CHARACTER STRING, FROM COLUMN ICOL+1 OF THE
13 !+ CURRENT LINE (MAXIMUM OF LGA CHARACTERS).
14 !+ IF THE STRING IS NOT COMPLETE, GOES TO THE NEXT LINE
15 !+ IF NEED BE.
16 !+ MOVES THE POINTER ICOL TO THE LAST DECODED CHARACTER
17 !+ OR TO ICOL=0 IF THE NEXT LINE WAS READ WITH NO REASON.
18 !
19 !note PORTABILITY : IBM,CRAY,HP,SUN
20 !
21 !warning FOLLOWS THE FORTRAN CONVENTION : '' IS READ AS
22 !+ ' WHEN WITHIN A CHARACTER STRING
23 !+
24 !warning STRINGS WITHOUT ' OR " CANNOT CONTAIN SEPARATOR
25 !+ CHARACTERS
26 !
27 !history O. QUIQUEMPOIX (LNH)
28 !+ 14/12/1993
29 !+
30 !+
31 !
32 !history J.M. HERVOUET (LNH); A. YESSAYAN
33 !+ 16/08/1994
34 !+ V5P1
35 !+
36 !
37 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
38 !+ 13/07/2010
39 !+ V6P0
40 !+ Translation of French comments within the FORTRAN sources into
41 !+ English comments
42 !
43 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
44 !+ 21/08/2010
45 !+ V6P0
46 !+ Creation of DOXYGEN tags for automated documentation and
47 !+ cross-referencing of the FORTRAN sources
48 !
49 !history J.M. HERVOUET (EDF R&D, LNHE)
50 !+ 31/12/2013
51 !+ V7P0
52 !+ Prints of LIGNED limited to maximum size LGVAR.
53 !
54 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
55 !| EXTREM |-->| SEPARATEUR DE CHAINE = ' OU "
56 !| ICOL |<->| POSITION COURANTE DU POINTEUR DANS LA LIGNE
57 !| LCAR |<--| LONGUEUR DE LA CHAINE DE CARACTERES
58 !| LGVAR |-->| LONGUEUR MAXIMUM DE LA CHAINE A LIRE
59 !| LIGNE |<->| LIGNE EN COURS DE DECODAGE
60 !| LONIGN |-->| TABLEAU DES LONGUEURS DES MOTS EDAMOX
61 !| MOTCLE |-->| TABLEAU DES MOTS CLES ACTIFS
62 !| MOTIGN |-->| TABLEAU DES MOTS CLES DUS A EDAMOX A IGNORER
63 !| NFICDA |-->| NUMERO DE CANAL DU FICHIER DES DONNEES
64 !| NMAXR |-->| TABLEAU DES INDEX MAXIMUM REELS PAR TYPES
65 !| SIZE |-->| TABLEAU DES LONGUEURS DES MOTS CLES
66 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
67 !
70  IMPLICIT NONE
71 !
72  INTEGER LCAR,ICOL,NMAXR(4),NFICDA,LGVAR,SIZE(4,*)
73  INTEGER LONIGN(100)
74  CHARACTER(LEN=*) LIGNE
75  CHARACTER(LEN=1) EXTREM
76  CHARACTER(LEN=72) MOTIGN(100),MOTCLE(4,*)
77 !
78  INTEGER NEXT,PRECAR,LONGLU
79  EXTERNAL next,precar,longlu
80 !
81 !-----------------------------------------------------------------------
82 !
83  INTEGER I,IDEB,IFIN,NCAR,ICOL2,NLIGN2,ITYP,K,LGLU
84  INTEGER :: LONPRO(15)
85  INTEGER QCAS
86  LOGICAL COTE,LISUIV,LUFIC,LUCOTE
87  CHARACTER(LEN=1) QUOTE,TABUL
88  CHARACTER(LEN=9) :: MOTPRO(15)
89  CHARACTER(LEN=72) LIGNE2
90  CHARACTER(LEN=PATH_LEN) LIGNED
91 !
92 !-----------------------------------------------------------------------
93 !
94  INTRINSIC char
95 !
96 !-----------------------------------------------------------------------
97 !
98  parameter( motpro = (/
99  & 'NOM ','TYPE ','INDEX ','TAILLE ','DEFAUT ',
100  & 'AIDE ','CHOIX ','RUBRIQUE ','NIVEAU ','MNEMO ',
101  & 'COMPOSE ','COMPORT ','CONTROLE ','APPARENCE','SUBMIT ' /) )
102 !
103 ! LENGTH OF PROTECTED WORDS
104 !
105  parameter( lonpro = (/ 3,4,5,6,6,4,5,8,6,5,7,7,8,9,6 /) )
106 !
107 !***********************************************************************
108 ! RCS AND SCCS MARKING
109 !
110 !***********************************************************************
111 !
112  cote = .false.
113  lisuiv = .false.
114  lufic = .false.
115  lucote = .false.
116  lcar = 1
117  carlu = ' '
118  quote = ''''
119  tabul = char(9)
120  nlign2 = nlign
121  icol2 = icol
122  ligne2 = ligne(1:min(72,len(ligne)))
123  ligned = ' '
124  lglu = 0
125  qcas = 0
126 !
127  icol = next( icol+1 , ligne )
128 !
129 ! //// FINDS THE ENDS OF THE STRING ////
130 !
131 ! NOTE: THE STRING CAN BE BETWEEN QUOTES OR WITHOUT QUOTES
132 ! IT CANNOT CONTAIN WHITE CHARACTERS IF THERE ARE
133 ! NO QUOTES
134 !
135  IF ( ligne(icol:icol).NE.extrem ) THEN
136  ideb = icol
137 ! PRECAR : SAME ROLE AS PREVAL, EXCEPT IT DOES NOT
138 ! SKIP COMMENTED LINES
139  icol = precar( icol+1 , ligne , ' ' , ';' , tabul) - 1
140  ifin = icol
141  ligned = ligne(ideb:ifin)
142  lglu = ifin-ideb+1
143 !
144 ! STEERING FILE : GOES TO THE NEXT, WHEN GETS TO THE END OF A LINE
145 !
146 290 IF (ifin.GE.longli) THEN
147  lisuiv = .true.
148  lufic = .true.
149  READ(nfic,end=900,err=998,fmt='(A)') ligne2
150  icol2 = 0
151  IF (ligne2(1:1).EQ.'&'.OR.
152  & ligne2(1:1).EQ.'='.OR.ligne2(1:1).EQ.':'.OR.
153  & ligne2(1:1).EQ.';'.OR.ligne2(1:1).EQ.'/' ) THEN
154  lisuiv = .false.
155  GO TO 96
156  ENDIF
157 !
158 ! CHECKS IF IT'S A KNOWN KEYWORD FOR THE STEERING FILE
159 !
160  IF (nfic.EQ.nficda) THEN
161  DO ityp = 1,4
162  DO i=1,nmaxr(ityp)
163 ! K=LONGLU(MOTCLE(ITYP,I))
164  k=SIZE(ityp,i)
165  IF (k.GT.0.AND.ligne2(1:k).EQ.motcle(ityp,i)(1:k)) THEN
166  lisuiv = .false.
167  GO TO 96
168  ENDIF
169  ENDDO ! I
170  ENDDO ! ITYP
171  DO i=1,100
172 ! K = LONGLU(MOTIGN(I))
173  k = lonign(i)
174  IF(k.GT.0.AND.ligne2(1:k).EQ.motign(i)(1:k)) THEN
175  lisuiv = .false.
176  GO TO 96
177  ENDIF
178  ENDDO ! I
179  ELSE
180  DO i=1,15
181 ! K = LONGLU(MOTPRO(I))
182  k = lonpro(i)
183  IF(k.GT.0.AND.ligne2(1:k).EQ.motpro(i)(1:k)) THEN
184  lisuiv = .false.
185  GO TO 96
186  ENDIF
187  ENDDO ! I
188  ENDIF
189 !
190 ! GETS TO THIS POINT IF/WHEN HAS TO READ THE NEXT LINE
191 !
192  icol2 =precar(1 , ligne2 , ' ' , tabul ,' ') - 1
193 !
194  lglu = lglu + icol2
195 !
196  IF(lglu.GT.lgvar) THEN
197  erreur = .true.
198  IF (longlu(ligned).GT.0) THEN
199  ligned = ligned(1:longlu(ligned))//ligne2(1:icol2)
200  ELSE
201  ligned = ligne2(1:icol2)
202  ENDIF
203  IF(lglu.GT.0) WRITE(lu,'(1X,A)')
204  & ligned(1:min(lglu,path_len))
205  WRITE(lu,*) ' '
206  WRITE(lu,'(1X,A5,I4,1X,A23)') 'LINE: ',nlign,
207  & 'ERROR : STRING TOO LONG'
208  icol = icol -1
209  GO TO 1000
210  ELSE
211 ! NEEDS TO READ ANOTHER LINE - SIMULATES A SHIFT OF LINE
212  lisuiv = .false.
213  ligne = ligne2
214  IF (longlu(ligned).GT.0) THEN
215  ligned = ligned(1:longlu(ligned))//ligne2(1:longli)
216  ELSE
217  ligned = ligne2(1:longli)
218  ENDIF
219  nlign = nlign2
220  icol = icol2
221  ifin = longli+1
222  GO TO 290
223  ENDIF
224  96 IF(lisuiv) THEN
225  IF(longlu(ligned).GT.0) THEN
226  ligned = ligned(1:longlu(ligned))//ligne2(1:icol2)
227  ELSE
228  ligned = ligne2(1:longli)
229  ENDIF
230  ifin = lglu+icol2
231  ideb = 1
232  ENDIF
233  ENDIF
234 !
235  GO TO 901
236  900 CONTINUE
237  retour = .true.
238  901 CONTINUE
239  DO i = 1 , lglu
240  IF (ligned(i:i).EQ.quote.OR.ligned(i:i).EQ.'&'.OR.
241  & ligned(i:i).EQ.'='.OR.ligned(i:i).EQ.':'.OR.
242  & ligned(i:i).EQ.'/') THEN
243  IF (nlign2.NE.nlign.AND.(.NOT.(lufic)))
244  & WRITE(lu,'(1X,A)') ligne2(1:longli)
245  IF (lglu.GT.0) WRITE(lu,'(1X,A)') ligned(1:lglu)
246  WRITE(lu,'(1X,A5,I4,A)') 'LINE: ',nlign,
247  & ' ERROR: UNEXPECTED CHARACTER IN A STRING WITHOUT QUOTES'
248  erreur = .true.
249  GO TO 1000
250  ENDIF
251  ENDDO ! I
252 !
253  ELSE
254 !
255 ! CASE WHERE THERE ARE QUOTES
256 !
257  ideb = icol + 1
258 !
259 ! THE 1ST QUOTE IS IN LAST POSITION (QCAS=4 OR QCAS=5)
260  IF (icol.EQ.longli) qcas=45
261 !
262  100 icol = precar( icol+1 , ligne , extrem , extrem , extrem )
263  IF (icol.EQ.longli) icol = longli+1
264 !
265 ! CASE WHERE DOUBLE QUOTES CAN BE FOUND IN THE 1ST LINE EXCEPT IN COLUMN 72
266 !
267  IF(icol.LT.longli) THEN
268  IF(ligne(icol+1:icol+1).EQ.extrem.AND.extrem.EQ.quote) THEN
269  icol = icol + 1
270 ! THE QUOTE IN 72 IS THE 2ND QUOTE OF A DOUBLE QUOTE (QCAS=3)
271  IF (icol.EQ.longli) qcas=3
272  cote = .true.
273  GO TO 100
274  ENDIF
275  ENDIF
276 !
277  lglu = max(0,icol-ideb)
278  IF (lglu.GT.0) ligned = ligne(ideb:icol-1)
279 !
280 ! HAS NOT FOUND THE END, OR A QUOTE WAS FOUND IN COLUMN 72
281 !
282  IF (icol.GT.longli) THEN
283 390 lisuiv = .true.
284  lufic = .true.
285  READ(nfic,end=905,err=998,fmt='(A)') ligne2
286 !
287 ! CASE WHERE THE PRECEDING LINE ENDS WITH A QUOTE
288 !
289  IF (ligne(longli:longli).EQ.quote) THEN
290 ! THE QUOTE IN COLUMN 72 STARTS A STRING, OR IS THE 2ND OF A DOUBLE QUOTE
291  IF (qcas.EQ.45.OR.qcas.EQ.3) THEN
292  qcas=0
293  ELSEIF (ligne2(1:1).EQ.quote) THEN
294  cote = .true.
295  lucote = .true.
296  qcas=0
297  ELSE
298  lglu=lglu-1
299  IF (lglu.GT.0) ligned = ligned(1:lglu)
300  lisuiv = .false.
301  qcas=0
302  GO TO 920
303  ENDIF
304  ENDIF
305 !
306  icol2 = 0
307  IF(ligne2(1:1).EQ.quote.AND.lucote) THEN
308  lucote = .false.
309  icol2=1
310  ENDIF
311  110 icol2 =precar(icol2+1,ligne2,extrem,extrem,extrem)
312  IF(icol2.LT.longli) THEN
313  IF(ligne2(icol2+1:icol2+1).EQ.
314  & extrem.AND.extrem.EQ.quote) THEN
315 ! ICOL2 = PRECAR(ICOL2+1,LIGNE2,EXTREM,EXTREM,EXTREM)
316  icol2=icol2+1
317  cote=.true.
318  IF (icol2.EQ.longli) qcas=3
319  GO TO 110
320  ENDIF
321  ENDIF
322  IF(icol2.EQ.longli) icol2=icol2+1
323  IF(lglu.GT.0) THEN
324  ligned = ligned(1:lglu)//ligne2(1:icol2-1)
325  ELSE
326  ligned = ligne2(1:icol2-1)
327  ENDIF
328  lglu = lglu + icol2-1
329 !
330  IF(lglu.GT.lgvar) GO TO 910
331 !
332 ! GOES TO NEXT LINE IF NOT COMPLETE, OR IF HAS FOUND A QUOTE IN 72
333 !
334  IF(icol2.GE.longli) THEN
335  lisuiv = .false.
336  ligne = ligne2
337  nlign = nlign2
338  icol = icol2
339  ifin = icol2
340  GO TO 390
341  ENDIF
342 ! HERE IT'S OK
343  GO TO 920
344 !
345  905 CONTINUE
346  retour = .true.
347 !
348  910 CONTINUE
349  WRITE(lu,'(1X,A)') ligned(1:max(1,min(lglu,lgvar)))
350  WRITE(lu,*)
351  WRITE(lu,'(1X,A5,I4,A)') 'LINE: ',nlign,
352  & ' ERROR: QUOTE MISSING AT THE END OF THE STRING'
353  WRITE(lu,*)'OR STRING TOO LONG ... '
354  erreur = .true.
355  icol = longli
356  GO TO 1000
357 !
358  ENDIF
359  ifin = icol - 1
360  ENDIF
361 !
362  920 CONTINUE
363  IF(lglu.NE.0) THEN
364  lcar = min(lglu,lgvar)
365  carlu = ligned(1:lglu)
366  ENDIF
367 !
368 ! CHANGES DOUBLE QUOTES WITH SIMPLE QUOTES
369 !
370  IF(cote) THEN
371  ncar = lcar
372  i = 1
373  200 CONTINUE
374  IF(i.GT.ncar) THEN
375  lcar = ncar
376  GO TO 1000
377  ENDIF
378  IF(carlu(i:i).EQ.quote.AND.carlu(i+1:i+1).EQ.quote) THEN
379  carlu(i+1:lcar) = carlu(i+2:lcar)//' '
380  ncar = ncar - 1
381  ENDIF
382  i = i + 1
383  GO TO 200
384  ENDIF
385 !
386 1000 CONTINUE
387 !
388  IF (lufic) THEN
389  nlign = nlign + 1
390  ligne = ligne2
391  IF (lisuiv) THEN
392  icol = icol2
393  ELSE
394  icol = 0
395  ENDIF
396  ENDIF
397 !
398 !-----------------------------------------------------------------------
399 !
400  RETURN
401 !
402 998 CONTINUE
403  WRITE(lu,1999) nfic,nlign+1
404 1999 FORMAT(1x,'LOGICAL UNIT ',1i2,' ERROR LINE ',1i6)
405  retour = .true.
406  RETURN
407 !
408 !-----------------------------------------------------------------------
409 !
410  END
character(len=path_len) function carlu(LCAR, ICOL, LIGNE, EXTREM, MOTCLE, SIZE, MOTIGN, LONIGN, NMAXR, NFICDA, LGVAR)
Definition: carlu.f:8
integer, parameter path_len
logical erreur
Y. AUDOUIN (EDF LAB, LNHE) 09/05/2014 V7P0 First version.