|
|
C $Id: dater.f 3304 2011-01-17 15:25:59Z brideout $
|
|
|
C
|
|
|
SUBROUTINE DATER(DATE,NCHAR,DAY,MONTH,YEAR,IER)
|
|
|
C
|
|
|
C SUBROUTINES DATER, MONAME, MONUM, WKNAME, IDAY, CALNDR, JDAY,
|
|
|
C JDATER, IZLR, IDMYCK AND DATES COMPRISE A COMPREHENSIVE DATE
|
|
|
C MANIPULATION
|
|
|
C PACKAGE. THE FOLLOWING VARIABLES APPEAR IN THE CALLING SEQUENCE
|
|
|
C OF ONE OR MORE SUBROUTINES. ALL ARE TYPED INTEGER. THE VALUE
|
|
|
C CORRESPONDING TO MARCH 1, 1977 IS SHOWN IN PARENTHESES.
|
|
|
C
|
|
|
C DAY - DAY OF THE MONTH (1)
|
|
|
C MONTH - MONTH NUMBER (3)
|
|
|
C YEAR - YEAR (1977)
|
|
|
C DAYNO - DAY OF THE YEAR (60)
|
|
|
C JDAYNO - JULIAN DAY NUMBER (2443204)
|
|
|
C WDAY - WEEKDAY NUMBER (3)
|
|
|
C DATE - DATE AS A STRING OF ALPHANUMERIC CHARS, 3 CHARS/WORD.
|
|
|
C WHEN AN INPUT VARIABLE, DATE MAY BE IN ANY REASONABLE
|
|
|
C FORMAT, E.G. MARCH 1 1977, 3/1/77, ETC. IF EXPRESSED
|
|
|
C AS THREE NUMERIC FIELDS, ORDER IS PRESUMED TO BE
|
|
|
C MONTH, DAY, YEAR. WHEN AN OUTPUT VARIABLE, THE FORMAT
|
|
|
C IS DETERMINED BY IOPT, AND SIX WORDS SHOULD BE
|
|
|
C RESERVED IN THE CALLING PROGRAM.
|
|
|
C
|
|
|
C MSTR - MONTH, AS A STRING OF UPPER CASE ALPHABETIC
|
|
|
C CHARACTERS, 3 CHARACTERS/WORD. THREE WORDS SHOULD BE
|
|
|
C RESERVED IN THE CALLING PROGRAM. (MARCH)
|
|
|
C WSTR - DAY OF THE WEEK, AS A STRING OF UPPER CASE ALPHABETIC
|
|
|
C CHARACTERS, 3 CHARACTERS/WORD. THREE WORDS SHOULD BE
|
|
|
C RESERVED IN THE CALLING PROGRAM. (TUESDAY)
|
|
|
C IOPT - FORMAT INDICATOR WHEN DATE IS AN OUTPUT VARIABLE
|
|
|
C 1 - 03/01/77
|
|
|
C 3 - 01,MAR,1977
|
|
|
C 4 - 1 MARCH, 1977
|
|
|
C 5 - MARCH 1, 1977
|
|
|
C NCHAR - NUMBER OF CHARACTERS TO BE SCANNED IN AN INPUT STRING.
|
|
|
C IER - ERROR INDICATOR. IER IS RETURNED BY ALL ROUTINES IN
|
|
|
C THE PACKAGE. IER=0 IF NO ERRORS ARE DETECTED. IER=1
|
|
|
C IF AN ERROR IS DETECTED.
|
|
|
C
|
|
|
C .. Scalar Arguments ..
|
|
|
INTEGER DAY,IER,MONTH,NCHAR,YEAR
|
|
|
CHARACTER*(*) DATE
|
|
|
C ..
|
|
|
C .. Local Scalars ..
|
|
|
INTEGER I,IA,ICH,IFLAST,IOS,J,JCHAR,MCHAR,N,NA,NI
|
|
|
CHARACTER*4 CFMT
|
|
|
CHARACTER*9 ITEMP
|
|
|
CHARACTER*12 NUMER
|
|
|
CHARACTER*27 IALPH
|
|
|
C ..
|
|
|
C .. Local Arrays ..
|
|
|
INTEGER IFIELD(4,3),IT(3)
|
|
|
C ..
|
|
|
C .. External Functions ..
|
|
|
INTEGER IDMYCK
|
|
|
EXTERNAL IDMYCK
|
|
|
C ..
|
|
|
C .. External Subroutines ..
|
|
|
EXTERNAL MONUM
|
|
|
C ..
|
|
|
C .. Intrinsic Functions ..
|
|
|
INTRINSIC CHAR,ICHAR,MIN0
|
|
|
C ..
|
|
|
C .. Data statements ..
|
|
|
DATA IALPH/'ABCDEFGHIJKLMNOPQRSTUVWXYZ '/
|
|
|
DATA NUMER/'0123456789 '/
|
|
|
DATA CFMT/'(I )'/
|
|
|
C ..
|
|
|
IER = 0
|
|
|
IA = 0
|
|
|
IOS = 0
|
|
|
C .....DETERMINE FIRST THREE ALPHANUMERIC FIELDS.....
|
|
|
N = 1
|
|
|
IFLAST = 3
|
|
|
DO 40 I = 1,NCHAR + 1
|
|
|
IF (I.EQ.NCHAR+1) GO TO 30
|
|
|
DO 10 J = 1,10
|
|
|
IF (DATE(I:I).NE.NUMER(J:J)) GO TO 10
|
|
|
IF (IFLAST.EQ.1) GO TO 40
|
|
|
IF (N.GT.3) THEN
|
|
|
IER = 1
|
|
|
RETURN
|
|
|
END IF
|
|
|
IFIELD(1,N) = 1
|
|
|
IFIELD(2,N) = I
|
|
|
IF (IFLAST.NE.3 .AND. N.GT.1) IFIELD(3,N-1) = I - 1
|
|
|
IFLAST = 1
|
|
|
N = N + 1
|
|
|
GO TO 30
|
|
|
10 CONTINUE
|
|
|
C .....ALPHABETIC FIELDS.....
|
|
|
DO 20 J = 1,26
|
|
|
C IF (DATE(I:I).NE.IALPH(J:J)) GO TO 30
|
|
|
IF (DATE(I:I).NE.IALPH(J:J) .AND.
|
|
|
* CHAR(ICHAR(DATE(I:I))-32).NE.IALPH(J:J)) GO TO 20
|
|
|
IF (IFLAST.EQ.2) GO TO 40
|
|
|
IF (N.GT.3) THEN
|
|
|
IER = 1
|
|
|
RETURN
|
|
|
END IF
|
|
|
IFIELD(1,N) = 2
|
|
|
IFIELD(2,N) = I
|
|
|
IF (IFLAST.NE.3 .AND. N.GT.1) IFIELD(3,N-1) = I - 1
|
|
|
IFLAST = 2
|
|
|
N = N + 1
|
|
|
GO TO 30
|
|
|
20 CONTINUE
|
|
|
C .....OTHER FIELDS.....
|
|
|
IF (IFLAST.NE.3 .AND. N.GT.1) IFIELD(3,N-1) = I - 1
|
|
|
IFLAST = 3
|
|
|
30 IF (N.EQ.5 .OR. N.EQ.4 .AND. IFLAST.EQ.3) GO TO 50
|
|
|
40 CONTINUE
|
|
|
IFIELD(3,3) = NCHAR
|
|
|
50 IF (N.LT.4) GO TO 160
|
|
|
C
|
|
|
NA = 0
|
|
|
NI = 0
|
|
|
DO 70 I = 1,3
|
|
|
IFIELD(4,I) = 0
|
|
|
IF (IFIELD(1,I).EQ.2) GO TO 60
|
|
|
NI = NI + 1
|
|
|
GO TO 70
|
|
|
60 NA = NA + 1
|
|
|
IA = I
|
|
|
70 CONTINUE
|
|
|
IF (NA.EQ.1) GO TO 80
|
|
|
IF (NA.EQ.0) GO TO 100
|
|
|
GO TO 160
|
|
|
C
|
|
|
80 IFIELD(4,IA) = 2
|
|
|
ICH = IFIELD(2,IA)
|
|
|
MCHAR = IFIELD(3,IA) - IFIELD(2,IA) + 1
|
|
|
MCHAR = MIN0(MCHAR,12)
|
|
|
DO 90 I = 1,MCHAR
|
|
|
JCHAR = ICH + I - 1
|
|
|
ITEMP(I:I) = DATE(JCHAR:JCHAR)
|
|
|
90 CONTINUE
|
|
|
CALL MONUM(ITEMP,MONTH,IER)
|
|
|
IF (MONTH.LT.1 .OR. MONTH.GT.12) GO TO 160
|
|
|
GO TO 110
|
|
|
C
|
|
|
100 IFIELD(4,1) = 2
|
|
|
WRITE (UNIT=CFMT(3:3),FMT='(I1)') IFIELD(3,1) - IFIELD(2,1) + 1
|
|
|
READ (UNIT=DATE(IFIELD(2,1) :IFIELD(3,1)),FMT=CFMT,
|
|
|
* IOSTAT=IOS) MONTH
|
|
|
IF (IOS.NE.0 .OR. MONTH.LT.1 .OR. MONTH.GT.12) GO TO 160
|
|
|
110 J = 0
|
|
|
DO 120 I = 1,3
|
|
|
IF (IFIELD(4,I).EQ.2) GO TO 120
|
|
|
J = J + 1
|
|
|
WRITE (UNIT=CFMT(3:3),FMT='(I1)') IFIELD(3,I) - IFIELD(2,I) + 1
|
|
|
READ (UNIT=DATE(IFIELD(2,I) :IFIELD(3,I)),FMT=CFMT,
|
|
|
* IOSTAT=IOS) IT(J)
|
|
|
120 CONTINUE
|
|
|
IF (IOS.NE.0) GO TO 160
|
|
|
IF (IT(1).GT.31 .AND. IT(2).GT.31) GO TO 160
|
|
|
IF (IT(1).LT.0 .OR. IT(2).LT.0) GO TO 160
|
|
|
IF (IT(1).EQ.0 .AND. IT(2).EQ.0) GO TO 160
|
|
|
IF (IT(1).GT.31 .AND. IT(2).LE.31) GO TO 130
|
|
|
GO TO 140
|
|
|
130 DAY = IT(2)
|
|
|
YEAR = IT(1)
|
|
|
GO TO 150
|
|
|
140 DAY = IT(1)
|
|
|
YEAR = IT(2)
|
|
|
150 IF (YEAR.GE.0 .AND. YEAR.LE.99) THEN
|
|
|
IF (YEAR.GE.50 .AND. YEAR.LE.99) THEN
|
|
|
YEAR = 1900 + YEAR
|
|
|
ELSE
|
|
|
YEAR = 2000 + YEAR
|
|
|
END IF
|
|
|
END IF
|
|
|
GO TO 170
|
|
|
160 IER = 1
|
|
|
RETURN
|
|
|
170 IER = IDMYCK(DAY,MONTH,YEAR)
|
|
|
RETURN
|
|
|
C
|
|
|
END
|
|
|
|