' JUL2GRE$(0.0)  Convert Julian Date to Gregorian      04/05/1988-10/04/2004
' --------------------------------------------------------------------------
' Copyright (C) 1988-2004 by Vladimir Veytsel                  www.davar.net

' Type ---------------------------------------------------------------------

'    Function

' Description --------------------------------------------------------------

'    JUL2GRE$ function converts Julian date into Gregorian date format.

' Declaration --------------------------------------------------------------

'    DECLARE FUNCTION JUL2GRE$(Jul.Date$)

' Parameter ----------------------------------------------------------------

'    Jul.Date$  - Julian date in the form of YY-DDD or CCYY-DDD,
'                 where DDD is a day number within a year.

' Value --------------------------------------------------------------------

'    If specified Julian date is valid, i.e.:
'       it is non-empty and
'       it has length either of 6 or 8 characters and
'       it is DIGITAL (with the exception of date field delimiter) and
'       day number lies within range of 1-365
'       (or 1-366, considering specified year leap characteristic),
'       then MM-DD-YY or MM-DD-CCYY (date in Gregorian format) is returned
'            to the point of function invocation,
'       else "" (empty string) is returned to the point of invocation.

' Notes --------------------------------------------------------------------

'  - Delimiter of parameter date fields is irrelevant and can be any
'    symbol.  Date fields are extracted from fixed positions.

'  - EMPTY date is considered to be an INVALID one - Julian date
'    is an internal format that doesn't require a default.

' Examples -----------------------------------------------------------------

'    JUL2GRE$(""        )=""
'    JUL2GRE$("87-31"   )=""
'    JUL2GRE$("1987-31" )=""
'    JUL2GRE$("19*7-031")=""
'    JUL2GRE$("1988-0#1")=""
'    JUL2GRE$("87-000"  )=""
'    JUL2GRE$("87-366"  )=""
'    JUL2GRE$("1988-367")=""

'    JUL2GRE$("87-031"  )="01-31-87"
'    JUL2GRE$("87-059"  )="02-28-87"
'    JUL2GRE$("87-090"  )="03-31-87"
'    JUL2GRE$("87-120"  )="04-30-87"
'    JUL2GRE$("87-151"  )="05-31-87"
'    JUL2GRE$("87-181"  )="06-30-87"
'    JUL2GRE$("87-212"  )="07-31-87"
'    JUL2GRE$("87-243"  )="08-31-87"
'    JUL2GRE$("87-273"  )="09-30-87"
'    JUL2GRE$("87-304"  )="10-31-87"
'    JUL2GRE$("87-334"  )="11-30-87"
'    JUL2GRE$("87-365"  )="12-31-87"

'    JUL2GRE$("1988-031")="01-31-1988"
'    JUL2GRE$("1988-060")="02-29-1988"
'    JUL2GRE$("1988-091")="03-31-1988"
'    JUL2GRE$("1988-121")="04-30-1988"
'    JUL2GRE$("1988-152")="05-31-1988"
'    JUL2GRE$("1988-182")="06-30-1988"
'    JUL2GRE$("1988-213")="07-31-1988"
'    JUL2GRE$("1988-244")="08-31-1988"
'    JUL2GRE$("1988-274")="09-30-1988"
'    JUL2GRE$("1988-305")="10-31-1988"
'    JUL2GRE$("1988-335")="11-30-1988"
'    JUL2GRE$("1988-366")="12-31-1988"

' External Functions -------------------------------------------------------

     DECLARE FUNCTION DIGITAL%(Strng$,Delim$)
     DECLARE FUNCTION LEAP%   (Year$)

' Start Function -----------------------------------------------------------

     DEFINT A-Z  ' All defaulted variables are integer

     FUNCTION JUL2GRE$(Jul.Date$) PUBLIC

' Constant -----------------------------------------------------------------

     Month.Days$="31,28,31,30,31,30,31,31,30,31,30,31"

' Check Specified Date for Valid Length (6 or 8 Characters) ----------------

     IF ((LEN(Jul.Date$)&lt;>6)  AND _
         (LEN(Jul.Date$)&lt;>8)) THEN
        JUL2GRE$=""
        EXIT FUNCTION
     END IF

' Check Specified Date for Digital Value -----------------------------------

     IF (NOT(DIGITAL%(LEFT$(Jul.Date$,2-(LEN(Jul.Date$)=8))+ _
                     RIGHT$(Jul.Date$,3),""))) THEN
        JUL2GRE$=""
        EXIT FUNCTION
     END IF

' Parse Date to Be Converted -----------------------------------------------

     Year$=     LEFT$(Jul.Date$,2-2*(LEN(Jul.Date$)=8))
     Day  =VAL(RIGHT$(Jul.Date$,3))

' Check Day for Lying within Proper Borders --------------------------------

     IF (NOT((Day>0) AND _
             (Day&lt;366-LEAP%(Year$)))) THEN
        JUL2GRE$=""
        EXIT FUNCTION
     END IF

' Adjust Number of February Days for the Leap Year -------------------------

     IF (LEAP%(Year$)) THEN MID$(Month.Days$,5,1)="9"

' Compute Gregorian Month Number and Day -----------------------------------
 
     DD=Day
     FOR MM=1 TO 12
         MM.Days=VAL(MID$(Month.Days$,3*MM-2,2))
         IF (DD&lt;=MM.Days) THEN EXIT FOR
         DD=DD-MM.Days
     NEXT MM

' Form and Return Gregorian Date Value to the Point of Invocation ----------

     JUL2GRE$=RIGHT$("0"+LTRIM$(STR$(MM)),2)+"-"+ _
              RIGHT$("0"+LTRIM$(STR$(DD)),2)+"-"+Year$

' Finish.Function ----------------------------------------------------------

     END FUNCTION
