| 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
 | 
|---|