home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / m2posx14 / src / tim.dpp < prev    next >
Encoding:
Modula Definition  |  1994-05-29  |  18.1 KB  |  349 lines

  1. DEFINITION MODULE tim;
  2. __DEF_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (****************************************************************************)
  13. (* Funktionen, die Datumsausdruecke verarbeiten.                            *)
  14. (*                                                                          *)
  15. (* Die Funktionen dieses Moduls sind nicht reentrant und koennen nicht      *)
  16. (* in Signalhandlern verwendet werden.                                      *)
  17. (* Wenn mit diesen Funktionen Zeiten bearbeitet werden, die in der Periode  *)
  18. (* zwischen Standard- und Sommerzeit bzw. umgekehrt liegen, ist das Ergebnis*)
  19. (* implementierungsabhaengig.                                               *)
  20. (* -------------------------------------------------------------------------*)
  21. (* 29-Mai-94, Holger Kleinschmidt                                           *)
  22. (****************************************************************************)
  23.  
  24. FROM types IMPORT
  25. (* TYPE *) int, long, double, sizeT, timeT, StrPtr;
  26.  
  27. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  28.  
  29. (* Bei POSIX wird zwischen der UTC (Coordinated Universal Time)-Zeit
  30.    (fruehere GMT-Zeit plus automatische Korrekturen) und der lokalen Zeit
  31.    unterschieden, die sich aus der Zeitzonendifferenz zu GMT und der evtl.
  32.    auftretenden Sommerzeit ergibt.
  33.  
  34.    Lokale Zeiten werden nie in Ausdruecken des Typs 'timeT' repraesentiert,
  35.    sondern immer in Ausdruecken des Typs 'TmRec', der eine Zeitangabe in
  36.    aufgeschluesselter Form enthaelt. Eine Zeit, die in einem Ausdruck des
  37.    Typs 'timeT' kodiert ist, ist immer eine Zeit in Sekunden seit
  38.    dem 1.1.1970 00:00:00 Uhr UTC bzw. GMT (dieser Zeitpunkt wird auch
  39.    die ``Epoche'' genannt),
  40.  
  41.    Eine Ausdruck des Typs 'TmRec' kann jedoch sowohl eine lokale als auch
  42.    eine UTC-Zeit enthalten.
  43.  
  44.    Also:
  45.  
  46.      'timeT': Sekunden seit dem 1.1.1970 00:00:00 UTC
  47.      'TmRec': Aufgeschluesselte lokale oder UTC-Zeit
  48.  
  49.  
  50.    Die Information, wie aus der lokalen Zeit die UTC-Zeit errechnet werden
  51.    kann (und umgekehrt), wird der Environmentvariablen TZ entnommen. Sie
  52.    enthaelt Namen der Zeitzonen, die zeitlichen Differenzen zur UTC-Zone
  53.    und Angaben ueber die Sommerzeit.
  54.  
  55.  
  56.    Format der Environmentvariable TZ:
  57.    ----------------------------------
  58.  
  59.    Beginnt mit Doppelpunkt:  TZ=:<imp. def.>  systemspezifisches Format
  60.  
  61.    Sonst: <std><offset1>[<dst>[<offset2>][,<rule>]]
  62.  
  63.    <std>: Drei oder mehr Zeichen, die weder Ziffern, Pluszeichen, Minuszeichen
  64.           oder Komma sind. Das erste Zeichen darf kein Doppelpunkt sein.
  65.           Name der Zeitzone ohne Sommerzeit.
  66.  
  67.    <dst>: Wie oben, aber optional. Name der Zeitzone mit Sommerzeit.
  68.  
  69.    <offset1>: <hh>[:<mm>[:<ss>]]
  70.      Zeit, die zur lokalen Zeit addiert werden muss, um UTC-Zeit zu erhalten.
  71.  
  72.      <hh>: Ein oder mehr Ziffern, optional mit fuehrendem Minuszeichen
  73.            (Zeitzone oestlich von UTC) oder Pluszeichen (Zeitzone westlich
  74.            von UTC). [0..24].
  75.  
  76.      <mm>: Ein oder mehr Ziffern, aber optional, dann gleich Null. [0..59].
  77.  
  78.      <ss>: Ein oder mehr Ziffern, aber optional, dann gleich Null. [0..59].
  79.  
  80.  
  81.    <offset2>: wie <offset1>, aber optional, dann eine Stunde weniger als
  82.               <offset1>
  83.  
  84.    <rule>: <start>[/<time>],end[/<time>] Beginn und Ende der Sommerzeit
  85.  
  86.      <start>: Datum des Starts der Sommerzeit
  87.  
  88.        | M<m>.<n>.<d>
  89.          (n-ter d-Tag im Monat m)
  90.          <m>: Nummer des Monats [1..12]
  91.          <n>: Woche im Monat [1..5].
  92.               1 <=> Erste (unvollstaendige) Woche mit einem <d>-Tag im
  93.                     im Monat <m>.
  94.               5 <=> Letzte (unvollstaendige) Woche mit einem <d>-Tag im
  95.                     Monat <m>; kann, je nach Monat, die vierte oder fuenfte
  96.                     Woche sein.
  97.          <d>: Tag der Woche [0..6], 0 <=> Sonntag
  98.  
  99.  
  100.        | J<n>: Julianischer Tag [1..365] im Jahr, es gibt KEINEN 29.2!
  101.  
  102.        | <n>: Julianischer Tag [0..365] im Jahr, es gibt einen 29.2
  103.  
  104.      <time>: Format wie <offset>, aber ohne Vorzeichen. Lokale Zeit der
  105.              Umstellung, optional, dann = 2:00:00 Uhr
  106.  
  107.              (Der Zeitpunkt der Umstellung von der Sommerzeit zurueck zur
  108.              ``normalen'' Zeit (Standardzeit) wird in der Sommerzeit
  109.              angegeben, d.h. die Umstellung findet dann z.B. um 2:00
  110.              Sommerzeit bzw. 1:00 normaler Zeit statt.)
  111.  
  112.      <end>: wie <start>
  113.  
  114.  
  115.    Falls TZ nicht gesetzt ist, werden systemspezifische Defaults verwendet.
  116.    Falls TZ gesetzt aber leer ist, wird die UTC-Zeitzone angenommen.
  117.  
  118.    Eine fuer Deutschland gueltige Beschreibung waere:
  119.  
  120.      TZ=MET-1:00:00MEST-2:00:00,M3.5.0/2:00:00,M9.5.0/3:00:00
  121.  
  122.      (Sommerzeit vom letzten Sonntag im Maerz bis zum letzten Sonntag
  123.      im September, Umschaltung jeweils zwei Uhr lokaler Standardzeit.)
  124.  
  125.    Das gleiche unter Ausnutzung von Defaultwerten:
  126.  
  127.      TZ=MET-1MEST,M3.5.0,M9.5.0/3
  128.  
  129. ==========================================================================
  130.  
  131. GEMDOS/MiNT:
  132.   Ausdruecke des Typs 'timeT' enthalten eine lokale Zeit. Solange aber nur
  133.   die Funktionen dieses Moduls zur Dekodierung herangezogen werden, entsteht
  134.   kein Problem. Als Folge davon muss eine Zeitzonenanpassung zwischen
  135.   lokaler und UTC-Zeit ausschliesslich bei "gmtime()" vorgenommen werden,
  136.   nicht jedoch bei den anderen Funktionen.
  137. *)
  138.  
  139. TYPE
  140.   TmRec = RECORD
  141.     tmSec    : int; (* Sekunden        [0..61] (+ 2 Schaltsekunden) *)
  142.     tmMin    : int; (* Minuten         [0..59] *)
  143.     tmHour   : int; (* Stunden         [0..23] *)
  144.     tmMDay   : int; (* Tag im Monat    [1..31] *)
  145.     tmMon    : int; (* Monat           [0..11] *)
  146.     tmYear   : int; (* Jahre seit 1900 [0..)   *)
  147.     tmWDay   : int; (* Wochentag       [0..6], 0 = Sonntag *)
  148.     tmYDay   : int; (* Tag im Jahr     [0..365], 1.Jan. = 0 *)
  149.     tmIsDst  : int; (* >0: im Augenblick gilt Sommerzeit,
  150.                        =0: im Augenblick gilt keine Sommerzeit,
  151.                        <0: keine Information ueber Sommerzeit vorhanden *)
  152.     (* Nicht POSIX: *)
  153.     tmGmtOff : long;(* Sekundendifferenz zwischen UTC und momentan
  154.                        gueltiger Zeitzone *)
  155.     tmZone   : StrPtr; (* Name der momentan gueltigen Zeitzone *)
  156.   END;
  157.  
  158.   TmPtr = POINTER TO TmRec;
  159.  
  160. VAR
  161.   (* tzname^[0]: Name der Zeitzone ohne Sommerzeit,
  162.    * tzname^[1]: Name der Zeitzone mit Sommerzeit
  163.    *)
  164.   tzname : ARRAY [0..1] OF StrPtr;
  165.  
  166. VAR (* Nicht POSIX: *)
  167.   timezone : long;
  168.     (* Sekunden Differenz zwischen GMT (UTC) und lokaler Standardzeit,
  169.        positiv wenn westlich von GMT *)
  170.   altzone  : long;
  171.     (* Sekunden Differenz zwischen GMT (UTC) und lokaler Sommerzeit
  172.        positiv wenn westlich von GMT *)
  173.   daylight : BOOLEAN;
  174.     (* Existiert eine Zeitzone mit Sommerzeit ? Sagt nicht aus, ob die
  175.        Sommerzeit im Augenblick gueltig ist. *)
  176.  
  177. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  178.  
  179. (* Nicht POSIX: *)
  180.  PROCEDURE difftime ((* EIN/ -- *) time2 : timeT;
  181.                      (* EIN/ -- *) time1 : timeT ): double;
  182.  
  183. (*--------------------------------------------------------------------------
  184.  | Liefert die Differenz von <time2> und <time1> in Sekunden.               |
  185.   --------------------------------------------------------------------------*)
  186.  
  187.  
  188.  
  189.  PROCEDURE tzset;
  190.  
  191. (*--------------------------------------------------------------------------
  192.  | Setzt den Inhalt von 'tzname', 'timezone', 'altzone' und 'daylight' aus  |
  193.  | der Environmentvariablen TZ.                                             |
  194.  | Die Prozedur wird automatisch von "ctime()", "localtime()", "strftime()" |
  195.  | und "mktime()" aufgerufen.                                               |
  196.   --------------------------------------------------------------------------*)
  197.  
  198.  
  199.  PROCEDURE localtime ((* EIN/ -- *) tm : timeT ): TmPtr;
  200.  
  201. (*--------------------------------------------------------------------------
  202.  | <tm> ist eine Zeit in Sekunden seit der ``Epoche''.Als Funktionswert wird|
  203.  | ein Zeiger auf eine interne Struktur vom Type 'TmRec' geliefert, in der  |
  204.  | die einzelnen Felder mit der lokalen Zeit belegt sind. Die Informationen |
  205.  | hierzu werden der Environmentvariablen TZ entnommen; existiert diese     |
  206.  | nicht, werden systemspezifische Defaultwerte benutzt.                    |
  207.  | Die interne Struktur wird mit jedem Aufruf von "localtime()" oder        |
  208.  | "gmtime()" ueberschrieben.                                               |
  209.  |                                                                          |
  210.  | GEMDOS/MiNT: Es findet keine Zeitzonenanpassung statt, da <tm> eine      |
  211.  |              lokale Zeit repraesentiert.                                 |
  212.   --------------------------------------------------------------------------*)
  213.  
  214.  PROCEDURE gmtime ((* EIN/ -- *) tm : timeT ): TmPtr;
  215.  
  216. (*--------------------------------------------------------------------------
  217.  | Wie "localtime()", aber die Felder sind mit der UTC-Zeit belegt, es      |
  218.  | findet also keine zeitliche Anpassung zwischen 'tm' und dem Ergebnis     |
  219.  | statt (TZ wird dann auch nicht benutzt).                                 |
  220.  |                                                                          |
  221.  | GEMDOS/MiNT: Es findet eine Zeitzonenanpassung mithilfe von TZ statt,    |
  222.  |              da <tm> eine lokale Zeit repraesentiert.                    |
  223.   --------------------------------------------------------------------------*)
  224.  
  225.  
  226.  PROCEDURE asctime ((* EIN/ -- *) tmrec : TmPtr ): StrPtr;
  227.  
  228. (*--------------------------------------------------------------------------
  229.  | Es wird ein Zeiger auf einen String zurueckgeliefert, der eine Reprae-   |
  230.  | sentation des Datums <tmrec> in englischer Sprache enthaelt. Das Format  |
  231.  | ist:                                                                     |
  232.  |                                                                          |
  233.  |   "Fri Apr 30 12:32:01 1994".                                            |
  234.  |                                                                          |
  235.  | Genauer gesagt wird das folgende ``C''-printf-Format verwendet:          |
  236.  |                                                                          |
  237.  |   "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n"                                     |
  238.  |                                                                          |
  239.  | D.h. die Stunden, Minuten und Sekunden werden mit mindestens zwei Ziffern|
  240.  | (evtl. fuehrende Null) ausgegeben, es koennen aber auch mehr sein (wenn  |
  241.  | die Werte in <tmrec> nicht im angegebenen Bereich liegen).               |
  242.  | Der String enthaelt als letztes Zeichen ein Linefeed (12C) und liegt in  |
  243.  | einem statischen Speicherbereich, der beim naechsten Aufruf der Prozedur |
  244.  | ueberschrieben wird.                                                     |
  245.  |                                                                          |
  246.  | GEMDOS/MiNT: Keine Besonderheiten.                                       |
  247.   --------------------------------------------------------------------------*)
  248.  
  249.  PROCEDURE ctime ((* EIN/ -- *) tm : timeT ): StrPtr;
  250.  
  251. (*--------------------------------------------------------------------------
  252.  | Aequivalent zu: asctime(localtime(<tm>)).                                |
  253.   --------------------------------------------------------------------------*)
  254.  
  255.  
  256.  PROCEDURE mktime ((* EIN/ -- *) tmrec : TmPtr ): timeT;
  257.  
  258. (*--------------------------------------------------------------------------
  259.  | Produziert aus der lokalen Zeit in <tmrec>^ eine UTC-Zeit, und ist damit |
  260.  | die Umkehrung zu "localtime()".                                          |
  261.  | Falls die Environmentvariable TZ nicht existiert, werden systemspezifi-  |
  262.  | sche Defaultwerte fuer die zeitliche Anpassung benutzt.                  |
  263.  | Falls <tmrec>^ in einzelnen Feldern Werte ausserhalb der Bereichsgrenzen |
  264.  | enthaelt, wird versucht, diese zu korrigieren, indem die Werte der       |
  265.  | anderen Felder entsprechend angepasst werden. Dies gilt fuer die Felder  |
  266.  | 'tmSec', 'tmMin', 'tmHour', 'tmMDay', 'tmMon' und 'tmYear'; die rest-    |
  267.  | lichen Felder werden immer neu gesetzt.                                  |
  268.  |                                                                          |
  269.  | GEMDOS/MiNT: Es findet keine Zeitzonenanpassung statt, da als Funktions- |
  270.  |              ergebnis eine lokale Zeit geliefert wird.                   |
  271.   --------------------------------------------------------------------------*)
  272.  
  273.  
  274.  PROCEDURE strftime ((* EIN/ -- *) buf     : StrPtr;
  275.                      (* EIN/ -- *) maxsize : sizeT;
  276.                      (* EIN/ -- *) format  : StrPtr;
  277.                      (* EIN/ -- *) tmrec   : TmPtr   ): sizeT;
  278.  
  279. (*--------------------------------------------------------------------------
  280.  | Wandelt die Zeit <tmrec>^ in einen String um. Der String wird nach <buf>^|
  281.  | geschrieben, <maxsize> ist der Platz in <buf>^ einschliesslich Nullbyte. |
  282.  | Als Funktionswert wird die Laenge des Strings geliefert, falls der Platz |
  283.  | ausgereicht hat, sonst wird Null geliefert, und der Inhalt von <buf>^ ist|
  284.  | undefiniert. Mit <format>^ wird festgelegt, wie der erzeugte String aus- |
  285.  | sehen soll, wobei Formatanweisungen aehnlich dem ``C''-printf verwendet  |
  286.  | werden:                                                                  |
  287.  | Nicht POSIX: Falls <buf> gleich NULL ist, wird nichts geschrieben, aber  |
  288.  | die Laenge des sonst erzeugten Strings zurueckgeliefert (wenn <maxsize>  |
  289.  | gross genug war).                                                        |
  290.  |                                                                          |
  291.  | Das Zeichen '%' leitet eine Formatanweisung ein, die durch genau ein     |
  292.  | weiteres Zeichen festgelegt wird; jede Formatanweisung wird durch die    |
  293.  | angegebene Zeichenkette ersetzt. Es gibt die folgenden Anweisungen:      |
  294.  |                                                                          |
  295.  | %a  Lokale Repraesentation des abgekuerzten Wochentags                   |
  296.  | %A  Lokale Repraesentation des vollen Wochentags                         |
  297.  | %b  Lokale Repraesentation des abgekuerzten Monats                       |
  298.  | %B  Lokale Repraesentation des vollen Monats                             |
  299.  | %c  Lokale Datums- und Zeitrepraesentation                               |
  300.  | %d  Tag des Monats als zweistellige Dezimalzahl im Bereich 01-31         |
  301.  | %H  Stunde als zweistellige Dezimalzahl im Bereich 00-23                 |
  302.  | %I  wie %H, aber im Bereich 01-12                                        |
  303.  | %j  Tag des Jahres als dreistellige Dezimalzahl im Bereich 001-366       |
  304.  | %m  Monat als zweistellige Dezimalzahl im Bereich 01-12                  |
  305.  | %M  Minute als zweistellige Dezimalzahl im Bereich 00-59                 |
  306.  | %p  Lokales Aequivalent zu A.M. bzw. P.M. (leer, falls nur 24h-Uhr)      |
  307.  | %S  Sekunde als zweistellige Dezimalzahl im Bereich 00-59                |
  308.  | %U  Woche des Jahres als zweistellige Dezimalzahl im Bereich 00-53.      |
  309.  |     Woche 01 ist die erste (vollstaendige) Woche im angegebenen Jahr, die|
  310.  |     mit einem Sonntag beginnt, Woche 00 enthaelt die Tage der unvoll-    |
  311.  |     staendigen Woche davor.                                              |
  312.  | %w  Wochentag als einstellige Dezimalzahl im Bereich 0-6, Sonntag = 0    |
  313.  | %W  Woche des Jahres als zweistellige Dezimalzahl im Bereich 00-53.      |
  314.  |     Woche 01 ist die erste (vollstaendige) Woche im angegebenen Jahr, die|
  315.  |     mit einem Montag beginnt, Woche 00 enthaelt die Tage der unvoll-     |
  316.  |     staendigen Woche davor.                                              |
  317.  | %x  Lokale Datumsrepraesentation                                         |
  318.  | %X  Lokale Zeitrepraesentation                                           |
  319.  | %y  Jahr als zweistellige Dezimalzahl im Bereich 00-99                   |
  320.  | %Y  Jahr inkl. Jahrhundertziffern                                        |
  321.  | %Z  Name der Zeitzone, falls bekannt, sonst leer                         |
  322.  | %%  Ein %-Zeichen                                                        |
  323.  |                                                                          |
  324.  | Die folgenden Formatanweisungen werden nicht von POSIX.1 unterstuetzt,   |
  325.  | aber vom POSIX.2-Programm 'date':                                        |
  326.  |                                                                          |
  327.  | %C  Jahrhundert als zweistellige Dezimalzahl                             |
  328.  | %D  wie %m/%d/%y                                                         |
  329.  | %e  wie %d, aber mit Leerzeichen statt fuehrender Null                   |
  330.  | %h  wie %b                                                               |
  331.  | %n  Linefeed                                                             |
  332.  | %r  wie %I:%M:%S %p                                                      |
  333.  | %T  wie %H:%M:%S                                                         |
  334.  | %t  Tabulator                                                            |
  335.  |                                                                          |
  336.  | Die folgenden Formatanweisungen werden nicht von POSIX unterstuetzt:     |
  337.  |                                                                          |
  338.  | %k  wie %H, aber mit Leerzeichen statt fuehrender Null                   |
  339.  | %l  wie %I, aber mit Leerzeichen statt fuehrender Null                   |
  340.  | %R  wie %H:%M                                                            |
  341.  |                                                                          |
  342.  | Alle Zeichen ausser '%' werden unveraendert von <format> nach <buf>^     |
  343.  | uebertragen.                                                             |
  344.  |                                                                          |
  345.  | GEMDOS/MiNT: Es wird nur das ``C/POSIX-Locale'' verwendet.               |
  346.   --------------------------------------------------------------------------*)
  347.  
  348. END tim.
  349.