[2403] | 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
|
---|