home *** CD-ROM | disk | FTP | other *** search
/ PC World Plus! (NZ) 2001 June / HDC50.iso / Runimage / Delphi50 / Doc / SYSUTILS.INT < prev    next >
Text File  |  1999-08-11  |  89KB  |  2,159 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Borland Delphi Runtime Library                  }
  5. {       System Utilities Unit                           }
  6. {                                                       }
  7. {       Copyright (C) 1995,99 Inprise Corporation       }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit SysUtils;
  12.  
  13. {$H+}
  14.  
  15. interface
  16.  
  17. uses Windows, SysConst;
  18.  
  19. const
  20.  
  21. { File open modes }
  22.  
  23.   fmOpenRead       = $0000;
  24.   fmOpenWrite      = $0001;
  25.   fmOpenReadWrite  = $0002;
  26.   fmShareCompat    = $0000;
  27.   fmShareExclusive = $0010;
  28.   fmShareDenyWrite = $0020;
  29.   fmShareDenyRead  = $0030;
  30.   fmShareDenyNone  = $0040;
  31.  
  32. { File attribute constants }
  33.  
  34.   faReadOnly  = $00000001;
  35.   faHidden    = $00000002;
  36.   faSysFile   = $00000004;
  37.   faVolumeID  = $00000008;
  38.   faDirectory = $00000010;
  39.   faArchive   = $00000020;
  40.   faAnyFile   = $0000003F;
  41.  
  42. { File mode magic numbers }
  43.  
  44.   fmClosed = $D7B0;
  45.   fmInput  = $D7B1;
  46.   fmOutput = $D7B2;
  47.   fmInOut  = $D7B3;
  48.  
  49. { Seconds and milliseconds per day }
  50.  
  51.   SecsPerDay = 24 * 60 * 60;
  52.   MSecsPerDay = SecsPerDay * 1000;
  53.  
  54. { Days between 1/1/0001 and 12/31/1899 }
  55.  
  56.   DateDelta = 693594;
  57.  
  58. type
  59.  
  60. { Standard Character set type }
  61.  
  62.   TSysCharSet = set of Char;
  63.  
  64. { Set access to an integer }
  65.  
  66.   TIntegerSet = set of 0..SizeOf(Integer) * 8 - 1;
  67.  
  68. { Type conversion records }
  69.  
  70.   WordRec = packed record
  71.     Lo, Hi: Byte;
  72.   end;
  73.  
  74.   LongRec = packed record
  75.     Lo, Hi: Word;
  76.   end;
  77.  
  78.   Int64Rec = packed record
  79.     Lo, Hi: DWORD;
  80.   end;
  81.  
  82.   TMethod = record
  83.     Code, Data: Pointer;
  84.   end;
  85.  
  86. { General arrays }
  87.  
  88.   PByteArray = ^TByteArray;
  89.   TByteArray = array[0..32767] of Byte;
  90.  
  91.   PWordArray = ^TWordArray;
  92.   TWordArray = array[0..16383] of Word;
  93.  
  94. { Generic procedure pointer }
  95.  
  96.   TProcedure = procedure;
  97.  
  98. { Generic filename type }
  99.  
  100.   TFileName = type string;
  101.  
  102. { Search record used by FindFirst, FindNext, and FindClose }
  103.  
  104.   TSearchRec = record
  105.     Time: Integer;
  106.     Size: Integer;
  107.     Attr: Integer;
  108.     Name: TFileName;
  109.     ExcludeAttr: Integer;
  110.     FindHandle: THandle;
  111.     FindData: TWin32FindData;
  112.   end;
  113.  
  114. { Typed-file and untyped-file record }
  115.  
  116.   TFileRec = packed record (* must match the size the compiler generates: 332 bytes *)
  117.     Handle: Integer;
  118.     Mode: Integer;
  119.     RecSize: Cardinal;
  120.     Private: array[1..28] of Byte;
  121.     UserData: array[1..32] of Byte;
  122.     Name: array[0..259] of Char;
  123.   end;
  124.  
  125. { Text file record structure used for Text files }
  126.  
  127.   PTextBuf = ^TTextBuf;
  128.   TTextBuf = array[0..127] of Char;
  129.   TTextRec = packed record (* must match the size the compiler generates: 460 bytes *)
  130.     Handle: Integer;
  131.     Mode: Integer;
  132.     BufSize: Cardinal;
  133.     BufPos: Cardinal;
  134.     BufEnd: Cardinal;
  135.     BufPtr: PChar;
  136.     OpenFunc: Pointer;
  137.     InOutFunc: Pointer;
  138.     FlushFunc: Pointer;
  139.     CloseFunc: Pointer;
  140.     UserData: array[1..32] of Byte;
  141.     Name: array[0..259] of Char;
  142.     Buffer: TTextBuf;
  143.   end;
  144.  
  145. { FloatToText, FloatToTextFmt, TextToFloat, and FloatToDecimal type codes }
  146.  
  147.   TFloatValue = (fvExtended, fvCurrency);
  148.  
  149. { FloatToText format codes }
  150.  
  151.   TFloatFormat = (ffGeneral, ffExponent, ffFixed, ffNumber, ffCurrency);
  152.  
  153. { FloatToDecimal result record }
  154.  
  155.   TFloatRec = packed record
  156.     Exponent: Smallint;
  157.     Negative: Boolean;
  158.     Digits: array[0..20] of Char;
  159.   end;
  160.  
  161. { Date and time record }
  162.  
  163.   TTimeStamp = record
  164.     Time: Integer;      { Number of milliseconds since midnight }
  165.     Date: Integer;      { One plus number of days since 1/1/0001 }
  166.   end;
  167.  
  168. { MultiByte Character Set (MBCS) byte type }
  169.   TMbcsByteType = (mbSingleByte, mbLeadByte, mbTrailByte);
  170.  
  171. { System Locale information record }
  172.   TSysLocale = packed record
  173.     DefaultLCID: LCID;
  174.     PriLangID: LANGID;
  175.     SubLangID: LANGID;
  176.     FarEast: Boolean;
  177.     MiddleEast: Boolean;
  178.   end;
  179.  
  180. { This is used by TLanguages }
  181.   TLangRec = packed record
  182.     FName: string;
  183.     FLCID: LCID;
  184.     FExt: string;
  185.   end;
  186.  
  187. { This stores the langauges that the system supports }
  188.   TLanguages = class
  189.   public
  190.     constructor Create;
  191.     function IndexOf(ID: LCID): Integer;
  192.     property Count: Integer;
  193.     property Name[Index: Integer]: string;
  194.     property NameFromLocaleID[ID: LCID]: string;
  195.     property NameFromLCID[const ID: string]: string;
  196.     property ID[Index: Integer]: string;
  197.     property LocaleID[Index: Integer]: LCID;
  198.     property Ext[Index: Integer]: string;
  199.   end;
  200.  
  201. { Exceptions }
  202.  
  203.   Exception = class(TObject)
  204.   public
  205.     constructor Create(const Msg: string);
  206.     constructor CreateFmt(const Msg: string; const Args: array of const);
  207.     constructor CreateRes(Ident: Integer); overload;
  208.     constructor CreateRes(ResStringRec: PResStringRec); overload;
  209.     constructor CreateResFmt(Ident: Integer; const Args: array of const); overload;
  210.     constructor CreateResFmt(ResStringRec: PResStringRec; const Args: array of const); overload;
  211.     constructor CreateHelp(const Msg: string; AHelpContext: Integer);
  212.     constructor CreateFmtHelp(const Msg: string; const Args: array of const;
  213.       AHelpContext: Integer);
  214.     constructor CreateResHelp(Ident: Integer; AHelpContext: Integer); overload;
  215.     constructor CreateResHelp(ResStringRec: PResStringRec; AHelpContext: Integer); overload;
  216.     constructor CreateResFmtHelp(ResStringRec: PResStringRec; const Args: array of const;
  217.       AHelpContext: Integer); overload;
  218.     constructor CreateResFmtHelp(Ident: Integer; const Args: array of const;
  219.       AHelpContext: Integer); overload;
  220.     property HelpContext: Integer;
  221.     property Message: string;
  222.   end;
  223.  
  224.   ExceptClass = class of Exception;
  225.  
  226.   EAbort = class(Exception);
  227.  
  228.   EHeapException = class(Exception)
  229.   public
  230.     procedure FreeInstance; override;
  231.   end;
  232.  
  233.   EOutOfMemory = class(EHeapException);
  234.  
  235.   EInOutError = class(Exception)
  236.   public
  237.     ErrorCode: Integer;
  238.   end;
  239.  
  240.   EExternal = class(Exception)
  241.   public
  242.     ExceptionRecord: PExceptionRecord;
  243.   end;
  244.  
  245.   EExternalException = class(EExternal);
  246.  
  247.   EIntError = class(EExternal);
  248.   EDivByZero = class(EIntError);
  249.   ERangeError = class(EIntError);
  250.   EIntOverflow = class(EIntError);
  251.  
  252.   EMathError = class(EExternal);
  253.   EInvalidOp = class(EMathError);
  254.   EZeroDivide = class(EMathError);
  255.   EOverflow = class(EMathError);
  256.   EUnderflow = class(EMathError);
  257.  
  258.   EInvalidPointer = class(EHeapException);
  259.  
  260.   EInvalidCast = class(Exception);
  261.  
  262.   EConvertError = class(Exception);
  263.  
  264.   EAccessViolation = class(EExternal);
  265.   EPrivilege = class(EExternal);
  266.   EStackOverflow = class(EExternal);
  267.   EControlC = class(EExternal);
  268.  
  269.   EVariantError = class(Exception);
  270.  
  271.   EPropReadOnly = class(Exception);
  272.   EPropWriteOnly = class(Exception);
  273.  
  274.   EAssertionFailed = class(Exception);
  275.  
  276.   EAbstractError = class(Exception);
  277.  
  278.   EIntfCastError = class(Exception);
  279.  
  280.   EInvalidContainer = class(Exception);
  281.   EInvalidInsert = class(Exception);
  282.  
  283.   EPackageError = class(Exception);
  284.  
  285.   EWin32Error = class(Exception)
  286.   public
  287.     ErrorCode: DWORD;
  288.   end;
  289.  
  290.   ESafecallException = class(Exception);
  291.  
  292. var
  293.  
  294. { Empty string and null string pointer. These constants are provided for
  295.   backwards compatibility only.  }
  296.  
  297.   EmptyStr: string = '';
  298.   NullStr: PString = @EmptyStr;
  299.  
  300. { Win32 platform identifier.  This will be one of the following values:
  301.  
  302.     VER_PLATFORM_WIN32s
  303.     VER_PLATFORM_WIN32_WINDOWS
  304.     VER_PLATFORM_WIN32_NT
  305.  
  306.   See WINDOWS.PAS for the numerical values. }
  307.  
  308.   Win32Platform: Integer = 0;
  309.  
  310. { Win32 OS version information -
  311.  
  312.   see TOSVersionInfo.dwMajorVersion/dwMinorVersion/dwBuildNumber }
  313.  
  314.   Win32MajorVersion: Integer = 0;
  315.   Win32MinorVersion: Integer = 0;
  316.   Win32BuildNumber: Integer = 0;
  317.  
  318. { Win32 OS extra version info string -
  319.  
  320.   see TOSVersionInfo.szCSDVersion }
  321.  
  322.   Win32CSDVersion: string = '';
  323.  
  324. { Currency and date/time formatting options
  325.  
  326.   The initial values of these variables are fetched from the system registry
  327.   using the GetLocaleInfo function in the Win32 API. The description of each
  328.   variable specifies the LOCALE_XXXX constant used to fetch the initial
  329.   value.
  330.  
  331.   CurrencyString - Defines the currency symbol used in floating-point to
  332.   decimal conversions. The initial value is fetched from LOCALE_SCURRENCY.
  333.  
  334.   CurrencyFormat - Defines the currency symbol placement and separation
  335.   used in floating-point to decimal conversions. Possible values are:
  336.  
  337.     0 = '$1'
  338.     1 = '1$'
  339.     2 = '$ 1'
  340.     3 = '1 $'
  341.  
  342.   The initial value is fetched from LOCALE_ICURRENCY.
  343.  
  344.   NegCurrFormat - Defines the currency format for used in floating-point to
  345.   decimal conversions of negative numbers. Possible values are:
  346.  
  347.     0 = '($1)'      4 = '(1$)'      8 = '-1 $'      12 = '$ -1'
  348.     1 = '-$1'       5 = '-1$'       9 = '-$ 1'      13 = '1- $'
  349.     2 = '$-1'       6 = '1-$'      10 = '1 $-'      14 = '($ 1)'
  350.     3 = '$1-'       7 = '1$-'      11 = '$ 1-'      15 = '(1 $)'
  351.  
  352.   The initial value is fetched from LOCALE_INEGCURR.
  353.  
  354.   ThousandSeparator - The character used to separate thousands in numbers
  355.   with more than three digits to the left of the decimal separator. The
  356.   initial value is fetched from LOCALE_STHOUSAND.
  357.  
  358.   DecimalSeparator - The character used to separate the integer part from
  359.   the fractional part of a number. The initial value is fetched from
  360.   LOCALE_SDECIMAL.
  361.  
  362.   CurrencyDecimals - The number of digits to the right of the decimal point
  363.   in a currency amount. The initial value is fetched from LOCALE_ICURRDIGITS.
  364.  
  365.   DateSeparator - The character used to separate the year, month, and day
  366.   parts of a date value. The initial value is fetched from LOCATE_SDATE.
  367.  
  368.   ShortDateFormat - The format string used to convert a date value to a
  369.   short string suitable for editing. For a complete description of date and
  370.   time format strings, refer to the documentation for the FormatDate
  371.   function. The short date format should only use the date separator
  372.   character and the  m, mm, d, dd, yy, and yyyy format specifiers. The
  373.   initial value is fetched from LOCALE_SSHORTDATE.
  374.  
  375.   LongDateFormat - The format string used to convert a date value to a long
  376.   string suitable for display but not for editing. For a complete description
  377.   of date and time format strings, refer to the documentation for the
  378.   FormatDate function. The initial value is fetched from LOCALE_SLONGDATE.
  379.  
  380.   TimeSeparator - The character used to separate the hour, minute, and
  381.   second parts of a time value. The initial value is fetched from
  382.   LOCALE_STIME.
  383.  
  384.   TimeAMString - The suffix string used for time values between 00:00 and
  385.   11:59 in 12-hour clock format. The initial value is fetched from
  386.   LOCALE_S1159.
  387.  
  388.   TimePMString - The suffix string used for time values between 12:00 and
  389.   23:59 in 12-hour clock format. The initial value is fetched from
  390.   LOCALE_S2359.
  391.  
  392.   ShortTimeFormat - The format string used to convert a time value to a
  393.   short string with only hours and minutes. The default value is computed
  394.   from LOCALE_ITIME and LOCALE_ITLZERO.
  395.  
  396.   LongTimeFormat - The format string used to convert a time value to a long
  397.   string with hours, minutes, and seconds. The default value is computed
  398.   from LOCALE_ITIME and LOCALE_ITLZERO.
  399.  
  400.   ShortMonthNames - Array of strings containing short month names. The mmm
  401.   format specifier in a format string passed to FormatDate causes a short
  402.   month name to be substituted. The default values are fecthed from the
  403.   LOCALE_SABBREVMONTHNAME system locale entries.
  404.  
  405.   LongMonthNames - Array of strings containing long month names. The mmmm
  406.   format specifier in a format string passed to FormatDate causes a long
  407.   month name to be substituted. The default values are fecthed from the
  408.   LOCALE_SMONTHNAME system locale entries.
  409.  
  410.   ShortDayNames - Array of strings containing short day names. The ddd
  411.   format specifier in a format string passed to FormatDate causes a short
  412.   day name to be substituted. The default values are fecthed from the
  413.   LOCALE_SABBREVDAYNAME system locale entries.
  414.  
  415.   LongDayNames - Array of strings containing long day names. The dddd
  416.   format specifier in a format string passed to FormatDate causes a long
  417.   day name to be substituted. The default values are fecthed from the
  418.   LOCALE_SDAYNAME system locale entries.
  419.  
  420.   ListSeparator - The character used to separate items in a list.  The
  421.   initial value is fetched from LOCALE_SLIST.
  422.  
  423.   TwoDigitYearCenturyWindow - Determines what century is added to two
  424.   digit years when converting string dates to numeric dates.  This value
  425.   is subtracted from the current year before extracting the century.
  426.   This can be used to extend the lifetime of existing applications that
  427.   are inextricably tied to 2 digit year data entry.  The best solution
  428.   to Year 2000 (Y2k) issues is not to accept 2 digit years at all - require
  429.   4 digit years in data entry to eliminate century ambiguities.
  430.  
  431.   Examples:
  432.  
  433.   Current TwoDigitCenturyWindow  Century  StrToDate() of:
  434.   Year    Value                  Pivot    '01/01/03' '01/01/68' '01/01/50'
  435.   -------------------------------------------------------------------------
  436.   1998    0                      1900     1903       1968       1950
  437.   2002    0                      2000     2003       2068       2050
  438.   1998    50 (default)           1948     2003       1968       1950
  439.   2002    50 (default)           1952     2003       1968       2050
  440.   2020    50 (default)           1970     2003       2068       2050
  441.  }
  442.  
  443. var
  444.   CurrencyString: string;
  445.   CurrencyFormat: Byte;
  446.   NegCurrFormat: Byte;
  447.   ThousandSeparator: Char;
  448.   DecimalSeparator: Char;
  449.   CurrencyDecimals: Byte;
  450.   DateSeparator: Char;
  451.   ShortDateFormat: string;
  452.   LongDateFormat: string;
  453.   TimeSeparator: Char;
  454.   TimeAMString: string;
  455.   TimePMString: string;
  456.   ShortTimeFormat: string;
  457.   LongTimeFormat: string;
  458.   ShortMonthNames: array[1..12] of string;
  459.   LongMonthNames: array[1..12] of string;
  460.   ShortDayNames: array[1..7] of string;
  461.   LongDayNames: array[1..7] of string;
  462.   SysLocale: TSysLocale;
  463.   EraNames: array[1..7] of string;
  464.   EraYearOffsets: array[1..7] of Integer;
  465.   TwoDigitYearCenturyWindow: Word = 50;
  466.   ListSeparator: Char;
  467.  
  468. function Languages: TLanguages;
  469.  
  470. { Memory management routines }
  471.  
  472. { AllocMem allocates a block of the given size on the heap. Each byte in
  473.   the allocated buffer is set to zero. To dispose the buffer, use the
  474.   FreeMem standard procedure. }
  475.  
  476. function AllocMem(Size: Cardinal): Pointer;
  477.  
  478. { Exit procedure handling }
  479.  
  480. { AddExitProc adds the given procedure to the run-time library's exit
  481.   procedure list. When an application terminates, its exit procedures are
  482.   executed in reverse order of definition, i.e. the last procedure passed
  483.   to AddExitProc is the first one to get executed upon termination. }
  484.  
  485. procedure AddExitProc(Proc: TProcedure);
  486.  
  487. { String handling routines }
  488.  
  489. { NewStr allocates a string on the heap. NewStr is provided for backwards
  490.   compatibility only. }
  491.  
  492. function NewStr(const S: string): PString;
  493.  
  494. { DisposeStr disposes a string pointer that was previously allocated using
  495.   NewStr. DisposeStr is provided for backwards compatibility only. }
  496.  
  497. procedure DisposeStr(P: PString);
  498.  
  499. { AssignStr assigns a new dynamically allocated string to the given string
  500.   pointer. AssignStr is provided for backwards compatibility only. }
  501.  
  502. procedure AssignStr(var P: PString; const S: string);
  503.  
  504. { AppendStr appends S to the end of Dest. AppendStr is provided for
  505.   backwards compatibility only. Use "Dest := Dest + S" instead. }
  506.  
  507. procedure AppendStr(var Dest: string; const S: string);
  508.  
  509. { UpperCase converts all ASCII characters in the given string to upper case.
  510.   The conversion affects only 7-bit ASCII characters between 'a' and 'z'. To
  511.   convert 8-bit international characters, use AnsiUpperCase. }
  512.  
  513. function UpperCase(const S: string): string;
  514.  
  515. { LowerCase converts all ASCII characters in the given string to lower case.
  516.   The conversion affects only 7-bit ASCII characters between 'A' and 'Z'. To
  517.   convert 8-bit international characters, use AnsiLowerCase. }
  518.  
  519. function LowerCase(const S: string): string;
  520.  
  521. { CompareStr compares S1 to S2, with case-sensitivity. The return value is
  522.   less than 0 if S1 < S2, 0 if S1 = S2, or greater than 0 if S1 > S2. The
  523.   compare operation is based on the 8-bit ordinal value of each character
  524.   and is not affected by the current Windows locale. }
  525.  
  526. function CompareStr(const S1, S2: string): Integer;
  527.  
  528. { CompareMem performs a binary compare of Length bytes of memory referenced
  529.   by P1 to that of P2.  CompareMem returns True if the memory referenced by
  530.   P1 is identical to that of P2. }
  531.  
  532. function CompareMem(P1, P2: Pointer; Length: Integer): Boolean; assembler;
  533.  
  534. { CompareText compares S1 to S2, without case-sensitivity. The return value
  535.   is the same as for CompareStr. The compare operation is based on the 8-bit
  536.   ordinal value of each character, after converting 'a'..'z' to 'A'..'Z',
  537.   and is not affected by the current Windows locale. }
  538.  
  539. function CompareText(const S1, S2: string): Integer;
  540.  
  541. { SameText compares S1 to S2, without case-sensitivity. Returns true if
  542.   S1 and S2 are the equal, that is, if CompareText would return 0. SameText
  543.   has the same 8-bit limitations as CompareText }
  544.  
  545. function SameText(const S1, S2: string): Boolean;
  546.  
  547. { AnsiUpperCase converts all characters in the given string to upper case.
  548.   The conversion uses the current Windows locale. }
  549.  
  550. function AnsiUpperCase(const S: string): string;
  551.  
  552. { AnsiLowerCase converts all characters in the given string to lower case.
  553.   The conversion uses the current Windows locale. }
  554.  
  555. function AnsiLowerCase(const S: string): string;
  556.  
  557. { AnsiCompareStr compares S1 to S2, with case-sensitivity. The compare
  558.   operation is controlled by the current Windows locale. The return value
  559.   is the same as for CompareStr. }
  560.  
  561. function AnsiCompareStr(const S1, S2: string): Integer;
  562.  
  563. { AnsiSameStr compares S1 to S2, with case-sensitivity. The compare
  564.   operation is controlled by the current Windows locale. The return value
  565.   is True if AnsiCompareStr would have returned 0. }
  566.  
  567. function AnsiSameStr(const S1, S2: string): Boolean;
  568.  
  569. { AnsiCompareText compares S1 to S2, without case-sensitivity. The compare
  570.   operation is controlled by the current Windows locale. The return value
  571.   is the same as for CompareStr. }
  572.  
  573. function AnsiCompareText(const S1, S2: string): Integer;
  574.  
  575. { AnsiSameText compares S1 to S2, without case-sensitivity. The compare
  576.   operation is controlled by the current Windows locale. The return value
  577.   is True if AnsiCompareText would have returned 0. }
  578.  
  579. function AnsiSameText(const S1, S2: string): Boolean;
  580.  
  581. { AnsiStrComp compares S1 to S2, with case-sensitivity. The compare
  582.   operation is controlled by the current Windows locale. The return value
  583.   is the same as for CompareStr. }
  584.  
  585. function AnsiStrComp(S1, S2: PChar): Integer;
  586.  
  587. { AnsiStrIComp compares S1 to S2, without case-sensitivity. The compare
  588.   operation is controlled by the current Windows locale. The return value
  589.   is the same as for CompareStr. }
  590.  
  591. function AnsiStrIComp(S1, S2: PChar): Integer;
  592.  
  593. { AnsiStrLComp compares S1 to S2, with case-sensitivity, up to a maximum
  594.   length of MaxLen bytes. The compare operation is controlled by the
  595.   current Windows locale. The return value is the same as for CompareStr. }
  596.  
  597. function AnsiStrLComp(S1, S2: PChar; MaxLen: Cardinal): Integer;
  598.  
  599. { AnsiStrLIComp compares S1 to S2, without case-sensitivity, up to a maximum
  600.   length of MaxLen bytes. The compare operation is controlled by the
  601.   current Windows locale. The return value is the same as for CompareStr. }
  602.  
  603. function AnsiStrLIComp(S1, S2: PChar; MaxLen: Cardinal): Integer;
  604.  
  605. { AnsiStrLower converts all characters in the given string to lower case.
  606.   The conversion uses the current Windows locale. }
  607.  
  608. function AnsiStrLower(Str: PChar): PChar;
  609.  
  610. { AnsiStrUpper converts all characters in the given string to upper case.
  611.   The conversion uses the current Windows locale. }
  612.  
  613. function AnsiStrUpper(Str: PChar): PChar;
  614.  
  615. { AnsiLastChar returns a pointer to the last full character in the string.
  616.   This function supports multibyte characters  }
  617.  
  618. function AnsiLastChar(const S: string): PChar;
  619.  
  620. { AnsiStrLastChar returns a pointer to the last full character in the string.
  621.   This function supports multibyte characters.  }
  622.  
  623. function AnsiStrLastChar(P: PChar): PChar;
  624.  
  625. { Trim trims leading and trailing spaces and control characters from the
  626.   given string. }
  627.  
  628. function Trim(const S: string): string;
  629.  
  630. { TrimLeft trims leading spaces and control characters from the given
  631.   string. }
  632.  
  633. function TrimLeft(const S: string): string;
  634.  
  635. { TrimRight trims trailing spaces and control characters from the given
  636.   string. }
  637.  
  638. function TrimRight(const S: string): string;
  639.  
  640. { QuotedStr returns the given string as a quoted string. A single quote
  641.   character is inserted at the beginning and the end of the string, and
  642.   for each single quote character in the string, another one is added. }
  643.  
  644. function QuotedStr(const S: string): string;
  645.  
  646. { AnsiQuotedStr returns the given string as a quoted string, using the
  647.   provided Quote character.  A Quote character is inserted at the beginning
  648.   and end of thestring, and each Quote character in the string is doubled.
  649.   This function supports multibyte character strings (MBCS). }
  650.  
  651. function AnsiQuotedStr(const S: string; Quote: Char): string;
  652.  
  653. { AnsiExtractQuotedStr removes the Quote characters from the beginning and end
  654.   of a quoted string, and reduces pairs of Quote characters within the quoted
  655.   string to a single character. If the first character in Src is not the Quote
  656.   character, the function returns an empty string.  The function copies
  657.   characters from the Src to the result string until the second solitary
  658.   Quote character or the first null character in Src. The Src parameter is
  659.   updated to point to the first character following the quoted string.  If
  660.   the Src string does not contain a matching end Quote character, the Src
  661.   parameter is updated to point to the terminating null character in Src.
  662.   This function supports multibyte character strings (MBCS).  }
  663.  
  664. function AnsiExtractQuotedStr(var Src: PChar; Quote: Char): string;
  665.  
  666. { AdjustLineBreaks adjusts all line breaks in the given string to be true
  667.   CR/LF sequences. The function changes any CR characters not followed by
  668.   a LF and any LF characters not preceded by a CR into CR/LF pairs. }
  669.  
  670. function AdjustLineBreaks(const S: string): string;
  671.  
  672. { IsValidIdent returns true if the given string is a valid identifier. An
  673.   identifier is defined as a character from the set ['A'..'Z', 'a'..'z', '_']
  674.   followed by zero or more characters from the set ['A'..'Z', 'a'..'z',
  675.   '0..'9', '_']. }
  676.  
  677. function IsValidIdent(const Ident: string): Boolean;
  678.  
  679. { IntToStr converts the given value to its decimal string representation. }
  680.  
  681. function IntToStr(Value: Integer): string; overload;
  682. function IntToStr(Value: Int64): string; overload;
  683.  
  684. { IntToHex converts the given value to a hexadecimal string representation
  685.   with the minimum number of digits specified. }
  686.  
  687. function IntToHex(Value: Integer; Digits: Integer): string; overload;
  688. function IntToHex(Value: Int64; Digits: Integer): string; overload;
  689.  
  690. { StrToInt converts the given string to an integer value. If the string
  691.   doesn't contain a valid value, an EConvertError exception is raised. }
  692.  
  693. function StrToInt(const S: string): Integer;
  694. function StrToInt64(const S: string): Int64;
  695.  
  696. { StrToIntDef converts the given string to an integer value. If the string
  697.   doesn't contain a valid value, the value given by Default is returned. }
  698.  
  699. function StrToIntDef(const S: string; Default: Integer): Integer;
  700. function StrToInt64Def(const S: string; Default: Int64): Int64;
  701.  
  702. { LoadStr loads the string resource given by Ident from the application's
  703.   executable file. If the string resource does not exist, an empty string
  704.   is returned. }
  705.  
  706. function LoadStr(Ident: Integer): string;
  707.  
  708. { LoadStr loads the string resource given by Ident from the application's
  709.   executable file, and uses it as the format string in a call to the
  710.   Format function with the given arguments. }
  711.  
  712. function FmtLoadStr(Ident: Integer; const Args: array of const): string;
  713.  
  714. { File management routines }
  715.  
  716. { FileOpen opens the specified file using the specified access mode. The
  717.   access mode value is constructed by OR-ing one of the fmOpenXXXX constants
  718.   with one of the fmShareXXXX constants. If the return value is positive,
  719.   the function was successful and the value is the file handle of the opened
  720.   file. A return value of -1 indicates that an error occurred. }
  721.  
  722. function FileOpen(const FileName: string; Mode: LongWord): Integer;
  723.  
  724. { FileCreate creates a new file by the specified name. If the return value
  725.   is positive, the function was successful and the value is the file handle
  726.   of the new file. A return value of -1 indicates that an error occurred. }
  727.  
  728. function FileCreate(const FileName: string): Integer;
  729.  
  730. { FileRead reads Count bytes from the file given by Handle into the buffer
  731.   specified by Buffer. The return value is the number of bytes actually
  732.   read; it is less than Count if the end of the file was reached. The return
  733.   value is -1 if an error occurred. }
  734.  
  735. function FileRead(Handle: Integer; var Buffer; Count: LongWord): Integer;
  736.  
  737. { FileWrite writes Count bytes to the file given by Handle from the buffer
  738.   specified by Buffer. The return value is the number of bytes actually
  739.   written, or -1 if an error occurred. }
  740.  
  741. function FileWrite(Handle: Integer; const Buffer; Count: LongWord): Integer;
  742.  
  743. { FileSeek changes the current position of the file given by Handle to be
  744.   Offset bytes relative to the point given by Origin. Origin = 0 means that
  745.   Offset is relative to the beginning of the file, Origin = 1 means that
  746.   Offset is relative to the current position, and Origin = 2 means that
  747.   Offset is relative to the end of the file. The return value is the new
  748.   current position, relative to the beginning of the file, or -1 if an error
  749.   occurred. }
  750.  
  751. function FileSeek(Handle, Offset, Origin: Integer): Integer; overload;
  752. function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64; overload;
  753.  
  754. { FileClose closes the specified file. }
  755.  
  756. procedure FileClose(Handle: Integer);
  757.  
  758. { FileAge returns the date-and-time stamp of the specified file. The return
  759.   value can be converted to a TDateTime value using the FileDateToDateTime
  760.   function. The return value is -1 if the file does not exist. }
  761.  
  762. function FileAge(const FileName: string): Integer;
  763.  
  764. { FileExists returns a boolean value that indicates whether the specified
  765.   file exists. }
  766.  
  767. function FileExists(const FileName: string): Boolean;
  768.  
  769. { FindFirst searches the directory given by Path for the first entry that
  770.   matches the filename given by Path and the attributes given by Attr. The
  771.   result is returned in the search record given by SearchRec. The return
  772.   value is zero if the function was successful. Otherwise the return value
  773.   is a Windows error code. FindFirst is typically used in conjunction with
  774.   FindNext and FindClose as follows:
  775.  
  776.     Result := FindFirst(Path, Attr, SearchRec);
  777.     while Result = 0 do
  778.     begin
  779.       ProcessSearchRec(SearchRec);
  780.       Result := FindNext(SearchRec);
  781.     end;
  782.     FindClose(SearchRec);
  783.  
  784.   where ProcessSearchRec represents user-defined code that processes the
  785.   information in a search record. }
  786.  
  787. function FindFirst(const Path: string; Attr: Integer;
  788.   var F: TSearchRec): Integer;
  789.  
  790. { FindNext returs the next entry that matches the name and attributes
  791.   specified in a previous call to FindFirst. The search record must be one
  792.   that was passed to FindFirst. The return value is zero if the function was
  793.   successful. Otherwise the return value is a Windows error code. }
  794.  
  795. function FindNext(var F: TSearchRec): Integer;
  796.  
  797. { FindClose terminates a FindFirst/FindNext sequence. FindClose does nothing
  798.   in the 16-bit version of Windows, but is required in the 32-bit version,
  799.   so for maximum portability every FindFirst/FindNext sequence should end
  800.   with a call to FindClose. }
  801.  
  802. procedure FindClose(var F: TSearchRec);
  803.  
  804. { FileGetDate returns the DOS date-and-time stamp of the file given by
  805.   Handle. The return value is -1 if the handle is invalid. The
  806.   FileDateToDateTime function can be used to convert the returned value to
  807.   a TDateTime value. }
  808.  
  809. function FileGetDate(Handle: Integer): Integer;
  810.  
  811. { FileSetDate sets the DOS date-and-time stamp of the file given by Handle
  812.   to the value given by Age. The DateTimeToFileDate function can be used to
  813.   convert a TDateTime value to a DOS date-and-time stamp. The return value
  814.   is zero if the function was successful. Otherwise the return value is a
  815.   Windows error code. }
  816.  
  817. function FileSetDate(Handle: Integer; Age: Integer): Integer;
  818.  
  819. { FileGetAttr returns the file attributes of the file given by FileName. The
  820.   attributes can be examined by AND-ing with the faXXXX constants defined
  821.   above. A return value of -1 indicates that an error occurred. }
  822.  
  823. function FileGetAttr(const FileName: string): Integer;
  824.  
  825. { FileSetAttr sets the file attributes of the file given by FileName to the
  826.   value given by Attr. The attribute value is formed by OR-ing the
  827.   appropriate faXXXX constants. The return value is zero if the function was
  828.   successful. Otherwise the return value is a Windows error code. }
  829.  
  830. function FileSetAttr(const FileName: string; Attr: Integer): Integer;
  831.  
  832. { DeleteFile deletes the file given by FileName. The return value is True if
  833.   the file was successfully deleted, or False if an error occurred. }
  834.  
  835. function DeleteFile(const FileName: string): Boolean;
  836.  
  837. { RenameFile renames the file given by OldName to the name given by NewName.
  838.   The return value is True if the file was successfully renamed, or False if
  839.   an error occurred. }
  840.  
  841. function RenameFile(const OldName, NewName: string): Boolean;
  842.  
  843. { ChangeFileExt changes the extension of a filename. FileName specifies a
  844.   filename with or without an extension, and Extension specifies the new
  845.   extension for the filename. The new extension can be a an empty string or
  846.   a period followed by up to three characters. }
  847.  
  848. function ChangeFileExt(const FileName, Extension: string): string;
  849.  
  850. { ExtractFilePath extracts the drive and directory parts of the given
  851.   filename. The resulting string is the leftmost characters of FileName,
  852.   up to and including the colon or backslash that separates the path
  853.   information from the name and extension. The resulting string is empty
  854.   if FileName contains no drive and directory parts. }
  855.  
  856. function ExtractFilePath(const FileName: string): string;
  857.  
  858. { ExtractFileDir extracts the drive and directory parts of the given
  859.   filename. The resulting string is a directory name suitable for passing
  860.   to SetCurrentDir, CreateDir, etc. The resulting string is empty if
  861.   FileName contains no drive and directory parts. }
  862.  
  863. function ExtractFileDir(const FileName: string): string;
  864.  
  865. { ExtractFileDrive extracts the drive part of the given filename.  For
  866.   filenames with drive letters, the resulting string is '<drive>:'.
  867.   For filenames with a UNC path, the resulting string is in the form
  868.   '\\<servername>\<sharename>'.  If the given path contains neither
  869.   style of filename, the result is an empty string. }
  870.  
  871. function ExtractFileDrive(const FileName: string): string;
  872.  
  873. { ExtractFileName extracts the name and extension parts of the given
  874.   filename. The resulting string is the leftmost characters of FileName,
  875.   starting with the first character after the colon or backslash that
  876.   separates the path information from the name and extension. The resulting
  877.   string is equal to FileName if FileName contains no drive and directory
  878.   parts. }
  879.  
  880. function ExtractFileName(const FileName: string): string;
  881.  
  882. { ExtractFileExt extracts the extension part of the given filename. The
  883.   resulting string includes the period character that separates the name
  884.   and extension parts. The resulting string is empty if the given filename
  885.   has no extension. }
  886.  
  887. function ExtractFileExt(const FileName: string): string;
  888.  
  889. { ExpandFileName expands the given filename to a fully qualified filename.
  890.   The resulting string consists of a drive letter, a colon, a root relative
  891.   directory path, and a filename. Embedded '.' and '..' directory references
  892.   are removed. }
  893.  
  894. function ExpandFileName(const FileName: string): string;
  895.  
  896. { ExpandUNCFileName expands the given filename to a fully qualified filename.
  897.   This function is the same as ExpandFileName except that it will return the
  898.   drive portion of the filename in the format '\\<servername>\<sharename> if
  899.   that drive is actually a network resource instead of a local resource.
  900.   Like ExpandFileName, embedded '.' and '..' directory references are
  901.   removed. }
  902.  
  903. function ExpandUNCFileName(const FileName: string): string;
  904.  
  905. { ExtractRelativePath will return a file path name relative to the given
  906.   BaseName.  It strips the common path dirs and adds '..\' for each level
  907.   up from the BaseName path. }
  908.  
  909. function ExtractRelativePath(const BaseName, DestName: string): string;
  910.  
  911. { ExtractShortPathName will convert the given filename to the short form
  912.   by calling the GetShortPathName API.  Will return an empty string if
  913.   the file or directory specified does not exist }
  914.  
  915. function ExtractShortPathName(const FileName: string): string;
  916.  
  917. { FileSearch searches for the file given by Name in the list of directories
  918.   given by DirList. The directory paths in DirList must be separated by
  919.   semicolons. The search always starts with the current directory of the
  920.   current drive. The returned value is a concatenation of one of the
  921.   directory paths and the filename, or an empty string if the file could not
  922.   be located. }
  923.  
  924. function FileSearch(const Name, DirList: string): string;
  925.  
  926. { DiskFree returns the number of free bytes on the specified drive number,
  927.   where 0 = Current, 1 = A, 2 = B, etc. DiskFree returns -1 if the drive
  928.   number is invalid. }
  929.  
  930. function DiskFree(Drive: Byte): Int64;
  931.  
  932. { DiskSize returns the size in bytes of the specified drive number, where
  933.   0 = Current, 1 = A, 2 = B, etc. DiskSize returns -1 if the drive number
  934.   is invalid. }
  935.  
  936. function DiskSize(Drive: Byte): Int64;
  937.  
  938. { FileDateToDateTime converts a DOS date-and-time value to a TDateTime
  939.   value. The FileAge, FileGetDate, and FileSetDate routines operate on DOS
  940.   date-and-time values, and the Time field of a TSearchRec used by the
  941.   FindFirst and FindNext functions contains a DOS date-and-time value. }
  942.  
  943. function FileDateToDateTime(FileDate: Integer): TDateTime;
  944.  
  945. { DateTimeToFileDate converts a TDateTime value to a DOS date-and-time
  946.   value. The FileAge, FileGetDate, and FileSetDate routines operate on DOS
  947.   date-and-time values, and the Time field of a TSearchRec used by the
  948.   FindFirst and FindNext functions contains a DOS date-and-time value. }
  949.  
  950. function DateTimeToFileDate(DateTime: TDateTime): Integer;
  951.  
  952. { GetCurrentDir returns the current directory. }
  953.  
  954. function GetCurrentDir: string;
  955.  
  956. { SetCurrentDir sets the current directory. The return value is True if
  957.   the current directory was successfully changed, or False if an error
  958.   occurred. }
  959.  
  960. function SetCurrentDir(const Dir: string): Boolean;
  961.  
  962. { CreateDir creates a new directory. The return value is True if a new
  963.   directory was successfully created, or False if an error occurred. }
  964.  
  965. function CreateDir(const Dir: string): Boolean;
  966.  
  967. { RemoveDir deletes an existing empty directory. The return value is
  968.   True if the directory was successfully deleted, or False if an error
  969.   occurred. }
  970.  
  971. function RemoveDir(const Dir: string): Boolean;
  972.  
  973. { PChar routines }
  974. { const params help simplify C++ code.  No effect on pascal code }
  975.  
  976. { StrLen returns the number of characters in Str, not counting the null
  977.   terminator. }
  978.  
  979. function StrLen(const Str: PChar): Cardinal;
  980.  
  981. { StrEnd returns a pointer to the null character that terminates Str. }
  982.  
  983. function StrEnd(const Str: PChar): PChar;
  984.  
  985. { StrMove copies exactly Count characters from Source to Dest and returns
  986.   Dest. Source and Dest may overlap. }
  987.  
  988. function StrMove(Dest: PChar; const Source: PChar; Count: Cardinal): PChar;
  989.  
  990. { StrCopy copies Source to Dest and returns Dest. }
  991.  
  992. function StrCopy(Dest: PChar; const Source: PChar): PChar;
  993.  
  994. { StrECopy copies Source to Dest and returns StrEnd(Dest). }
  995.  
  996. function StrECopy(Dest:PChar; const Source: PChar): PChar;
  997.  
  998. { StrLCopy copies at most MaxLen characters from Source to Dest and
  999.   returns Dest. }
  1000.  
  1001. function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar;
  1002.  
  1003. { StrPCopy copies the Pascal style string Source into Dest and
  1004.   returns Dest. }
  1005.  
  1006. function StrPCopy(Dest: PChar; const Source: string): PChar;
  1007.  
  1008. { StrPLCopy copies at most MaxLen characters from the Pascal style string
  1009.   Source into Dest and returns Dest. }
  1010.  
  1011. function StrPLCopy(Dest: PChar; const Source: string;
  1012.   MaxLen: Cardinal): PChar;
  1013.  
  1014. { StrCat appends a copy of Source to the end of Dest and returns Dest. }
  1015.  
  1016. function StrCat(Dest: PChar; const Source: PChar): PChar;
  1017.  
  1018. { StrLCat appends at most MaxLen - StrLen(Dest) characters from Source to
  1019.   the end of Dest, and returns Dest. }
  1020.  
  1021. function StrLCat(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar;
  1022.  
  1023. { StrComp compares Str1 to Str2. The return value is less than 0 if
  1024.   Str1 < Str2, 0 if Str1 = Str2, or greater than 0 if Str1 > Str2. }
  1025.  
  1026. function StrComp(const Str1, Str2: PChar): Integer;
  1027.  
  1028. { StrIComp compares Str1 to Str2, without case sensitivity. The return
  1029.   value is the same as StrComp. }
  1030.  
  1031. function StrIComp(const Str1, Str2: PChar): Integer;
  1032.  
  1033. { StrLComp compares Str1 to Str2, for a maximum length of MaxLen
  1034.   characters. The return value is the same as StrComp. }
  1035.  
  1036. function StrLComp(const Str1, Str2: PChar; MaxLen: Cardinal): Integer;
  1037.  
  1038. { StrLIComp compares Str1 to Str2, for a maximum length of MaxLen
  1039.   characters, without case sensitivity. The return value is the same
  1040.   as StrComp. }
  1041.  
  1042. function StrLIComp(const Str1, Str2: PChar; MaxLen: Cardinal): Integer;
  1043.  
  1044. { StrScan returns a pointer to the first occurrence of Chr in Str. If Chr
  1045.   does not occur in Str, StrScan returns NIL. The null terminator is
  1046.   considered to be part of the string. }
  1047.  
  1048. function StrScan(const Str: PChar; Chr: Char): PChar;
  1049.  
  1050. { StrRScan returns a pointer to the last occurrence of Chr in Str. If Chr
  1051.   does not occur in Str, StrRScan returns NIL. The null terminator is
  1052.   considered to be part of the string. }
  1053.  
  1054. function StrRScan(const Str: PChar; Chr: Char): PChar;
  1055.  
  1056. { StrPos returns a pointer to the first occurrence of Str2 in Str1. If
  1057.   Str2 does not occur in Str1, StrPos returns NIL. }
  1058.  
  1059. function StrPos(const Str1, Str2: PChar): PChar;
  1060.  
  1061. { StrUpper converts Str to upper case and returns Str. }
  1062.  
  1063. function StrUpper(Str: PChar): PChar;
  1064.  
  1065. { StrLower converts Str to lower case and returns Str. }
  1066.  
  1067. function StrLower(Str: PChar): PChar;
  1068.  
  1069. { StrPas converts Str to a Pascal style string. This function is provided
  1070.   for backwards compatibility only. To convert a null terminated string to
  1071.   a Pascal style string, use a string type cast or an assignment. }
  1072.  
  1073. function StrPas(const Str: PChar): string;
  1074.  
  1075. { StrAlloc allocates a buffer of the given size on the heap. The size of
  1076.   the allocated buffer is encoded in a four byte header that immediately
  1077.   preceeds the buffer. To dispose the buffer, use StrDispose. }
  1078.  
  1079. function StrAlloc(Size: Cardinal): PChar;
  1080.  
  1081. { StrBufSize returns the allocated size of the given buffer, not including
  1082.   the two byte header. }
  1083.  
  1084. function StrBufSize(const Str: PChar): Cardinal;
  1085.  
  1086. { StrNew allocates a copy of Str on the heap. If Str is NIL, StrNew returns
  1087.   NIL and doesn't allocate any heap space. Otherwise, StrNew makes a
  1088.   duplicate of Str, obtaining space with a call to the StrAlloc function,
  1089.   and returns a pointer to the duplicated string. To dispose the string,
  1090.   use StrDispose. }
  1091.  
  1092. function StrNew(const Str: PChar): PChar;
  1093.  
  1094. { StrDispose disposes a string that was previously allocated with StrAlloc
  1095.   or StrNew. If Str is NIL, StrDispose does nothing. }
  1096.  
  1097. procedure StrDispose(Str: PChar);
  1098.  
  1099. { String formatting routines }
  1100.  
  1101. { The Format routine formats the argument list given by the Args parameter
  1102.   using the format string given by the Format parameter.
  1103.  
  1104.   Format strings contain two types of objects--plain characters and format
  1105.   specifiers. Plain characters are copied verbatim to the resulting string.
  1106.   Format specifiers fetch arguments from the argument list and apply
  1107.   formatting to them.
  1108.  
  1109.   Format specifiers have the following form:
  1110.  
  1111.     "%" [index ":"] ["-"] [width] ["." prec] type
  1112.  
  1113.   A format specifier begins with a % character. After the % come the
  1114.   following, in this order:
  1115.  
  1116.   -  an optional argument index specifier, [index ":"]
  1117.   -  an optional left-justification indicator, ["-"]
  1118.   -  an optional width specifier, [width]
  1119.   -  an optional precision specifier, ["." prec]
  1120.   -  the conversion type character, type
  1121.  
  1122.   The following conversion characters are supported:
  1123.  
  1124.   d  Decimal. The argument must be an integer value. The value is converted
  1125.      to a string of decimal digits. If the format string contains a precision
  1126.      specifier, it indicates that the resulting string must contain at least
  1127.      the specified number of digits; if the value has less digits, the
  1128.      resulting string is left-padded with zeros.
  1129.  
  1130.   u  Unsigned decimal.  Similar to 'd' but no sign is output.
  1131.  
  1132.   e  Scientific. The argument must be a floating-point value. The value is
  1133.      converted to a string of the form "-d.ddd...E+ddd". The resulting
  1134.      string starts with a minus sign if the number is negative, and one digit
  1135.      always precedes the decimal point. The total number of digits in the
  1136.      resulting string (including the one before the decimal point) is given
  1137.      by the precision specifer in the format string--a default precision of
  1138.      15 is assumed if no precision specifer is present. The "E" exponent
  1139.      character in the resulting string is always followed by a plus or minus
  1140.      sign and at least three digits.
  1141.  
  1142.   f  Fixed. The argument must be a floating-point value. The value is
  1143.      converted to a string of the form "-ddd.ddd...". The resulting string
  1144.      starts with a minus sign if the number is negative. The number of digits
  1145.      after the decimal point is given by the precision specifier in the
  1146.      format string--a default of 2 decimal digits is assumed if no precision
  1147.      specifier is present.
  1148.  
  1149.   g  General. The argument must be a floating-point value. The value is
  1150.      converted to the shortest possible decimal string using fixed or
  1151.      scientific format. The number of significant digits in the resulting
  1152.      string is given by the precision specifier in the format string--a
  1153.      default precision of 15 is assumed if no precision specifier is present.
  1154.      Trailing zeros are removed from the resulting string, and a decimal
  1155.      point appears only if necessary. The resulting string uses fixed point
  1156.      format if the number of digits to the left of the decimal point in the
  1157.      value is less than or equal to the specified precision, and if the
  1158.      value is greater than or equal to 0.00001. Otherwise the resulting
  1159.      string uses scientific format.
  1160.  
  1161.   n  Number. The argument must be a floating-point value. The value is
  1162.      converted to a string of the form "-d,ddd,ddd.ddd...". The "n" format
  1163.      corresponds to the "f" format, except that the resulting string
  1164.      contains thousand separators.
  1165.  
  1166.   m  Money. The argument must be a floating-point value. The value is
  1167.      converted to a string that represents a currency amount. The conversion
  1168.      is controlled by the CurrencyString, CurrencyFormat, NegCurrFormat,
  1169.      ThousandSeparator, DecimalSeparator, and CurrencyDecimals global
  1170.      variables, all of which are initialized from the Currency Format in
  1171.      the International section of the Windows Control Panel. If the format
  1172.      string contains a precision specifier, it overrides the value given
  1173.      by the CurrencyDecimals global variable.
  1174.  
  1175.   p  Pointer. The argument must be a pointer value. The value is converted
  1176.      to a string of the form "XXXX:YYYY" where XXXX and YYYY are the
  1177.      segment and offset parts of the pointer expressed as four hexadecimal
  1178.      digits.
  1179.  
  1180.   s  String. The argument must be a character, a string, or a PChar value.
  1181.      The string or character is inserted in place of the format specifier.
  1182.      The precision specifier, if present in the format string, specifies the
  1183.      maximum length of the resulting string. If the argument is a string
  1184.      that is longer than this maximum, the string is truncated.
  1185.  
  1186.   x  Hexadecimal. The argument must be an integer value. The value is
  1187.      converted to a string of hexadecimal digits. If the format string
  1188.      contains a precision specifier, it indicates that the resulting string
  1189.      must contain at least the specified number of digits; if the value has
  1190.      less digits, the resulting string is left-padded with zeros.
  1191.  
  1192.   Conversion characters may be specified in upper case as well as in lower
  1193.   case--both produce the same results.
  1194.  
  1195.   For all floating-point formats, the actual characters used as decimal and
  1196.   thousand separators are obtained from the DecimalSeparator and
  1197.   ThousandSeparator global variables.
  1198.  
  1199.   Index, width, and precision specifiers can be specified directly using
  1200.   decimal digit string (for example "%10d"), or indirectly using an asterisk
  1201.   charcater (for example "%*.*f"). When using an asterisk, the next argument
  1202.   in the argument list (which must be an integer value) becomes the value
  1203.   that is actually used. For example "Format('%*.*f', [8, 2, 123.456])" is
  1204.   the same as "Format('%8.2f', [123.456])".
  1205.  
  1206.   A width specifier sets the minimum field width for a conversion. If the
  1207.   resulting string is shorter than the minimum field width, it is padded
  1208.   with blanks to increase the field width. The default is to right-justify
  1209.   the result by adding blanks in front of the value, but if the format
  1210.   specifier contains a left-justification indicator (a "-" character
  1211.   preceding the width specifier), the result is left-justified by adding
  1212.   blanks after the value.
  1213.  
  1214.   An index specifier sets the current argument list index to the specified
  1215.   value. The index of the first argument in the argument list is 0. Using
  1216.   index specifiers, it is possible to format the same argument multiple
  1217.   times. For example "Format('%d %d %0:d %d', [10, 20])" produces the string
  1218.   '10 20 10 20'.
  1219.  
  1220.   The Format function can be combined with other formatting functions. For
  1221.   example
  1222.  
  1223.     S := Format('Your total was %s on %s', [
  1224.       FormatFloat('$#,##0.00;;zero', Total),
  1225.       FormatDateTime('mm/dd/yy', Date)]);
  1226.  
  1227.   which uses the FormatFloat and FormatDateTime functions to customize the
  1228.   format beyond what is possible with Format. }
  1229.  
  1230. function Format(const Format: string; const Args: array of const): string;
  1231.  
  1232. { FmtStr formats the argument list given by Args using the format string
  1233.   given by Format into the string variable given by Result. For further
  1234.   details, see the description of the Format function. }
  1235.  
  1236. procedure FmtStr(var Result: string; const Format: string;
  1237.   const Args: array of const);
  1238.  
  1239. { StrFmt formats the argument list given by Args using the format string
  1240.   given by Format into the buffer given by Buffer. It is up to the caller to
  1241.   ensure that Buffer is large enough for the resulting string. The returned
  1242.   value is Buffer. For further details, see the description of the Format
  1243.   function. }
  1244.  
  1245. function StrFmt(Buffer, Format: PChar; const Args: array of const): PChar;
  1246.  
  1247. { StrFmt formats the argument list given by Args using the format string
  1248.   given by Format into the buffer given by Buffer. The resulting string will
  1249.   contain no more than MaxLen characters, not including the null terminator.
  1250.   The returned value is Buffer. For further details, see the description of
  1251.   the Format function. }
  1252.  
  1253. function StrLFmt(Buffer: PChar; MaxLen: Cardinal; Format: PChar;
  1254.   const Args: array of const): PChar;
  1255.  
  1256. { FormatBuf formats the argument list given by Args using the format string
  1257.   given by Format and FmtLen into the buffer given by Buffer and BufLen.
  1258.   The Format parameter is a reference to a buffer containing FmtLen
  1259.   characters, and the Buffer parameter is a reference to a buffer of BufLen
  1260.   characters. The returned value is the number of characters actually stored
  1261.   in Buffer. The returned value is always less than or equal to BufLen. For
  1262.   further details, see the description of the Format function. }
  1263.  
  1264. function FormatBuf(var Buffer; BufLen: Cardinal; const Format;
  1265.   FmtLen: Cardinal; const Args: array of const): Cardinal;
  1266.  
  1267. { Floating point conversion routines }
  1268.  
  1269. { FloatToStr converts the floating-point value given by Value to its string
  1270.   representation. The conversion uses general number format with 15
  1271.   significant digits. For further details, see the description of the
  1272.   FloatToStrF function. }
  1273.  
  1274. function FloatToStr(Value: Extended): string;
  1275.  
  1276. { CurrToStr converts the currency value given by Value to its string
  1277.   representation. The conversion uses general number format. For further
  1278.   details, see the description of the CurrToStrF function. }
  1279.  
  1280. function CurrToStr(Value: Currency): string;
  1281.  
  1282. { FloatToStrF converts the floating-point value given by Value to its string
  1283.   representation. The Format parameter controls the format of the resulting
  1284.   string. The Precision parameter specifies the precision of the given value.
  1285.   It should be 7 or less for values of type Single, 15 or less for values of
  1286.   type Double, and 18 or less for values of type Extended. The meaning of the
  1287.   Digits parameter depends on the particular format selected.
  1288.  
  1289.   The possible values of the Format parameter, and the meaning of each, are
  1290.   described below.
  1291.  
  1292.   ffGeneral - General number format. The value is converted to the shortest
  1293.   possible decimal string using fixed or scientific format. Trailing zeros
  1294.   are removed from the resulting string, and a decimal point appears only
  1295.   if necessary. The resulting string uses fixed point format if the number
  1296.   of digits to the left of the decimal point in the value is less than or
  1297.   equal to the specified precision, and if the value is greater than or
  1298.   equal to 0.00001. Otherwise the resulting string uses scientific format,
  1299.   and the Digits parameter specifies the minimum number of digits in the
  1300.   exponent (between 0 and 4).
  1301.  
  1302.   ffExponent - Scientific format. The value is converted to a string of the
  1303.   form "-d.ddd...E+dddd". The resulting string starts with a minus sign if
  1304.   the number is negative, and one digit always precedes the decimal point.
  1305.   The total number of digits in the resulting string (including the one
  1306.   before the decimal point) is given by the Precision parameter. The "E"
  1307.   exponent character in the resulting string is always followed by a plus
  1308.   or minus sign and up to four digits. The Digits parameter specifies the
  1309.   minimum number of digits in the exponent (between 0 and 4).
  1310.  
  1311.   ffFixed - Fixed point format. The value is converted to a string of the
  1312.   form "-ddd.ddd...". The resulting string starts with a minus sign if the
  1313.   number is negative, and at least one digit always precedes the decimal
  1314.   point. The number of digits after the decimal point is given by the Digits
  1315.   parameter--it must be between 0 and 18. If the number of digits to the
  1316.   left of the decimal point is greater than the specified precision, the
  1317.   resulting value will use scientific format.
  1318.  
  1319.   ffNumber - Number format. The value is converted to a string of the form
  1320.   "-d,ddd,ddd.ddd...". The ffNumber format corresponds to the ffFixed format,
  1321.   except that the resulting string contains thousand separators.
  1322.  
  1323.   ffCurrency - Currency format. The value is converted to a string that
  1324.   represents a currency amount. The conversion is controlled by the
  1325.   CurrencyString, CurrencyFormat, NegCurrFormat, ThousandSeparator, and
  1326.   DecimalSeparator global variables, all of which are initialized from the
  1327.   Currency Format in the International section of the Windows Control Panel.
  1328.   The number of digits after the decimal point is given by the Digits
  1329.   parameter--it must be between 0 and 18.
  1330.  
  1331.   For all formats, the actual characters used as decimal and thousand
  1332.   separators are obtained from the DecimalSeparator and ThousandSeparator
  1333.   global variables.
  1334.  
  1335.   If the given value is a NAN (not-a-number), the resulting string is 'NAN'.
  1336.   If the given value is positive infinity, the resulting string is 'INF'. If
  1337.   the given value is negative infinity, the resulting string is '-INF'. }
  1338.  
  1339. function FloatToStrF(Value: Extended; Format: TFloatFormat;
  1340.   Precision, Digits: Integer): string;
  1341.  
  1342. { CurrToStrF converts the currency value given by Value to its string
  1343.   representation. A call to CurrToStrF corresponds to a call to
  1344.   FloatToStrF with an implied precision of 19 digits. }
  1345.  
  1346. function CurrToStrF(Value: Currency; Format: TFloatFormat;
  1347.   Digits: Integer): string;
  1348.  
  1349. { FloatToText converts the given floating-point value to its decimal
  1350.   representation using the specified format, precision, and digits. The
  1351.   Value parameter must be a variable of type Extended or Currency, as
  1352.   indicated by the ValueType parameter. The resulting string of characters
  1353.   is stored in the given buffer, and the returned value is the number of
  1354.   characters stored. The resulting string is not null-terminated. For
  1355.   further details, see the description of the FloatToStrF function. }
  1356.  
  1357. function FloatToText(Buffer: PChar; const Value; ValueType: TFloatValue;
  1358.   Format: TFloatFormat; Precision, Digits: Integer): Integer;
  1359.  
  1360. { FormatFloat formats the floating-point value given by Value using the
  1361.   format string given by Format. The following format specifiers are
  1362.   supported in the format string:
  1363.  
  1364.   0     Digit placeholder. If the value being formatted has a digit in the
  1365.         position where the '0' appears in the format string, then that digit
  1366.         is copied to the output string. Otherwise, a '0' is stored in that
  1367.         position in the output string.
  1368.  
  1369.   #     Digit placeholder. If the value being formatted has a digit in the
  1370.         position where the '#' appears in the format string, then that digit
  1371.         is copied to the output string. Otherwise, nothing is stored in that
  1372.         position in the output string.
  1373.  
  1374.   .     Decimal point. The first '.' character in the format string
  1375.         determines the location of the decimal separator in the formatted
  1376.         value; any additional '.' characters are ignored. The actual
  1377.         character used as a the decimal separator in the output string is
  1378.         determined by the DecimalSeparator global variable. The default value
  1379.         of DecimalSeparator is specified in the Number Format of the
  1380.         International section in the Windows Control Panel.
  1381.  
  1382.   ,     Thousand separator. If the format string contains one or more ','
  1383.         characters, the output will have thousand separators inserted between
  1384.         each group of three digits to the left of the decimal point. The
  1385.         placement and number of ',' characters in the format string does not
  1386.         affect the output, except to indicate that thousand separators are
  1387.         wanted. The actual character used as a the thousand separator in the
  1388.         output is determined by the ThousandSeparator global variable. The
  1389.         default value of ThousandSeparator is specified in the Number Format
  1390.         of the International section in the Windows Control Panel.
  1391.  
  1392.   E+    Scientific notation. If any of the strings 'E+', 'E-', 'e+', or 'e-'
  1393.   E-    are contained in the format string, the number is formatted using
  1394.   e+    scientific notation. A group of up to four '0' characters can
  1395.   e-    immediately follow the 'E+', 'E-', 'e+', or 'e-' to determine the
  1396.         minimum number of digits in the exponent. The 'E+' and 'e+' formats
  1397.         cause a plus sign to be output for positive exponents and a minus
  1398.         sign to be output for negative exponents. The 'E-' and 'e-' formats
  1399.         output a sign character only for negative exponents.
  1400.  
  1401.   'xx'  Characters enclosed in single or double quotes are output as-is, and
  1402.   "xx"  do not affect formatting.
  1403.  
  1404.   ;     Separates sections for positive, negative, and zero numbers in the
  1405.         format string.
  1406.  
  1407.   The locations of the leftmost '0' before the decimal point in the format
  1408.   string and the rightmost '0' after the decimal point in the format string
  1409.   determine the range of digits that are always present in the output string.
  1410.  
  1411.   The number being formatted is always rounded to as many decimal places as
  1412.   there are digit placeholders ('0' or '#') to the right of the decimal
  1413.   point. If the format string contains no decimal point, the value being
  1414.   formatted is rounded to the nearest whole number.
  1415.  
  1416.   If the number being formatted has more digits to the left of the decimal
  1417.   separator than there are digit placeholders to the left of the '.'
  1418.   character in the format string, the extra digits are output before the
  1419.   first digit placeholder.
  1420.  
  1421.   To allow different formats for positive, negative, and zero values, the
  1422.   format string can contain between one and three sections separated by
  1423.   semicolons.
  1424.  
  1425.   One section - The format string applies to all values.
  1426.  
  1427.   Two sections - The first section applies to positive values and zeros, and
  1428.   the second section applies to negative values.
  1429.  
  1430.   Three sections - The first section applies to positive values, the second
  1431.   applies to negative values, and the third applies to zeros.
  1432.  
  1433.   If the section for negative values or the section for zero values is empty,
  1434.   that is if there is nothing between the semicolons that delimit the
  1435.   section, the section for positive values is used instead.
  1436.  
  1437.   If the section for positive values is empty, or if the entire format string
  1438.   is empty, the value is formatted using general floating-point formatting
  1439.   with 15 significant digits, corresponding to a call to FloatToStrF with
  1440.   the ffGeneral format. General floating-point formatting is also used if
  1441.   the value has more than 18 digits to the left of the decimal point and
  1442.   the format string does not specify scientific notation.
  1443.  
  1444.   The table below shows some sample formats and the results produced when
  1445.   the formats are applied to different values:
  1446.  
  1447.   Format string          1234        -1234       0.5         0
  1448.   -----------------------------------------------------------------------
  1449.                          1234        -1234       0.5         0
  1450.   0                      1234        -1234       1           0
  1451.   0.00                   1234.00     -1234.00    0.50        0.00
  1452.   #.##                   1234        -1234       .5
  1453.   #,##0.00               1,234.00    -1,234.00   0.50        0.00
  1454.   #,##0.00;(#,##0.00)    1,234.00    (1,234.00)  0.50        0.00
  1455.   #,##0.00;;Zero         1,234.00    -1,234.00   0.50        Zero
  1456.   0.000E+00              1.234E+03   -1.234E+03  5.000E-01   0.000E+00
  1457.   #.###E-0               1.234E3     -1.234E3    5E-1        0E0
  1458.   ----------------------------------------------------------------------- }
  1459.  
  1460. function FormatFloat(const Format: string; Value: Extended): string;
  1461.  
  1462. { FormatCurr formats the currency value given by Value using the format
  1463.   string given by Format. For further details, see the description of the
  1464.   FormatFloat function. }
  1465.  
  1466. function FormatCurr(const Format: string; Value: Currency): string;
  1467.  
  1468. { FloatToTextFmt converts the given floating-point value to its decimal
  1469.   representation using the specified format. The Value parameter must be a
  1470.   variable of type Extended or Currency, as indicated by the ValueType
  1471.   parameter. The resulting string of characters is stored in the given
  1472.   buffer, and the returned value is the number of characters stored. The
  1473.   resulting string is not null-terminated. For further details, see the
  1474.   description of the FormatFloat function. }
  1475.  
  1476. function FloatToTextFmt(Buffer: PChar; const Value; ValueType: TFloatValue;
  1477.   Format: PChar): Integer;
  1478.  
  1479. { StrToFloat converts the given string to a floating-point value. The string
  1480.   must consist of an optional sign (+ or -), a string of digits with an
  1481.   optional decimal point, and an optional 'E' or 'e' followed by a signed
  1482.   integer. Leading and trailing blanks in the string are ignored. The
  1483.   DecimalSeparator global variable defines the character that must be used
  1484.   as a decimal point. Thousand separators and currency symbols are not
  1485.   allowed in the string. If the string doesn't contain a valid value, an
  1486.   EConvertError exception is raised. }
  1487.  
  1488. function StrToFloat(const S: string): Extended;
  1489.  
  1490. { StrToCurr converts the given string to a currency value. For further
  1491.   details, see the description of the StrToFloat function. }
  1492.  
  1493. function StrToCurr(const S: string): Currency;
  1494.  
  1495. { TextToFloat converts the null-terminated string given by Buffer to a
  1496.   floating-point value which is returned in the variable given by Value.
  1497.   The Value parameter must be a variable of type Extended or Currency, as
  1498.   indicated by the ValueType parameter. The return value is True if the
  1499.   conversion was successful, or False if the string is not a valid
  1500.   floating-point value. For further details, see the description of the
  1501.   StrToFloat function. }
  1502.  
  1503. function TextToFloat(Buffer: PChar; var Value;
  1504.   ValueType: TFloatValue): Boolean;
  1505.  
  1506. { FloatToDecimal converts a floating-point value to a decimal representation
  1507.   that is suited for further formatting. The Value parameter must be a
  1508.   variable of type Extended or Currency, as indicated by the ValueType
  1509.   parameter. For values of type Extended, the Precision parameter specifies
  1510.   the requested number of significant digits in the result--the allowed range
  1511.   is 1..18. For values of type Currency, the Precision parameter is ignored,
  1512.   and the implied precision of the conversion is 19 digits. The Decimals
  1513.   parameter specifies the requested maximum number of digits to the left of
  1514.   the decimal point in the result. Precision and Decimals together control
  1515.   how the result is rounded. To produce a result that always has a given
  1516.   number of significant digits regardless of the magnitude of the number,
  1517.   specify 9999 for the Decimals parameter. The result of the conversion is
  1518.   stored in the specified TFloatRec record as follows:
  1519.  
  1520.   Exponent - Contains the magnitude of the number, i.e. the number of
  1521.   significant digits to the right of the decimal point. The Exponent field
  1522.   is negative if the absolute value of the number is less than one. If the
  1523.   number is a NAN (not-a-number), Exponent is set to -32768. If the number
  1524.   is INF or -INF (positive or negative infinity), Exponent is set to 32767.
  1525.  
  1526.   Negative - True if the number is negative, False if the number is zero
  1527.   or positive.
  1528.  
  1529.   Digits - Contains up to 18 (for type Extended) or 19 (for type Currency)
  1530.   significant digits followed by a null terminator. The implied decimal
  1531.   point (if any) is not stored in Digits. Trailing zeros are removed, and
  1532.   if the resulting number is zero, NAN, or INF, Digits contains nothing but
  1533.   the null terminator. }
  1534.  
  1535. procedure FloatToDecimal(var Result: TFloatRec; const Value;
  1536.   ValueType: TFloatValue; Precision, Decimals: Integer);
  1537.  
  1538. { Date/time support routines }
  1539.  
  1540. function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
  1541.  
  1542. function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
  1543. function MSecsToTimeStamp(MSecs: Comp): TTimeStamp;
  1544. function TimeStampToMSecs(const TimeStamp: TTimeStamp): Comp;
  1545.  
  1546. { EncodeDate encodes the given year, month, and day into a TDateTime value.
  1547.   The year must be between 1 and 9999, the month must be between 1 and 12,
  1548.   and the day must be between 1 and N, where N is the number of days in the
  1549.   specified month. If the specified values are not within range, an
  1550.   EConvertError exception is raised. The resulting value is the number of
  1551.   days between 12/30/1899 and the given date. }
  1552.  
  1553. function EncodeDate(Year, Month, Day: Word): TDateTime;
  1554.  
  1555. { EncodeTime encodes the given hour, minute, second, and millisecond into a
  1556.   TDateTime value. The hour must be between 0 and 23, the minute must be
  1557.   between 0 and 59, the second must be between 0 and 59, and the millisecond
  1558.   must be between 0 and 999. If the specified values are not within range, an
  1559.   EConvertError exception is raised. The resulting value is a number between
  1560.   0 (inclusive) and 1 (not inclusive) that indicates the fractional part of
  1561.   a day given by the specified time. The value 0 corresponds to midnight,
  1562.   0.5 corresponds to noon, 0.75 corresponds to 6:00 pm, etc. }
  1563.  
  1564. function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
  1565.  
  1566. { DecodeDate decodes the integral (date) part of the given TDateTime value
  1567.   into its corresponding year, month, and day. If the given TDateTime value
  1568.   is less than or equal to zero, the year, month, and day return parameters
  1569.   are all set to zero. }
  1570.  
  1571. procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);
  1572.  
  1573. { DecodeTime decodes the fractional (time) part of the given TDateTime value
  1574.   into its corresponding hour, minute, second, and millisecond. }
  1575.  
  1576. procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);
  1577.  
  1578. { DateTimeToSystemTime converts a date and time from Delphi's TDateTime
  1579.   format into the Win32 API's TSystemTime format. }
  1580.  
  1581. procedure DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);
  1582.  
  1583. { SystemTimeToDateTime converts a date and time from the Win32 API's
  1584.   TSystemTime format into Delphi's TDateTime format. }
  1585.  
  1586. function SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime;
  1587.  
  1588. { DayOfWeek returns the day of the week of the given date. The result is an
  1589.   integer between 1 and 7, corresponding to Sunday through Saturday. }
  1590.  
  1591. function DayOfWeek(Date: TDateTime): Integer;
  1592.  
  1593. { Date returns the current date. }
  1594.  
  1595. function Date: TDateTime;
  1596.  
  1597. { Time returns the current time. }
  1598.  
  1599. function Time: TDateTime;
  1600.  
  1601. { Now returns the current date and time, corresponding to Date + Time. }
  1602.  
  1603. function Now: TDateTime;
  1604.  
  1605. { IncMonth returns Date shifted by the specified number of months.
  1606.   NumberOfMonths parameter can be negative, to return a date N months ago.
  1607.   If the input day of month is greater than the last day of the resulting
  1608.   month, the day is set to the last day of the resulting month.
  1609.   Input time of day is copied to the DateTime result.  }
  1610.  
  1611. function IncMonth(const Date: TDateTime; NumberOfMonths: Integer): TDateTime;
  1612.  
  1613. { ReplaceTime replaces the time portion of the DateTime parameter with the given
  1614.   time value, adjusting the signs as needed if the date is prior to 1900
  1615.   (Date value less than zero)  }
  1616.  
  1617. procedure ReplaceTime(var DateTime: TDateTime; const NewTime: TDateTime);
  1618.  
  1619. { ReplaceDate replaces the date portion of the DateTime parameter with the given
  1620.   date value, adjusting as needed for negative dates }
  1621.  
  1622. procedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);
  1623.  
  1624. { IsLeapYear determines whether the given year is a leap year. }
  1625.  
  1626. function IsLeapYear(Year: Word): Boolean;
  1627.  
  1628. type
  1629.   PDayTable = ^TDayTable;
  1630.   TDayTable = array[1..12] of Word;
  1631.  
  1632. { The MonthDays array can be used to quickly find the number of
  1633.   days in a month:  MonthDays[IsLeapYear(Y), M]      }
  1634.  
  1635. const
  1636.   MonthDays: array [Boolean] of TDayTable =
  1637.     ((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
  1638.      (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));
  1639.  
  1640. { DateToStr converts the date part of the given TDateTime value to a string.
  1641.   The conversion uses the format specified by the ShortDateFormat global
  1642.   variable. }
  1643.  
  1644. function DateToStr(Date: TDateTime): string;
  1645.  
  1646. { TimeToStr converts the time part of the given TDateTime value to a string.
  1647.   The conversion uses the format specified by the LongTimeFormat global
  1648.   variable. }
  1649.  
  1650. function TimeToStr(Time: TDateTime): string;
  1651.  
  1652. { DateTimeToStr converts the given date and time to a string. The resulting
  1653.   string consists of a date and time formatted using the ShortDateFormat and
  1654.   LongTimeFormat global variables. Time information is included in the
  1655.   resulting string only if the fractional part of the given date and time
  1656.   value is non-zero. }
  1657.  
  1658. function DateTimeToStr(DateTime: TDateTime): string;
  1659.  
  1660. { StrToDate converts the given string to a date value. The string must
  1661.   consist of two or three numbers, separated by the character defined by
  1662.   the DateSeparator global variable. The order for month, day, and year is
  1663.   determined by the ShortDateFormat global variable--possible combinations
  1664.   are m/d/y, d/m/y, and y/m/d. If the string contains only two numbers, it
  1665.   is interpreted as a date (m/d or d/m) in the current year. Year values
  1666.   between 0 and 99 are assumed to be in the current century. If the given
  1667.   string does not contain a valid date, an EConvertError exception is
  1668.   raised. }
  1669.  
  1670. function StrToDate(const S: string): TDateTime;
  1671.  
  1672. { StrToTime converts the given string to a time value. The string must
  1673.   consist of two or three numbers, separated by the character defined by
  1674.   the TimeSeparator global variable, optionally followed by an AM or PM
  1675.   indicator. The numbers represent hour, minute, and (optionally) second,
  1676.   in that order. If the time is followed by AM or PM, it is assumed to be
  1677.   in 12-hour clock format. If no AM or PM indicator is included, the time
  1678.   is assumed to be in 24-hour clock format. If the given string does not
  1679.   contain a valid time, an EConvertError exception is raised. }
  1680.  
  1681. function StrToTime(const S: string): TDateTime;
  1682.  
  1683. { StrToDateTime converts the given string to a date and time value. The
  1684.   string must contain a date optionally followed by a time. The date and
  1685.   time parts of the string must follow the formats described for the
  1686.   StrToDate and StrToTime functions. }
  1687.  
  1688. function StrToDateTime(const S: string): TDateTime;
  1689.  
  1690. { FormatDateTime formats the date-and-time value given by DateTime using the
  1691.   format given by Format. The following format specifiers are supported:
  1692.  
  1693.   c       Displays the date using the format given by the ShortDateFormat
  1694.           global variable, followed by the time using the format given by
  1695.           the LongTimeFormat global variable. The time is not displayed if
  1696.           the fractional part of the DateTime value is zero.
  1697.  
  1698.   d       Displays the day as a number without a leading zero (1-31).
  1699.  
  1700.   dd      Displays the day as a number with a leading zero (01-31).
  1701.  
  1702.   ddd     Displays the day as an abbreviation (Sun-Sat) using the strings
  1703.           given by the ShortDayNames global variable.
  1704.  
  1705.   dddd    Displays the day as a full name (Sunday-Saturday) using the strings
  1706.           given by the LongDayNames global variable.
  1707.  
  1708.   ddddd   Displays the date using the format given by the ShortDateFormat
  1709.           global variable.
  1710.  
  1711.   dddddd  Displays the date using the format given by the LongDateFormat
  1712.           global variable.
  1713.  
  1714.   g       Displays the period/era as an abbreviation (Japanese and
  1715.           Taiwanese locales only).
  1716.  
  1717.   gg      Displays the period/era as a full name.
  1718.  
  1719.   e       Displays the year in the current period/era as a number without
  1720.           a leading zero (Japanese, Korean and Taiwanese locales only).
  1721.  
  1722.   ee      Displays the year in the current period/era as a number with
  1723.           a leading zero (Japanese, Korean and Taiwanese locales only).
  1724.  
  1725.   m       Displays the month as a number without a leading zero (1-12). If
  1726.           the m specifier immediately follows an h or hh specifier, the
  1727.           minute rather than the month is displayed.
  1728.  
  1729.   mm      Displays the month as a number with a leading zero (01-12). If
  1730.           the mm specifier immediately follows an h or hh specifier, the
  1731.           minute rather than the month is displayed.
  1732.  
  1733.   mmm     Displays the month as an abbreviation (Jan-Dec) using the strings
  1734.           given by the ShortMonthNames global variable.
  1735.  
  1736.   mmmm    Displays the month as a full name (January-December) using the
  1737.           strings given by the LongMonthNames global variable.
  1738.  
  1739.   yy      Displays the year as a two-digit number (00-99).
  1740.  
  1741.   yyyy    Displays the year as a four-digit number (0000-9999).
  1742.  
  1743.   h       Displays the hour without a leading zero (0-23).
  1744.  
  1745.   hh      Displays the hour with a leading zero (00-23).
  1746.  
  1747.   n       Displays the minute without a leading zero (0-59).
  1748.  
  1749.   nn      Displays the minute with a leading zero (00-59).
  1750.  
  1751.   s       Displays the second without a leading zero (0-59).
  1752.  
  1753.   ss      Displays the second with a leading zero (00-59).
  1754.  
  1755.   z       Displays the millisecond without a leading zero (0-999).
  1756.  
  1757.   zzz     Displays the millisecond with a leading zero (000-999).
  1758.  
  1759.   t       Displays the time using the format given by the ShortTimeFormat
  1760.           global variable.
  1761.  
  1762.   tt      Displays the time using the format given by the LongTimeFormat
  1763.           global variable.
  1764.  
  1765.   am/pm   Uses the 12-hour clock for the preceding h or hh specifier, and
  1766.           displays 'am' for any hour before noon, and 'pm' for any hour
  1767.           after noon. The am/pm specifier can use lower, upper, or mixed
  1768.           case, and the result is displayed accordingly.
  1769.  
  1770.   a/p     Uses the 12-hour clock for the preceding h or hh specifier, and
  1771.           displays 'a' for any hour before noon, and 'p' for any hour after
  1772.           noon. The a/p specifier can use lower, upper, or mixed case, and
  1773.           the result is displayed accordingly.
  1774.  
  1775.   ampm    Uses the 12-hour clock for the preceding h or hh specifier, and
  1776.           displays the contents of the TimeAMString global variable for any
  1777.           hour before noon, and the contents of the TimePMString global
  1778.           variable for any hour after noon.
  1779.  
  1780.   /       Displays the date separator character given by the DateSeparator
  1781.           global variable.
  1782.  
  1783.   :       Displays the time separator character given by the TimeSeparator
  1784.           global variable.
  1785.  
  1786.   'xx'    Characters enclosed in single or double quotes are displayed as-is,
  1787.   "xx"    and do not affect formatting.
  1788.  
  1789.   Format specifiers may be written in upper case as well as in lower case
  1790.   letters--both produce the same result.
  1791.  
  1792.   If the string given by the Format parameter is empty, the date and time
  1793.   value is formatted as if a 'c' format specifier had been given.
  1794.  
  1795.   The following example:
  1796.  
  1797.     S := FormatDateTime('"The meeting is on" dddd, mmmm d, yyyy, ' +
  1798.       '"at" hh:mm AM/PM', StrToDateTime('2/15/95 10:30am'));
  1799.  
  1800.   assigns 'The meeting is on Wednesday, February 15, 1995 at 10:30 AM' to
  1801.   the string variable S. }
  1802.  
  1803. function FormatDateTime(const Format: string; DateTime: TDateTime): string;
  1804.  
  1805. { DateTimeToString converts the date and time value given by DateTime using
  1806.   the format string given by Format into the string variable given by Result.
  1807.   For further details, see the description of the FormatDateTime function. }
  1808.  
  1809. procedure DateTimeToString(var Result: string; const Format: string;
  1810.   DateTime: TDateTime);
  1811.  
  1812. { System error messages }
  1813.  
  1814. function SysErrorMessage(ErrorCode: Integer): string;
  1815.  
  1816. { Initialization file support }
  1817.  
  1818. function GetLocaleStr(Locale, LocaleType: Integer; const Default: string): string;
  1819. function GetLocaleChar(Locale, LocaleType: Integer; Default: Char): Char;
  1820.  
  1821. { GetFormatSettings resets all date and number format variables to their
  1822.   default values. }
  1823.  
  1824. procedure GetFormatSettings;
  1825.  
  1826. { Exception handling routines }
  1827.  
  1828. function ExceptObject: TObject;
  1829. function ExceptAddr: Pointer;
  1830.  
  1831. function ExceptionErrorMessage(ExceptObject: TObject; ExceptAddr: Pointer;
  1832.   Buffer: PChar; Size: Integer): Integer;
  1833.  
  1834. procedure ShowException(ExceptObject: TObject; ExceptAddr: Pointer);
  1835.  
  1836. procedure Abort;
  1837.  
  1838. procedure OutOfMemoryError;
  1839.  
  1840. procedure Beep;
  1841.  
  1842. { MBCS functions }
  1843.  
  1844. { LeadBytes is a char set that indicates which char values are lead bytes
  1845.   in multibyte character sets (Japanese, Chinese, etc).
  1846.   This set is always empty for western locales. }
  1847. var
  1848.   LeadBytes: set of Char = [];
  1849. (*$EXTERNALSYM LeadBytes*)
  1850. (*$HPPEMIT 'namespace Sysutils {'*)
  1851. (*$HPPEMIT 'extern PACKAGE System::Set<Byte, 0, 255>  LeadBytes;'*)
  1852. (*$HPPEMIT '} // namespace Sysutils'*)
  1853.  
  1854. { ByteType indicates what kind of byte exists at the Index'th byte in S.
  1855.   Western locales always return mbSingleByte.  Far East multibyte locales
  1856.   may also return mbLeadByte, indicating the byte is the first in a multibyte
  1857.   character sequence, and mbTrailByte, indicating that the byte is the second
  1858.   in a multibyte character sequence.  Parameters are assumed to be valid. }
  1859.  
  1860. function ByteType(const S: string; Index: Integer): TMbcsByteType;
  1861.  
  1862. { StrByteType works the same as ByteType, but on null-terminated PChar strings }
  1863.  
  1864. function StrByteType(Str: PChar; Index: Cardinal): TMbcsByteType;
  1865.  
  1866. { ByteToCharLen returns the character length of a MBCS string, scanning the
  1867.   string for up to MaxLen bytes.  In multibyte character sets, the number of
  1868.   characters in a string may be less than the number of bytes.  }
  1869.  
  1870. function ByteToCharLen(const S: string; MaxLen: Integer): Integer;
  1871.  
  1872. { CharToByteLen returns the byte length of a MBCS string, scanning the string
  1873.   for up to MaxLen characters. }
  1874.  
  1875. function CharToByteLen(const S: string; MaxLen: Integer): Integer;
  1876.  
  1877. { ByteToCharIndex returns the 1-based character index of the Index'th byte in
  1878.   a MBCS string.  Returns zero if Index is out of range:
  1879.   (Index <= 0) or (Index > Length(S)) }
  1880.  
  1881. function ByteToCharIndex(const S: string; Index: Integer): Integer;
  1882.  
  1883. { CharToByteIndex returns the 1-based byte index of the Index'th character
  1884.   in a MBCS string.  Returns zero if Index or Result are out of range:
  1885.   (Index <= 0) or (Index > Length(S)) or (Result would be > Length(S)) }
  1886.  
  1887. function CharToByteIndex(const S: string; Index: Integer): Integer;
  1888.  
  1889. { IsPathDelimiter returns True if the character at byte S[Index]
  1890.   is '\', and it is not a MBCS lead or trail byte. }
  1891.  
  1892. function IsPathDelimiter(const S: string; Index: Integer): Boolean;
  1893.  
  1894. { IsDelimiter returns True if the character at byte S[Index] matches any
  1895.   character in the Delimiters string, and the character is not a MBCS lead or
  1896.   trail byte.  S may contain multibyte characters; Delimiters must contain
  1897.   only single byte characters. }
  1898.  
  1899. function IsDelimiter(const Delimiters, S: string; Index: Integer): Boolean;
  1900.  
  1901. { IncludeTrailingBackslash returns the path with a '\' at the end.
  1902.   This function is MBCS enabled. }
  1903.  
  1904. function IncludeTrailingBackslash(const S: string): string;
  1905.  
  1906. { ExcludeTrailingBackslash returns the path without a '\' at the end.
  1907.   This function is MBCS enabled. }
  1908.  
  1909. function ExcludeTrailingBackslash(const S: string): string;
  1910.  
  1911. { LastDelimiter returns the byte index in S of the rightmost whole
  1912.   character that matches any character in Delimiters (except null (#0)).
  1913.   S may contain multibyte characters; Delimiters must contain only single
  1914.   byte non-null characters.
  1915.   Example: LastDelimiter('\.:', 'c:\filename.ext') returns 12. }
  1916.  
  1917. function LastDelimiter(const Delimiters, S: string): Integer;
  1918.  
  1919. { AnsiCompareFileName supports DOS file name comparison idiosyncracies
  1920.   in Far East locales (Zenkaku).  In non-MBCS locales, AnsiCompareFileName
  1921.   is identical to AnsiCompareText.  For general purpose file name comparisions,
  1922.   you should use this function instead of AnsiCompareText. }
  1923.  
  1924. function AnsiCompareFileName(const S1, S2: string): Integer;
  1925.  
  1926. { AnsiLowerCaseFileName supports lowercase conversion idiosyncracies of
  1927.   DOS file names in Far East locales (Zenkaku).  In non-MBCS locales,
  1928.   AnsiLowerCaseFileName is identical to AnsiLowerCase. }
  1929.  
  1930. function AnsiLowerCaseFileName(const S: string): string;
  1931.  
  1932. { AnsiUpperCaseFileName supports uppercase conversion idiosyncracies of
  1933.   DOS file names in Far East locales (Zenkaku).  In non-MBCS locales,
  1934.   AnsiUpperCaseFileName is identical to AnsiUpperCase. }
  1935.  
  1936. function AnsiUpperCaseFileName(const S: string): string;
  1937.  
  1938. { AnsiPos:  Same as Pos but supports MBCS strings }
  1939.  
  1940. function AnsiPos(const Substr, S: string): Integer;
  1941.  
  1942. { AnsiStrPos: Same as StrPos but supports MBCS strings }
  1943.  
  1944. function AnsiStrPos(Str, SubStr: PChar): PChar;
  1945.  
  1946. { AnsiStrRScan: Same as StrRScan but supports MBCS strings }
  1947.  
  1948. function AnsiStrRScan(Str: PChar; Chr: Char): PChar;
  1949.  
  1950. { AnsiStrScan: Same as StrScan but supports MBCS strings }
  1951.  
  1952. function AnsiStrScan(Str: PChar; Chr: Char): PChar;
  1953.  
  1954. { StringReplace replaces occurances of <oldpattern> with <newpattern> in a
  1955.   given string.  Assumes the string may contain Multibyte characters }
  1956.  
  1957. type
  1958.   TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
  1959.  
  1960. function StringReplace(const S, OldPattern, NewPattern: string;
  1961.   Flags: TReplaceFlags): string;
  1962.  
  1963. { WrapText will scan a string for BreakChars and insert the BreakStr at the
  1964.   last BreakChar position before MaxCol.  Will not insert a break into an
  1965.   embedded quoted string (both ''' and '"' supported) }
  1966.  
  1967. function WrapText(const Line, BreakStr: string; BreakChars: TSysCharSet;
  1968.   MaxCol: Integer): string; overload;
  1969. function WrapText(const Line: string; MaxCol: Integer = 45): string; overload;
  1970.  
  1971. { FindCmdLineSwitch determines whether the string in the Switch parameter
  1972.   was passed as a command line argument to the application.  SwitchChars
  1973.   identifies valid argument-delimiter characters (i.e., "-" and "/" are
  1974.   common delimiters). The IgnoreCase paramter controls whether a
  1975.   case-sensistive or case-insensitive search is performed. }
  1976.  
  1977. function FindCmdLineSwitch(const Switch: string; SwitchChars: TSysCharSet;
  1978.   IgnoreCase: Boolean): Boolean;
  1979.  
  1980. { FreeAndNil frees the given TObject instance and sets the variable reference
  1981.   to nil.  Be careful to only pass TObjects to this routine. }
  1982.  
  1983. procedure FreeAndNil(var Obj);
  1984.  
  1985. { Interface support routines }
  1986.  
  1987. function Supports(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean; overload;
  1988. function Supports(Instance: TObject; const Intf: TGUID; out Inst): Boolean; overload;
  1989.  
  1990. { Package support routines }
  1991.  
  1992. { Package Info flags }
  1993.  
  1994. const
  1995.   pfNeverBuild = $00000001;
  1996.   pfDesignOnly = $00000002;
  1997.   pfRunOnly = $00000004;
  1998.   pfIgnoreDupUnits = $00000008;
  1999.   pfModuleTypeMask = $C0000000;
  2000.   pfExeModule = $00000000;
  2001.   pfPackageModule = $40000000;
  2002.   pfProducerMask = $0C000000;
  2003.   pfV3Produced =  $00000000;
  2004.   pfProducerUndefined = $04000000;
  2005.   pfBCB4Produced = $08000000;
  2006.   pfDelphi4Produced = $0C000000;
  2007.   pfLibraryModule = $80000000;
  2008.  
  2009. { Unit info flags }
  2010.  
  2011. const
  2012.   ufMainUnit = $01;
  2013.   ufPackageUnit = $02;
  2014.   ufWeakUnit = $04;
  2015.   ufOrgWeakUnit = $08;
  2016.   ufImplicitUnit = $10;
  2017.  
  2018.   ufWeakPackageUnit = ufPackageUnit or ufWeakUnit;
  2019.  
  2020. { Procedure type of the callback given to GetPackageInfo.  Name is the actual
  2021.   name of the package element.  If IsUnit is True then Name is the name of
  2022.   a contained unit; a required package if False.  Param is the value passed
  2023.   to GetPackageInfo }
  2024.  
  2025. type
  2026.   TNameType = (ntContainsUnit, ntRequiresPackage);
  2027.  
  2028.   TPackageInfoProc = procedure (const Name: string; NameType: TNameType; Flags: Byte; Param: Pointer);
  2029.  
  2030. { LoadPackage loads a given package DLL, checks for duplicate units and
  2031.   calls the initialization blocks of all the contained units }
  2032.  
  2033. function LoadPackage(const Name: string): HMODULE;
  2034.  
  2035. { UnloadPackage does the opposite of LoadPackage by calling the finalization
  2036.   blocks of all contained units, then unloading the package DLL }
  2037.  
  2038. procedure UnloadPackage(Module: HMODULE);
  2039.  
  2040. { GetPackageInfo accesses the given package's info table and enumerates
  2041.   all the contained units and required packages }
  2042.  
  2043. procedure GetPackageInfo(Module: HMODULE; Param: Pointer; var Flags: Integer;
  2044.   InfoProc: TPackageInfoProc);
  2045.  
  2046. { GetPackageDescription loads the description resource from the package
  2047.   library. If the description resource does not exist,
  2048.   an empty string is returned. }
  2049. function GetPackageDescription(ModuleName: PChar): string;
  2050.  
  2051. { InitializePackage Validates and initializes the given package DLL }
  2052.  
  2053. procedure InitializePackage(Module: HMODULE);
  2054.  
  2055. { FinalizePackage finalizes the given package DLL }
  2056.  
  2057. procedure FinalizePackage(Module: HMODULE);
  2058.  
  2059. { RaiseLastWin32Error calls the GetLastError API to retrieve the code for }
  2060. { the last occuring Win32 error.  If GetLastError returns an error code,  }
  2061. { RaiseLastWin32Error then raises an exception with the error code and    }
  2062. { message associated with with error. }
  2063.  
  2064. procedure RaiseLastWin32Error;
  2065.  
  2066. { Win32Check is used to check the return value of a Win32 API function     }
  2067. { which returns a BOOL to indicate success.  If the Win32 API function     }
  2068. { returns False (indicating failure), Win32Check calls RaiseLastWin32Error }
  2069. { to raise an exception.  If the Win32 API function returns True,          }
  2070. { Win32Check returns True. }
  2071.  
  2072. function Win32Check(RetVal: BOOL): BOOL;
  2073.  
  2074. { Termination procedure support }
  2075.  
  2076. type
  2077.   TTerminateProc = function: Boolean;
  2078.  
  2079. { Call AddTerminateProc to add a terminate procedure to the system list of }
  2080. { termination procedures.  Delphi will call all of the function in the     }
  2081. { termination procedure list before an application terminates.  The user-  }
  2082. { defined TermProc function should return True if the application can      }
  2083. { safely terminate or False if the application cannot safely terminate.    }
  2084. { If one of the functions in the termination procedure list returns False, }
  2085. { the application will not terminate. }
  2086.  
  2087. procedure AddTerminateProc(TermProc: TTerminateProc);
  2088.  
  2089. { CallTerminateProcs is called by VCL when an application is about to }
  2090. { terminate.  It returns True only if all of the functions in the     }
  2091. { system's terminate procedure list return True.  This function is    }
  2092. { intended only to be called by Delphi, and it should not be called   }
  2093. { directly. }
  2094.  
  2095. function CallTerminateProcs: Boolean;
  2096.  
  2097. function GDAL: LongWord;
  2098. procedure RCS;
  2099. procedure RPR;
  2100.  
  2101.  
  2102. { HexDisplayPrefix contains the prefix to display on hexadecimal
  2103.   values - '$' for Pascal syntax, '0x' for C++ syntax.  This is
  2104.   for display only - this does not affect the string-to-integer
  2105.   conversion routines. }
  2106. var
  2107.   HexDisplayPrefix: string = '$';
  2108.  
  2109. { The GetDiskFreeSpace Win32 API does not support partitions larger than 2GB
  2110.   under Win95.  A new Win32 function, GetDiskFreeSpaceEx, supports partitions
  2111.   larger than 2GB but only exists on Win NT 4.0 and Win95 OSR2.
  2112.   The GetDiskFreeSpaceEx function pointer variable below will be initialized
  2113.   at startup to point to either the actual OS API function if it exists on
  2114.   the system, or to an internal Delphi function if it does not.  When running
  2115.   on Win95 pre-OSR2, the output of this function will still be limited to
  2116.   the 2GB range reported by Win95, but at least you don't have to worry
  2117.   about which API function to call in code you write.  }
  2118.  
  2119. var
  2120.   GetDiskFreeSpaceEx: function (Directory: PChar; var FreeAvailable,
  2121.     TotalSpace: TLargeInteger; TotalFree: PLargeInteger): Bool stdcall = nil;
  2122.  
  2123. { SafeLoadLibrary calls LoadLibrary, disabling normal Win32 error message
  2124.   popup dialogs if the requested file can't be loaded.  SafeLoadLibrary also
  2125.   preserves the current FPU control word (precision, exception masks) across
  2126.   the LoadLibrary call (in case the DLL you're loading hammers the FPU control
  2127.   word in its initialization, as many MS DLLs do)}
  2128.  
  2129. function SafeLoadLibrary(const Filename: string;
  2130.   ErrorMode: UINT = SEM_NOOPENFILEERRORBOX): HMODULE;
  2131.  
  2132. { Thread synchronization }
  2133.  
  2134. { TMultiReadExclusiveWriteSynchronizer minimizes thread serialization to gain
  2135.   read access to a resource shared among threads while still providing complete
  2136.   exclusivity to callers needing write access to the shared resource.
  2137.   (multithread shared reads, single thread exclusive write)
  2138.   Reading is allowed while owning a write lock.
  2139.   Read locks can be promoted to write locks.}
  2140.  
  2141. type
  2142.   TActiveThreadRecord = record
  2143.     ThreadID: Integer;
  2144.     RecursionCount: Integer;
  2145.   end;
  2146.   TActiveThreadArray = array of TActiveThreadRecord;
  2147.  
  2148.   TMultiReadExclusiveWriteSynchronizer = class
  2149.   public
  2150.     constructor Create;
  2151.     destructor Destroy; override;
  2152.     procedure BeginRead;
  2153.     procedure EndRead;
  2154.     procedure BeginWrite;
  2155.     procedure EndWrite;
  2156.   end;
  2157.  
  2158. implementation
  2159.