sstrings.inc 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2005, 2011 by Florian Klaempfl, Jonas Maebe
  4. members of the Free Pascal development team.
  5. This file implements support routines for Shortstrings with FPC/JVM
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. constructor ShortstringClass.Create(const arr: array of ansichar; maxlen: byte);
  13. begin
  14. setlength(fdata,maxlen);
  15. if high(arr)=-1 then
  16. exit;
  17. curlen:=min(high(arr)+1,maxlen);
  18. JLSystem.ArrayCopy(JLObject(@arr),0,JLObject(fdata),0,curlen);
  19. end;
  20. constructor ShortstringClass.Create(const arr: array of unicodechar; maxlen: byte);
  21. begin
  22. if high(arr)=-1 then
  23. begin
  24. setlength(fdata,maxlen);
  25. exit;
  26. end;
  27. fdata:=TAnsiCharArray(JLString.Create(arr).getBytes);
  28. setlength(fdata,maxlen);
  29. curlen:=min(high(fdata)+1,maxlen);
  30. end;
  31. constructor ShortstringClass.Create(const u: unicodestring; maxlen: byte);
  32. begin
  33. if system.length(u)=0 then
  34. begin
  35. setlength(fdata,maxlen);
  36. exit;
  37. end;
  38. fdata:=TAnsiCharArray(JLString(u).getBytes);
  39. setlength(fdata,maxlen);
  40. curlen:=min(high(fdata)+1,maxlen);
  41. end;
  42. constructor ShortstringClass.Create(const a: ansistring; maxlen: byte);
  43. var
  44. alen: jint;
  45. begin
  46. setlength(fdata,maxlen);
  47. alen:=system.length(a);
  48. if alen=0 then
  49. exit;
  50. curlen:=min(alen,maxlen);
  51. JLSystem.ArrayCopy(JLObject(AnsistringClass(a).fdata),0,JLObject(fdata),0,curlen);
  52. end;
  53. constructor ShortstringClass.Create(const s: shortstring; maxlen: byte);overload;
  54. begin
  55. setlength(fdata,maxlen);
  56. if system.length(s)=0 then
  57. exit;
  58. curlen:=min(system.length(s),maxlen);
  59. JLSystem.ArrayCopy(JLObject(ShortstringClass(@s).fdata),0,JLObject(fdata),0,min(system.length(s),maxlen));
  60. end;
  61. constructor ShortstringClass.Create(ch: ansichar; maxlen: byte);overload;
  62. begin
  63. setlength(fdata,maxlen);
  64. fdata[0]:=ch;
  65. curlen:=1;
  66. end;
  67. constructor ShortstringClass.Create(ch: unicodechar; maxlen: byte);overload;
  68. begin
  69. fdata:=TAnsiCharArray(JLString.Create(ch).getBytes);
  70. curlen:=min(system.length(fdata),maxlen);
  71. setlength(fdata,maxlen);
  72. end;
  73. class function ShortstringClass.CreateEmpty(maxlen: byte): ShortstringClass;
  74. begin
  75. result:=ShortstringClass.Create;
  76. setlength(result.fdata,maxlen);
  77. end;
  78. class function ShortstringClass.CreateFromLiteralStringBytes(const u: unicodestring): shortstring;
  79. var
  80. i: longint;
  81. begin
  82. { used to construct constant shortstrings from Java string constants }
  83. ShortstringClass(@result).curlen:=min(system.length(u),255);
  84. setlength(ShortstringClass(@result).fdata,ShortstringClass(@result).curlen);
  85. for i:=1 to ShortstringClass(@result).curlen do
  86. ShortstringClass(@result).fdata[i-1]:=ansichar(ord(u[i]));
  87. end;
  88. procedure ShortstringClass.FpcDeepCopy(dest: ShortstringClass);
  89. var
  90. destmaxlen,
  91. copylen: longint;
  92. begin
  93. dest.curlen:=curlen;
  94. copylen:=system.length(fdata);
  95. destmaxlen:=system.length(dest.fdata);
  96. if copylen>destmaxlen then
  97. begin
  98. copylen:=destmaxlen;
  99. dest.curlen:=destmaxlen;
  100. end;
  101. if copylen>0 then
  102. JLSystem.ArrayCopy(JLObject(fdata),0,JLObject(dest.fdata),0,copylen);
  103. end;
  104. procedure ShortstringClass.setChar(index: jint; char: ansichar);
  105. begin
  106. { index is 1-based here }
  107. { support accessing the length byte }
  108. if index=0 then
  109. curlen:=ord(char)
  110. else
  111. fdata[index-1]:=char;
  112. end;
  113. function ShortstringClass.charAt(index: jint): ansichar;
  114. begin
  115. { index is already decreased by one, because same calling code is used for
  116. JLString.charAt() }
  117. { support accessing the length byte }
  118. if (index=-1) then
  119. result:=ansichar(curlen)
  120. else
  121. result:=fdata[index];
  122. end;
  123. function ShortstringClass.toUnicodeString: unicodestring;
  124. begin
  125. result:=UnicodeString(toString);
  126. end;
  127. function ShortstringClass.toAnsistring: ansistring;
  128. begin
  129. result:=ansistring(AnsistringClass.Create(pshortstring(self)^));
  130. end;
  131. function ShortstringClass.toString: JLString;
  132. begin
  133. if curlen<>0 then
  134. result:=JLString.Create(TJByteArray(fdata),0,curlen)
  135. else
  136. result:='';
  137. end;
  138. function ShortstringClass.clone: JLObject;
  139. begin
  140. result:=ShortstringClass.Create(pshortstring(self)^,system.length(fdata));
  141. end;
  142. function ShortstringClass.length: jint;
  143. begin
  144. result:=curlen;
  145. end;
  146. class function AnsiCharArrayClass.CreateFromLiteralStringBytes(const u: unicodestring): TAnsiCharArray;
  147. var
  148. i: longint;
  149. begin
  150. { used to construct constant chararrays from Java string constants }
  151. setlength(result,length(u)+1);
  152. for i:=1 to length(u) do
  153. result[i-1]:=ansichar(ord(u[i]));
  154. result[length(u)]:=#0;
  155. end;
  156. procedure fpc_Shortstr_SetLength(var s:shortstring;len:SizeInt); compilerproc;
  157. begin
  158. if len>255 then
  159. len:=255;
  160. ShortstringClass(@s).curlen:=len;
  161. end;
  162. procedure fpc_Char_To_ShortStr(out res : shortstring;const c : AnsiChar) compilerproc;
  163. {
  164. Converts a WideChar to a ShortString;
  165. }
  166. begin
  167. setlength(res,1);
  168. ShortstringClass(@res).fdata[0]:=c;
  169. end;
  170. Function fpc_shortstr_Copy(const s:shortstring;index:SizeInt;count:SizeInt):shortstring;compilerproc;
  171. begin
  172. if count<0 then
  173. count:=0;
  174. if index>1 then
  175. dec(index)
  176. else
  177. index:=0;
  178. if index>length(s) then
  179. count:=0
  180. else
  181. if count>length(s)-index then
  182. count:=length(s)-index;
  183. ShortstringClass(@result).curlen:=count;
  184. JLSystem.ArrayCopy(JLObject(ShortstringClass(@s).fdata),index,JLObject(ShortstringClass(@result).fdata),0,count);
  185. end;
  186. function fpc_char_copy(c:AnsiChar;index : SizeInt;count : SizeInt): shortstring;compilerproc;
  187. begin
  188. if (index=1) and (Count>0) then
  189. fpc_char_Copy:=c
  190. else
  191. fpc_char_Copy:='';
  192. end;
  193. function upcase(const s : shortstring) : shortstring;
  194. var
  195. u : unicodestring;
  196. begin
  197. u:=s;
  198. result:=upcase(u);
  199. end;
  200. Function upCase(c:Char):Char;
  201. var
  202. u : unicodestring;
  203. s: ansistring;
  204. begin
  205. u:=c;
  206. s:=upcase(u);
  207. c:=s[1];
  208. end;
  209. function lowercase(const s : shortstring) : shortstring;
  210. var
  211. u : unicodestring;
  212. begin
  213. u:=s;
  214. result:=lowercase(u);
  215. end;
  216. Function lowerCase(c:Char):Char; overload;
  217. var
  218. u : unicodestring;
  219. s: ansistring;
  220. begin
  221. u:=c;
  222. s:=lowercase(u);
  223. c:=s[1];
  224. end;
  225. Function Pos (Const Substr : Shortstring; Const Source : Shortstring) : SizeInt;
  226. var
  227. i,j,k,MaxLen, SubstrLen : SizeInt;
  228. begin
  229. Pos:=0;
  230. SubstrLen:=Length(SubStr);
  231. if SubstrLen>0 then
  232. begin
  233. MaxLen:=Length(source)-Length(SubStr);
  234. i:=0;
  235. while (i<=MaxLen) do
  236. begin
  237. inc(i);
  238. j:=0;
  239. k:=i-1;
  240. while (j<SubstrLen) and
  241. (ShortstringClass(@SubStr).fdata[j]=ShortstringClass(@Source).fdata[k]) do
  242. begin
  243. inc(j);
  244. inc(k);
  245. end;
  246. if (j=SubstrLen) then
  247. begin
  248. Pos:=i;
  249. exit;
  250. end;
  251. end;
  252. end;
  253. end;
  254. { Faster version for a char alone. Must be implemented because }
  255. { pos(c: char; const s: shortstring) also exists, so otherwise }
  256. { using pos(char,pchar) will always call the shortstring version }
  257. { (exact match for first argument), also with $h+ (JM) }
  258. Function Pos (c : AnsiChar; Const s : ShortString) : SizeInt;
  259. var
  260. i: SizeInt;
  261. begin
  262. for i:=1 to length(s) do
  263. begin
  264. if ShortstringClass(@s).fdata[i-1]=c then
  265. begin
  266. pos:=i;
  267. exit;
  268. end;
  269. end;
  270. pos:=0;
  271. end;
  272. function space (b : byte): shortstring;
  273. begin
  274. setlength(result,b);
  275. if b>0 then
  276. JUArrays.fill(TJByteArray(ShortstringClass(@result).fdata),0,b,ord(' '))
  277. end;
  278. {*****************************************************************************
  279. Str() Helpers
  280. *****************************************************************************}
  281. procedure fpc_shortstr_SInt(v : valSInt;len : SizeInt;out s : shortstring);[public,alias:'FPC_SHORTSTR_SINT']; compilerproc;
  282. begin
  283. int_str(v,s);
  284. if length(s)<len then
  285. s:=space(len-length(s))+s;
  286. end;
  287. procedure fpc_shortstr_UInt(v : valUInt;len : SizeInt;out s : shortstring);[public,alias:'FPC_SHORTSTR_UINT']; compilerproc;
  288. begin
  289. int_str_unsigned(v,s);
  290. if length(s)<len then
  291. s:=space(len-length(s))+s;
  292. end;
  293. procedure fpc_shortstr_qword(v : qword;len : SizeInt;out s : shortstring);[public,alias:'FPC_SHORTSTR_QWORD']; compilerproc;
  294. begin
  295. int_str_unsigned(v,s);
  296. if length(s)<len then
  297. s:=space(len-length(s))+s;
  298. end;
  299. procedure fpc_shortstr_int64(v : int64;len : SizeInt;out s : shortstring);[public,alias:'FPC_SHORTSTR_INT64']; compilerproc;
  300. begin
  301. int_str(v,s);
  302. if length(s)<len then
  303. s:=space(len-length(s))+s;
  304. end;
  305. { lie, implemented internally in the compiler }
  306. {$define FPC_SHORTSTR_ENUM_INTERN}