home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / pastrick / nls.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-02-22  |  4.3 KB  |  169 lines

  1. (* ****************************************************** *)
  2. (*                       NLS.PAS                          *)
  3. (*           National Language Support-Routinen           *)
  4. (*           (c) 1993 Andres Cvitkovich & DMV             *)
  5. (* ****************************************************** *)
  6. UNIT NLS;
  7.  
  8. INTERFACE
  9.  
  10. CONST
  11.   DATE_USA    = 0;
  12.   DATE_EUROPE = 1;
  13.   DATE_JAPAN  = 2;
  14.   TIME_12HOUR = 0;
  15.   TIME_24HOUR = 1;
  16.  
  17. TYPE
  18.   CountryInfo = Record
  19.                   ciDateFormat    : WORD;
  20.                   ciCurrency      : ARRAY [1..5] OF CHAR;
  21.                   ciThousands     : CHAR;
  22.                   ciASCIIZ_1      : BYTE;
  23.                   ciDecimal       : CHAR;
  24.                   ciASCIIZ_2      : BYTE;
  25.                   ciDateSep       : CHAR;
  26.                   ciASCIIZ_3      : BYTE;
  27.                   ciTimeSep       : CHAR;
  28.                   ciASCIIZ_4      : BYTE;
  29.                   ciBitField      : BYTE;
  30.                   ciCurrencyPlaces: BYTE;
  31.                   ciTimeFormat    : BYTE;
  32.                   ciCaseMap       : PROCEDURE;
  33.                   ciDataSep       : CHAR;
  34.                   ciASCIIZ_5      : BYTE;
  35.                   ciReserved      : ARRAY [1..10] OF BYTE;
  36.                 END;
  37.  
  38.   DateString = STRING [10];
  39.   TimeString = STRING [10];
  40.  
  41. VAR
  42.   Country : CountryInfo;
  43.  
  44.   FUNCTION GetCountryInfo(Buf : Pointer) : BOOLEAN;
  45.   FUNCTION DateStr(Year, Month, Day : WORD) : DateString;
  46.   FUNCTION TimeStr(Hour, Minute, Second : WORD): TimeString;
  47.   FUNCTION CurrentDate : DateString;
  48.   FUNCTION CurrentTime : TimeString;
  49.   FUNCTION AsciizToString(Asciiz : Pointer) : STRING;
  50.  
  51. IMPLEMENTATION
  52.  
  53. USES Dos;
  54.  
  55.   FUNCTION GetCountryInfo(Buf : Pointer) : BOOLEAN;
  56.   ASSEMBLER;
  57.   ASM
  58.     MOV  AX, 3800h
  59.     PUSH DS
  60.     LDS  DX, Buf
  61.     INT  21h
  62.     MOV  AL, TRUE
  63.     JNC  @@1
  64.     XOR  AL, AL
  65.   @@1:
  66.     POP  DS
  67.   END;
  68.  
  69.   FUNCTION DateStr(Year, Month, Day : WORD) : DateString;
  70.   VAR
  71.     dd, mm: STRING [2];
  72.     yy:     STRING [4];
  73.   BEGIN
  74.     Str(Day:2, dd);    IF dd[1] = ' ' THEN dd[1] := '0';
  75.     Str(Month:2, mm);  IF mm[1] = ' ' THEN mm[1] := '0';
  76.     Str(Year:4, yy);
  77.     CASE Country.ciDateFormat OF
  78.       DATE_USA:
  79.         DateStr := mm + Country.ciDateSep + dd +
  80.                         Country.ciDateSep + yy;
  81.       DATE_EUROPE:
  82.         DateStr := dd + Country.ciDateSep + mm +
  83.                         Country.ciDateSep + yy;
  84.       DATE_JAPAN:
  85.         DateStr := yy + Country.ciDateSep + mm +
  86.                         Country.ciDateSep + dd;
  87.     ELSE
  88.       DateStr := ''
  89.     END;
  90.   END;
  91.  
  92.   FUNCTION TimeStr(Hour, Minute, Second : WORD): TimeString;
  93.   VAR
  94.     hh,mm,ss : STRING [2];
  95.     ampm:      CHAR;
  96.   BEGIN
  97.     Str(Minute:2, mm);  IF mm[1] = ' ' THEN mm[1] := '0';
  98.     Str(Second:2, ss);  IF ss[1] = ' ' THEN ss[1] := '0';
  99.     Case Country.ciTimeFormat Of
  100.       TIME_12HOUR: BEGIN
  101.         IF Hour < 12 THEN ampm := 'a' ELSE ampm := 'p';
  102.         Hour := Hour MOD 12;
  103.         IF Hour = 0 THEN Hour := 12;  Str(Hour:2, hh);
  104.         TimeStr := hh + Country.ciTimeSep + mm +
  105.                         Country.ciTimeSep + ss + ampm + 'm'
  106.       END;
  107.     TIME_24HOUR: BEGIN
  108.       Str (Hour:2, hh);
  109.       TimeStr := hh + Country.ciTimeSep + mm +
  110.                       Country.ciTimeSep + ss
  111.     END;
  112.     ELSE
  113.      TimeStr := ''
  114.     END;
  115.   END;
  116.  
  117.   FUNCTION CurrentDate : DateString;
  118.   VAR
  119.     y, m, d, wd : WORD;
  120.   BEGIN
  121.     GetDate(y, m, d, wd);
  122.     CurrentDate := DateStr(y, m, d);
  123.   END;
  124.  
  125.   FUNCTION CurrentTime : TimeString;
  126.   VAR
  127.     h, m, s, s100 : WORD;
  128.   BEGIN
  129.     GetTime(h, m, s, s100);
  130.     CurrentTime := TimeStr(h, m, s);
  131.   END;
  132.  
  133.   FUNCTION AsciizToString(Asciiz : Pointer) : STRING;
  134.   Assembler;
  135.   ASM
  136.     PUSH DS
  137.     LES  DI, @Result
  138.     LDS  SI, Asciiz
  139.     CLD
  140.     PUSH DI
  141.     INC  DI
  142.     XOR  CL, CL
  143.   @@1:
  144.     LODSB
  145.     OR   AL, AL
  146.     JZ   @@2
  147.     STOSB
  148.     INC  CL
  149.     CMP  CL, 255
  150.     JB   @@1
  151.   @@2:
  152.     POP  DI
  153.     MOV  AL, CL
  154.     STOSB
  155.     POP  DS
  156.   END;
  157.  
  158.  
  159. BEGIN
  160.   IF NOT GetCountryInfo(@Country) THEN BEGIN
  161.      Country.ciDateFormat := DATE_USA;
  162.      Country.ciDateSep := '-';
  163.      Country.ciTimeFormat := TIME_12HOUR;
  164.      Country.ciTimeSep := ':';
  165.   END;
  166. END.
  167. (* ****************************************************** *)
  168. (*                  Ende von NLS.PAS                      *)
  169.