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