home *** CD-ROM | disk | FTP | other *** search
- (* ****************************************************** *)
- (* NLS.PAS *)
- (* National Language Support-Routinen *)
- (* (c) 1993 Andres Cvitkovich & DMV *)
- (* ****************************************************** *)
- UNIT NLS;
-
- INTERFACE
-
- CONST
- DATE_USA = 0;
- DATE_EUROPE = 1;
- DATE_JAPAN = 2;
- TIME_12HOUR = 0;
- TIME_24HOUR = 1;
-
- TYPE
- CountryInfo = Record
- ciDateFormat : WORD;
- ciCurrency : ARRAY [1..5] OF CHAR;
- ciThousands : CHAR;
- ciASCIIZ_1 : BYTE;
- ciDecimal : CHAR;
- ciASCIIZ_2 : BYTE;
- ciDateSep : CHAR;
- ciASCIIZ_3 : BYTE;
- ciTimeSep : CHAR;
- ciASCIIZ_4 : BYTE;
- ciBitField : BYTE;
- ciCurrencyPlaces: BYTE;
- ciTimeFormat : BYTE;
- ciCaseMap : PROCEDURE;
- ciDataSep : CHAR;
- ciASCIIZ_5 : BYTE;
- ciReserved : ARRAY [1..10] OF BYTE;
- END;
-
- DateString = STRING [10];
- TimeString = STRING [10];
-
- VAR
- Country : CountryInfo;
-
- FUNCTION GetCountryInfo(Buf : Pointer) : BOOLEAN;
- FUNCTION DateStr(Year, Month, Day : WORD) : DateString;
- FUNCTION TimeStr(Hour, Minute, Second : WORD): TimeString;
- FUNCTION CurrentDate : DateString;
- FUNCTION CurrentTime : TimeString;
- FUNCTION AsciizToString(Asciiz : Pointer) : STRING;
-
- IMPLEMENTATION
-
- USES Dos;
-
- FUNCTION GetCountryInfo(Buf : Pointer) : BOOLEAN;
- ASSEMBLER;
- ASM
- MOV AX, 3800h
- PUSH DS
- LDS DX, Buf
- INT 21h
- MOV AL, TRUE
- JNC @@1
- XOR AL, AL
- @@1:
- POP DS
- END;
-
- FUNCTION DateStr(Year, Month, Day : WORD) : DateString;
- VAR
- dd, mm: STRING [2];
- yy: STRING [4];
- BEGIN
- Str(Day:2, dd); IF dd[1] = ' ' THEN dd[1] := '0';
- Str(Month:2, mm); IF mm[1] = ' ' THEN mm[1] := '0';
- Str(Year:4, yy);
- CASE Country.ciDateFormat OF
- DATE_USA:
- DateStr := mm + Country.ciDateSep + dd +
- Country.ciDateSep + yy;
- DATE_EUROPE:
- DateStr := dd + Country.ciDateSep + mm +
- Country.ciDateSep + yy;
- DATE_JAPAN:
- DateStr := yy + Country.ciDateSep + mm +
- Country.ciDateSep + dd;
- ELSE
- DateStr := ''
- END;
- END;
-
- FUNCTION TimeStr(Hour, Minute, Second : WORD): TimeString;
- VAR
- hh,mm,ss : STRING [2];
- ampm: CHAR;
- BEGIN
- Str(Minute:2, mm); IF mm[1] = ' ' THEN mm[1] := '0';
- Str(Second:2, ss); IF ss[1] = ' ' THEN ss[1] := '0';
- Case Country.ciTimeFormat Of
- TIME_12HOUR: BEGIN
- IF Hour < 12 THEN ampm := 'a' ELSE ampm := 'p';
- Hour := Hour MOD 12;
- IF Hour = 0 THEN Hour := 12; Str(Hour:2, hh);
- TimeStr := hh + Country.ciTimeSep + mm +
- Country.ciTimeSep + ss + ampm + 'm'
- END;
- TIME_24HOUR: BEGIN
- Str (Hour:2, hh);
- TimeStr := hh + Country.ciTimeSep + mm +
- Country.ciTimeSep + ss
- END;
- ELSE
- TimeStr := ''
- END;
- END;
-
- FUNCTION CurrentDate : DateString;
- VAR
- y, m, d, wd : WORD;
- BEGIN
- GetDate(y, m, d, wd);
- CurrentDate := DateStr(y, m, d);
- END;
-
- FUNCTION CurrentTime : TimeString;
- VAR
- h, m, s, s100 : WORD;
- BEGIN
- GetTime(h, m, s, s100);
- CurrentTime := TimeStr(h, m, s);
- END;
-
- FUNCTION AsciizToString(Asciiz : Pointer) : STRING;
- Assembler;
- ASM
- PUSH DS
- LES DI, @Result
- LDS SI, Asciiz
- CLD
- PUSH DI
- INC DI
- XOR CL, CL
- @@1:
- LODSB
- OR AL, AL
- JZ @@2
- STOSB
- INC CL
- CMP CL, 255
- JB @@1
- @@2:
- POP DI
- MOV AL, CL
- STOSB
- POP DS
- END;
-
-
- BEGIN
- IF NOT GetCountryInfo(@Country) THEN BEGIN
- Country.ciDateFormat := DATE_USA;
- Country.ciDateSep := '-';
- Country.ciTimeFormat := TIME_12HOUR;
- Country.ciTimeSep := ':';
- END;
- END.
- (* ****************************************************** *)
- (* Ende von NLS.PAS *)