1 | *
|
---|
2 | * $Id: mncrck.F,v 1.1.1.1 2003-06-11 14:18:26 cmv Exp $
|
---|
3 | *
|
---|
4 | * $Log: not supported by cvs2svn $
|
---|
5 | * Revision 1.1.1.1 1996/03/07 14:31:29 mclareni
|
---|
6 | * Minuit
|
---|
7 | *
|
---|
8 | *
|
---|
9 | #include "minuit/pilot.h"
|
---|
10 | SUBROUTINE MNCRCK(CRDBUF,MAXCWD,COMAND,LNC,
|
---|
11 | + MXP, PLIST, LLIST,IERR,ISYSWR)
|
---|
12 | #include "minuit/d506dp.inc"
|
---|
13 | CC
|
---|
14 | CC Called from MNREAD.
|
---|
15 | CC Cracks the free-format input, expecting zero or more
|
---|
16 | CC alphanumeric fields (which it joins into COMAND(1:LNC))
|
---|
17 | CC followed by one or more numeric fields separated by
|
---|
18 | CC blanks and/or one comma. The numeric fields are put into
|
---|
19 | CC the LLIST (but at most MXP) elements of PLIST.
|
---|
20 | CC IERR = 0 if no errors,
|
---|
21 | CC = 1 if error(s).
|
---|
22 | CC Diagnostic messages are written to ISYSWR
|
---|
23 | CC
|
---|
24 | PARAMETER (MAXELM=25, MXLNEL=19)
|
---|
25 | CHARACTER*(*) COMAND, CRDBUF
|
---|
26 | CHARACTER CNUMER*13, CELMNT(MAXELM)*(MXLNEL), CNULL*15
|
---|
27 | DIMENSION LELMNT(MAXELM),PLIST(MXP)
|
---|
28 | DATA CNULL /')NULL STRING '/
|
---|
29 | DATA CNUMER/'123456789-.0+'/
|
---|
30 | IELMNT = 0
|
---|
31 | LEND = LEN(CRDBUF)
|
---|
32 | NEXTB = 1
|
---|
33 | IERR = 0
|
---|
34 | C . . . . loop over words CELMNT
|
---|
35 | 10 CONTINUE
|
---|
36 | DO 100 IPOS= NEXTB,LEND
|
---|
37 | IBEGIN = IPOS
|
---|
38 | IF (CRDBUF(IPOS:IPOS).EQ.' ') GO TO 100
|
---|
39 | IF (CRDBUF(IPOS:IPOS).EQ.',') GO TO 250
|
---|
40 | GO TO 150
|
---|
41 | 100 CONTINUE
|
---|
42 | GO TO 300
|
---|
43 | 150 CONTINUE
|
---|
44 | C found beginning of word, look for end
|
---|
45 | DO 180 IPOS = IBEGIN+1,LEND
|
---|
46 | IF (CRDBUF(IPOS:IPOS).EQ.' ') GO TO 250
|
---|
47 | IF (CRDBUF(IPOS:IPOS).EQ.',') GO TO 250
|
---|
48 | 180 CONTINUE
|
---|
49 | IPOS = LEND+1
|
---|
50 | 250 IEND = IPOS-1
|
---|
51 | IELMNT = IELMNT + 1
|
---|
52 | IF (IEND .GE. IBEGIN) THEN
|
---|
53 | CELMNT(IELMNT) = CRDBUF(IBEGIN:IEND)
|
---|
54 | ELSE
|
---|
55 | CELMNT(IELMNT) = CNULL
|
---|
56 | ENDIF
|
---|
57 | LELMNT(IELMNT) = IEND-IBEGIN+1
|
---|
58 | IF (LELMNT(IELMNT) .GT. MXLNEL) THEN
|
---|
59 | WRITE (ISYSWR, 253) CRDBUF(IBEGIN:IEND),CELMNT(IELMNT)
|
---|
60 | 253 FORMAT (' MINUIT WARNING: INPUT DATA WORD TOO LONG.'
|
---|
61 | + /' ORIGINAL:',A
|
---|
62 | + /' TRUNCATED TO:',A)
|
---|
63 | LELMNT(IELMNT) = MXLNEL
|
---|
64 | ENDIF
|
---|
65 | IF (IPOS .GE. LEND) GO TO 300
|
---|
66 | IF (IELMNT .GE. MAXELM) GO TO 300
|
---|
67 | C look for comma or beginning of next word
|
---|
68 | DO 280 IPOS= IEND+1,LEND
|
---|
69 | IF (CRDBUF(IPOS:IPOS) .EQ. ' ') GO TO 280
|
---|
70 | NEXTB = IPOS
|
---|
71 | IF (CRDBUF(IPOS:IPOS) .EQ. ',') NEXTB = IPOS+1
|
---|
72 | GO TO 10
|
---|
73 | 280 CONTINUE
|
---|
74 | C All elements found, join the alphabetic ones to
|
---|
75 | C form a command
|
---|
76 | 300 CONTINUE
|
---|
77 | NELMNT = IELMNT
|
---|
78 | COMAND = ' '
|
---|
79 | LNC = 1
|
---|
80 | PLIST(1) = 0.
|
---|
81 | LLIST = 0
|
---|
82 | IF (IELMNT .EQ. 0) GO TO 900
|
---|
83 | KCMND = 0
|
---|
84 | DO 400 IELMNT = 1, NELMNT
|
---|
85 | IF (CELMNT(IELMNT) .EQ. CNULL) GO TO 450
|
---|
86 | DO 350 IC= 1, 13
|
---|
87 | IF (CELMNT(IELMNT)(1:1) .EQ. CNUMER(IC:IC)) GO TO 450
|
---|
88 | 350 CONTINUE
|
---|
89 | IF (KCMND .GE. MAXCWD) GO TO 400
|
---|
90 | LEFT = MAXCWD-KCMND
|
---|
91 | LTOADD = LELMNT(IELMNT)
|
---|
92 | IF (LTOADD .GT. LEFT) LTOADD=LEFT
|
---|
93 | COMAND(KCMND+1:KCMND+LTOADD) = CELMNT(IELMNT)(1:LTOADD)
|
---|
94 | KCMND = KCMND + LTOADD
|
---|
95 | IF (KCMND .EQ. MAXCWD) GO TO 400
|
---|
96 | KCMND = KCMND + 1
|
---|
97 | COMAND(KCMND:KCMND) = ' '
|
---|
98 | 400 CONTINUE
|
---|
99 | LNC = KCMND
|
---|
100 | GO TO 900
|
---|
101 | 450 CONTINUE
|
---|
102 | LNC = KCMND
|
---|
103 | C . . . . we have come to a numeric field
|
---|
104 | LLIST = 0
|
---|
105 | DO 600 IFLD= IELMNT,NELMNT
|
---|
106 | LLIST = LLIST + 1
|
---|
107 | IF (LLIST .GT. MXP) THEN
|
---|
108 | NREQ = NELMNT-IELMNT+1
|
---|
109 | WRITE (ISYSWR,511) NREQ,MXP
|
---|
110 | 511 FORMAT (/' MINUIT WARNING IN MNCRCK: '/ ' COMMAND HAS INPUT',I5,
|
---|
111 | + ' NUMERIC FIELDS, BUT MINUIT CAN ACCEPT ONLY',I3)
|
---|
112 | GO TO 900
|
---|
113 | ENDIF
|
---|
114 | IF (CELMNT(IFLD) .EQ. CNULL) THEN
|
---|
115 | PLIST(LLIST) = 0.
|
---|
116 | ELSE
|
---|
117 | READ (CELMNT(IFLD), '(BN,F19.0)',ERR=575) PLIST(LLIST)
|
---|
118 | ENDIF
|
---|
119 | GO TO 600
|
---|
120 | 575 WRITE (ISYSWR,'(A,A,A)') ' FORMAT ERROR IN NUMERIC FIELD: "',
|
---|
121 | + CELMNT(IFLD)(1:LELMNT(IFLD)),'"'
|
---|
122 | IERR = 1
|
---|
123 | PLIST(LLIST) = 0.
|
---|
124 | 600 CONTINUE
|
---|
125 | C end loop over numeric fields
|
---|
126 | 900 CONTINUE
|
---|
127 | IF (LNC .LE. 0) LNC=1
|
---|
128 | RETURN
|
---|
129 | END
|
---|