home *** CD-ROM | disk | FTP | other *** search
- THE DATE LIBRARY
-
- This package of routines :
- -- Allows a date to be entered in the relatively comfortable form of
- number/separator/number/separator/number -- eg: 10-22-80 or 1/1/77.
- The full year can also be entered [eg: 12-11-1980], although the
- leading numbers are stripped, which means that 12-11-1680 equals
- 12-11-1980.
- -- Can insist that the entered year be within a specified range,
- refusing to continue processing until the restrictions are
- complied with.
- -- Converts the entered date into a two-byte integer value [in the range
- 1..maxint] which reflects the total number of days between the entered
- date and Jan 1 of the program's base year. This means that calculations
- made using this value do not have to take into consideration the
- number of days in any given month -- or year for that matter.
- -- Breaks the date back into separate values for the month, date, year
- and day of week [Sun..Sat].
- -- Prepares the broken date into strings with the various names spelled
- out [eg: Thursday, January 1, 1981] or as a fixed eight place value
- [11-11-80]. In the former the day-of-week name can be omitted and/or
- names abbreviated and in the latter spaces can be substituted for
- leading zeroes for the month and date [ie: 01-01-81 or 1- 1-80].
-
- I have set the beast up in two forms: [1] separate .LIB modules for
- each routine, allowing them to be included in any Pascal program with
- the editor and [2] a complete external subprogram for separate compilation
- with ver 3.2 or later.
-
- The separate routines are:
-
- PROMPT PROMPT.LIB
- This is actually a general-purpose routine, but it is specifically called
- by GETDATE. PROMPT is passed a string, pads it to a specified length,
- and writes it to the console. It allows pretty data entry.
-
- MAKEDATE with GETDATE MAKEDATE.LIB
- RMAKEDATE with RGETDATE RMAKEDA.LIB
- Prompts the console to enter a date and returns the calculated integer
- value. RMAKEDATE is passed the minimum and maximum year values and
- checks to ensure that the entered value falls within the range.
- GETDATE and RGETDATE perform the actual data entry. When compiled
- separately they are not accessible to the main program but if included
- within the program text these names obviously cannot be used for other
- routines.
-
- BRKDATE BRKDATE.LIB
- Breaks the integer date value into the month, day, year and weekday.
- Note that the latter is in the range 0..6 rather than 1..7. Breakdate
- fully corrects for leap years.
-
- DASTRLONG DASTRLON.LIB
- DASTRSHORT DASTRSH.LIB
- DASTRFIXED DASTRFIX.LIB
- The names are admittedly crunched a bit, but that's to fit within the
- six-character name limit for separate compilation.
- Each function is passed a date value and returns a string in
- the appropriate format. They all use BRKDATE. DASTRLONG spells out all
- words while DASTRSHORT abbreviates the month and day name [but not with
- periods -- I think they're ugly]. In addition a boolean value WITHDAY
- is passed to indicate whether the day name is to be included [true] or
- omitted [false].
- DASTRFIXED returns the date in an eight-place fixed length
- format. The separator character is specified as a constant and can
- be changed if desired. The function includes a boolean parameter WITHSPACE
- which determines whether leading zeroes are converted into spaces or
- left as numeric characters.
-
- STRBYTE
- This routine is contained within DASTRFIX.LIB. It is passed a byte value
- and WITHSPACE and returns a two-place string equivalent. It is broken out
- in case it proves useful elsewhere in the program.
-
- ----------
-
- DATE.PAS has all of the date library routines plus PROMPT set up as an
- external module for separate compilation. Note, however, that it is
- necessary to change "progname" in the first line of the program to
- the name of the main program before it will properly compile. It also
- appears that the program names cannot exceed six characters [rather than
- just having only the first six be significant].
-
- DATE.LIB can then be inserted in the main program to provide the relevant
- external declarations. DATE.LIB includes declarations for LENGTH and
- SETLENGTH.
-
- Generally, the date routines require the following global type declarations:
- TYPE string255 = string 255;
- byte = 0..255;
- There are two important constants used in MAKEDATE, RMAKEDATE and BRKDATE.
- YRBASE is the base year, which equals 10 in the package as written.
- YRSPAN is the total number of years which constitute the acceptable
- maximum range of entries. This number is dicated by maxint and thus cannot
- exceed 89.
-
- This means that as written the routines can handle dates in the range
- 1910..1999. Since 1900 was not a leap year and there is no provision
- for dealing with that occurrence, 1901 [yrbase = 1] is the lowest possible
- base year. Since 2000 will be a leap year [wouldn't life be easier if
- the sun rose and set only 360 times a year and pi equalled three?] the
- routines could be extended beyond 1999, but the yr mod 100 statement
- within GETDATE and RGETDATE -- which permits dates to be entered
- 1-11-1980, if you're so moved -- would have to be modified to permit
- 00 to be higher than 99. I just didn't see any reason to clutter the
- program up with this business for a few more years.
-
- As long as two integer date values share a common base year they are
- directly comparable. This is an argument for sticking with just one
- base year for all purposes. Thus the difference between any two date
- values is the number of days between them. More importantly, your
- programs should have a much easier time of scanning through data to
- determine whether the records fall within a designate range -- and
- are thus eligible for further processing -- when that range is specified
- as a number of days -- 10, 30, 90, etc.
-
- It should also be noted that the string returned by DASTRFIXED with
- spaces passed as false can be used to create a CP/M file name if you have
- a series of data files which you want to keep broken down by date.
- Thus one set of files could be 01-11-80.ORD, 01-12-80.ORD, etc. if you
- wanted to keep, say, orders as a set of separate files.
-
- Please note that DATEFUNC.LIB includes declarations for LENGTH and
- SETLENGTH, since they are used within DATE.PAS, so these should not
- be declared elsewhere in the main module.
-
- The following global types are generally required:
- TYPE string255 = string 255;
- byte = 0..255;
-
- The datestring routines are all functions returning strings, which means
- that Pascal/Z ver 3.2 or later is required for proper compilation.
-
- ----------
-
- Scott Custin
- 2410 20th St NW #10
- Washington DC 20009
-
-