sstrings.inc 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  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; maxlen: byte): TAnsiCharArray;
  147. var
  148. i: longint;
  149. begin
  150. { used to construct constant chararrays from Java string constants }
  151. setlength(result,maxlen);
  152. for i:=1 to system.length(u) do
  153. result[i-1]:=ansichar(ord(u[i]));
  154. end;
  155. procedure fpc_Shortstr_SetLength(var s:shortstring;len:SizeInt); compilerproc;
  156. begin
  157. if len>255 then
  158. len:=255;
  159. ShortstringClass(@s).curlen:=len;
  160. end;
  161. procedure fpc_Char_To_ShortStr(out res : shortstring;const c : AnsiChar) compilerproc;
  162. {
  163. Converts a WideChar to a ShortString;
  164. }
  165. begin
  166. setlength(res,1);
  167. ShortstringClass(@res).fdata[0]:=c;
  168. end;
  169. Function fpc_shortstr_Copy(const s:shortstring;index:SizeInt;count:SizeInt):shortstring;compilerproc;
  170. begin
  171. if count<0 then
  172. count:=0;
  173. if index>1 then
  174. dec(index)
  175. else
  176. index:=0;
  177. if index>length(s) then
  178. count:=0
  179. else
  180. if count>length(s)-index then
  181. count:=length(s)-index;
  182. ShortstringClass(@result).curlen:=count;
  183. JLSystem.ArrayCopy(JLObject(ShortstringClass(@s).fdata),index,JLObject(ShortstringClass(@result).fdata),0,count);
  184. end;
  185. function fpc_char_copy(c:AnsiChar;index : SizeInt;count : SizeInt): shortstring;compilerproc;
  186. begin
  187. if (index=1) and (Count>0) then
  188. fpc_char_Copy:=c
  189. else
  190. fpc_char_Copy:='';
  191. end;
  192. function upcase(const s : shortstring) : shortstring;
  193. var
  194. u : unicodestring;
  195. begin
  196. u:=s;
  197. result:=upcase(u);
  198. end;
  199. Function upCase(c:Char):Char;
  200. var
  201. u : unicodestring;
  202. s: ansistring;
  203. begin
  204. u:=c;
  205. s:=upcase(u);
  206. c:=s[1];
  207. end;
  208. function lowercase(const s : shortstring) : shortstring;
  209. var
  210. u : unicodestring;
  211. begin
  212. u:=s;
  213. result:=lowercase(u);
  214. end;
  215. Function lowerCase(c:Char):Char; overload;
  216. var
  217. u : unicodestring;
  218. s: ansistring;
  219. begin
  220. u:=c;
  221. s:=lowercase(u);
  222. c:=s[1];
  223. end;
  224. Function Pos (Const Substr : Shortstring; Const Source : Shortstring) : SizeInt;
  225. var
  226. i,j,k,MaxLen, SubstrLen : SizeInt;
  227. begin
  228. Pos:=0;
  229. SubstrLen:=Length(SubStr);
  230. if SubstrLen>0 then
  231. begin
  232. MaxLen:=Length(source)-Length(SubStr);
  233. i:=0;
  234. while (i<=MaxLen) do
  235. begin
  236. inc(i);
  237. j:=0;
  238. k:=i-1;
  239. while (j<SubstrLen) and
  240. (ShortstringClass(@SubStr).fdata[j]=ShortstringClass(@Source).fdata[k]) do
  241. begin
  242. inc(j);
  243. inc(k);
  244. end;
  245. if (j=SubstrLen) then
  246. begin
  247. Pos:=i;
  248. exit;
  249. end;
  250. end;
  251. end;
  252. end;
  253. { Faster version for a char alone. Must be implemented because }
  254. { pos(c: char; const s: shortstring) also exists, so otherwise }
  255. { using pos(char,pchar) will always call the shortstring version }
  256. { (exact match for first argument), also with $h+ (JM) }
  257. Function Pos (c : AnsiChar; Const s : ShortString) : SizeInt;
  258. var
  259. i: SizeInt;
  260. begin
  261. for i:=1 to length(s) do
  262. begin
  263. if ShortstringClass(@s).fdata[i-1]=c then
  264. begin
  265. pos:=i;
  266. exit;
  267. end;
  268. end;
  269. pos:=0;
  270. end;
  271. function space (b : byte): shortstring;
  272. begin
  273. setlength(result,b);
  274. if b>0 then
  275. JUArrays.fill(TJByteArray(ShortstringClass(@result).fdata),0,b,ord(' '))
  276. end;
  277. {*****************************************************************************
  278. Str() Helpers
  279. *****************************************************************************}
  280. procedure fpc_shortstr_SInt(v : valSInt;len : SizeInt;out s : shortstring);[public,alias:'FPC_SHORTSTR_SINT']; compilerproc;
  281. begin
  282. int_str(v,s);
  283. if length(s)<len then
  284. s:=space(len-length(s))+s;
  285. end;
  286. procedure fpc_shortstr_UInt(v : valUInt;len : SizeInt;out s : shortstring);[public,alias:'FPC_SHORTSTR_UINT']; compilerproc;
  287. begin
  288. int_str_unsigned(v,s);
  289. if length(s)<len then
  290. s:=space(len-length(s))+s;
  291. end;
  292. procedure fpc_shortstr_qword(v : qword;len : SizeInt;out s : shortstring);[public,alias:'FPC_SHORTSTR_QWORD']; compilerproc;
  293. begin
  294. int_str_unsigned(v,s);
  295. if length(s)<len then
  296. s:=space(len-length(s))+s;
  297. end;
  298. procedure fpc_shortstr_int64(v : int64;len : SizeInt;out s : shortstring);[public,alias:'FPC_SHORTSTR_INT64']; compilerproc;
  299. begin
  300. int_str(v,s);
  301. if length(s)<len then
  302. s:=space(len-length(s))+s;
  303. end;
  304. { lie, implemented internally in the compiler }
  305. {$define FPC_SHORTSTR_ENUM_INTERN}