48
49
50
51 USE spmd_comm_world_mod, ONLY : spmd_comm_world
52#include "implicit_f.inc"
53
54
55
56#include "warn_c.inc"
57#include "commandline.inc"
58#include "userlib.inc"
59
60
61
62 INTEGER GOT_INPUT,LENI,GOT_PATH,LENP
63 CHARACTER*256 INPUT
64 CHARACTER*2048 PATH
65
66
67
68 INTEGER ARGN
69 INTEGER PHELPI,PEXECI,PINPUTI, PNTHI,PUSERLNAMI,MDS_PATHI
70 INTEGER :: MDS_DIRI
71 INTEGER I,STRL,STRLN,ERR,LENLIST,ISIN,BEGIN,IERRMSG
72 INTEGER IDUM
73 CHARACTER*2096 ARGS,INPUTC,INPUTR,MSG,STRING
74 LOGICAL :: CONDITION
75 CHARACTER C
76 INTEGER IARGC,,IJK
77 CHARACTER :: LAST_LETTER,SEPARATOR
78 CHARACTER(LEN=2096) ARGS2,ARGS_REDUCE,ARGP
79 CHARACTER(LEN=4096) ULIBC
80 parameter(lenlist=20)
81 CHARACTER(LEN=12):: ARGLIST(LENLIST)
82 EXTERNAL iargc
83 DATA arglist/
84 . '-VERSION', '-V',
85 . '-HELP' , '-H',
86 . '-INPUT' , '-I',
87 . '-NTHREAD' , '-NT',
88 . '-ERROR_MSG','-EM',
89 . '-NOTRAP',
90 . '-DYNAMIC_LIB',
91 . '-DYLIB',
92 . '-MEM-MAP' ,
93 . '-INSPIRE',
94 . '-PREVIEW',
95 . '-INSPIRE_ALM','-NORST',
96 . '-MDS_LIBPATH','-MDSDIR'/
97
98 idum=-1
99 got_input = 0
100 got_nth = 0
101 input=' '
102 leni=0
103 phelpi = 0
104 pexeci = 0
105 pinputi = 0
106 pnthi= 0
107 ierrmsg=0
108 puserlnami = 0
109 got_userl_altname=0
110 got_mem_map=0
111 got_inspire=0
112 got_inspire_alm=0
113 mds_path_len = 0
114 mds_pathi = 0
115 mds_diri = 0
117
118
119 mds_path=''
120
121
122
124
125
133
134#if CPP_mach == CPP_w95 || CPP_mach == CPP_win64_spmd || CPP_mach == CPP_p4win64_spmd || CPP_mach == CPP_wnt || CPP_mach == CPP_wmr || CPP_mach == CPP_p4win64 || CPP_mach == CPP_p4win32
135 separator='\'
136#elif 1
137 separator='/'
138#endif
139
140 argn = command_argument_count()
141
142 DO i=1,argn
143 CALL getarg(i,args)
144 strl=len_trim(args)
145
146 args2(1:2096) = ''
147 args2(1:strl) = args(1:strl)
149
150 args_reduce(1:9) = args(1:9)
151 cdl_case = 0
152 IF(args_reduce(1:9)=='-OUTFILE=') cdl_case = 1
153 IF(args_reduce(1:8)=='-INFILE=') cdl_case = 2
154 IF(cdl_case==0) THEN
155 SELECT CASE (args)
156
157
158 CASE ( '-NOTRAP')
159 itrace = -1
160
161
162 CASE ( '-VERSION')
163 pexeci = 1
164 CASE ( '-V')
165 pexeci = 1
166
167
168 CASE ( '-HELP')
169 phelpi = 1
170 CASE ( '-H')
171 phelpi = 1
172
173
174 CASE ( '-ERROR_MSG')
175 ierrmsg = i
176 CASE ( '-EM')
177 ierrmsg = i
178
179
180 CASE ( '-INPUT')
181 IF (pinputi==0) pinputi = i
182 CASE ( '-I')
183 IF (pinputi==0) pinputi = i
184
185
186 CASE ( '-RST')
187 err = 0
188
189
190 CASE ( '--')
191 err = 0
192
193
194 CASE ( '-NTHREAD')
195 IF (pnthi==0) pnthi = i
196 CASE ( '-NT')
197 IF (pnthi==0) pnthi = i
198
199
200 CASE ( '-DYNAMIC_LIB')
201 IF (puserlnami==0) puserlnami=i
202 CASE ( '-DYLIB')
203 IF (puserlnami==0) puserlnami=i
204
205
206 CASE ( '-mds_libpath')
207 IF (MDS_PATHI==0) MDS_PATHI=I
208
209
210 CASE ( '-mdsdir')
211 IF (MDS_DIRI==0) MDS_DIRI=I
212
213
214 CASE ( '-mem-map')
215 GOT_MEM_MAP=1
216 CASE ( '-preview')
217 GOT_PREVIEW=1
218 CASE ( '-inspire_alm')
219 GOT_INSPIRE_ALM=1
220 CASE ( '-inspire')
221 GOT_INSPIRE=1
222
223
224 CASE ( '-norst')
225 RESTART_FILE = 0
226
227
228 CASE DEFAULT
229 ERR = 0
230 IF (I == 1)THEN
231 ERR = 1
232 ELSE
233 CALL GETARG(I-1,ARGP)
234 CALL UPCASE(ARGP)
235 STRLN=LEN_TRIM(ARGP)
236
237 IF (ARGP == '-i.OR.' ARGP =='-input.OR.'
238 * ARGP == '-rst.OR.' ARGP =='-nt.OR.'
239 * ARGP == '-nthread.OR.'
240 * ARGP == '-dylib.OR.' ARGP =='-dynamic_lib.OR.'
241 * ARGP == '-mds_libpath.OR.' ARGP == '-mdsdir' )THEN
242 ERR = 0
243 ELSE
244 ERR = 1
245 ENDIF
246 ENDIF
247
248
249.AND. IF (ERR == 1strl>4)THEN
250 IF (ARGS(strl-3:strl)=='.xml')THEN
251 ERR = 0
252 ENDIF
253 ENDIF
254 IF (ERR == 1)THEN
255 CALL GETARG(I,ARGP)
256 STRLN=LEN_TRIM(ARGP)
257 CALL PHELPINFO(2,ARGP,STRLN)
258 CALL ARRET(7)
259 ENDIF
260
261 END SELECT
262 ELSE
263! ------------------------------------------------
264 SELECT CASE(CDL_CASE)
265 ! -----------------------------
266 ! -OUTFILE=... option
267 ! -----------------------------
268 CASE(1)
269
270 OUTFILE_NAME_LEN = LEN_TRIM(ARGS2) - 9
271 OUTFILE_NAME(1:OUTFILE_NAME_LEN) = ARGS2(10:LEN_TRIM(ARGS2))
272 OUTFILE_BOOL=.TRUE.
273 DO IJK=1,OUTFILE_NAME_LEN
274 LAST_LETTER = OUTFILE_NAME(IJK:IJK)
275 ENDDO
276 IF(LAST_LETTER/=SEPARATOR) THEN
277 OUTFILE_NAME(1:OUTFILE_NAME_LEN+1) =
278 . OUTFILE_NAME(1:OUTFILE_NAME_LEN)//SEPARATOR
279 OUTFILE_NAME_LEN = OUTFILE_NAME_LEN + 1
280 ENDIF
281 ! -----------------------------
282 ! -INFILE=... option
283 ! -----------------------------
284 CASE(2)
285 INFILE_NAME_LEN = LEN_TRIM(ARGS2) - 8
286 INFILE_NAME(1:INFILE_NAME_LEN) = ARGS2(9:LEN_TRIM(ARGS2))
287 INFILE_BOOL=.TRUE.
288 DO IJK=1,INFILE_NAME_LEN
289 LAST_LETTER = INFILE_NAME(IJK:IJK)
290 ENDDO
291 IF(LAST_LETTER/=SEPARATOR) THEN
292 INFILE_NAME(1:INFILE_NAME_LEN+1) =
293 . INFILE_NAME(1:INFILE_NAME_LEN)//SEPARATOR
294 INFILE_NAME_LEN = INFILE_NAME_LEN + 1
295 ENDIF
296 END SELECT
297! ------------------------------------------------
298 ENDIF
299 ENDDO
300
301
302
303 IF (PEXECI==1) THEN
304 CALL PEXECINFO(IDUM)
305 ENDIF
306
307
308
309
310 IF (PHELPI==1) THEN
311 MSG= ' '
312 CALL PHELPINFO(0,MSG,0)
313 ENDIF
314
315
316
317
318 IF (IERRMSG /= 0)THEN
319 IF (IERRMSG+1 > ARGN) THEN
320
321
322
323 CALL GETARG(IERRMSG,ARGP)
324 STRLN=LEN_TRIM(ARGP)
325 MSG = ARGP
326 CALL PHELPINFO(1,MSG,STRLN)
327 CALL ARRET(7)
328 ELSE
329 CALL GETARG(IERRMSG+1,INPUTR)
330 LENI=LEN_TRIM(INPUTR)
331
332
333
334 INPUTC = INPUTR
335 CALL UPCASE(INPUTC)
336 ISIN = 0
337 CALL ISANARGUMENT(ARGLIST,LENLIST,INPUTC,ISIN)
338 IF ( ISIN==1 )THEN
339 CALL GETARG(PINPUTI,ARGP)
340 STRLN=LEN_TRIM(ARGP)
341 MSG=ARGP
342 CALL PHELPINFO(1,MSG,STRLN)
343 CALL ARRET(7)
344 ENDIF
345 CALL READ_MSGFILE(LENI,INPUTR)
346 CALL BUILD_MSG()
347 ENDIF
348 ENDIF
349
350
351
352
353 IF (PINPUTI /= 0)THEN
354 IF (PINPUTI+1 > ARGN) THEN
355
356
357
358 CALL GETARG(PINPUTI,ARGP)
359 STRLN=LEN_TRIM(ARGP)
360 MSG = ARGP
361 CALL PHELPINFO(1,MSG,STRLN)
362 CALL ARRET(7)
363 ELSE
364 CALL GETARG(PINPUTI+1,INPUTR)
365 LENI=LEN_TRIM(INPUTR)
366 GOT_INPUT = 1
367
368
369
370 INPUTC = INPUTR
371 CALL UPCASE(INPUTC)
372 ISIN = 0
373 CALL ISANARGUMENT(ARGLIST,LENLIST,INPUTC,ISIN)
374 IF ( ISIN==1 )THEN
375 CALL GETARG(PINPUTI,ARGP)
376 STRLN=LEN_TRIM(ARGP)
377 MSG=ARGP
378 CALL PHELPINFO(1,MSG,STRLN)
379 CALL ARRET(7)
380 ENDIF
381
382 BEGIN=LEN_TRIM(INPUTR)
383 CONDITION = .FALSE.
384.AND..NOT. DO WHILE (BEGIN > 0 CONDITION)
385 C = INPUTR(BEGIN:BEGIN)
386.OR. IF (ICHAR(C)==47 ichar(C)==92) THEN
387 CONDITION=.TRUE.
388 GOTO 150
389 ENDIF
390 BEGIN=BEGIN-1
391 ENDDO
392 150 CONTINUE
393 LENI = LEN_TRIM(INPUTR) - BEGIN
394 BEGIN=BEGIN+1
395 INPUT(1:LENI) = INPUTR(BEGIN:LEN_TRIM(INPUTR))
396
397 IF (BEGIN > 1)THEN
398 GOT_PATH=1
399 LENP=BEGIN-1
400 PATH(1:LENP)=INPUTR(1:LENP)
401 ENDIF
402 ENDIF
403 ELSE
404 ! -input/-i was not set. Exiting with error message.
405 MSG= ' '
406 CALL PHELPINFO(6,MSG,0)
407 CALL ARRET(7)
408 ENDIF
409
410
411
412
413 IF (PNTHI /= 0)THEN
414 IF (PNTHI+1 > ARGN) THEN
415
416 CALL GETARG(PNTHI,ARGP)
417 STRLN=LEN_TRIM(ARGP)
418 MSG = ARGP
419 CALL PHELPINFO(1,MSG,STRLN)
420 CALL ARRET(7)
421 ELSE
422 CALL GETARG(PNTHI+1,STRING)
423
424 CALL UPCASE(STRING)
425 ISIN = 0
426 CALL ISANARGUMENT(ARGLIST,LENLIST,STRING,ISIN)
427 IF ( ISIN==1 )THEN
428 CALL GETARG(PNTHI,ARGP)
429 STRLN=LEN_TRIM(ARGP)
430 MSG=ARGP
431 CALL PHELPINFO(1,MSG,STRLN)
432 CALL ARRET(7)
433 END IF
434 GOT_NTH = 1
435
436 CALL GETARG(PNTHI+1,STRING)
437 READ(STRING,'(i10)',ERR=1999) NTH
438
439 GOTO 2000
440 1999 CONTINUE
441
442 STRLN=LEN_TRIM(STRING)
443
444 MSG=STRING
445 CALL PHELPINFO(4,MSG,STRLN)
446 CALL ARRET(7)
447 2000 CONTINUE
448 ENDIF
449 ENDIF
450
451
452
453 IF (PUSERLNAMI /= 0)THEN
454 IF (PUSERLNAMI+1 > ARGN) THEN
455
456
457
458 CALL GETARG(PUSERLNAMI,ARGP)
459 STRLN=LEN_TRIM(ARGP)
460 CALL PHELPINFO(1,ARGP,STRLN)
461
462 ELSE
463 CALL GETARG(PUSERLNAMI+1,USERL_ALTNAME)
464 LEN_USERL_ALTNAME=LEN_TRIM(USERL_ALTNAME)
465 GOT_USERL_ALTNAME = 1
466
467 ULIBC=''
468 ULIBC(1:LEN_USERL_ALTNAME) = USERL_ALTNAME(1:LEN_USERL_ALTNAME)
469 CALL UPCASE(ULIBC)
470 ISIN = 0
471 CALL ISANARGUMENT(ARGLIST,LENLIST,ULIBC,ISIN)
472 IF ( ISIN==1 )THEN
473 CALL GETARG(PUSERLNAMI,ARGP)
474 STRLN=LEN_TRIM(ARGP)
475 CALL PHELPINFO(1,ARGP,STRLN)
476 CALL ARRET(7)
477 ENDIF
478
479 ENDIF ! IF (PUSERLNAMI+1 > ARGN) THEN
480 ENDIF
481 3000 CONTINUE
482
483
484
485 IF (MDS_PATHI /= 0)THEN
486
487 IF (MDS_PATHI+1 > ARGN) THEN
488
489
490
491 CALL GET_COMMAND_ARGUMENT(MDS_PATHI,ARGP)
492 STRLN=LEN_TRIM(ARGP)
493 CALL PHELPINFO(1,ARGP,STRLN)
494
495 ELSE
496 CALL GET_COMMAND_ARGUMENT(MDS_PATHI+1,MDS_PATH)
497 MDS_PATH_LEN=LEN_TRIM(MDS_PATH)
498
499
500 ULIBC=''
501 ULIBC(1:MDS_PATH_LEN) = MDS_PATH(1:MDS_PATH_LEN)
502 CALL UPCASE(ULIBC)
503 ISIN = 0
504 CALL ISANARGUMENT(ARGLIST,LENLIST,ULIBC,ISIN)
505
506 IF ( ISIN==1 )THEN
507 CALL GETARG(MDS_PATHI,ARGP)
508 STRLN=LEN_TRIM(ARGP)
509 CALL PHELPINFO(1,ARGP,STRLN)
510 CALL ARRET(7)
511 ENDIF
512
513 ENDIF ! IF (MDS_PATHI+1 > ARGN) THEN
514 ENDIF
515
516
517
518 IF (MDS_DIRI /= 0)THEN
519
520 IF (MDS_DIRI+1 > ARGN) THEN
521
522
523 CALL GET_COMMAND_ARGUMENT(MDS_DIRI,ARGP)
524 STRLN=LEN_TRIM(ARGP)
525 CALL PHELPINFO(1,ARGP,STRLN)
526
527 ELSE
528
529 CALL GET_COMMAND_ARGUMENT(MDS_DIRI+1,MDS_PATH)
530 MDS_PATH_LEN=LEN_TRIM(MDS_PATH)
531
532 ! check if -mdsdir has got an argument or if the next string is an input command
533 ULIBC=''
534 ULIBC(1:MDS_PATH_LEN) = MDS_PATH(1:MDS_PATH_LEN)
535 CALL UPCASE(ULIBC)
536 ISIN = 0
537 CALL ISANARGUMENT(ARGLIST,LENLIST,ULIBC,ISIN)
538
539 IF ( ISIN==1 )THEN
540 CALL GETARG(MDS_DIRI,ARGP)
541 STRLN=LEN_TRIM(ARGP)
542 CALL PHELPINFO(1,ARGP,STRLN)
543 CALL ARRET(7)
544 ENDIF
545
546 ENDIF ! IF (MDS_DIRI+1 > ARGN) THEN
547 ENDIF
548
549
subroutine upcase(string)
integer, parameter infile_char_len
character(len=outfile_char_len) outfile_name
character(len=infile_char_len) infile_name
integer, parameter outfile_char_len