(*
-------------------------------------------------------------------------------
@@@@@@@@@@@@@@@@@@@@*)  DEFINITION  MODULE  DateIO;  (*@@@@@@@@@@@@@@@@@@@@@@@@
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
| Kurzbeschreibung   | formatierte Ausgabe von Datum und Zeit                 |
|                    | formatfreie Eingabe von Datum und Zeit                 |
---------------------+---------------------------------------------------------
| Programm - Version |  1.0   |   Text - Version        |   V#001             |
---------------------+--------+-------------------------+----------------------
| Modulholder        |  WS    |   Urversion     |  WS   |   Januar 89         |
---------------------+---------------------------------------------------------
| System - Version   | OS-9, Miele-Modula-2 3.5                               |
---------------------+---------------------------------------------------------
| Copyright          | Freigegeben fuer nichtkommerzielle Nutzung             |
|                    |  durch Teilnehmer am EFFO                              |
---------------------+---------------------------------------------------------
| Hardware           | GEPARD 68010, 1 MByte RAM, 80Zeichen-Textkarte         |
---------------------+---------------------------------------------------------
| besondere Importe  |                                                        |
---------------------+---------------------------------------------------------
| Autoren            |  WS    | Werner Stehling, Seilerwis 3,                 |
|                    |        | CH-8606 Greifensee, Tel. 01/256 42 21         |
---------------------+---------------------------------------------------------
|   U P D A T E S    |                                                        |
----------------------                                                        |
|   Datum   Version  Autor  Bemerkungen                                       |
| --------  -------  -----  -----------                                       |
|                                                                             |
-------------------------------------------------------------------------------
| Modul-Beschreibung |                                                        |
----------------------                                                        |
|  form ist ein String, der das Ausgabeformat festlegt. Er wird               |
|  als Geruest fuer die Ausgabe verwendet, wobei alle Zeichen bis auf         |
|  einige Kombinationen unveraendert uebernommen werden. Die speziellen       |
|  Zeichenfolgen werden dabei durch die angegebeben Datums- oder Zeit-        |
|  informationen ersetzt. Folgende Moeglichkeiten sind fuer das Datum         |
|  vorgesehen:                                                                |
|                                                                             |
|  y2       : zweistellige Jahreszahl                                         |
|  y4       : vierstellige Jahreszahl                                         |
|                                                                             |
|  m2       : zweistellige Monatszahl                                         |
|  m3       : dreistelliger Monatsname                                        |
|  mv       : voller Monatsname                                               |
|                                                                             |
|  d2       : zweistellige Tageszahl                                          |
|  w3       : dreistelliger Wochentag                                         |
|  wv       : voller Wochentag                                                |
|                                                                             |
|  Beispiel: der Formatstring 'Zuerich, wv den d2. mv y2' ergibt              |
|    Zuerich, Freitag den 13. Januar 89                                       |
|  (das ist so etwas wie 'Print Using' in der Sprache, die wir alle kennen)   |
|                                                                             |
|  Fuer die Zeitinformation sind folgende Formate zulaessig:                  |
|                                                                             |
|  h12      : Stunde im 12-Stunden Format                                     |
|  h24      : Stunde im 24-Stunden Format                                     |
|  apm      : am/pm beim 12-Stunden Format, wird bei h24 ignoriert            |
|                                                                             |
|  min      : Minuten                                                         |
|  sec      : Sekunden                                                        |
|                                                                             |
|  Die Kodierung von date und time ist im Gregorianischen Format von OS-9     |
|  (siehe F$Time):                                                            |
|                                                                             |
|     Byte        date            time                                        |
|    ---------------------------------------------                            |
|      3         (year             00                                         |
|      2         (year CARDINAL   hour (0..23)                                |
|      1          month (1..12)   minute (0..59)                              |
|      0          day (1..31)     second (0..59)                              |
|                                                                             |
|  Wochentage und Monatsnamen koennen in 4 verschiedenen Sprachen ausgegeben  |
|  werden. Dabei besteht die Wahl zwischen dem ganzen Wort (Format mv / wv),  |
|  oder einer dreistelligen Abkuerzung (m3 / w3).                             |
|                                                                             |
|                 language        weekday                                     |
|    ---------------------------------------------                            |
|      0          Deutsch         Sonntag                                     |
|      1          Englisch        Montag                                      |
|      2          Franzoesisch    Dienstag                                    |
|      3          Italienisch     Mittwoch                                    |
|      4                          Donnerstag                                  |
|      5                          Freitag                                     |
|      6                          Samstag                                     |
|                                                                             |
|  Der Parameter space wird in der gleichen Bedeutung verwendet, wie bei den  |
|  Prozeduren des Moduls AreaIO (tatsaechlich wird die Prozedur WriteStr von  |
|  dort benutzt).                                                             |
|                                                                             |
|  Bei den Read-Prozeduren dient der Parameter form zwei Zwecken: er gibt     |
|  analog zu den Write-Prozeduren das Format fuer den Vorschlagswert an,      |
|  andererseits legen die reservierten Begriffe fuer die Datums- und Zeit-    |
|  informationen aber auch Zahl und Reihenfolge der Parameter fest. Die       |
|  eigentliche Eingabe kann dann in nahezu beliebigem freien Format erfolgen. |
|  Beispiel:                                                                  |
|     der Formatstring   'heute ist der d2.m2.y4'   schlaegt z.B. vor:        |
|     heute ist der 13. 1.1989           Folgende Strings werden dann bei der |
|                                        Eingabe akzeptiert:                  |
|     24 Februar 88                                                           |
|     nein, 11.ter okt 1643                                                   |
|                                                                             |
|  Die Eingabe wird erst verlassen, wenn alle Parameter richtig eingegeben    |
|  wurden. Der Monat kann als Zahl, dreistellige Abkuerzung oder mit vollem   |
|  Namen angegeben werden. Allerdings wird nur die angegebene Sprache         |
|  akzeptiert. Gross- oder Kleinschreibung wird nicht unterschieden.          |
|  Falls im Formatstring z.B. keine Tagesangabe vorgesehen war, wird der      |
|  Tag des Vorschlagsdatums beibehalten. Wurde z.B. der 31.1. auf Februar     |
|  geaendert, wird der letzte Tag des Februar zurueckgegeben. Schaltjahre     |
|  werden beruecksichtigt.                                                    |
|                                                                             |
|  Die Jahreszahl kann entweder vollstaendig oder mit ihren letzten zwei      |
|  Stellen eingegeben werden. Die Konstante shortyear entscheidet ueber das   |
|  zugehoerige Jahrhundert: 0..shortyear: 2000; shortyear..99: 1900. Deshalb  |
|  sind diese Prozeduren fuer Jahreszahlen 0..99 nicht ohne weiteres geeignet.|
|  Negative Jahreszahlen werden nicht unterstuetzt.                           |
|                                                                             |
|  Wie bei den Prozeduren aus AreaIO geben die Read-Prozeduren als Funktions- |
|  wert das Zeichen zurueck, mit dem die Routine verlassen wurde. Es stehen   |
|  die Editiermoeglichkeiten aus AreaIO zur Verfuegung.                       |
|                                                                             |
|  Die maximale Laenge des Outputs ist als maxstr im Implementation Teil      |
|  festgelegt.                                                                |
|                                                                             |
|                                                                             |
| W A R N U N G :                                                             |
| ===============                                                             |
| Die Ein- und Ausgabeprozeduren dieses Moduls und darauf aufbauender Module  |
| duerfen nur gemeinsam mit den I/O-Prozeduren aus Area und AreaIO verwendet  |
| werden, da ueber den Bildschirm-Inhalt und die Cursorpositionen separat     |
| Buch gefuehrt wird.                                                         |
-------------------------------------------------------------------------------
*)

FROM  SYSTEM    IMPORT  ADDRESS;

EXPORT  QUALIFIED       JulToGreg, DateStr, TimeStr, Weekday,
                        WriteDate, WriteToday, WriteTime, WriteNow,
                        ReadDate, ReadToday, ReadTime, ReadNow;

(*==========================================================================*)
(****   Konversions-Prozeduren                                           ****)
(*==========================================================================*)
(*--------------------------------------------------------------------------*)
   PROCEDURE  JulToGreg (VAR time, date : ADDRESS; sec, juldate : ADDRESS);

(*                  die in OS-9 fehlende Umwandlung vom Julianischen ins    *)
(*                  Gregorianische Datum                                    *) 
(* Achtung: die OS-9 Prozedur F$Julian geht um einen Tag nach.              *)
(*          JulToGreg verwendet ebenfalls dieses falsche Julianische Datum. *)
(*--------------------------------------------------------------------------*)
   PROCEDURE  DateStr (VAR form, s : ARRAY OF CHAR; date : ADDRESS;
                                                language : CARDINAL);

(*                  wandelt date mit Hilfe von form in s                    *)
(*--------------------------------------------------------------------------*)
   PROCEDURE  TimeStr (VAR form, s : ARRAY OF CHAR; time : ADDRESS);

(*                  wandelt time mit Hilfe von form in s                    *)
(*--------------------------------------------------------------------------*)
   PROCEDURE  Weekday (date : ADDRESS) : CARDINAL;
(*                  berechnet den Wochentag fuer date, 0 = Sonntag          *)

(*==========================================================================*)
(****   Ausgabe-Prozeduren                                               ****)
(*==========================================================================*)
(*--------------------------------------------------------------------------*)
   PROCEDURE  WriteDate (VAR form : ARRAY OF CHAR; date : ADDRESS;
                             language : CARDINAL; space : INTEGER);
(*--------------------------------------------------------------------------*)
   PROCEDURE  WriteToday (VAR form : ARRAY OF CHAR; 
                              language : CARDINAL; space : INTEGER);

(*                   wie WriteDate, das gegenwaertige Datum wird ausgegeben *)
(*--------------------------------------------------------------------------*)
   PROCEDURE  WriteTime (VAR form : ARRAY OF CHAR; time : ADDRESS;
                                                       space : INTEGER);
(*--------------------------------------------------------------------------*)
   PROCEDURE  WriteNow (VAR form : ARRAY OF CHAR; space : INTEGER);

(*              wie WriteTime, die gegenwaertige Systemzeit wird ausgegeben *)
(*==========================================================================*)
(****   Eingabe-Prozeduren                                               ****)
(*==========================================================================*)
   PROCEDURE  ReadDate (VAR form : ARRAY OF CHAR; VAR date : ADDRESS;
                                language : CARDINAL; space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
   PROCEDURE  ReadToday (VAR form : ARRAY OF CHAR; VAR date : ADDRESS;
                                 language : CARDINAL; space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
   PROCEDURE  ReadTime (VAR form : ARRAY OF CHAR; VAR time : ADDRESS;
                                                     space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)
   PROCEDURE  ReadNow (VAR form : ARRAY OF CHAR; VAR time : ADDRESS;
                                                    space : INTEGER) : CHAR;
(*--------------------------------------------------------------------------*)

END  DateIO.
