system.ansistrings.pp 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448
  1. {
  2. This file is part of the Free Pascal Run Time Library (rtl)
  3. Copyright (c) 2023 by the Free Pascal development team
  4. This file provides an ansistring unit as delphi has it.
  5. Most routines are present in the SysUtils and StrUtils unit.
  6. Do not use this for new FPC code.
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit System.AnsiStrings;
  14. {$mode objfpc}
  15. {$H+}
  16. {$Macro ON}
  17. interface
  18. uses
  19. {$ifdef FPC_DOTTEDUNITS}
  20. System.SysUtils, System.StrUtils;
  21. {$else FPC_DOTTEDUNITS}
  22. SysUtils, StrUtils;
  23. {$endif FPC_DOTTEDUNITS}
  24. const
  25. EmptyAnsiStr: AnsiString = '';
  26. NullAnsiStr: PAnsiString = @EmptyAnsiStr;
  27. WordDelimiters: set of Byte = [0..255] -
  28. [Ord('a')..Ord('z'), Ord('A')..Ord('Z'), Ord('1')..Ord('9'), Ord('0')];
  29. {Type
  30. TFilenameCaseMatch = SysUtils.TFil;}
  31. function AdjustLineBreaks(const S: AnsiString; Style: TTextLineBreakStyle): AnsiString; overload;
  32. function AnsiCompareFileName(const S1, S2: AnsiString): Integer; inline;
  33. function AnsiCompareStr(const S1, S2: AnsiString): Integer; inline; overload;
  34. function AnsiCompareText(const S1, S2: AnsiString): Integer; inline; overload;
  35. function AnsiContainsStr(const AText, ASubText: AnsiString): Boolean; overload;
  36. function AnsiContainsText(const AText, ASubText: AnsiString): Boolean; overload;
  37. function AnsiDequotedStr(const S: AnsiString; AQuote: AnsiChar): AnsiString; overload;
  38. function AnsiEndsStr(const ASubText, AText: AnsiString): Boolean; overload;
  39. function AnsiEndsText(const ASubText, AText: AnsiString): Boolean; overload;
  40. function AnsiExtractQuotedStr(var Src: PAnsiChar; Quote: AnsiChar): AnsiString; overload;
  41. function AnsiFormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const): Cardinal; overload;
  42. function AnsiFormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const; const AFormatSettings: TFormatSettings): Cardinal; overload;
  43. function AnsiIndexStr(const AText: AnsiString; const AValues: array of AnsiString): Integer; overload;
  44. function AnsiIndexText(const AText: AnsiString; const AValues: array of AnsiString): Integer; overload;
  45. function AnsiLastChar(const S: AnsiString): PAnsiChar; overload;
  46. function AnsiLeftStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
  47. function AnsiLowerCase(const S: AnsiString): AnsiString; overload;
  48. function AnsiLowerCaseFileName(const S: AnsiString): AnsiString; overload; deprecated 'Use AnsiLowerCase instead';
  49. function AnsiMatchStr(const AText: AnsiString; const AValues: array of AnsiString): Boolean; overload;
  50. function AnsiMatchText(const AText: AnsiString; const AValues: array of AnsiString): Boolean; overload;
  51. function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString; overload;
  52. function AnsiPos(const Substr, S: AnsiString): Integer; overload;
  53. function AnsiQuotedStr(const S: AnsiString; Quote: AnsiChar): AnsiString; overload;
  54. function AnsiReplaceStr(const AText, AFromText, AToText: AnsiString): AnsiString; overload;
  55. function AnsiReplaceText(const AText, AFromText, AToText: AnsiString): AnsiString; overload;
  56. function AnsiReverseString(const AText: AnsiString): AnsiString; overload;
  57. function AnsiRightStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
  58. function AnsiSameStr(const S1, S2: AnsiString): Boolean; inline; overload;
  59. function AnsiSameText(const S1, S2: AnsiString): Boolean; inline; overload;
  60. function AnsiStartsStr(const ASubText, AText: AnsiString): Boolean; overload;
  61. function AnsiStartsText(const ASubText, AText: AnsiString): Boolean; overload;
  62. function AnsiStrAlloc(Size: Cardinal): PAnsiChar;
  63. function AnsiStrComp(S1, S2: PAnsiChar): Integer; inline; overload;
  64. function AnsiStrIComp(S1, S2: PAnsiChar): Integer; inline; overload;
  65. function AnsiStrLastChar(P: PAnsiChar): PAnsiChar; overload;{$IFNDEF POSIX} inline; {$ENDIF}
  66. function AnsiStrLComp(S1, S2: PAnsiChar; MaxLen: Cardinal): Integer; overload;
  67. function AnsiStrLIComp(S1, S2: PAnsiChar; MaxLen: Cardinal): Integer; overload;
  68. function AnsiStrLower(Str: PAnsiChar): PAnsiChar; overload;{$IFDEF MSWINDOWS} inline; {$ENDIF}
  69. function AnsiStrPos(Str, SubStr: PAnsiChar): PAnsiChar; overload;
  70. function AnsiStrRScan(Str: PAnsiChar; Chr: AnsiChar): PAnsiChar; overload;
  71. function AnsiStrScan(Str: PAnsiChar; Chr: AnsiChar): PAnsiChar; overload;
  72. function AnsiStrUpper(Str: PAnsiChar): PAnsiChar; overload;{$IFDEF MSWINDOWS} inline; {$ENDIF}
  73. function AnsiUpperCase(const S: AnsiString): AnsiString; overload;
  74. function AnsiUpperCaseFileName(const S: AnsiString): AnsiString; overload; deprecated 'Use AnsiUpperCase instead';
  75. procedure AppendStr(var Dest: AnsiString; const S: AnsiString); deprecated;
  76. procedure AssignStr(var P: PAnsiString; const S: AnsiString); deprecated;
  77. function ByteToCharIndex(const S: AnsiString; Index: Integer): Integer; overload; inline; deprecated 'Use ElementToCharIndex.';
  78. function ByteToCharLen(const S: AnsiString; MaxLen: Integer): Integer; overload; inline; deprecated 'Use ElementToCharLen';
  79. function ByteType(const S: AnsiString; Index: Integer): TMbcsByteType; overload;
  80. function ChangeFileExt(const FileName, Extension: AnsiString): AnsiString; overload;
  81. function ChangeFilePath(const FileName, Path: AnsiString): AnsiString; overload;
  82. function CharLength(const S: AnsiString; Index: Integer): Integer; overload;
  83. function CharToByteIndex(const S: AnsiString; Index: Integer): Integer; overload; inline; deprecated 'Use CharToElementIndex.';
  84. function CharToByteLen(const S: AnsiString; MaxLen: Integer): Integer; overload; inline; deprecated 'Use CharToElementLen.';
  85. function CharToElementIndex(const S: AnsiString; Index: Integer): Integer; overload;
  86. function CharToElementLen(const S: AnsiString; MaxLen: Integer): Integer; overload;
  87. function CompareStr(const S1, S2: AnsiString): Integer; overload;
  88. function CompareStr(const S1, S2: AnsiString; LocaleOptions: TLocaleOptions): Integer; overload;
  89. function CompareText(const S1, S2: AnsiString): Integer; overload;
  90. function CompareText(const S1, S2: AnsiString; LocaleOptions: TLocaleOptions): Integer; overload;
  91. function ContainsStr(const AText, ASubText: AnsiString): Boolean; inline; overload;
  92. function ContainsText(const AText, ASubText: AnsiString): Boolean; inline; overload;
  93. procedure DisposeStr(P: PAnsiString); deprecated;
  94. function DupeString(const AText: AnsiString; ACount: Integer): AnsiString; overload;
  95. function ElementToCharIndex(const S: AnsiString; Index: Integer): Integer; overload;
  96. function ElementToCharLen(const S: AnsiString; MaxLen: Integer): Integer; overload;
  97. function EndsStr(const ASubText, AText: AnsiString): Boolean; inline; overload;
  98. function EndsText(const ASubText, AText: AnsiString): Boolean; inline; overload;
  99. function ExcludeTrailingBackslash(const S: AnsiString): AnsiString; platform;
  100. function ExcludeTrailingPathDelimiter(const S: AnsiString): AnsiString; overload;
  101. function ExpandFileNameCase(const FileName: AnsiString; out MatchFound: TFilenameCaseMatch): AnsiString; overload;
  102. function ExpandFileName(const FileName: AnsiString): AnsiString; overload;
  103. function ExpandUNCFileName(const FileName: AnsiString): AnsiString; overload;
  104. function ExtractFileDir(const FileName: AnsiString): AnsiString; overload;
  105. function ExtractFileDrive(const FileName: AnsiString): AnsiString; overload;
  106. function ExtractFileExt(const FileName: AnsiString): AnsiString; overload;
  107. function ExtractFileName(const FileName: AnsiString): AnsiString; overload;
  108. function ExtractFilePath(const FileName: AnsiString): AnsiString; overload;
  109. function ExtractRelativePath(const BaseName, DestName: AnsiString): AnsiString; overload;
  110. function ExtractShortPathName(const FileName: AnsiString): AnsiString; overload;
  111. function FloatToText(BufferArg: PAnsiChar; const Value; ValueType: TFloatValue; Format: TFloatFormat; Precision, Digits: Integer; const AFormatSettings: TFormatSettings): Integer; overload;
  112. function FloatToText(BufferArg: PAnsiChar; const Value; ValueType: TFloatValue; Format: TFloatFormat; Precision, Digits: Integer): Integer; overload; inline;
  113. function FloatToTextFmt(Buf: PAnsiChar; const Value; ValueType: TFloatValue; Format: PAnsiChar; const AFormatSettings: TFormatSettings): Integer; overload;
  114. function FloatToTextFmt(Buf: PAnsiChar; const Value; ValueType: TFloatValue; Format: PAnsiChar): Integer; overload; inline;
  115. procedure FmtStr(var aResult: AnsiString; const Format: AnsiString; const Args: array of const; const AFormatSettings: TFormatSettings); overload;
  116. procedure FmtStr(var aResult: AnsiString; const Format: AnsiString; const Args: array of const); overload;
  117. function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const): Cardinal; overload;
  118. function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const; const AFormatSettings: TFormatSettings): Cardinal; overload;
  119. function Format(const aFormat: AnsiString; const Args: array of const): AnsiString; overload;
  120. function Format(const aFormat: AnsiString; const Args: array of const; const AFormatSettings: TFormatSettings): AnsiString; overload;
  121. function IncludeTrailingBackslash(const S: AnsiString): AnsiString; platform;
  122. function IncludeTrailingPathDelimiter(const S: AnsiString): AnsiString; overload;
  123. function IndexStr(const AText: AnsiString; const AValues: array of AnsiString): Integer; overload;
  124. function IndexText(const AText: AnsiString; const AValues: array of AnsiString): Integer; overload;
  125. function IsDelimiter(const Delimiters, S: AnsiString; Index: Integer): Boolean; overload;
  126. function IsPathDelimiter(const S: AnsiString; Index: Integer): Boolean; overload;
  127. function IsValidIdent(const Ident: AnsiString; AllowDots: Boolean; StrictDots : Boolean = False): Boolean;
  128. function LastDelimiter(const Delimiters, S: AnsiString): Integer; overload;
  129. function LeftBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
  130. function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
  131. function LowerCase(const S: AnsiString): AnsiString; overload;
  132. function LowerCase(const S: AnsiString; LocaleOptions: TLocaleOptions): AnsiString; overload; inline;
  133. function MatchStr(const AText: AnsiString; const AValues: array of AnsiString): Boolean; overload;
  134. function MatchText(const AText: AnsiString; const AValues: array of AnsiString): Boolean; overload;
  135. function MidBStr(const AText: AnsiString; const AByteStart, AByteCount: Integer): AnsiString;
  136. function MidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString; overload;
  137. function NewStr(const S: AnsiString): PAnsiString; deprecated;
  138. function NextCharIndex(const S: AnsiString; Index: Integer): Integer; overload;
  139. function PosEx(const SubStr, S: AnsiString; Offset: Integer = 1): Integer; inline; overload;
  140. function QuotedStr(const S: AnsiString): AnsiString; overload;
  141. function RandomFrom(const AValues: array of AnsiString): AnsiString; overload;
  142. function ReplaceStr(const AText, AFromText, AToText: AnsiString): AnsiString; inline; overload;
  143. function ReplaceText(const AText, AFromText, AToText: AnsiString): AnsiString; inline; overload;
  144. function ReverseString(const AText: AnsiString): AnsiString; overload;
  145. function RightBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
  146. function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
  147. function SameFileName(const S1, S2: AnsiString): Boolean; inline; overload;
  148. function SameStr(const S1, S2: AnsiString): Boolean; overload;
  149. function SameStr(const S1, S2: AnsiString; LocaleOptions: TLocaleOptions): Boolean; overload;
  150. function SameText(const S1, S2: AnsiString): Boolean; overload;
  151. function SameText(const S1, S2: AnsiString; LocaleOptions: TLocaleOptions): Boolean; overload;
  152. function SearchBuf(Buf: PAnsiChar; BufLen: Integer; SelStart, SelLength: Integer; SearchString: AnsiString; Options: TStringSearchOptions = [soDown]): PAnsiChar; overload;
  153. function StartsStr(const ASubText, AText: AnsiString): Boolean; inline; overload;
  154. function StartsText(const ASubText, AText: AnsiString): Boolean; inline; overload;
  155. function StrBufSize(const Str: PAnsiChar): Cardinal; overload;
  156. function StrByteType(Str: PAnsiChar; Index: Cardinal): TMbcsByteType; overload;
  157. function StrCat(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar; overload;
  158. function StrCharLength(const Str: PAnsiChar): Integer; overload;
  159. function StrComp(const Str1, Str2: PAnsiChar): Integer; overload;
  160. function StrCopy(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar; overload;
  161. procedure StrDispose(Str: PAnsiChar); overload;
  162. function StrECopy(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar; overload;
  163. function StrEnd(const Str: PAnsiChar): PAnsiChar; overload;
  164. function StrFmt(Buffer, Format: PAnsiChar; const Args: array of const; const AFormatSettings: TFormatSettings): PAnsiChar; overload;
  165. function StrFmt(Buffer, Format: PAnsiChar; const Args: array of const): PAnsiChar; overload;
  166. function StrIComp(const Str1, Str2: PAnsiChar): Integer; overload;
  167. function StringReplace(const Source, OldPattern, NewPattern: AnsiString; Flags: TReplaceFlags): AnsiString; overload;
  168. function StrLCat(Dest: PAnsiChar; const Source: PAnsiChar; MaxLen: Cardinal): PAnsiChar; overload;
  169. function StrLComp(const Str1, Str2: PAnsiChar; MaxLen: Cardinal): Integer; overload;
  170. function StrLCopy(Dest: PAnsiChar; const Source: PAnsiChar; MaxLen: Cardinal): PAnsiChar; overload;
  171. function StrLen(const Str: PAnsiChar): Cardinal; overload;{$IFNDEF LEGACYSTRLEN} inline; {$ENDIF}
  172. function StrLFmt(Buffer: PAnsiChar; MaxBufLen: Cardinal; Format: PAnsiChar; const Args: array of const; const AFormatSettings: TFormatSettings): PAnsiChar; overload;
  173. function StrLFmt(Buffer: PAnsiChar; MaxBufLen: Cardinal; Format: PAnsiChar; const Args: array of const): PAnsiChar; overload;
  174. function StrLIComp(const Str1, Str2: PAnsiChar; MaxLen: Cardinal): Integer; overload;
  175. function StrLower(Str: PAnsiChar): PAnsiChar; overload;
  176. function StrMove(Dest: PAnsiChar; const Source: PAnsiChar; Count: Cardinal): PAnsiChar; overload;
  177. function StrNew(const Str: PAnsiChar): PAnsiChar; overload;
  178. function StrNextChar(const Str: PAnsiChar): PAnsiChar; inline; overload;
  179. function StrPas(const Str: PAnsiChar): AnsiString; overload;
  180. function StrPCopy(Dest: PAnsiChar; const Source: AnsiString): PAnsiChar; overload;
  181. function StrPLCopy(Dest: PAnsiChar; const Source: AnsiString; MaxLen: Cardinal): PAnsiChar; overload;
  182. function StrPos(const Str1, Str2: PAnsiChar): PAnsiChar; overload;
  183. function StrRScan(const Str: PAnsiChar; Chr: AnsiChar): PAnsiChar; overload;
  184. function StrScan(const Str: PAnsiChar; Chr: AnsiChar): PAnsiChar; overload;
  185. function StrUpper(Str: PAnsiChar): PAnsiChar; overload;
  186. function StuffString(const AText: AnsiString; AStart, ALength: Cardinal; const ASubText: AnsiString): AnsiString; overload;
  187. function TextPos(Str, SubStr: PAnsiChar): PAnsiChar; overload;
  188. function TextToFloat(Buffer: PAnsiChar; var Value; ValueType: TFloatValue): Boolean; overload; inline;
  189. function TextToFloat(Buffer: PAnsiChar; var Value; ValueType: TFloatValue; const AFormatSettings: TFormatSettings): Boolean; overload;
  190. function Trim(const S: AnsiString): AnsiString; overload;
  191. function TrimLeft(const S: AnsiString): AnsiString; overload;
  192. function TrimRight(const S: AnsiString): AnsiString; overload;
  193. function UpperCase(const S: AnsiString): AnsiString; overload;
  194. function UpperCase(const S: AnsiString; LocaleOptions: TLocaleOptions): AnsiString; overload; inline;
  195. implementation
  196. {$IF SIZEOF(SIZEINT)>SIZEOF(INTEGER)}
  197. Function DoCapSizeInt(SI : SizeInt) : Integer; inline;
  198. begin
  199. if (SI<0) then
  200. result:=-1
  201. else if (SI>0) then
  202. result:=1
  203. else
  204. result:=0;
  205. end;
  206. {$DEFINE CAPSIZEINT:=DoCapSizeInt}
  207. {$ELSE}
  208. {$DEFINE CAPSIZEINT:=}
  209. {$ENDIF}
  210. function AdjustLineBreaks(const S: AnsiString; Style: TTextLineBreakStyle): AnsiString;
  211. var
  212. Source,Dest: PAnsiChar;
  213. DestLen: Integer;
  214. I,J,L: Longint;
  215. begin
  216. Source:=Pointer(S);
  217. L:=Length(S);
  218. DestLen:=L;
  219. I:=1;
  220. while (I<=L) do
  221. begin
  222. case S[i] of
  223. #10: if (Style=tlbsCRLF) then
  224. Inc(DestLen);
  225. #13: if (Style=tlbsCRLF) then
  226. if (I<L) and (S[i+1]=#10) then
  227. Inc(I)
  228. else
  229. Inc(DestLen)
  230. else if (I<L) and (S[I+1]=#10) then
  231. Dec(DestLen);
  232. end;
  233. Inc(I);
  234. end;
  235. if (DestLen=L) then
  236. Result:=S
  237. else
  238. begin
  239. SetLength(Result, DestLen);
  240. FillChar(Result[1],DestLen,0);
  241. Dest := Pointer(Result);
  242. J:=0;
  243. I:=0;
  244. While I<L do
  245. case Source[I] of
  246. #10: begin
  247. if Style=tlbsCRLF then
  248. begin
  249. Dest[j]:=#13;
  250. Inc(J);
  251. end;
  252. Dest[J] := #10;
  253. Inc(J);
  254. Inc(I);
  255. end;
  256. #13: begin
  257. if Style=tlbsCRLF then
  258. begin
  259. Dest[j] := #13;
  260. Inc(J);
  261. end;
  262. Dest[j]:=#10;
  263. Inc(J);
  264. Inc(I);
  265. if Source[I]=#10 then
  266. Inc(I);
  267. end;
  268. else
  269. Dest[j]:=Source[i];
  270. Inc(J);
  271. Inc(I);
  272. end;
  273. end;
  274. end;
  275. function AnsiCompareStr(const S1, S2: AnsiString): Integer;
  276. begin
  277. result:=CAPSIZEINT(widestringmanager.CompareStrAnsiStringProc(s1,s2));
  278. end;
  279. function AnsiCompareText(const S1, S2: AnsiString): Integer;
  280. begin
  281. result:=CAPSIZEINT(widestringmanager.CompareTextAnsiStringProc(s1,s2));
  282. end;
  283. function AnsiCompareFileName(const S1, S2: AnsiString): Integer;
  284. begin
  285. If FileNameCaseSensitive then
  286. Result:=AnsiCompareStr(S1,S2) // Compare case sensitive
  287. else
  288. Result:=AnsiCompareText(S1,S2); // Compare case insensitive. No MBCS yet.
  289. end;
  290. function AnsiContainsStr(const AText, ASubText: AnsiString): Boolean;
  291. begin
  292. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiContainsStr(aText,aSubText);
  293. end;
  294. function AnsiContainsText(const AText, ASubText: AnsiString): Boolean;
  295. begin
  296. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiContainsText(aText,aSubText);
  297. end;
  298. function AnsiDequotedStr(const S: AnsiString; AQuote: AnsiChar): AnsiString;
  299. var
  300. p : PAnsiChar;
  301. begin
  302. p:=PAnsiChar(Pointer(s)); // work around CONST. Ansiextract is safe for nil
  303. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.AnsiExtractquotedStr(P,AQuote);
  304. end;
  305. function AnsiEndsStr(const ASubText, AText: AnsiString): Boolean;
  306. begin
  307. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiEndsStr(aSubText,aText);
  308. end;
  309. function AnsiEndsText(const ASubText, AText: AnsiString): Boolean;
  310. begin
  311. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiEndsText(aSubText,aText);
  312. end;
  313. function AnsiExtractQuotedStr(var Src: PAnsiChar; Quote: AnsiChar): AnsiString;
  314. begin
  315. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.AnsiExtractQuotedStr(Src,Quote);
  316. end;
  317. function AnsiFormatBuf(var Buffer; BufLen: Cardinal; const Format;
  318. FmtLen: Cardinal; const Args: array of const): Cardinal;
  319. begin
  320. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FormatBuf(Buffer,BufLen,Format,FmtLen,Args);
  321. end;
  322. function AnsiFormatBuf(var Buffer; BufLen: Cardinal; const Format;
  323. FmtLen: Cardinal; const Args: array of const;
  324. const AFormatSettings: TFormatSettings): Cardinal;
  325. begin
  326. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FormatBuf(Buffer,BufLen,Format,FmtLen,Args,AFormatSettings);
  327. end;
  328. function AnsiIndexStr(const AText: AnsiString;
  329. const AValues: array of AnsiString): Integer;
  330. begin
  331. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiIndexStr(aText,aValues);
  332. end;
  333. function AnsiIndexText(const AText: AnsiString;
  334. const AValues: array of AnsiString): Integer;
  335. begin
  336. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiIndexText(aText,aValues);
  337. end;
  338. function AnsiLastChar(const S: AnsiString): PAnsiChar;
  339. begin
  340. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.AnsiLastChar(S);
  341. end;
  342. function AnsiLeftStr(const AText: AnsiString; const ACount: Integer
  343. ): AnsiString;
  344. begin
  345. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.LeftStr(aText,aCount);
  346. end;
  347. function AnsiLowerCase(const S: AnsiString): AnsiString;
  348. begin
  349. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.LowerCase(S);
  350. end;
  351. function AnsiLowerCaseFileName(const S: AnsiString): AnsiString;
  352. begin
  353. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.LowerCase(S);
  354. end;
  355. function AnsiMatchStr(const AText: AnsiString;
  356. const AValues: array of AnsiString): Boolean;
  357. begin
  358. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiMatchStr(aText,aValues);
  359. end;
  360. function AnsiMatchText(const AText: AnsiString;
  361. const AValues: array of AnsiString): Boolean;
  362. begin
  363. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiMatchText(aText,aValues);
  364. end;
  365. function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer
  366. ): AnsiString;
  367. begin
  368. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.MidStr(aText,aStart,aCount);
  369. end;
  370. function AnsiPos(const Substr, S: AnsiString): Integer;
  371. begin
  372. Result:=System.Pos(Substr,S);
  373. end;
  374. function AnsiQuotedStr(const S: AnsiString; Quote: AnsiChar): AnsiString;
  375. var
  376. i, j, count: integer;
  377. begin
  378. Result:='';
  379. count:=length(s);
  380. i:=0;
  381. j:=0;
  382. while (i<count) do
  383. begin
  384. Inc(I);
  385. if (S[i]=Quote) then
  386. begin
  387. Result:=Result+Copy(S,1+j,i-j)+Quote;
  388. j:=i;
  389. end ;
  390. end ;
  391. if i<>j then
  392. Result:=Result+copy(S,1+j,i-j);
  393. Result:=Result+Quote;
  394. end;
  395. function AnsiReplaceStr(const AText, AFromText, AToText: AnsiString
  396. ): AnsiString;
  397. begin
  398. Result := StringReplace(AText,AFromText,AToText,[rfReplaceAll]);
  399. end;
  400. function AnsiReplaceText(const AText, AFromText, AToText: AnsiString
  401. ): AnsiString;
  402. begin
  403. Result := StringReplace(AText,AFromText,AToText,[rfReplaceAll,rfIgnoreCase]);
  404. end;
  405. function AnsiReverseString(const AText: AnsiString): AnsiString;
  406. var
  407. i,j : SizeInt;
  408. begin
  409. result:='';
  410. j:=Length(atext);
  411. setLength(Result,j);
  412. i:=1;
  413. while (i<=j) do
  414. begin
  415. Result[i]:=atext[j-i+1];
  416. inc(i);
  417. end;
  418. end;
  419. function AnsiRightStr(const AText: AnsiString; const ACount: Integer
  420. ): AnsiString;
  421. begin
  422. Result:=RightStr(aText,aCount);
  423. end;
  424. function AnsiSameStr(const S1, S2: AnsiString): Boolean;
  425. begin
  426. Result:=SameStr(S1,S2);
  427. end;
  428. function AnsiSameText(const S1, S2: AnsiString): Boolean;
  429. begin
  430. Result:=SameText(S1,S2);
  431. end;
  432. function AnsiStartsStr(const ASubText, AText: AnsiString): Boolean;
  433. begin
  434. if (Length(AText) >= Length(ASubText)) and (ASubText <> '') then
  435. Result := StrLComp(PAnsiChar(ASubText), PAnsiChar(AText), Length(ASubText)) = 0
  436. else
  437. Result := (AsubText='');
  438. end;
  439. function AnsiStartsText(const ASubText, AText: AnsiString): Boolean;
  440. begin
  441. Result:=(ASubText = '') or AnsiSameText(LeftStr(AText,Length(ASubText)), ASubText);
  442. end;
  443. function AnsiStrAlloc(Size: Cardinal): PAnsiChar;
  444. begin
  445. Result:=StrAlloc(Size);
  446. end;
  447. function AnsiStrComp(S1, S2: PAnsiChar): Integer;
  448. begin
  449. result:=CAPSIZEINT(widestringmanager.StrCompAnsiStringProc(s1,s2));
  450. end;
  451. function AnsiStrIComp(S1, S2: PAnsiChar): Integer;
  452. begin
  453. result:=CAPSIZEINT(widestringmanager.StrICompAnsiStringProc(s1,s2));
  454. end;
  455. function AnsiStrLastChar(P: PAnsiChar): PAnsiChar;
  456. begin
  457. result:=StrEnd(P);
  458. Dec(Result);
  459. end;
  460. function AnsiStrLComp(S1, S2: PAnsiChar; MaxLen: Cardinal): Integer;
  461. begin
  462. result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}Sysutils.AnsiStrLComp(S1,S2,MaxLen);
  463. end;
  464. function AnsiStrLIComp(S1, S2: PAnsiChar; MaxLen: Cardinal): Integer;
  465. begin
  466. result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}Sysutils.AnsiStrLIComp(S1,S2,MaxLen);
  467. end;
  468. function AnsiStrLower(Str: PAnsiChar): PAnsiChar;
  469. begin
  470. result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}Sysutils.AnsiStrLower(Str);
  471. end;
  472. function AnsiStrPos(Str, SubStr: PAnsiChar): PAnsiChar;
  473. begin
  474. result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}Sysutils.AnsiStrPos(Str,SubStr);
  475. end;
  476. function AnsiStrRScan(Str: PAnsiChar; Chr: AnsiChar): PAnsiChar;
  477. begin
  478. result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}Sysutils.AnsiStrRScan(Str,Chr);
  479. end;
  480. function AnsiStrScan(Str: PAnsiChar; Chr: AnsiChar): PAnsiChar;
  481. begin
  482. result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}Sysutils.AnsiStrScan(Str,Chr);
  483. end;
  484. function AnsiStrUpper(Str: PAnsiChar): PAnsiChar;
  485. begin
  486. result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}Sysutils.AnsiStrUpper(Str);
  487. end;
  488. function AnsiUpperCase(const S: AnsiString): AnsiString;
  489. begin
  490. result:=widestringmanager.UpperAnsiStringProc(s);
  491. end;
  492. function AnsiUpperCaseFileName(const S: AnsiString): AnsiString;
  493. begin
  494. result:=AnsiUpperCase(S);
  495. end;
  496. procedure AppendStr(var Dest: AnsiString; const S: AnsiString);
  497. begin
  498. Dest:=Dest+S;
  499. end;
  500. procedure AssignStr(var P: PAnsiString; const S: AnsiString);
  501. begin
  502. P^:=S;
  503. end;
  504. function ByteToCharIndex(const S: AnsiString; Index: Integer): Integer;
  505. begin
  506. if (Index>0) and (Index<=Length(S)) then
  507. result:=Index
  508. else
  509. Result:=0;
  510. end;
  511. function ByteToCharLen(const S: AnsiString; MaxLen: Integer): Integer;
  512. begin
  513. result:=Length(S);
  514. if Result>MaxLen then
  515. Result:=MaxLen;
  516. end;
  517. function ByteType(const S: AnsiString; Index: Integer): TMbcsByteType;
  518. begin
  519. if (Index>0) and (Index<=Length(S)) then
  520. Result:=mbSingleByte
  521. else
  522. Result:=mbSingleByte;
  523. end;
  524. function ChangeFileExt(const FileName, Extension: AnsiString): AnsiString;
  525. begin
  526. result:=AnsiString({$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}Sysutils.ChangeFileExt(RawByteString(FileName),RawByteString(Extension)));
  527. end;
  528. function ChangeFilePath(const FileName, Path: AnsiString): AnsiString;
  529. begin
  530. Result:=IncludeTrailingPathDelimiter(Path)+ExtractFileName(FileName);
  531. end;
  532. function CharLength(const S: AnsiString; Index: Integer): Integer;
  533. begin
  534. if (Index>0) and (Index<=Length(S)) then
  535. Result:=1
  536. else
  537. Result:=0;
  538. end;
  539. function CharToByteIndex(const S: AnsiString; Index: Integer): Integer;
  540. begin
  541. if (Index>0) and (Index<=Length(S)) then
  542. Result:=Index
  543. else
  544. Result:=0;
  545. end;
  546. function CharToByteLen(const S: AnsiString; MaxLen: Integer): Integer;
  547. begin
  548. result:=Length(S);
  549. if Result>MaxLen then
  550. Result:=MaxLen;
  551. end;
  552. function CharToElementIndex(const S: AnsiString; Index: Integer): Integer;
  553. begin
  554. if (Index>0) and (Index<=Length(S)) then
  555. Result:=Index
  556. else
  557. Result:=0;
  558. end;
  559. function CharToElementLen(const S: AnsiString; MaxLen: Integer): Integer;
  560. begin
  561. result:=Length(S);
  562. if Result>MaxLen then
  563. Result:=MaxLen;
  564. end;
  565. function CompareStr(const S1, S2: AnsiString): Integer;
  566. var
  567. Count, Count1,Count2 : Integer;
  568. begin
  569. Count1 := Length(S1);
  570. Count2 := Length(S2);
  571. if Count1>Count2 then
  572. Count:=Count2
  573. else
  574. Count:=Count1;
  575. result:=CompareMemRange(Pointer(S1),Pointer(S2),Count);
  576. if result=0 then
  577. // CAPSIZEINT is no-op if Sizeof(Sizeint)<=SizeOF(Integer)
  578. result:=CAPSIZEINT(Count1-Count2);
  579. end;
  580. function CompareStr(const S1, S2: AnsiString; LocaleOptions: TLocaleOptions
  581. ): Integer;
  582. begin
  583. case LocaleOptions of
  584. loInvariantLocale: Result:=CompareStr(S1,S2);
  585. loUserLocale: Result:=AnsiCompareStr(S1,S2);
  586. end;
  587. end;
  588. function CompareText(const S1, S2: AnsiString): Integer;
  589. var
  590. i, count, count1, count2: sizeint;
  591. Chr1, Chr2: byte;
  592. P1, P2: PChar;
  593. begin
  594. Count1 := Length(S1);
  595. Count2 := Length(S2);
  596. if (Count1>Count2) then
  597. Count := Count2
  598. else
  599. Count := Count1;
  600. i := 0;
  601. if count>0 then
  602. begin
  603. P1 := @S1[1];
  604. P2 := @S2[1];
  605. while i < Count do
  606. begin
  607. Chr1 := byte(p1^);
  608. Chr2 := byte(p2^);
  609. if Chr1 <> Chr2 then
  610. begin
  611. if Chr1 in [97..122] then
  612. dec(Chr1,32);
  613. if Chr2 in [97..122] then
  614. dec(Chr2,32);
  615. if Chr1 <> Chr2 then
  616. Break;
  617. end;
  618. Inc(P1); Inc(P2); Inc(I);
  619. end;
  620. end;
  621. if i < Count then
  622. result := Chr1-Chr2
  623. else
  624. // CAPSIZEINT is no-op if Sizeof(Sizeint)<=SizeOF(Integer)
  625. result:=CAPSIZEINT(Count1-Count2);
  626. end;
  627. function CompareText(const S1, S2: AnsiString; LocaleOptions: TLocaleOptions
  628. ): Integer;
  629. begin
  630. case LocaleOptions of
  631. loInvariantLocale: Result:=CompareText(S1,S2);
  632. loUserLocale: Result:=AnsiCompareText(S1,S2);
  633. end;
  634. end;
  635. function ContainsStr(const AText, ASubText: AnsiString): Boolean;
  636. begin
  637. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiContainsStr(aText,aSubText);
  638. end;
  639. function ContainsText(const AText, ASubText: AnsiString): Boolean;
  640. begin
  641. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.AnsiContainsText(aText,aSubText);
  642. end;
  643. procedure DisposeStr(P: PAnsiString);
  644. begin
  645. if (P <> nil) and (P^ <> '') then
  646. Dispose(P);
  647. end;
  648. function DupeString(const AText: AnsiString; ACount: Integer): AnsiString;
  649. var
  650. ResLen, Rp, ToCopy: SizeInt;
  651. begin
  652. if (AText = '') or (ACount <= 0) then
  653. Exit('');
  654. if ACount = 1 then
  655. Exit(AText);
  656. Rp := Length(AText);
  657. ResLen := ACount * Rp;
  658. SetLength(Result, ResLen);
  659. Move(Pointer(AText)^, Pointer(Result)^, Rp * SizeOf(AText[1]));
  660. repeat
  661. ToCopy := ResLen - Rp;
  662. if Rp < ToCopy then
  663. ToCopy := Rp;
  664. Move(Pointer(Result)^, PAnsiChar(Pointer(Result))[Rp], ToCopy * SizeOf(AText[1]));
  665. Inc(Rp, ToCopy);
  666. until Rp = ResLen;
  667. end;
  668. function ElementToCharIndex(const S: AnsiString; Index: Integer): Integer;
  669. begin
  670. if (Index>0) and (Index<=Length(S)) then
  671. Result:=Index
  672. else
  673. Result:=0;
  674. end;
  675. function ElementToCharLen(const S: AnsiString; MaxLen: Integer): Integer;
  676. begin
  677. Result:=Length(S);
  678. if Result>MaxLen then
  679. Result:=MaxLen;
  680. end;
  681. function EndsStr(const ASubText, AText: AnsiString): Boolean;
  682. begin
  683. Result:=Length(AText) >= Length(ASubText);
  684. if Result then
  685. Result := StrLComp(PAnsiChar(ASubText), PAnsiChar(AText)+Length(AText)-Length(ASubText),Length(ASubText))=0
  686. end;
  687. function EndsText(const ASubText, AText: AnsiString): Boolean;
  688. begin
  689. Result:=Length(AText) >= Length(ASubText);
  690. if Result then
  691. Result := StrLIComp(PAnsiChar(ASubText), PAnsiChar(AText)+Length(AText)-Length(ASubText),Length(ASubText))=0
  692. end;
  693. function ExcludeTrailingBackslash(const S: AnsiString): AnsiString;
  694. begin
  695. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExcludeLeadingPathDelimiter(S);
  696. end;
  697. function ExcludeTrailingPathDelimiter(const S: AnsiString): AnsiString;
  698. begin
  699. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExcludeLeadingPathDelimiter(S);
  700. end;
  701. function ExpandFileNameCase(const FileName: AnsiString; out
  702. MatchFound: TFilenameCaseMatch): AnsiString;
  703. begin
  704. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExpandFileNameCase(FileName,MatchFound);
  705. end;
  706. function ExpandFileName(const FileName: AnsiString): AnsiString;
  707. begin
  708. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExpandFileName(FileName);
  709. end;
  710. function ExpandUNCFileName(const FileName: AnsiString): AnsiString;
  711. begin
  712. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExpandUNCFileName(FileName);
  713. end;
  714. function ExtractFileDir(const FileName: AnsiString): AnsiString;
  715. begin
  716. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExtractFileDir(FileName);
  717. end;
  718. function ExtractFileDrive(const FileName: AnsiString): AnsiString;
  719. begin
  720. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExtractFileDrive(FileName);
  721. end;
  722. function ExtractFileExt(const FileName: AnsiString): AnsiString;
  723. begin
  724. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExtractFileExt(FileName);
  725. end;
  726. function ExtractFileName(const FileName: AnsiString): AnsiString;
  727. begin
  728. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExtractFileName(FileName);
  729. end;
  730. function ExtractFilePath(const FileName: AnsiString): AnsiString;
  731. begin
  732. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExtractFilePath(FileName);
  733. end;
  734. function ExtractRelativePath(const BaseName, DestName: AnsiString): AnsiString;
  735. begin
  736. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExtractRelativePath(BaseName,DestName);
  737. end;
  738. Type
  739. PReal = ^Real;
  740. function FloatToText(BufferArg: PAnsiChar; const Value; ValueType: TFloatValue;
  741. Format: TFloatFormat; Precision, Digits: Integer;
  742. const AFormatSettings: TFormatSettings): Integer;
  743. Var
  744. E : Extended;
  745. begin
  746. Case ValueType of
  747. fvComp : E:=PComp(@Value)^;
  748. fvExtended : E:=PExtended(@Value)^;
  749. fvDouble: E:=PDouble(@Value)^;
  750. fvReal: E:=PReal(@Value)^;
  751. fvSingle : E:=PSingle(@Value)^;
  752. fvCurrency : E:=PCurrency(@Value)^;
  753. end;
  754. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FloatToText(BufferArg,E,Format,Precision,Digits,AFormatSettings);
  755. end;
  756. function FloatToText(BufferArg: PAnsiChar; const Value; ValueType: TFloatValue;
  757. Format: TFloatFormat; Precision, Digits: Integer): Integer;
  758. begin
  759. Result:=FloatToText(BufferArg,Value,ValueType,Format,Precision,Digits,DefaultFormatSettings);
  760. end;
  761. function FloatToTextFmt(Buf: PAnsiChar; const Value; ValueType: TFloatValue;
  762. Format: PAnsiChar; const AFormatSettings: TFormatSettings): Integer;
  763. Var
  764. E : Extended;
  765. SBuf,Fmt : String;
  766. begin
  767. Case ValueType of
  768. fvComp : E:=PComp(@Value)^;
  769. fvExtended : E:=PExtended(@Value)^;
  770. fvDouble: E:=PDouble(@Value)^;
  771. fvReal: E:=PReal(@Value)^;
  772. fvSingle : E:=PSingle(@Value)^;
  773. fvCurrency : E:=PCurrency(@Value)^;
  774. end;
  775. SBuf:=StrPas(Buf);
  776. Fmt:=StrPas(Format);
  777. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FloatToTextFmt(PChar(SBuf),E,PChar(Fmt),aFormatSettings);
  778. end;
  779. function FloatToTextFmt(Buf: PAnsiChar; const Value; ValueType: TFloatValue;
  780. Format: PAnsiChar): Integer;
  781. begin
  782. Result:=FloatToTextFmt(Buf,Value,ValueType,Format,DefaultFormatSettings);
  783. end;
  784. procedure FmtStr(var aResult: AnsiString; const Format: AnsiString;
  785. const Args: array of const; const AFormatSettings: TFormatSettings);
  786. var
  787. S : String;
  788. begin
  789. S:=aResult;
  790. {$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FmtStr(S,Format,Args,aFormatSettings);
  791. aResult:=S;
  792. end;
  793. procedure FmtStr(var aResult: AnsiString; const Format: AnsiString;
  794. const Args: array of const);
  795. var
  796. S : String;
  797. begin
  798. S:=aResult;
  799. {$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FmtStr(S,Format,Args,DefaultFormatSettings);
  800. aResult:=S;
  801. end;
  802. function FormatBuf(var Buffer; BufLen: Cardinal; const Format;
  803. FmtLen: Cardinal; const Args: array of const): Cardinal;
  804. begin
  805. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FormatBuf(Buffer,BufLen,Format,FmtLen,args);
  806. end;
  807. function FormatBuf(var Buffer; BufLen: Cardinal; const Format;
  808. FmtLen: Cardinal; const Args: array of const;
  809. const AFormatSettings: TFormatSettings): Cardinal;
  810. begin
  811. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FormatBuf(Buffer,BufLen,Format,FmtLen,Args, aFormatSettings);
  812. end;
  813. function Format(const aFormat: AnsiString; const Args: array of const): AnsiString;
  814. begin
  815. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.Format(aFormat,Args);
  816. end;
  817. function Format(const aFormat: AnsiString; const Args: array of const;
  818. const AFormatSettings: TFormatSettings): AnsiString;
  819. begin
  820. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.Format(aFormat,Args,aFormatSettings);
  821. end;
  822. function IncludeTrailingBackslash(const S: AnsiString): AnsiString;
  823. begin
  824. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.IncludeTrailingBackslash(S);
  825. end;
  826. function IncludeTrailingPathDelimiter(const S: AnsiString): AnsiString;
  827. begin
  828. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.IncludeTrailingPathDelimiter(S);
  829. end;
  830. function IndexStr(const AText: AnsiString; const AValues: array of AnsiString
  831. ): Integer;
  832. begin
  833. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.IndexStr(aText,aValues);
  834. end;
  835. function IndexText(const AText: AnsiString; const AValues: array of AnsiString
  836. ): Integer;
  837. begin
  838. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.IndexText(aText,aValues);
  839. end;
  840. function IsDelimiter(const Delimiters, S: AnsiString; Index: Integer): Boolean;
  841. begin
  842. Result:=False;
  843. If (Index>0) and (Index<=Length(S)) then
  844. Result:=Pos(S[Index],Delimiters)<>0; // Note we don't do MBCS yet
  845. end;
  846. function IsPathDelimiter(const S: AnsiString; Index: Integer): Boolean;
  847. begin
  848. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.IsPathDelimiter(S,Index);
  849. end;
  850. function IsValidIdent(const Ident: AnsiString; AllowDots: Boolean; StrictDots : Boolean = False): Boolean;
  851. const
  852. Alpha = ['A'..'Z', 'a'..'z', '_'];
  853. AlphaNum = Alpha + ['0'..'9'];
  854. Dot = '.';
  855. var
  856. First: Boolean;
  857. I, Len: Integer;
  858. begin
  859. Len := Length(Ident);
  860. if Len < 1 then
  861. Exit(False);
  862. First := True;
  863. for I := 1 to Len do
  864. begin
  865. if First then
  866. begin
  867. Result := Ident[I] in Alpha;
  868. First := False;
  869. end
  870. else if AllowDots and (Ident[I] = Dot) then
  871. begin
  872. if StrictDots then
  873. begin
  874. Result := I < Len;
  875. First := True;
  876. end;
  877. end
  878. else
  879. Result := Ident[I] in AlphaNum;
  880. if not Result then
  881. Break;
  882. end;
  883. end;
  884. function LastDelimiter(const Delimiters, S: AnsiString): Integer;
  885. var
  886. chs: Set of AnsiChar;
  887. I: SizeInt;
  888. begin
  889. chs := [];
  890. for I := 1 to Length(Delimiters) do
  891. Include(chs, Delimiters[I]);
  892. Result:=Length(S);
  893. While (Result>0) and not (S[Result] in chs) do
  894. Dec(Result);
  895. end;
  896. function LeftBStr(const AText: AnsiString; const AByteCount: Integer
  897. ): AnsiString;
  898. begin
  899. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.LeftBStr(aText,aByteCount);
  900. end;
  901. function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  902. begin
  903. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.LeftStr(aText,aCount);
  904. end;
  905. function LowerCase(const S: AnsiString): AnsiString;
  906. begin
  907. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.LowerCase(S);
  908. end;
  909. function LowerCase(const S: AnsiString; LocaleOptions: TLocaleOptions): AnsiString;
  910. begin
  911. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.LowerCase(S,LocaleOptions);
  912. end;
  913. function MatchStr(const AText: AnsiString; const AValues: array of AnsiString
  914. ): Boolean;
  915. begin
  916. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.MatchStr(aText,aValues);
  917. end;
  918. function MatchText(const AText: AnsiString; const AValues: array of AnsiString
  919. ): Boolean;
  920. begin
  921. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.MatchText(aText,aValues);
  922. end;
  923. function MidBStr(const AText: AnsiString; const AByteStart, AByteCount: Integer
  924. ): AnsiString;
  925. begin
  926. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.MidBStr(aText,aByteStart,aByteCount);
  927. end;
  928. function MidStr(const AText: AnsiString; const AStart, ACount: Integer
  929. ): AnsiString;
  930. begin
  931. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.MidStr(aText,aStart,aCount);
  932. end;
  933. function NewStr(const S: AnsiString): PAnsiString;
  934. begin
  935. if (S='') then
  936. Result:=nil
  937. else
  938. begin
  939. new(result);
  940. if (Result<>nil) then
  941. Result^:=s;
  942. end;
  943. end;
  944. function NextCharIndex(const S: AnsiString; Index: Integer): Integer;
  945. begin
  946. if Index<Length(S) then
  947. Result:=Index+1
  948. else
  949. Result:=0;
  950. end;
  951. function PosEx(const SubStr, S: AnsiString; Offset: Integer): Integer;
  952. begin
  953. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.PosEx(SubStr,S,Offset);
  954. end;
  955. function QuotedStr(const S: AnsiString): AnsiString;
  956. begin
  957. Result:=AnsiQuotedStr(S,'"');
  958. end;
  959. function RandomFrom(const AValues: array of AnsiString): AnsiString;
  960. begin
  961. if high(AValues)=-1 then exit('');
  962. result:=Avalues[random(High(AValues)+1)];
  963. end;
  964. function ReplaceStr(const AText, AFromText, AToText: AnsiString): AnsiString;
  965. begin
  966. Result:= {$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StringReplace(AText,AFromText,AToText,[rfReplaceAll]);
  967. end;
  968. function ReplaceText(const AText, AFromText, AToText: AnsiString): AnsiString;
  969. begin
  970. Result:= {$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StringReplace(AText,AFromText,AToText,[rfReplaceAll,rfIgnoreCase]);
  971. end;
  972. function ReverseString(const AText: AnsiString): AnsiString;
  973. begin
  974. Result:=AnsiReverseString(aText);
  975. end;
  976. function RightBStr(const AText: AnsiString; const AByteCount: Integer
  977. ): AnsiString;
  978. begin
  979. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.RightBStr(aText,aByteCount);
  980. end;
  981. function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  982. begin
  983. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.RightStr(aText,aCount);
  984. end;
  985. function SameFileName(const S1, S2: AnsiString): Boolean;
  986. begin
  987. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.SameFileName(S1,S2);
  988. end;
  989. function SameStr(const S1, S2: AnsiString): Boolean;
  990. begin
  991. Result:=CompareStr(S1,S2)=0;
  992. end;
  993. function SameStr(const S1, S2: AnsiString; LocaleOptions: TLocaleOptions
  994. ): Boolean;
  995. begin
  996. Result:=CompareStr(S1,S2,LocaleOptions)=0;
  997. end;
  998. function SameText(const S1, S2: AnsiString): Boolean;
  999. begin
  1000. Result:=CompareText(S1,S2)=0;
  1001. end;
  1002. function SameText(const S1, S2: AnsiString; LocaleOptions: TLocaleOptions
  1003. ): Boolean;
  1004. begin
  1005. Result:=CompareText(S1,S2,LocaleOptions)=0;
  1006. end;
  1007. function SearchBuf(Buf: PAnsiChar; BufLen: Integer; SelStart,
  1008. SelLength: Integer; SearchString: AnsiString; Options: TStringSearchOptions
  1009. ): PAnsiChar;
  1010. begin
  1011. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}StrUtils.SearchBuf(Buf,BufLen,SelStart,SelLength,SearchString,Options);
  1012. end;
  1013. function StartsStr(const ASubText, AText: AnsiString): Boolean;
  1014. begin
  1015. if (Length(AText) >= Length(ASubText)) and (ASubText <> '') then
  1016. Result := StrLComp(PAnsiChar(ASubText), PAnsiChar(AText), Length(ASubText)) = 0
  1017. else
  1018. Result := (AsubText='');
  1019. end;
  1020. function StartsText(const ASubText, AText: AnsiString): Boolean;
  1021. begin
  1022. Result:=AnsiStartsText(aSubText,aText);
  1023. end;
  1024. function StrBufSize(const Str: PAnsiChar): Cardinal;
  1025. begin
  1026. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrBufSize(Str);
  1027. end;
  1028. function StrByteType(Str: PAnsiChar; Index: Cardinal): TMbcsByteType;
  1029. begin
  1030. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrByteType(Str,Index);
  1031. end;
  1032. function StrCat(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar;
  1033. begin
  1034. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrCat(Dest,Source);
  1035. end;
  1036. function StrCharLength(const Str: PAnsiChar): Integer;
  1037. begin
  1038. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrCharLength(Str);
  1039. end;
  1040. function StrComp(const Str1, Str2: PAnsiChar): Integer;
  1041. begin
  1042. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrComp(Str1,Str2);
  1043. end;
  1044. function StrCopy(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar;
  1045. begin
  1046. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrCopy(Dest,Source);
  1047. end;
  1048. procedure StrDispose(Str: PAnsiChar);
  1049. begin
  1050. {$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrDispose(Str);
  1051. end;
  1052. function StrECopy(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar;
  1053. begin
  1054. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrECopy(Dest,Source);
  1055. end;
  1056. function StrEnd(const Str: PAnsiChar): PAnsiChar;
  1057. begin
  1058. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrEnd(Str);
  1059. end;
  1060. function StrLen(const Str: PAnsiChar): Cardinal;
  1061. begin
  1062. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrLen(Str);
  1063. end;
  1064. function StrFmt(Buffer, Format: PAnsiChar; const Args: array of const;
  1065. const AFormatSettings: TFormatSettings): PAnsiChar;
  1066. Var
  1067. Len : Integer;
  1068. begin
  1069. Len:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FormatBuf(Buffer^,Maxint,Format^,strlen(Format),args,aFormatSettings);
  1070. Buffer[Len]:=#0;
  1071. Result:=Buffer;
  1072. end;
  1073. function StrFmt(Buffer, Format: PAnsiChar; const Args: array of const): PAnsiChar;
  1074. Var
  1075. Len : Integer;
  1076. begin
  1077. Len:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.FormatBuf(Buffer^,Maxint,Format^,strlen(Format),args);
  1078. Buffer[Len]:=#0;
  1079. Result:=Buffer;
  1080. end;
  1081. function StrIComp(const Str1, Str2: PAnsiChar): Integer;
  1082. begin
  1083. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrIComp(Str1,Str2);
  1084. end;
  1085. function StringReplace(const Source, OldPattern, NewPattern: AnsiString;
  1086. Flags: TReplaceFlags): AnsiString;
  1087. begin
  1088. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StringReplace(Source,OldPattern,NewPattern,Flags);
  1089. end;
  1090. function StrLCat(Dest: PAnsiChar; const Source: PAnsiChar; MaxLen: Cardinal
  1091. ): PAnsiChar;
  1092. begin
  1093. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrLCat(Dest,Source,MaxLen);
  1094. end;
  1095. function StrLComp(const Str1, Str2: PAnsiChar; MaxLen: Cardinal): Integer;
  1096. begin
  1097. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrLComp(str1,str2,MaxLen);
  1098. end;
  1099. function StrLCopy(Dest: PAnsiChar; const Source: PAnsiChar; MaxLen: Cardinal
  1100. ): PAnsiChar;
  1101. begin
  1102. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrLCopy(Dest,Source,MaxLen);
  1103. end;
  1104. function StrLFmt(Buffer: PAnsiChar; MaxBufLen: Cardinal; Format: PAnsiChar;
  1105. const Args: array of const; const AFormatSettings: TFormatSettings
  1106. ): PAnsiChar;
  1107. var
  1108. Len : integer;
  1109. begin
  1110. Len:=FormatBuf(Buffer^,MaxBufLen,Format^,strlen(Format),args,aFormatSettings);
  1111. Buffer[Len]:=#0;
  1112. Result:=Buffer;
  1113. end;
  1114. function StrLFmt(Buffer: PAnsiChar; MaxBufLen: Cardinal; Format: PAnsiChar;
  1115. const Args: array of const): PAnsiChar;
  1116. begin
  1117. Result:=StrLFmt(Buffer,MaxBufLen,Format,Args,DefaultFormatSettings);
  1118. end;
  1119. function StrLIComp(const Str1, Str2: PAnsiChar; MaxLen: Cardinal): Integer;
  1120. begin
  1121. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrLIComp(Str1,Str2,MaxLen);
  1122. end;
  1123. function StrLower(Str: PAnsiChar): PAnsiChar;
  1124. begin
  1125. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrLower(Str);
  1126. end;
  1127. function StrMove(Dest: PAnsiChar; const Source: PAnsiChar; Count: Cardinal
  1128. ): PAnsiChar;
  1129. begin
  1130. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrMove(Dest,Source,Count);
  1131. end;
  1132. function StrNew(const Str: PAnsiChar): PAnsiChar;
  1133. begin
  1134. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrNew(Str);
  1135. end;
  1136. function StrNextChar(const Str: PAnsiChar): PAnsiChar;
  1137. begin
  1138. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrNextChar(Str);
  1139. end;
  1140. function StrPas(const Str: PAnsiChar): AnsiString;
  1141. begin
  1142. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrNextChar(Str);
  1143. end;
  1144. function StrPCopy(Dest: PAnsiChar; const Source: AnsiString): PAnsiChar;
  1145. begin
  1146. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrPCopy(Dest,Source);
  1147. end;
  1148. function StrPLCopy(Dest: PAnsiChar; const Source: AnsiString; MaxLen: Cardinal
  1149. ): PAnsiChar;
  1150. begin
  1151. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrPLCopy(Dest,Source,MaxLen);
  1152. end;
  1153. function StrPos(const Str1, Str2: PAnsiChar): PAnsiChar;
  1154. begin
  1155. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrPos(Str1,Str2);
  1156. end;
  1157. function StrRScan(const Str: PAnsiChar; Chr: AnsiChar): PAnsiChar;
  1158. begin
  1159. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrRScan(Str,Chr);
  1160. end;
  1161. function StrScan(const Str: PAnsiChar; Chr: AnsiChar): PAnsiChar;
  1162. begin
  1163. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrScan(Str,Chr);
  1164. end;
  1165. function StrUpper(Str: PAnsiChar): PAnsiChar;
  1166. begin
  1167. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.StrUpper(Str);
  1168. end;
  1169. function StuffString(const AText: AnsiString; AStart, ALength: Cardinal; const ASubText: AnsiString): AnsiString;
  1170. var i,j,k : SizeUInt;
  1171. begin
  1172. Result:='';
  1173. j:=length(ASubText);
  1174. i:=length(AText);
  1175. if AStart>i then
  1176. aStart:=i+1;
  1177. k:=i+1-AStart;
  1178. if ALength> k then
  1179. ALength:=k;
  1180. SetLength(Result,i+j-ALength);
  1181. move (AText[1],result[1],AStart-1);
  1182. move (ASubText[1],result[AStart],j);
  1183. move (AText[AStart+ALength], Result[AStart+j],i+1-AStart-ALength);
  1184. end;
  1185. function TextPos(Str, SubStr: PAnsiChar): PAnsiChar;
  1186. var
  1187. R,L,LS : PAnsiChar;
  1188. begin
  1189. Result:=Nil;
  1190. L:=nil;
  1191. LS:=System.AnsiStrings.StrLower(System.AnsiStrings.StrNew(SubStr));
  1192. try
  1193. L:=System.AnsiStrings.StrLower(System.AnsiStrings.StrNew(Str));
  1194. R:=System.AnsiStrings.StrPos(L,LS);
  1195. if Assigned(R) then
  1196. Result:=PAnsiChar(Str+(R-LS));
  1197. finally
  1198. StrDispose(L);
  1199. StrDispose(LS);
  1200. end;
  1201. end;
  1202. function TextToFloat(Buffer: PAnsiChar; var Value; ValueType: TFloatValue
  1203. ): Boolean;
  1204. begin
  1205. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.TextToFloat(Buffer,Value,ValueType);
  1206. end;
  1207. function TextToFloat(Buffer: PAnsiChar; var Value; ValueType: TFloatValue;
  1208. const AFormatSettings: TFormatSettings): Boolean;
  1209. begin
  1210. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.TextToFloat(Buffer,Value,ValueType,aFormatSettings);
  1211. end;
  1212. function Trim(const S: AnsiString): AnsiString;
  1213. begin
  1214. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.Trim(S);
  1215. end;
  1216. function TrimLeft(const S: AnsiString): AnsiString;
  1217. begin
  1218. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.TrimLeft(S);
  1219. end;
  1220. function TrimRight(const S: AnsiString): AnsiString;
  1221. begin
  1222. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.TrimRight(S);
  1223. end;
  1224. function UpperCase(const S: AnsiString): AnsiString;
  1225. begin
  1226. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.UpperCase(S);
  1227. end;
  1228. function UpperCase(const S: AnsiString; LocaleOptions: TLocaleOptions
  1229. ): AnsiString;
  1230. begin
  1231. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.UpperCase(S,LocaleOptions);
  1232. end;
  1233. function ExtractShortPathName(const FileName: AnsiString): AnsiString; overload;
  1234. begin
  1235. Result:={$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.ExtractShortPathName(FileName);
  1236. end;
  1237. end.