Merged revisions 11665-11738 via svnmerge from

http://svn.freepascal.org/svn/fpc/branches/unicodestring

........
  r11665 | florian | 2008-08-30 13:30:17 +0200 (Sat, 30 Aug 2008) | 1 line
  
  * continued to work on unicodestring type support
........
  r11666 | florian | 2008-08-30 19:02:26 +0200 (Sat, 30 Aug 2008) | 2 lines
  
  * expectloc for wide/ansi/unicode strings is LOC_CONSTANT or LOC_REGISTER now
........
  r11667 | florian | 2008-08-30 20:42:37 +0200 (Sat, 30 Aug 2008) | 1 line
  
  * more unicodestring stuff fixed, test results on win32 are already good
........
  r11670 | florian | 2008-08-30 23:21:48 +0200 (Sat, 30 Aug 2008) | 2 lines
  
  * first fixes for unix bootstrapping
........
  r11683 | ivost | 2008-09-01 12:46:39 +0200 (Mon, 01 Sep 2008) | 2 lines
  
      * fixed 64bit bug in iconvenc.pas
........
  r11689 | florian | 2008-09-01 23:12:34 +0200 (Mon, 01 Sep 2008) | 1 line
  
  * fixed several errors when building on unix
........
  r11694 | florian | 2008-09-03 20:32:43 +0200 (Wed, 03 Sep 2008) | 1 line
  
  * fixed unix compilation
........
  r11695 | florian | 2008-09-03 21:01:04 +0200 (Wed, 03 Sep 2008) | 1 line
  
  * bootstrapping fix
........
  r11696 | florian | 2008-09-03 21:07:18 +0200 (Wed, 03 Sep 2008) | 1 line
  
  * more bootstrapping fixed
........
  r11698 | florian | 2008-09-03 22:47:54 +0200 (Wed, 03 Sep 2008) | 1 line
  
  + two missing compiler procs exported
........
  r11701 | florian | 2008-09-04 16:42:34 +0200 (Thu, 04 Sep 2008) | 2 lines
  
  + lazarus project for the linux rtl
........
  r11702 | florian | 2008-09-04 16:43:27 +0200 (Thu, 04 Sep 2008) | 2 lines
  
  + set unicode string procedures
........
  r11707 | florian | 2008-09-04 23:23:02 +0200 (Thu, 04 Sep 2008) | 2 lines
  
  * fixed several type casting stuff
........
  r11712 | florian | 2008-09-05 22:46:03 +0200 (Fri, 05 Sep 2008) | 1 line
  
  * fixed unicodestring compilation on windows after recent unix changes
........
  r11713 | florian | 2008-09-05 23:35:12 +0200 (Fri, 05 Sep 2008) | 1 line
  
  + UnicodeString support for Variants
........
  r11715 | florian | 2008-09-06 20:59:54 +0200 (Sat, 06 Sep 2008) | 1 line
  
  * patch by Martin Schreiber for UnicodeString streaming
........
  r11716 | florian | 2008-09-06 22:22:55 +0200 (Sat, 06 Sep 2008) | 2 lines
  
  * fixed test
........
  r11717 | florian | 2008-09-07 10:25:51 +0200 (Sun, 07 Sep 2008) | 1 line
  
  * fixed typo when converting tunicodestring to punicodechar
........
  r11718 | florian | 2008-09-07 11:29:52 +0200 (Sun, 07 Sep 2008) | 3 lines
  
  * fixed writing of UnicodeString properties
  * moved some helper routines to unicode headers
........
  r11734 | florian | 2008-09-09 22:38:55 +0200 (Tue, 09 Sep 2008) | 1 line
  
  * fixed bootstrapping
........
  r11735 | florian | 2008-09-10 11:25:28 +0200 (Wed, 10 Sep 2008) | 2 lines
  
  * first fixes for persisten unicodestrings
........
  r11736 | florian | 2008-09-10 14:31:00 +0200 (Wed, 10 Sep 2008) | 3 lines
  
  Initialized merge tracking via "svnmerge" with revisions "1-11663" from 
  http://svn.freepascal.org/svn/fpc/trunk
........
  r11737 | florian | 2008-09-10 21:06:57 +0200 (Wed, 10 Sep 2008) | 3 lines
  
  * fixed unicodestring <-> variant handling
  * fixed unicodestring property reading
........

git-svn-id: trunk@11739 -
This commit is contained in:
florian 2008-09-10 20:14:31 +00:00
parent ffed6aae86
commit b178b08ba7
69 changed files with 8007 additions and 2302 deletions

14
.gitattributes vendored
View File

@ -106,6 +106,7 @@ compiler/avr/rgcpu.pas svneol=native#text/plain
compiler/browcol.pas svneol=native#text/plain compiler/browcol.pas svneol=native#text/plain
compiler/bsdcompile -text compiler/bsdcompile -text
compiler/catch.pas svneol=native#text/plain compiler/catch.pas svneol=native#text/plain
compiler/ccharset.pas svneol=native#text/plain
compiler/cclasses.pas svneol=native#text/plain compiler/cclasses.pas svneol=native#text/plain
compiler/cfidwarf.pas svneol=native#text/plain compiler/cfidwarf.pas svneol=native#text/plain
compiler/cfileutl.pas svneol=native#text/plain compiler/cfileutl.pas svneol=native#text/plain
@ -5383,14 +5384,18 @@ rtl/inc/threadvr.inc svneol=native#text/plain
rtl/inc/typefile.inc svneol=native#text/plain rtl/inc/typefile.inc svneol=native#text/plain
rtl/inc/ucomplex.pp svneol=native#text/plain rtl/inc/ucomplex.pp svneol=native#text/plain
rtl/inc/ufloat128.pp svneol=native#text/plain rtl/inc/ufloat128.pp svneol=native#text/plain
rtl/inc/ustringh.inc svneol=native#text/plain
rtl/inc/ustrings.inc svneol=native#text/plain
rtl/inc/varerror.inc svneol=native#text/plain rtl/inc/varerror.inc svneol=native#text/plain
rtl/inc/variant.inc svneol=native#text/plain rtl/inc/variant.inc svneol=native#text/plain
rtl/inc/varianth.inc svneol=native#text/plain rtl/inc/varianth.inc svneol=native#text/plain
rtl/inc/variants.pp svneol=native#text/plain rtl/inc/variants.pp svneol=native#text/plain
rtl/inc/video.inc svneol=native#text/plain rtl/inc/video.inc svneol=native#text/plain
rtl/inc/videoh.inc svneol=native#text/plain rtl/inc/videoh.inc svneol=native#text/plain
rtl/inc/wstring22h.inc svneol=native#text/plain
rtl/inc/wstringh.inc svneol=native#text/plain rtl/inc/wstringh.inc svneol=native#text/plain
rtl/inc/wstrings.inc -text rtl/inc/wstrings.inc -text
rtl/inc/wustring22.inc svneol=native#text/plain
rtl/inc/wustrings.inc svneol=native#text/plain rtl/inc/wustrings.inc svneol=native#text/plain
rtl/linux/Makefile svneol=native#text/plain rtl/linux/Makefile svneol=native#text/plain
rtl/linux/Makefile.fpc svneol=native#text/plain rtl/linux/Makefile.fpc svneol=native#text/plain
@ -5406,6 +5411,8 @@ rtl/linux/arm/syscall.inc svneol=native#text/plain
rtl/linux/arm/syscallh.inc svneol=native#text/plain rtl/linux/arm/syscallh.inc svneol=native#text/plain
rtl/linux/arm/sysnr.inc svneol=native#text/plain rtl/linux/arm/sysnr.inc svneol=native#text/plain
rtl/linux/arm/ucprt0.as svneol=native#text/plain rtl/linux/arm/ucprt0.as svneol=native#text/plain
rtl/linux/buildrtl.lpi svneol=native#text/plain
rtl/linux/buildrtl.pp svneol=native#text/plain
rtl/linux/bunxsysc.inc svneol=native#text/plain rtl/linux/bunxsysc.inc svneol=native#text/plain
rtl/linux/errno.inc svneol=native#text/plain rtl/linux/errno.inc svneol=native#text/plain
rtl/linux/errnostr.inc -text rtl/linux/errnostr.inc -text
@ -7820,6 +7827,7 @@ tests/test/tsetsize.pp svneol=native#text/plain
tests/test/tstack.pp svneol=native#text/plain tests/test/tstack.pp svneol=native#text/plain
tests/test/tstprocv.pp svneol=native#text/plain tests/test/tstprocv.pp svneol=native#text/plain
tests/test/tstring1.pp svneol=native#text/plain tests/test/tstring1.pp svneol=native#text/plain
tests/test/tstring10.pp svneol=native#text/plain
tests/test/tstring2.pp svneol=native#text/plain tests/test/tstring2.pp svneol=native#text/plain
tests/test/tstring3.pp svneol=native#text/plain tests/test/tstring3.pp svneol=native#text/plain
tests/test/tstring4.pp svneol=native#text/plain tests/test/tstring4.pp svneol=native#text/plain
@ -7833,6 +7841,12 @@ tests/test/tstrreal2.pp svneol=native#text/plain
tests/test/tstrreal3.pp -text tests/test/tstrreal3.pp -text
tests/test/tsubdecl.pp svneol=native#text/plain tests/test/tsubdecl.pp svneol=native#text/plain
tests/test/tunaligned1.pp svneol=native#text/plain tests/test/tunaligned1.pp svneol=native#text/plain
tests/test/tunistr1.pp svneol=native#text/plain
tests/test/tunistr2.pp svneol=native#text/plain
tests/test/tunistr4.pp svneol=native#text/plain
tests/test/tunistr5.pp svneol=native#text/plain
tests/test/tunistr6.pp svneol=native#text/plain
tests/test/tunistr7.pp svneol=native#text/plain
tests/test/tunit1.pp svneol=native#text/plain tests/test/tunit1.pp svneol=native#text/plain
tests/test/tunit2.pp svneol=native#text/plain tests/test/tunit2.pp svneol=native#text/plain
tests/test/tunit3.pp svneol=native#text/plain tests/test/tunit3.pp svneol=native#text/plain

254
compiler/ccharset.pas Normal file
View File

@ -0,0 +1,254 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 2000 by Florian Klaempfl
member of the Free Pascal development team.
This unit implements several classes for charset conversions
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{ this unit is included temporarily for 2.2 bootstrapping and can be
removed after the next release after 2.2.2 }
{$mode objfpc}
unit ccharset;
interface
type
tunicodechar = word;
tunicodestring = ^tunicodechar;
tcsconvert = class
// !!!!!!1constructor create;
end;
tunicodecharmappingflag = (umf_noinfo,umf_leadbyte,umf_undefined,
umf_unused);
punicodecharmapping = ^tunicodecharmapping;
tunicodecharmapping = record
unicode : tunicodechar;
flag : tunicodecharmappingflag;
reserved : byte;
end;
punicodemap = ^tunicodemap;
tunicodemap = record
cpname : string[20];
map : punicodecharmapping;
lastchar : longint;
next : punicodemap;
internalmap : boolean;
end;
tcp2unicode = class(tcsconvert)
end;
function loadunicodemapping(const cpname,f : string) : punicodemap;
procedure registermapping(p : punicodemap);
function getmap(const s : string) : punicodemap;
function mappingavailable(const s : string) : boolean;
function getunicode(c : char;p : punicodemap) : tunicodechar;
function getascii(c : tunicodechar;p : punicodemap) : string;
implementation
var
mappings : punicodemap;
function loadunicodemapping(const cpname,f : string) : punicodemap;
var
data : punicodecharmapping;
datasize : longint;
t : text;
s,hs : string;
scanpos,charpos,unicodevalue : longint;
code : word;
flag : tunicodecharmappingflag;
p : punicodemap;
lastchar : longint;
begin
lastchar:=-1;
loadunicodemapping:=nil;
datasize:=256;
getmem(data,sizeof(tunicodecharmapping)*datasize);
assign(t,f);
{$I-}
reset(t);
{$I+}
if ioresult<>0 then
begin
freemem(data,sizeof(tunicodecharmapping)*datasize);
exit;
end;
while not(eof(t)) do
begin
readln(t,s);
if (s[1]='0') and (s[2]='x') then
begin
flag:=umf_unused;
scanpos:=3;
hs:='$';
while s[scanpos] in ['0'..'9','A'..'F','a'..'f'] do
begin
hs:=hs+s[scanpos];
inc(scanpos);
end;
val(hs,charpos,code);
if code<>0 then
begin
freemem(data,sizeof(tunicodecharmapping)*datasize);
close(t);
exit;
end;
while not(s[scanpos] in ['0','#']) do
inc(scanpos);
if s[scanpos]='#' then
begin
{ special char }
unicodevalue:=$ffff;
hs:=copy(s,scanpos,length(s)-scanpos+1);
if hs='#DBCS LEAD BYTE' then
flag:=umf_leadbyte;
end
else
begin
{ C hex prefix }
inc(scanpos,2);
hs:='$';
while s[scanpos] in ['0'..'9','A'..'F','a'..'f'] do
begin
hs:=hs+s[scanpos];
inc(scanpos);
end;
val(hs,unicodevalue,code);
if code<>0 then
begin
freemem(data,sizeof(tunicodecharmapping)*datasize);
close(t);
exit;
end;
if charpos>datasize then
begin
{ allocate 1024 bytes more because }
{ if we need more than 256 entries it's }
{ probably a mbcs with a lot of }
{ entries }
datasize:=charpos+1024;
reallocmem(data,sizeof(tunicodecharmapping)*datasize);
end;
flag:=umf_noinfo;
end;
data[charpos].flag:=flag;
data[charpos].unicode:=unicodevalue;
if charpos>lastchar then
lastchar:=charpos;
end;
end;
close(t);
new(p);
p^.lastchar:=lastchar;
p^.cpname:=cpname;
p^.internalmap:=false;
p^.next:=nil;
p^.map:=data;
loadunicodemapping:=p;
end;
procedure registermapping(p : punicodemap);
begin
p^.next:=mappings;
mappings:=p;
end;
function getmap(const s : string) : punicodemap;
var
hp : punicodemap;
const
mapcache : string = '';
mapcachep : punicodemap = nil;
begin
if (mapcache=s) and assigned(mapcachep) and (mapcachep^.cpname=s) then
begin
getmap:=mapcachep;
exit;
end;
hp:=mappings;
while assigned(hp) do
begin
if hp^.cpname=s then
begin
getmap:=hp;
mapcache:=s;
mapcachep:=hp;
exit;
end;
hp:=hp^.next;
end;
getmap:=nil;
end;
function mappingavailable(const s : string) : boolean;
begin
mappingavailable:=getmap(s)<>nil;
end;
function getunicode(c : char;p : punicodemap) : tunicodechar;
begin
if ord(c)<=p^.lastchar then
getunicode:=p^.map[ord(c)].unicode
else
getunicode:=0;
end;
function getascii(c : tunicodechar;p : punicodemap) : string;
var
i : longint;
begin
{ at least map to space }
getascii:=#32;
for i:=0 to p^.lastchar do
if p^.map[i].unicode=c then
begin
if i<256 then
getascii:=chr(i)
else
getascii:=chr(i div 256)+chr(i mod 256);
exit;
end;
end;
var
hp : punicodemap;
initialization
mappings:=nil;
finalization
while assigned(mappings) do
begin
hp:=mappings^.next;
if not(mappings^.internalmap) then
begin
freemem(mappings^.map);
dispose(mappings);
end;
mappings:=hp;
end;
end.

View File

@ -3117,6 +3117,8 @@ implementation
incrfunc:='FPC_ANSISTR_INCR_REF' incrfunc:='FPC_ANSISTR_INCR_REF'
else if is_widestring(t) then else if is_widestring(t) then
incrfunc:='FPC_WIDESTR_INCR_REF' incrfunc:='FPC_WIDESTR_INCR_REF'
else if is_unicodestring(t) then
incrfunc:='FPC_UNICODESTR_INCR_REF'
else if is_dynamic_array(t) then else if is_dynamic_array(t) then
incrfunc:='FPC_DYNARRAY_INCR_REF' incrfunc:='FPC_DYNARRAY_INCR_REF'
else else
@ -3174,6 +3176,8 @@ implementation
decrfunc:='FPC_ANSISTR_DECR_REF' decrfunc:='FPC_ANSISTR_DECR_REF'
else if is_widestring(t) then else if is_widestring(t) then
decrfunc:='FPC_WIDESTR_DECR_REF' decrfunc:='FPC_WIDESTR_DECR_REF'
else if is_unicodestring(t) then
decrfunc:='FPC_UNICODESTR_DECR_REF'
else if is_dynamic_array(t) then else if is_dynamic_array(t) then
begin begin
decrfunc:='FPC_DYNARRAY_DECR_REF'; decrfunc:='FPC_DYNARRAY_DECR_REF';
@ -3234,6 +3238,7 @@ implementation
paramanager.getintparaloc(pocall_default,2,cgpara2); paramanager.getintparaloc(pocall_default,2,cgpara2);
if is_ansistring(t) or if is_ansistring(t) or
is_widestring(t) or is_widestring(t) or
is_unicodestring(t) or
is_interfacecom(t) or is_interfacecom(t) or
is_dynamic_array(t) then is_dynamic_array(t) then
a_load_const_ref(list,OS_ADDR,0,ref) a_load_const_ref(list,OS_ADDR,0,ref)
@ -3266,6 +3271,7 @@ implementation
paramanager.getintparaloc(pocall_default,2,cgpara2); paramanager.getintparaloc(pocall_default,2,cgpara2);
if is_ansistring(t) or if is_ansistring(t) or
is_widestring(t) or is_widestring(t) or
is_unicodestring(t) or
is_interfacecom(t) then is_interfacecom(t) then
begin begin
g_decrrefcount(list,t,ref); g_decrrefcount(list,t,ref);

View File

@ -6,7 +6,7 @@ unit cp1251;
implementation implementation
uses uses
charset; {$ifdef VER2_2}ccharset{$else VER2_2}charset{$endif VER2_2};
const const
map : array[0..255] of tunicodecharmapping = ( map : array[0..255] of tunicodecharmapping = (

View File

@ -6,7 +6,7 @@ unit cp437;
implementation implementation
uses uses
charset; {$ifdef VER2_2}ccharset{$else VER2_2}charset{$endif VER2_2};
const const
map : array[0..255] of tunicodecharmapping = ( map : array[0..255] of tunicodecharmapping = (

View File

@ -6,7 +6,7 @@ unit cp850;
implementation implementation
uses uses
charset; {$ifdef VER2_2}ccharset{$else VER2_2}charset{$endif VER2_2};
const const
map : array[0..255] of tunicodecharmapping = ( map : array[0..255] of tunicodecharmapping = (

View File

@ -6,7 +6,7 @@ unit cp866;
implementation implementation
uses uses
charset; {$ifdef VER2_2}ccharset{$else VER2_2}charset{$endif VER2_2};
const const
map : array[0..255] of tunicodecharmapping = ( map : array[0..255] of tunicodecharmapping = (

View File

@ -6,7 +6,7 @@ unit cp8859_1;
implementation implementation
uses uses
charset; {$ifdef VER2_2}ccharset{$else VER2_2}charset{$endif VER2_2};
const const
map : array[0..255] of tunicodecharmapping = ( map : array[0..255] of tunicodecharmapping = (

View File

@ -6,7 +6,7 @@ unit cp8859_5;
implementation implementation
uses uses
charset; {$ifdef VER2_2}ccharset{$else VER2_2}charset{$endif VER2_2};
const const
map : array[0..255] of tunicodecharmapping = ( map : array[0..255] of tunicodecharmapping = (

View File

@ -413,7 +413,7 @@ implementation
else if (cs_ansistrings in current_settings.localswitches) and else if (cs_ansistrings in current_settings.localswitches) and
(tstringdef(def_to).stringtype=st_ansistring) then (tstringdef(def_to).stringtype=st_ansistring) then
eq:=te_equal eq:=te_equal
else if tstringdef(def_to).stringtype=st_widestring then else if tstringdef(def_to).stringtype in [st_widestring,st_unicodestring] then
eq:=te_convert_l3 eq:=te_convert_l3
else else
eq:=te_convert_l1; eq:=te_convert_l1;
@ -425,7 +425,7 @@ implementation
begin begin
if is_ansistring(def_to) then if is_ansistring(def_to) then
eq:=te_convert_l1 eq:=te_convert_l1
else if is_widestring(def_to) then else if is_widestring(def_to) or is_unicodestring(def_to) then
eq:=te_convert_l3 eq:=te_convert_l3
else else
eq:=te_convert_l2; eq:=te_convert_l2;
@ -446,7 +446,7 @@ implementation
else else
eq:=te_convert_l2; eq:=te_convert_l2;
end end
else if is_widestring(def_to) then else if is_widestring(def_to) or is_unicodestring(def_to) then
eq:=te_convert_l3 eq:=te_convert_l3
else else
eq:=te_convert_l2; eq:=te_convert_l2;
@ -458,7 +458,7 @@ implementation
if is_widechararray(def_from) or is_open_widechararray(def_from) then if is_widechararray(def_from) or is_open_widechararray(def_from) then
begin begin
doconv:=tc_chararray_2_string; doconv:=tc_chararray_2_string;
if is_widestring(def_to) then if is_widestring(def_to) or is_unicodestring(def_to) then
eq:=te_convert_l1 eq:=te_convert_l1
else else
{ size of widechar array is double due the sizeof a widechar } { size of widechar array is double due the sizeof a widechar }
@ -490,7 +490,7 @@ implementation
else if is_pwidechar(def_from) then else if is_pwidechar(def_from) then
begin begin
doconv:=tc_pwchar_2_string; doconv:=tc_pwchar_2_string;
if is_widestring(def_to) then if is_widestring(def_to) or is_unicodestring(def_to) then
eq:=te_convert_l1 eq:=te_convert_l1
else else
eq:=te_convert_l3; eq:=te_convert_l3;
@ -909,7 +909,7 @@ implementation
else else
{ pwidechar(widestring) } { pwidechar(widestring) }
if is_pwidechar(def_to) and if is_pwidechar(def_to) and
is_widestring(def_from) then is_wide_or_unicode_string(def_from) then
begin begin
doconv:=tc_ansistring_2_pchar; doconv:=tc_ansistring_2_pchar;
eq:=te_convert_l1; eq:=te_convert_l1;

View File

@ -165,6 +165,12 @@ interface
{# returns true if p is a wide string type } {# returns true if p is a wide string type }
function is_widestring(p : tdef) : boolean; function is_widestring(p : tdef) : boolean;
{# true if p is an unicode string def }
function is_unicodestring(p : tdef) : boolean;
{# returns true if p is a wide or unicode string type }
function is_wide_or_unicode_string(p : tdef) : boolean;
{# Returns true if p is a short string type } {# Returns true if p is a short string type }
function is_shortstring(p : tdef) : boolean; function is_shortstring(p : tdef) : boolean;
@ -577,6 +583,22 @@ implementation
end; end;
{ true if p is an wide string def }
function is_wide_or_unicode_string(p : tdef) : boolean;
begin
is_wide_or_unicode_string:=(p.typ=stringdef) and
(tstringdef(p).stringtype in [st_widestring,st_unicodestring]);
end;
{ true if p is an unicode string def }
function is_unicodestring(p : tdef) : boolean;
begin
is_unicodestring:=(p.typ=stringdef) and
(tstringdef(p).stringtype=st_unicodestring);
end;
{ true if p is an short string def } { true if p is an short string def }
function is_shortstring(p : tdef) : boolean; function is_shortstring(p : tdef) : boolean;
begin begin

View File

@ -1541,7 +1541,7 @@ implementation
) or ) or
( (
is_widechar(p.resultdef) and is_widechar(p.resultdef) and
is_widestring(def_to) (is_widestring(def_to) or is_unicodestring(def_to))
) then ) then
eq:=te_equal eq:=te_equal
end; end;
@ -2238,7 +2238,7 @@ implementation
(tve_single,tve_dblcurrency,tve_extended, (tve_single,tve_dblcurrency,tve_extended,
tve_dblcurrency,tve_dblcurrency,tve_extended); tve_dblcurrency,tve_dblcurrency,tve_extended);
variantstringdef_cl: array[tstringtype] of tvariantequaltype = variantstringdef_cl: array[tstringtype] of tvariantequaltype =
(tve_sstring,tve_astring,tve_astring,tve_wstring,tve_unicodestring); (tve_sstring,tve_astring,tve_astring,tve_wstring,tve_ustring);
begin begin
case def.typ of case def.typ of
orddef: orddef:
@ -2437,9 +2437,9 @@ implementation
else if (currvcl=tve_boolformal) or else if (currvcl=tve_boolformal) or
(bestvcl=tve_boolformal) then (bestvcl=tve_boolformal) then
if (currvcl=tve_boolformal) then if (currvcl=tve_boolformal) then
result:=ord(bestvcl in [tve_chari64,tve_sstring,tve_astring,tve_wstring]) result:=ord(bestvcl in [tve_chari64,tve_sstring,tve_astring,tve_wstring,tve_ustring])
else else
result:=-ord(currvcl in [tve_chari64,tve_sstring,tve_astring,tve_wstring]) result:=-ord(currvcl in [tve_chari64,tve_sstring,tve_astring,tve_wstring,tve_ustring])
{ byte is better than everything else (we assume both aren't byte, } { byte is better than everything else (we assume both aren't byte, }
{ since there's only one parameter and that one can't be the same) } { since there's only one parameter and that one can't be the same) }
else if (currvcl=tve_byte) or else if (currvcl=tve_byte) or
@ -2497,7 +2497,11 @@ implementation
{ widestring is better than everything left } { widestring is better than everything left }
else if (currvcl=tve_wstring) or else if (currvcl=tve_wstring) or
(bestvcl=tve_wstring) then (bestvcl=tve_wstring) then
result:=1-2*ord(bestvcl=tve_wstring); result:=1-2*ord(bestvcl=tve_wstring)
{ unicodestring is better than everything left }
else if (currvcl=tve_ustring) or
(bestvcl=tve_ustring) then
result:=1-2*ord(bestvcl=tve_ustring);
{ all possibilities should have been checked now } { all possibilities should have been checked now }
if (result=-5) then if (result=-5) then

View File

@ -546,11 +546,11 @@ implementation
{ stringconstn only } { stringconstn only }
{ widechars are converted above to widestrings too } { widechars are converted above to widestrings too }
{ this isn't veryy efficient, but I don't think } { this isn't ver y efficient, but I don't think }
{ that it does matter that much (FK) } { that it does matter that much (FK) }
if (lt=stringconstn) and (rt=stringconstn) and if (lt=stringconstn) and (rt=stringconstn) and
(tstringconstnode(left).cst_type=cst_widestring) and (tstringconstnode(left).cst_type in [cst_widestring,cst_unicodestring]) and
(tstringconstnode(right).cst_type=cst_widestring) then (tstringconstnode(right).cst_type in [cst_widestring,cst_unicodestring]) then
begin begin
initwidestring(ws1); initwidestring(ws1);
initwidestring(ws2); initwidestring(ws2);
@ -835,6 +835,8 @@ implementation
if is_constnode(right) and is_constnode(left) and if is_constnode(right) and is_constnode(left) and
(is_widestring(right.resultdef) or (is_widestring(right.resultdef) or
is_widestring(left.resultdef) or is_widestring(left.resultdef) or
is_unicodestring(right.resultdef) or
is_unicodestring(left.resultdef) or
is_widechar(right.resultdef) or is_widechar(right.resultdef) or
is_widechar(left.resultdef)) then is_widechar(left.resultdef)) then
begin begin
@ -1419,8 +1421,13 @@ implementation
begin begin
if (nodetype in [addn,equaln,unequaln,lten,gten,ltn,gtn]) then if (nodetype in [addn,equaln,unequaln,lten,gten,ltn,gtn]) then
begin begin
{ Is there a unicodestring? }
if is_unicodestring(rd) or is_unicodestring(ld) then
strtype:= st_unicodestring
else
{ Is there a widestring? } { Is there a widestring? }
if is_widestring(rd) or is_widestring(ld) or if is_widestring(rd) or is_widestring(ld) or
is_unicodestring(rd) or is_unicodestring(ld) or
is_pwidechar(rd) or is_widechararray(rd) or is_widechar(rd) or is_open_widechararray(rd) or is_pwidechar(rd) or is_widechararray(rd) or is_widechar(rd) or is_open_widechararray(rd) or
is_pwidechar(ld) or is_widechararray(ld) or is_widechar(ld) or is_open_widechararray(ld) then is_pwidechar(ld) or is_widechararray(ld) or is_widechar(ld) or is_open_widechararray(ld) then
strtype:= st_widestring strtype:= st_widestring
@ -1456,6 +1463,13 @@ implementation
if not(is_widestring(ld)) then if not(is_widestring(ld)) then
inserttypeconv(left,cwidestringtype); inserttypeconv(left,cwidestringtype);
end; end;
st_unicodestring :
begin
if not(is_unicodestring(rd)) then
inserttypeconv(right,cunicodestringtype);
if not(is_unicodestring(ld)) then
inserttypeconv(left,cunicodestringtype);
end;
st_ansistring : st_ansistring :
begin begin
if not(is_ansistring(rd)) then if not(is_ansistring(rd)) then
@ -2520,6 +2534,11 @@ implementation
{ this is only for add, the comparisaion is handled later } { this is only for add, the comparisaion is handled later }
expectloc:=LOC_REGISTER; expectloc:=LOC_REGISTER;
end end
else if is_unicodestring(ld) then
begin
{ this is only for add, the comparisaion is handled later }
expectloc:=LOC_REGISTER;
end
else if is_ansistring(ld) then else if is_ansistring(ld) then
begin begin
{ this is only for add, the comparisaion is handled later } { this is only for add, the comparisaion is handled later }

View File

@ -2772,7 +2772,8 @@ implementation
else else
{ ansi/widestrings must be registered, so we can dispose them } { ansi/widestrings must be registered, so we can dispose them }
if is_ansistring(resultdef) or if is_ansistring(resultdef) or
is_widestring(resultdef) then is_widestring(resultdef) or
is_unicodestring(resultdef) then
begin begin
expectloc:=LOC_REFERENCE; expectloc:=LOC_REFERENCE;
end end

View File

@ -148,6 +148,8 @@ interface
location.register:=cg.getaddressregister(current_asmdata.CurrAsmList); location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.register); cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.register);
end; end;
cst_widestring,
cst_unicodestring,
cst_ansistring : cst_ansistring :
begin begin
if tstringconstnode(left).len=0 then if tstringconstnode(left).len=0 then
@ -167,20 +169,8 @@ interface
{!!!!!!!} {!!!!!!!}
internalerror(8888); internalerror(8888);
end; end;
cst_widestring:
begin
if tstringconstnode(left).len=0 then
begin
reference_reset(hr);
hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR');
location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,hr,location.register);
end
else else
begin internalerror(200808241);
location_copy(location,left.location);
end;
end;
end; end;
end; end;

View File

@ -282,7 +282,7 @@ implementation
); );
begin begin
{ for empty ansistrings we could return a constant 0 } { for empty ansistrings we could return a constant 0 }
if (cst_type in [cst_ansistring,cst_widestring]) and (len=0) then if (cst_type in [cst_ansistring,cst_widestring,cst_unicodestring]) and (len=0) then
begin begin
location_reset(location,LOC_CONSTANT,OS_ADDR); location_reset(location,LOC_CONSTANT,OS_ADDR);
location.value:=0; location.value:=0;
@ -311,7 +311,7 @@ implementation
entry^.Data := lastlabel; entry^.Data := lastlabel;
maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]); maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
if (len=0) or if (len=0) or
not(cst_type in [cst_ansistring,cst_widestring]) then not(cst_type in [cst_ansistring,cst_widestring,cst_unicodestring]) then
new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.name,const_align(sizeof(pint))) new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.name,const_align(sizeof(pint)))
else else
new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata,lastlabel.name,const_align(sizeof(pint))); new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata,lastlabel.name,const_align(sizeof(pint)));
@ -342,6 +342,7 @@ implementation
current_asmdata.asmlists[al_typedconsts].concat(Tai_string.Create_pchar(pc,len+1)); current_asmdata.asmlists[al_typedconsts].concat(Tai_string.Create_pchar(pc,len+1));
end; end;
end; end;
cst_unicodestring,
cst_widestring: cst_widestring:
begin begin
if len=0 then if len=0 then
@ -353,7 +354,7 @@ implementation
{ we use always UTF-16 coding for constants } { we use always UTF-16 coding for constants }
{ at least for now } { at least for now }
{ Consts.concat(Tai_const.Create_8bit(2)); } { Consts.concat(Tai_const.Create_8bit(2)); }
if tf_winlikewidestring in target_info.flags then if (cst_type=cst_widestring) and (tf_winlikewidestring in target_info.flags) then
current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit(len*cwidechartype.size)) current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit(len*cwidechartype.size))
else else
begin begin
@ -401,7 +402,7 @@ implementation
end; end;
end; end;
end; end;
if cst_type in [cst_ansistring, cst_widestring] then if cst_type in [cst_ansistring, cst_widestring, cst_unicodestring] then
begin begin
location_reset(location, LOC_REGISTER, OS_ADDR); location_reset(location, LOC_REGISTER, OS_ADDR);
reference_reset_symbol(href, lab_str, 0); reference_reset_symbol(href, lab_str, 0);

View File

@ -358,7 +358,7 @@ implementation
hregister:=cg.makeregsize(current_asmdata.CurrAsmList,left.location.register,OS_INT); hregister:=cg.makeregsize(current_asmdata.CurrAsmList,left.location.register,OS_INT);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,href,hregister); cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,href,hregister);
end; end;
if is_widestring(left.resultdef) then if is_widestring(left.resultdef) or is_unicodestring(left.resultdef) then
cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SHR,OS_INT,1,hregister); cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SHR,OS_INT,1,hregister);
cg.a_label(current_asmdata.CurrAsmList,lengthlab); cg.a_label(current_asmdata.CurrAsmList,lengthlab);
location_reset(location,LOC_REGISTER,def_cgsize(resultdef)); location_reset(location,LOC_REGISTER,def_cgsize(resultdef));

View File

@ -1073,7 +1073,7 @@ implementation
freetemp:=false; freetemp:=false;
end end
else else
if is_widestring(lt) then if is_widestring(lt) or is_unicodestring(lt) then
begin begin
vtype:=vtWideString; vtype:=vtWideString;
freetemp:=false; freetemp:=false;

View File

@ -642,7 +642,8 @@ implementation
{ an ansistring needs to be dereferenced } { an ansistring needs to be dereferenced }
if is_ansistring(left.resultdef) or if is_ansistring(left.resultdef) or
is_widestring(left.resultdef) then is_widestring(left.resultdef) or
is_unicodestring(left.resultdef) then
begin begin
if nf_callunique in flags then if nf_callunique in flags then
internalerror(200304236); internalerror(200304236);
@ -763,6 +764,7 @@ implementation
begin begin
case tstringdef(left.resultdef).stringtype of case tstringdef(left.resultdef).stringtype of
{ it's the same for ansi- and wide strings } { it's the same for ansi- and wide strings }
st_unicodestring,
st_widestring, st_widestring,
st_ansistring: st_ansistring:
begin begin
@ -926,6 +928,7 @@ implementation
begin begin
case tstringdef(left.resultdef).stringtype of case tstringdef(left.resultdef).stringtype of
{ it's the same for ansi- and wide strings } { it's the same for ansi- and wide strings }
st_unicodestring,
st_widestring, st_widestring,
st_ansistring: st_ansistring:
begin begin

View File

@ -372,6 +372,11 @@ implementation
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkWString)); current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkWString));
write_rtti_name(def); write_rtti_name(def);
end; end;
st_unicodestring:
begin
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkUString));
write_rtti_name(def);
end;
st_longstring: st_longstring:
begin begin
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkLString)); current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkLString));

View File

@ -917,12 +917,12 @@ implementation
{ we can't do widechar to ansichar conversions at compile time, since } { we can't do widechar to ansichar conversions at compile time, since }
{ this maps all non-ascii chars to '?' -> loses information } { this maps all non-ascii chars to '?' -> loses information }
if (left.nodetype=ordconstn) and if (left.nodetype=ordconstn) and
((tstringdef(resultdef).stringtype=st_widestring) or ((tstringdef(resultdef).stringtype in [st_widestring,st_unicodestring]) or
(torddef(left.resultdef).ordtype=uchar) or (torddef(left.resultdef).ordtype=uchar) or
{ >=128 is destroyed } { >=128 is destroyed }
(tordconstnode(left).value.uvalue<128)) then (tordconstnode(left).value.uvalue<128)) then
begin begin
if tstringdef(resultdef).stringtype=st_widestring then if tstringdef(resultdef).stringtype in [st_widestring,st_unicodestring] then
begin begin
initwidestring(ws); initwidestring(ws);
if torddef(left.resultdef).ordtype=uwidechar then if torddef(left.resultdef).ordtype=uwidechar then
@ -953,7 +953,7 @@ implementation
if torddef(left.resultdef).ordtype<>uwidechar then if torddef(left.resultdef).ordtype<>uwidechar then
procname := 'fpc_char_to_' procname := 'fpc_char_to_'
else else
procname := 'fpc_wchar_to_'; procname := 'fpc_uchar_to_';
procname:=procname+tstringdef(resultdef).stringtypname; procname:=procname+tstringdef(resultdef).stringtypname;
{ and the parameter } { and the parameter }
@ -1193,7 +1193,8 @@ implementation
inserttypeconv(left,cwidestringtype) inserttypeconv(left,cwidestringtype)
else else
if is_pchar(resultdef) and if is_pchar(resultdef) and
is_widestring(left.resultdef) then (is_widestring(left.resultdef) or
is_unicodestring(left.resultdef)) then
begin begin
inserttypeconv(left,cansistringtype); inserttypeconv(left,cansistringtype);
{ the second pass of second_cstring_to_pchar expects a } { the second pass of second_cstring_to_pchar expects a }
@ -2037,8 +2038,8 @@ implementation
if (convtype=tc_string_2_string) and if (convtype=tc_string_2_string) and
( (
((not is_widechararray(left.resultdef) and ((not is_widechararray(left.resultdef) and
not is_widestring(left.resultdef)) or not is_wide_or_unicode_string(left.resultdef)) or
(tstringdef(resultdef).stringtype=st_widestring) or (tstringdef(resultdef).stringtype in [st_widestring,st_unicodestring]) or
{ non-ascii chars would be replaced with '?' -> loses info } { non-ascii chars would be replaced with '?' -> loses info }
not hasnonasciichars(pcompilerwidestring(tstringconstnode(left).value_str))) not hasnonasciichars(pcompilerwidestring(tstringconstnode(left).value_str)))
) then ) then
@ -2530,10 +2531,10 @@ implementation
begin begin
if (torddef(resultdef).ordtype=uchar) and if (torddef(resultdef).ordtype=uchar) and
(torddef(left.resultdef).ordtype=uwidechar) then (torddef(left.resultdef).ordtype=uwidechar) then
fname := 'fpc_wchar_to_char' fname := 'fpc_uchar_to_char'
else if (torddef(resultdef).ordtype=uwidechar) and else if (torddef(resultdef).ordtype=uwidechar) and
(torddef(left.resultdef).ordtype=uchar) then (torddef(left.resultdef).ordtype=uchar) then
fname := 'fpc_char_to_wchar' fname := 'fpc_char_to_uchar'
else else
internalerror(2007081201); internalerror(2007081201);

View File

@ -866,7 +866,8 @@ implementation
resultdef:=cshortstringtype; resultdef:=cshortstringtype;
cst_ansistring : cst_ansistring :
resultdef:=cansistringtype; resultdef:=cansistringtype;
cst_unicodestring, cst_unicodestring :
resultdef:=cunicodestringtype;
cst_widestring : cst_widestring :
resultdef:=cwidestringtype; resultdef:=cwidestringtype;
cst_longstring : cst_longstring :
@ -877,9 +878,13 @@ implementation
function tstringconstnode.pass_1 : tnode; function tstringconstnode.pass_1 : tnode;
begin begin
result:=nil; result:=nil;
if (cst_type in [cst_ansistring,cst_widestring,cst_unicodestring]) and if (cst_type in [cst_ansistring,cst_widestring,cst_unicodestring]) then
(len=0) then begin
if len=0 then
expectloc:=LOC_CONSTANT expectloc:=LOC_CONSTANT
else
expectloc:=LOC_REGISTER
end
else else
expectloc:=LOC_CREFERENCE; expectloc:=LOC_CREFERENCE;
end; end;
@ -920,8 +925,8 @@ implementation
if def.typ<>stringdef then if def.typ<>stringdef then
internalerror(200510011); internalerror(200510011);
{ convert ascii 2 unicode } { convert ascii 2 unicode }
if (tstringdef(def).stringtype=st_widestring) and if (tstringdef(def).stringtype in [st_widestring,st_unicodestring]) and
(cst_type<>cst_widestring) then not(cst_type in [cst_widestring,cst_unicodestring]) then
begin begin
initwidestring(pw); initwidestring(pw);
ascii2unicode(value_str,len,pw); ascii2unicode(value_str,len,pw);
@ -930,8 +935,8 @@ implementation
end end
else else
{ convert unicode 2 ascii } { convert unicode 2 ascii }
if (cst_type=cst_widestring) and if (cst_type in [cst_widestring,cst_unicodestring]) and
(tstringdef(def).stringtype<>st_widestring) then not(tstringdef(def).stringtype in [st_widestring,st_unicodestring]) then
begin begin
pw:=pcompilerwidestring(value_str); pw:=pcompilerwidestring(value_str);
getmem(pc,getlengthwidestring(pw)+1); getmem(pc,getlengthwidestring(pw)+1);

View File

@ -1676,7 +1676,7 @@ implementation
result:=cordconstnode.create(0,u8inttype,false); result:=cordconstnode.create(0,u8inttype,false);
end end
else if not is_ansistring(left.resultdef) and else if not is_ansistring(left.resultdef) and
not is_widestring(left.resultdef) then not is_wide_or_unicode_string(left.resultdef) then
result:=cordconstnode.create(tstringdef(left.resultdef).len,u8inttype,true) result:=cordconstnode.create(tstringdef(left.resultdef).len,u8inttype,true)
end; end;
end; end;
@ -2040,8 +2040,8 @@ implementation
{ length) } { length) }
if (left.nodetype=typeconvn) and if (left.nodetype=typeconvn) and
(ttypeconvnode(left).left.resultdef.typ=stringdef) and (ttypeconvnode(left).left.resultdef.typ=stringdef) and
not(is_widestring(left.resultdef) xor not(is_wide_or_unicode_string(left.resultdef) xor
is_widestring(ttypeconvnode(left).left.resultdef)) then is_wide_or_unicode_string(ttypeconvnode(left).left.resultdef)) then
begin begin
hp:=ttypeconvnode(left).left; hp:=ttypeconvnode(left).left;
ttypeconvnode(left).left:=nil; ttypeconvnode(left).left:=nil;
@ -2334,7 +2334,7 @@ implementation
result:=load_high_value_node(tparavarsym(tloadnode(left).symtableentry)) result:=load_high_value_node(tparavarsym(tloadnode(left).symtableentry))
end end
else if is_ansistring(left.resultdef) or else if is_ansistring(left.resultdef) or
is_widestring(left.resultdef) then is_wide_or_unicode_string(left.resultdef) then
CGMessage(type_e_mismatch) CGMessage(type_e_mismatch)
end; end;
end; end;

View File

@ -667,7 +667,7 @@ implementation
ansi/widestring needs to be valid } ansi/widestring needs to be valid }
valid:=is_dynamic_array(left.resultdef) or valid:=is_dynamic_array(left.resultdef) or
is_ansistring(left.resultdef) or is_ansistring(left.resultdef) or
is_widestring(left.resultdef) or is_wide_or_unicode_string(left.resultdef) or
{ implicit pointer dereference -> pointer is read } { implicit pointer dereference -> pointer is read }
(left.resultdef.typ = pointerdef); (left.resultdef.typ = pointerdef);
if valid then if valid then
@ -827,6 +827,7 @@ implementation
if (nf_callunique in flags) and if (nf_callunique in flags) and
(is_ansistring(left.resultdef) or (is_ansistring(left.resultdef) or
is_unicodestring(left.resultdef) or
(is_widestring(left.resultdef) and not(tf_winlikewidestring in target_info.flags))) then (is_widestring(left.resultdef) and not(tf_winlikewidestring in target_info.flags))) then
begin begin
left := ctypeconvnode.create_internal(ccallnode.createintern('fpc_'+tstringdef(left.resultdef).stringtypname+'_unique', left := ctypeconvnode.create_internal(ccallnode.createintern('fpc_'+tstringdef(left.resultdef).stringtypname+'_unique',

View File

@ -531,7 +531,7 @@ implementation
if not assigned(p.resultdef) then if not assigned(p.resultdef) then
typecheckpass(p); typecheckpass(p);
if is_ansistring(p.resultdef) or if is_ansistring(p.resultdef) or
is_widestring(p.resultdef) or is_wide_or_unicode_string(p.resultdef) or
is_interfacecom(p.resultdef) or is_interfacecom(p.resultdef) or
is_dynamic_array(p.resultdef) then is_dynamic_array(p.resultdef) then
begin begin
@ -584,6 +584,18 @@ implementation
cnilnode.create cnilnode.create
)); ));
end end
else if is_unicodestring(p.resultdef) then
begin
result:=internalstatements(newstatement);
addstatement(newstatement,ccallnode.createintern('fpc_unicodestr_decr_ref',
ccallparanode.create(
ctypeconvnode.create_internal(p,voidpointertype),
nil)));
addstatement(newstatement,cassignmentnode.create(
ctypeconvnode.create_internal(p.getcopy,voidpointertype),
cnilnode.create
));
end
else if is_interfacecom(p.resultdef) then else if is_interfacecom(p.resultdef) then
begin begin
result:=internalstatements(newstatement); result:=internalstatements(newstatement);

View File

@ -71,7 +71,7 @@ implementation
uses uses
widestr, widestr,
charset, {$ifdef VER2_2}ccharset{$else VER2_2}charset{$endif VER2_2},
SysUtils, SysUtils,
version, version,
cutils,cmsgs, cutils,cmsgs,
@ -2580,6 +2580,9 @@ begin
set_system_macro('FPC_PATCH',patch_nr); set_system_macro('FPC_PATCH',patch_nr);
set_system_macro('FPC_FULLVERSION',Format('%d%.02d%.02d',[StrToInt(version_nr),StrToInt(release_nr),StrToInt(patch_nr)])); set_system_macro('FPC_FULLVERSION',Format('%d%.02d%.02d',[StrToInt(version_nr),StrToInt(release_nr),StrToInt(patch_nr)]));
if not(target_info.system in system_windows) then
def_system_macro('FPC_WIDESTRING_EQUAL_UNICODESTRING');
for i:=low(tfeature) to high(tfeature) do for i:=low(tfeature) to high(tfeature) do
if i in features then if i in features then
def_system_macro('FPC_HAS_FEATURE_'+featurestr[i]); def_system_macro('FPC_HAS_FEATURE_'+featurestr[i]);

View File

@ -96,7 +96,7 @@ implementation
end; end;
stringconstn: stringconstn:
begin begin
if is_widestring(p.resultdef) then if is_wide_or_unicode_string(p.resultdef) then
begin begin
initwidestring(pw); initwidestring(pw);
copywidestring(pcompilerwidestring(tstringconstnode(p).value_str),pw); copywidestring(pcompilerwidestring(tstringconstnode(p).value_str),pw);

View File

@ -720,6 +720,9 @@ implementation
is_widechararray(paradef) or is_widechararray(paradef) or
is_pwidechar(paradef) then is_pwidechar(paradef) then
copynode:=ccallnode.createintern('fpc_widestr_copy',paras) copynode:=ccallnode.createintern('fpc_widestr_copy',paras)
else
if is_unicodestring(paradef) then
copynode:=ccallnode.createintern('fpc_unicodestr_copy',paras)
else else
if is_char(paradef) then if is_char(paradef) then
copynode:=ccallnode.createintern('fpc_char_copy',paras) copynode:=ccallnode.createintern('fpc_char_copy',paras)

View File

@ -43,7 +43,7 @@ type
{$endif Test_Double_checksum} {$endif Test_Double_checksum}
const const
CurrentPPUVersion = 91; CurrentPPUVersion = 92;
{ buffer sizes } { buffer sizes }
maxentrysize = 1024; maxentrysize = 1024;

View File

@ -157,7 +157,10 @@ implementation
{ should we give a length to the default long and ansi string definition ?? } { should we give a length to the default long and ansi string definition ?? }
clongstringtype:=tstringdef.createlong(-1); clongstringtype:=tstringdef.createlong(-1);
cansistringtype:=tstringdef.createansi; cansistringtype:=tstringdef.createansi;
cwidestringtype:=tstringdef.createwide; if target_info.system in system_windows then
cwidestringtype:=tstringdef.createwide
else
cwidestringtype:=tstringdef.createunicode;
cunicodestringtype:=tstringdef.createunicode; cunicodestringtype:=tstringdef.createunicode;
{ length=0 for shortstring is open string (needed for readln(string) } { length=0 for shortstring is open string (needed for readln(string) }
openshortstringtype:=tstringdef.createshort(0); openshortstringtype:=tstringdef.createshort(0);
@ -265,6 +268,7 @@ implementation
addtype('AnsiString',cansistringtype); addtype('AnsiString',cansistringtype);
addtype('WideString',cwidestringtype); addtype('WideString',cwidestringtype);
addtype('UnicodeString',cunicodestringtype); addtype('UnicodeString',cunicodestringtype);
addtype('OpenString',openshortstringtype); addtype('OpenString',openshortstringtype);
addtype('Boolean',booltype); addtype('Boolean',booltype);
addtype('ByteBool',bool8type); addtype('ByteBool',bool8type);

View File

@ -431,7 +431,7 @@ implementation
{ convert to widestring stringconstn } { convert to widestring stringconstn }
inserttypeconv(p,cwidestringtype); inserttypeconv(p,cwidestringtype);
if (p.nodetype=stringconstn) and if (p.nodetype=stringconstn) and
(tstringconstnode(p).cst_type=cst_widestring) then (tstringconstnode(p).cst_type in [cst_widestring,cst_unicodestring]) then
begin begin
pw:=pcompilerwidestring(tstringconstnode(p).value_str); pw:=pcompilerwidestring(tstringconstnode(p).value_str);
for i:=0 to tstringconstnode(p).len-1 do for i:=0 to tstringconstnode(p).len-1 do
@ -641,7 +641,7 @@ implementation
begin begin
n:=comp_expr(true); n:=comp_expr(true);
{ load strval and strlength of the constant tree } { load strval and strlength of the constant tree }
if (n.nodetype=stringconstn) or is_widestring(def) or is_constwidecharnode(n) then if (n.nodetype=stringconstn) or is_wide_or_unicode_string(def) or is_constwidecharnode(n) then
begin begin
{ convert to the expected string type so that { convert to the expected string type so that
for widestrings strval is a pcompilerwidestring } for widestrings strval is a pcompilerwidestring }

View File

@ -962,7 +962,7 @@ In case not, the value returned can be arbitrary.
else else
l:=tarraydef(hdef).highrange; l:=tarraydef(hdef).highrange;
stringdef: stringdef:
if is_open_string(hdef) or is_ansistring(hdef) or is_widestring(hdef) then if is_open_string(hdef) or is_ansistring(hdef) or is_wide_or_unicode_string(hdef) then
Message(type_e_mismatch) Message(type_e_mismatch)
else else
l:=tstringdef(hdef).len; l:=tstringdef(hdef).len;

View File

@ -61,6 +61,8 @@ const
tkDynArray = 21; tkDynArray = 21;
tkInterfaceCorba = 22; tkInterfaceCorba = 22;
tkProcVar = 23; tkProcVar = 23;
tkUString = 24;
tkUChar = 25;
otSByte = 0; otSByte = 0;
otUByte = 1; otUByte = 1;
@ -446,7 +448,7 @@ type
tvariantequaltype = ( tvariantequaltype = (
tve_incompatible, tve_incompatible,
tve_chari64, tve_chari64,
tve_unicodestring, tve_ustring,
tve_wstring, tve_wstring,
tve_astring, tve_astring,
tve_sstring, tve_sstring,

View File

@ -28,8 +28,7 @@ unit widestr;
interface interface
uses uses
charset,globtype {$ifdef VER2_2}ccharset{$else VER2_2}charset{$endif VER2_2},globtype;
;
type type

View File

@ -15,6 +15,7 @@
} }
unit iconvenc; unit iconvenc;
interface interface
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
@ -29,44 +30,46 @@ uses
const const
n = 1; n = 1;
type type
Piconv_t = ^iconv_t; piconv_t = ^iconv_t;
iconv_t = pointer; iconv_t = pointer;
Ticonv_open = function (__tocode:Pchar; __fromcode:Pchar):iconv_t;cdecl; Ticonv_open = function(__tocode: pchar; __fromcode: pchar): iconv_t; cdecl;
Ticonv = function (__cd:iconv_t; __inbuf:PPchar; __inbytesleft:Psize_t; __outbuf:PPchar; __outbytesleft:Psize_t):size_t;cdecl; Ticonv = function(__cd: iconv_t; __inbuf: ppchar; __inbytesleft: psize_t; __outbuf: ppchar; __outbytesleft: psize_t): size_t; cdecl;
Ticonv_close = function (__cd:iconv_t):longint;cdecl; Ticonv_close = function(__cd: iconv_t): cint; cdecl;
{$IFNDEF LOADDYNAMIC} {$IFNDEF LOADDYNAMIC}
{$ifndef Linux} // and other OSes with iconv in libc. {$ifndef Linux} // and other OSes with iconv in libc.
{$linklib iconv} {$linklib iconv}
{$endif} {$endif}
function iconv_open (__tocode:Pchar; __fromcode:Pchar):iconv_t;cdecl; external; function iconv_open(__tocode: pchar; __fromcode: pchar): iconv_t; cdecl; external;
function iconv (__cd:iconv_t; __inbuf:PPchar; __inbytesleft:Psize_t; __outbuf:PPchar; __outbytesleft:Psize_t):size_t;cdecl; external; function iconv (__cd: iconv_t; __inbuf: ppchar; __inbytesleft: psize_t; __outbuf: ppchar; __outbytesleft: psize_t): size_t; cdecl; external;
function iconv_close (__cd:iconv_t):longint;cdecl; external; function iconv_close (__cd: iconv_t): cint; cdecl; external;
var var
IconvLibFound: Boolean = False; IconvLibFound: boolean = False;
{$ELSE} {$ELSE}
var var
iconv_lib: Pointer; iconv_lib: pointer;
iconv_open: Ticonv_open; iconv_open: Ticonv_open;
iconv: Ticonv; iconv: Ticonv;
iconv_close: Ticonv_close; iconv_close: Ticonv_close;
IconvLibFound: Boolean = True; IconvLibFound: boolean = true;
function TryLoadLib(LibName:String;var error:string):Boolean; // can be used to load non standard libname
function TryLoadLib(LibName: string; var error: string): boolean; // can be used to load non standard libname
{$endif} {$endif}
function Iconvert(S:string;var res:string; FromEncoding, ToEncoding: string): cint; function Iconvert(s: string; var res: string; FromEncoding, ToEncoding: string): cint;
function InitIconv (Var error:string): Boolean; function InitIconv(var error: string): boolean;
implementation implementation
{$IFDEF LOADDYNAMIC} {$IFDEF LOADDYNAMIC}
function TryLoadLib(LibName:String;var error:string):Boolean; function TryLoadLib(LibName: string; var error: string): boolean;
function resolvesymbol (var funcptr; symbol:string):boolean;
function resolvesymbol (var funcptr; symbol: string): Boolean;
begin begin
pointer(funcptr) := pointer(dlsym(iconv_lib, pchar(symbol))); pointer(funcptr) := pointer(dlsym(iconv_lib, pchar(symbol)));
result := assigned(pointer(funcptr)); result := assigned(pointer(funcptr));
@ -74,8 +77,8 @@ begin
error := error+#13#10+dlerror(); error := error+#13#10+dlerror();
end; end;
var res:boolean; var
res: boolean;
begin begin
result := false; result := false;
Error := Error+#13#10'Trying '+LibName; Error := Error+#13#10'Trying '+LibName;
@ -88,14 +91,13 @@ begin
result := result and resolvesymbol(pointer(iconv_close),'iconv_close'); result := result and resolvesymbol(pointer(iconv_close),'iconv_close');
// if not res then // if not res then
// dlclose(iconv_lib); // dlclose(iconv_lib);
end end else
else
error:=error+#13#10+dlerror(); error:=error+#13#10+dlerror();
end; end;
{$ENDIF} {$ENDIF}
function InitIconv(Var error:string): Boolean; function InitIconv(var error: string): boolean;
begin begin
result := true; result := true;
{$ifdef LOADDYNAMIC} {$ifdef LOADDYNAMIC}
@ -107,30 +109,32 @@ begin
iconvlibfound := iconvlibfound or result; iconvlibfound := iconvlibfound or result;
end; end;
function Iconvert(S:string;var res:string; FromEncoding, ToEncoding: string): cint; function Iconvert(S: string; var Res: string; FromEncoding, ToEncoding: string): cint;
var var
InLen, OutLen, Offset: size_t; InLen, OutLen, Offset: size_t;
Src, Dst: PChar; Src, Dst: pchar;
H: iconv_t; H: iconv_t;
lerr: cint; lerr: cint;
iconvres : cint; iconvres: size_t;
begin begin
H := iconv_open(PChar(ToEncoding), PChar(FromEncoding)); H := iconv_open(PChar(ToEncoding), PChar(FromEncoding));
if not assigned(H) then if not assigned(H) then
begin begin
Res := S; Res := S;
Exit(-1); exit(-1);
end; end;
try try
SetLength(Res, Length(S)); SetLength(Res, Length(S));
InLen := Length(S); InLen := Length(S);
OutLen := Length(Res); OutLen := Length(Res);
Src := PChar(S); Src := PChar(S);
Dst := PChar(Res); Dst := PChar(Res);
while InLen > 0 do while InLen > 0 do
begin begin
iconvres := iconv(H, @Src, @InLen, @Dst, @OutLen); iconvres := iconv(H, @Src, @InLen, @Dst, @OutLen);
if iconvres=Cint(-1) then if iconvres = size_t(-1) then
begin begin
lerr := cerrno; lerr := cerrno;
if lerr = ESysEILSEQ then // unknown char, skip if lerr = ESysEILSEQ then // unknown char, skip
@ -153,14 +157,17 @@ begin
exit(-1) exit(-1)
end; end;
end; end;
// iconv has a buffer that needs flushing, specially if the last char is not #0
iconvres:=iconv(H, nil, nil, @Dst, @Outlen);
SetLength(Res, Length(Res)-outlen); // iconv has a buffer that needs flushing, specially if the last char is not #0
iconv(H, nil, nil, @Dst, @Outlen);
// trim output buffer
SetLength(Res, Length(Res) - Outlen);
finally finally
iconv_close(H); iconv_close(H);
end; end;
result:=0;
Result := 0;
end; end;
end. end.

View File

@ -123,9 +123,16 @@ procedure fpc_AnsiStr_Currency(c : currency;len,fr : SizeInt;out s : ansistring)
{$endif FPC_HAS_FEATURE_ANSISTRINGS} {$endif FPC_HAS_FEATURE_ANSISTRINGS}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{$if not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
procedure fpc_WideStr_sint(v : valsint; Len : SizeInt; out S : WideString); compilerproc; procedure fpc_WideStr_sint(v : valsint; Len : SizeInt; out S : WideString); compilerproc;
procedure fpc_WideStr_uint(v : valuint;Len : SizeInt; out S : WideString); compilerproc; procedure fpc_WideStr_uint(v : valuint;Len : SizeInt; out S : WideString); compilerproc;
{$endif not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
{$ifndef VER2_2}
procedure fpc_UnicodeStr_sint(v : valsint; Len : SizeInt; out S : UnicodeString); compilerproc;
procedure fpc_UnicodeStr_uint(v : valuint;Len : SizeInt; out S : UnicodeString); compilerproc;
{$endif VER2_2}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$ifndef CPU64} {$ifndef CPU64}
procedure fpc_shortstr_qword(v : qword;len : SizeInt;out s : shortstring); compilerproc; procedure fpc_shortstr_qword(v : qword;len : SizeInt;out s : shortstring); compilerproc;
procedure fpc_shortstr_int64(v : int64;len : SizeInt;out s : shortstring); compilerproc; procedure fpc_shortstr_int64(v : int64;len : SizeInt;out s : shortstring); compilerproc;
@ -137,17 +144,33 @@ procedure fpc_WideStr_uint(v : valuint;Len : SizeInt; out S : WideString); compi
{$endif FPC_HAS_FEATURE_ANSISTRINGS} {$endif FPC_HAS_FEATURE_ANSISTRINGS}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{$if not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
procedure fpc_widestr_qword(v : qword;len : SizeInt;out s : widestring); compilerproc; procedure fpc_widestr_qword(v : qword;len : SizeInt;out s : widestring); compilerproc;
procedure fpc_widestr_int64(v : int64;len : SizeInt;out s : widestring); compilerproc; procedure fpc_widestr_int64(v : int64;len : SizeInt;out s : widestring); compilerproc;
{$endif not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
{$ifndef VER2_2}
procedure fpc_UnicodeStr_qword(v : qword;len : SizeInt;out s : UnicodeString); compilerproc;
procedure fpc_UnicodeStr_int64(v : int64;len : SizeInt;out s : UnicodeString); compilerproc;
{$endif VER2_2}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$endif CPU64} {$endif CPU64}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{$if not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
{$ifndef FPUNONE} {$ifndef FPUNONE}
procedure fpc_WideStr_Float(d : ValReal;len,fr,rt : SizeInt;out s : WideString); compilerproc; procedure fpc_WideStr_Float(d : ValReal;len,fr,rt : SizeInt;out s : WideString); compilerproc;
{$endif} {$endif}
{$ifdef FPC_HAS_STR_CURRENCY} {$ifdef FPC_HAS_STR_CURRENCY}
procedure fpc_WideStr_Currency(c : Currency;len,fr : SizeInt;out s : WideString);compilerproc; procedure fpc_WideStr_Currency(c : Currency;len,fr : SizeInt;out s : WideString);compilerproc;
{$endif FPC_HAS_STR_CURRENCY} {$endif FPC_HAS_STR_CURRENCY}
{$endif not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
{$ifndef VER2_2}
{$ifndef FPUNONE}
procedure fpc_UnicodeStr_Float(d : ValReal;len,fr,rt : SizeInt;out s : UnicodeString); compilerproc;
{$endif}
{$ifdef FPC_HAS_STR_CURRENCY}
procedure fpc_UnicodeStr_Currency(c : Currency;len,fr : SizeInt;out s : UnicodeString);compilerproc;
{$endif FPC_HAS_STR_CURRENCY}
{$endif VER2_2}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$ifndef FPUNONE} {$ifndef FPUNONE}
@ -174,15 +197,28 @@ Function fpc_Val_SInt_AnsiStr (DestSize: SizeInt; Const S : AnsiString; out Code
Function fpc_Val_Currency_AnsiStr(Const S : AnsiString; out Code : ValSInt): Currency; compilerproc; Function fpc_Val_Currency_AnsiStr(Const S : AnsiString; out Code : ValSInt): Currency; compilerproc;
function fpc_Val_enum_ansistr(str2ordindex:pointer;const s:ansistring;out code:valsint):longint; compilerproc; function fpc_Val_enum_ansistr(str2ordindex:pointer;const s:ansistring;out code:valsint):longint; compilerproc;
{$endif FPC_HAS_FEATURE_ANSISTRINGS} {$endif FPC_HAS_FEATURE_ANSISTRINGS}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{$if not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
{$ifndef FPUNONE} {$ifndef FPUNONE}
Function fpc_Val_Real_WideStr(Const S : WideString; out Code : ValSInt): ValReal; compilerproc; Function fpc_Val_Real_WideStr(Const S : WideString; out Code : ValSInt): ValReal; compilerproc;
{$endif} {$endif}
Function fpc_Val_SInt_WideStr (DestSize: SizeInt; Const S : WideString; out Code : ValSInt): ValSInt; compilerproc; Function fpc_Val_SInt_WideStr (DestSize: SizeInt; Const S : WideString; out Code : ValSInt): ValSInt; compilerproc;
Function fpc_Val_UInt_WideStr (Const S : WideString; out Code : ValSInt): ValUInt; compilerproc; Function fpc_Val_UInt_WideStr (Const S : WideString; out Code : ValSInt): ValUInt; compilerproc;
function fpc_val_enum_widestr(str2ordindex:pointer;const s:widestring;out code:valsint):longint;compilerproc; function fpc_val_Enum_WideStr (str2ordindex:pointer;const s:WideString;out code:valsint):longint;compilerproc;
Function fpc_Val_Currency_WideStr(Const S : WideString; out Code : ValSInt): Currency; compilerproc; Function fpc_Val_Currency_WideStr(Const S : WideString; out Code : ValSInt): Currency; compilerproc;
{$endif not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
{$ifndef VER2_2}
{$ifndef FPUNONE}
Function fpc_Val_Real_UnicodeStr(Const S : UnicodeString; out Code : ValSInt): ValReal; compilerproc;
{$endif}
Function fpc_Val_SInt_UnicodeStr (DestSize: SizeInt; Const S : UnicodeString; out Code : ValSInt): ValSInt; compilerproc;
Function fpc_Val_UInt_UnicodeStr (Const S : UnicodeString; out Code : ValSInt): ValUInt; compilerproc;
function fpc_val_Enum_UnicodeStr(str2ordindex:pointer;const s:UnicodeString;out code:valsint):longint;compilerproc;
Function fpc_Val_Currency_UnicodeStr(Const S : UnicodeString; out Code : ValSInt): Currency; compilerproc;
{$endif VER2_2}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$ifndef CPU64} {$ifndef CPU64}
Function fpc_val_int64_shortstr(Const S: ShortString; out Code: ValSInt): Int64; compilerproc; Function fpc_val_int64_shortstr(Const S: ShortString; out Code: ValSInt): Int64; compilerproc;
Function fpc_val_qword_shortstr(Const S: ShortString; out Code: ValSInt): QWord; compilerproc; Function fpc_val_qword_shortstr(Const S: ShortString; out Code: ValSInt): QWord; compilerproc;
@ -190,10 +226,18 @@ Function fpc_val_qword_shortstr(Const S: ShortString; out Code: ValSInt): QWord;
Function fpc_Val_qword_AnsiStr (Const S : AnsiString; out Code : ValSInt): qword;compilerproc; Function fpc_Val_qword_AnsiStr (Const S : AnsiString; out Code : ValSInt): qword;compilerproc;
Function fpc_Val_int64_AnsiStr (Const S : AnsiString; out Code : ValSInt): Int64; compilerproc; Function fpc_Val_int64_AnsiStr (Const S : AnsiString; out Code : ValSInt): Int64; compilerproc;
{$endif FPC_HAS_FEATURE_ANSISTRINGS} {$endif FPC_HAS_FEATURE_ANSISTRINGS}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{$if not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
Function fpc_Val_qword_WideStr (Const S : WideString; out Code : ValSInt): qword; compilerproc; Function fpc_Val_qword_WideStr (Const S : WideString; out Code : ValSInt): qword; compilerproc;
Function fpc_Val_int64_WideStr (Const S : WideString; out Code : ValSInt): Int64; compilerproc; Function fpc_Val_int64_WideStr (Const S : WideString; out Code : ValSInt): Int64; compilerproc;
{$endif not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
{$ifndef VER2_2}
Function fpc_Val_qword_UnicodeStr (Const S : UnicodeString; out Code : ValSInt): qword; compilerproc;
Function fpc_Val_int64_UnicodeStr (Const S : UnicodeString; out Code : ValSInt): Int64; compilerproc;
{$endif VER2_2}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$endif CPU64} {$endif CPU64}
{$ifdef FPC_HAS_FEATURE_ANSISTRINGS} {$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
@ -243,6 +287,11 @@ Function fpc_AnsiStr_ShortStr_Compare (Var S1 : Pointer; Var S2 : ShortString):
Function fpc_ansistr_Unique(Var S : Pointer): Pointer; compilerproc; Function fpc_ansistr_Unique(Var S : Pointer): Pointer; compilerproc;
{$endif FPC_HAS_FEATURE_ANSISTRINGS} {$endif FPC_HAS_FEATURE_ANSISTRINGS}
{*****************************************************************************
Widestring support
*****************************************************************************}
{$if not(defined(FPC_WIDESTRING_EQUAL_UNICODESTRING)) or defined(VER2_2)}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
Procedure fpc_WideStr_Decr_Ref (Var S : Pointer); compilerproc; Procedure fpc_WideStr_Decr_Ref (Var S : Pointer); compilerproc;
Procedure fpc_WideStr_Incr_Ref (Var S : Pointer); compilerproc; Procedure fpc_WideStr_Incr_Ref (Var S : Pointer); compilerproc;
@ -267,22 +316,11 @@ Function fpc_PChar_To_WideStr(const p : pchar): WideString; compilerproc;
Function fpc_CharArray_To_WideStr(const arr: array of char; zerobased: boolean = true): WideString; compilerproc; Function fpc_CharArray_To_WideStr(const arr: array of char; zerobased: boolean = true): WideString; compilerproc;
{$ifndef FPC_STRTOCHARARRAYPROC} {$ifndef FPC_STRTOCHARARRAYPROC}
function fpc_widestr_to_chararray(arraysize: SizeInt; const src: WideString): fpc_big_chararray; compilerproc; function fpc_widestr_to_chararray(arraysize: SizeInt; const src: WideString): fpc_big_chararray; compilerproc;
Function fpc_shortstr_to_widechararray(arraysize: SizeInt; const src: ShortString): fpc_big_widechararray; compilerproc;
Function fpc_ansistr_to_widechararray(arraysize: SizeInt; const src: AnsiString): fpc_big_widechararray; compilerproc;
Function fpc_widestr_to_widechararray(arraysize: SizeInt; const src: WideString): fpc_big_widechararray; compilerproc; Function fpc_widestr_to_widechararray(arraysize: SizeInt; const src: WideString): fpc_big_widechararray; compilerproc;
{$else ndef FPC_STRTOCHARARRAYPROC} {$else ndef FPC_STRTOCHARARRAYPROC}
procedure fpc_widestr_to_chararray(out res: array of char; const src: WideString); compilerproc; procedure fpc_widestr_to_chararray(out res: array of char; const src: WideString); compilerproc;
procedure fpc_shortstr_to_widechararray(out res: array of widechar; const src: ShortString); compilerproc;
procedure fpc_ansistr_to_widechararray(out res: array of widechar; const src: AnsiString); compilerproc;
procedure fpc_widestr_to_widechararray(out res: array of widechar; const src: WideString); compilerproc; procedure fpc_widestr_to_widechararray(out res: array of widechar; const src: WideString); compilerproc;
{$endif ndef FPC_STRTOCHARARRAYPROC} {$endif ndef FPC_STRTOCHARARRAYPROC}
{$ifndef FPC_STRTOSHORTSTRINGPROC}
Function fpc_WideCharArray_To_ShortStr(const arr: array of widechar; zerobased: boolean = true): shortstring; compilerproc;
{$else FPC_STRTOSHORTSTRINGPROC}
procedure fpc_WideCharArray_To_ShortStr(out res : shortstring;const arr: array of widechar; zerobased: boolean = true); compilerproc;
{$endif FPC_STRTOSHORTSTRINGPROC}
Function fpc_WideCharArray_To_AnsiStr(const arr: array of widechar; zerobased: boolean = true): AnsiString; compilerproc;
Function fpc_WideCharArray_To_WideStr(const arr: array of widechar; zerobased: boolean = true): WideString; compilerproc;
Function fpc_WideStr_Compare(const S1,S2 : WideString): SizeInt; compilerproc; Function fpc_WideStr_Compare(const S1,S2 : WideString): SizeInt; compilerproc;
Function fpc_WideStr_Compare_equal(const S1,S2 : WideString): SizeInt; compilerproc; Function fpc_WideStr_Compare_equal(const S1,S2 : WideString): SizeInt; compilerproc;
Procedure fpc_WideStr_CheckZero(p : pointer); compilerproc; Procedure fpc_WideStr_CheckZero(p : pointer); compilerproc;
@ -292,28 +330,131 @@ Function fpc_widestr_Copy (Const S : WideString; Index,Size : SizeInt) : WideSt
{$ifndef FPC_WINLIKEWIDESTRING} {$ifndef FPC_WINLIKEWIDESTRING}
function fpc_widestr_Unique(Var S : Pointer): Pointer; compilerproc; function fpc_widestr_Unique(Var S : Pointer): Pointer; compilerproc;
{$endif FPC_WINLIKEWIDESTRING} {$endif FPC_WINLIKEWIDESTRING}
Function fpc_Char_To_WChar(const c : Char): WideChar; compilerproc; Function fpc_WChar_To_AnsiStr(const c : WideChar): AnsiString; compilerproc;
Function fpc_WChar_To_Char(const c : WideChar): Char; compilerproc; Function fpc_WChar_To_WideStr(const c : WideChar): WideString; compilerproc;
{$ifndef VER2_2}
Function fpc_UChar_To_WideStr(const c : WideChar): WideString; compilerproc;
{$endif VER2_2}
{$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
Function fpc_PWideChar_To_WideStr(const p : pwidechar): widestring; compilerproc;
{$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$endif defined(WINDOWS) or defined(VER2_2)}
{*****************************************************************************
Unicode string support
*****************************************************************************}
{$ifndef VER2_2}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
Procedure fpc_UnicodeStr_Decr_Ref (Var S : Pointer); compilerproc;
Procedure fpc_UnicodeStr_Incr_Ref (S : Pointer); compilerproc;
{$ifndef FPC_STRTOSHORTSTRINGPROC}
function fpc_UnicodeStr_To_ShortStr (high_of_res: SizeInt;const S2 : UnicodeString): shortstring; compilerproc;
{$else FPC_STRTOSHORTSTRINGPROC}
procedure fpc_UnicodeStr_To_ShortStr (out res: ShortString;const S2 : UnicodeString); compilerproc;
{$endif FPC_STRTOSHORTSTRINGPROC}
Function fpc_ShortStr_To_UnicodeStr (Const S2 : ShortString): UnicodeString; compilerproc;
Function fpc_UnicodeStr_To_AnsiStr (const S2 : UnicodeString): AnsiString; compilerproc;
Function fpc_AnsiStr_To_UnicodeStr (Const S2 : AnsiString): UnicodeString; compilerproc;
Function fpc_UnicodeStr_To_WideStr (const S2 : UnicodeString): WideString; compilerproc;
Function fpc_WideStr_To_UnicodeStr (Const S2 : WideString): UnicodeString; compilerproc;
Procedure fpc_UnicodeStr_Assign (Var S1 : Pointer;S2 : Pointer); compilerproc;
{$ifndef STR_CONCAT_PROCS}
Function fpc_UnicodeStr_Concat (const S1,S2 : UnicodeString) : UnicodeString; compilerproc;
function fpc_UnicodeStr_Concat_multi (const sarr:array of Unicodestring): unicodestring; compilerproc;
{$else STR_CONCAT_PROCS}
Procedure fpc_UnicodeStr_Concat (Var DestS : Unicodestring;const S1,S2 : UnicodeString); compilerproc;
Procedure fpc_UnicodeStr_Concat_multi (Var DestS : Unicodestring;const sarr:array of Unicodestring); compilerproc;
{$endif STR_CONCAT_PROCS}
Function fpc_Char_To_UnicodeStr(const c : Char): UnicodeString; compilerproc;
Function fpc_PChar_To_UnicodeStr(const p : pchar): UnicodeString; compilerproc;
Function fpc_CharArray_To_UnicodeStr(const arr: array of char; zerobased: boolean = true): UnicodeString; compilerproc;
{$ifndef FPC_STRTOCHARARRAYPROC}
function fpc_unicodestr_to_chararray(arraysize: SizeInt; const src: UnicodeString): fpc_big_chararray; compilerproc;
Function fpc_shortstr_to_unicodechararray(arraysize: SizeInt; const src: ShortString): fpc_big_unicodechararray; compilerproc;
Function fpc_ansistr_to_unicodechararray(arraysize: SizeInt; const src: AnsiString): fpc_big_unicodechararray; compilerproc;
Function fpc_unicodestr_to_unicodechararray(arraysize: SizeInt; const src: UnicodeString): fpc_big_unicodechararray; compilerproc;
{$else ndef FPC_STRTOCHARARRAYPROC}
procedure fpc_unicodestr_to_chararray(out res: array of char; const src: UnicodeString); compilerproc;
procedure fpc_shortstr_to_unicodechararray(out res: array of unicodechar; const src: ShortString); compilerproc;
procedure fpc_ansistr_to_unicodechararray(out res: array of unicodechar; const src: AnsiString); compilerproc;
procedure fpc_unicodestr_to_unicodechararray(out res: array of unicodechar; const src: UnicodeString); compilerproc;
{$endif ndef FPC_STRTOCHARARRAYPROC}
{$ifndef FPC_STRTOSHORTSTRINGPROC}
Function fpc_UnicodeCharArray_To_ShortStr(const arr: array of unicodechar; zerobased: boolean = true): shortstring; compilerproc;
{$else FPC_STRTOSHORTSTRINGPROC}
procedure fpc_UnicodeCharArray_To_ShortStr(out res : shortstring;const arr: array of unicodechar; zerobased: boolean = true); compilerproc;
{$endif FPC_STRTOSHORTSTRINGPROC}
Function fpc_UnicodeCharArray_To_AnsiStr(const arr: array of unicodechar; zerobased: boolean = true): AnsiString; compilerproc;
Function fpc_UnicodeCharArray_To_UnicodeStr(const arr: array of unicodechar; zerobased: boolean = true): UnicodeString; compilerproc;
{$ifndef VER2_2}
{$ifndef FPC_STRTOSHORTSTRINGPROC}
Function fpc_WideCharArray_To_ShortStr(const arr: array of widechar; zerobased: boolean = true): shortstring; compilerproc;
{$else FPC_STRTOSHORTSTRINGPROC}
procedure fpc_WideCharArray_To_ShortStr(out res : shortstring;const arr: array of widechar; zerobased: boolean = true); compilerproc;
{$endif FPC_STRTOSHORTSTRINGPROC}
Function fpc_WideCharArray_To_AnsiStr(const arr: array of widechar; zerobased: boolean = true): AnsiString; compilerproc;
Function fpc_WideCharArray_To_WideStr(const arr: array of widechar; zerobased: boolean = true): WideString; compilerproc;
Function fpc_WideCharArray_To_UnicodeStr(const arr: array of widechar; zerobased: boolean = true): UnicodeString; compilerproc;
{$ifndef FPC_STRTOCHARARRAYPROC}
Function fpc_shortstr_to_widechararray(arraysize: SizeInt; const src: ShortString): fpc_big_widechararray; compilerproc;
Function fpc_ansistr_to_widechararray(arraysize: SizeInt; const src: AnsiString): fpc_big_widechararray; compilerproc;
{$else ndef FPC_STRTOCHARARRAYPROC}
procedure fpc_shortstr_to_widechararray(out res: array of widechar; const src: ShortString); compilerproc;
procedure fpc_ansistr_to_widechararray(out res: array of widechar; const src: AnsiString); compilerproc;
procedure fpc_unicodestr_to_widechararray(out res: array of widechar; const src: UnicodeString); compilerproc;
{$endif ndef FPC_STRTOCHARARRAYPROC}
{$endif VER2_2}
Function fpc_UnicodeStr_Compare(const S1,S2 : UnicodeString): SizeInt; compilerproc;
Function fpc_UnicodeStr_Compare_equal(const S1,S2 : UnicodeString): SizeInt; compilerproc;
Procedure fpc_UnicodeStr_CheckZero(p : pointer); compilerproc;
Procedure fpc_UnicodeStr_CheckRange(len,index : SizeInt); compilerproc;
Procedure fpc_UnicodeStr_SetLength (Var S : UnicodeString; l : SizeInt); compilerproc;
Function fpc_unicodestr_Copy (Const S : UnicodeString; Index,Size : SizeInt) : UnicodeString;compilerproc;
function fpc_unicodestr_Unique(Var S : Pointer): Pointer; compilerproc;
Function fpc_Char_To_UChar(const c : Char): UnicodeChar; compilerproc;
Function fpc_UChar_To_Char(const c : UnicodeChar): Char; compilerproc;
Function fpc_UChar_To_UnicodeStr(const c : UnicodeChar): UnicodeString; compilerproc;
Function fpc_WChar_To_UnicodeStr(const c : WideChar): UnicodeString; compilerproc;
Function fpc_UChar_To_AnsiStr(const c : UnicodeChar): AnsiString; compilerproc;
{$ifndef FPC_STRTOSHORTSTRINGPROC} {$ifndef FPC_STRTOSHORTSTRINGPROC}
Function fpc_WChar_To_ShortStr(const c : WideChar): ShortString; compilerproc; Function fpc_WChar_To_ShortStr(const c : WideChar): ShortString; compilerproc;
{$else FPC_STRTOSHORTSTRINGPROC} {$else FPC_STRTOSHORTSTRINGPROC}
procedure fpc_WChar_To_ShortStr(out res : shortstring;const c : WideChar) compilerproc; procedure fpc_WChar_To_ShortStr(out res : shortstring;const c : WideChar) compilerproc;
{$endif FPC_STRTOSHORTSTRINGPROC} {$endif FPC_STRTOSHORTSTRINGPROC}
Function fpc_WChar_To_AnsiStr(const c : WideChar): AnsiString; compilerproc; {$endif FPC_HAS_FEATURE_WIDESTRINGS}
Function fpc_WChar_To_WideStr(const c : WideChar): WideString; compilerproc;
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
Function fpc_PUnicodeChar_To_AnsiStr(const p : punicodechar): ansistring; compilerproc;
{$endif FPC_HAS_FEATURE_ANSISTRINGS}
Function fpc_PUnicodeChar_To_UnicodeStr(const p : punicodechar): unicodestring; compilerproc;
Function fpc_PWideChar_To_UnicodeStr(const p : pwidechar): unicodestring; compilerproc;
{$ifndef FPC_STRTOSHORTSTRINGPROC}
Function fpc_PUnicodeChar_To_ShortStr(const p : punicodechar): shortstring; compilerproc;
{$else FPC_STRTOSHORTSTRINGPROC}
procedure fpc_PUnicodeChar_To_ShortStr(out res : shortstring;const p : punicodechar); compilerproc;
{$endif FPC_STRTOSHORTSTRINGPROC}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{$ifdef FPC_HAS_FEATURE_ANSISTRINGS} {$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
Function fpc_PWideChar_To_AnsiStr(const p : pwidechar): ansistring; compilerproc; Function fpc_PWideChar_To_AnsiStr(const p : pwidechar): ansistring; compilerproc;
{$endif FPC_HAS_FEATURE_ANSISTRINGS} {$endif FPC_HAS_FEATURE_ANSISTRINGS}
Function fpc_PWideChar_To_WideStr(const p : pwidechar): widestring; compilerproc;
{$ifndef FPC_STRTOSHORTSTRINGPROC} {$ifndef FPC_STRTOSHORTSTRINGPROC}
Function fpc_PWideChar_To_ShortStr(const p : pwidechar): shortstring; compilerproc; Function fpc_PWideChar_To_ShortStr(const p : pwidechar): shortstring; compilerproc;
{$else FPC_STRTOSHORTSTRINGPROC} {$else FPC_STRTOSHORTSTRINGPROC}
procedure fpc_PWideChar_To_ShortStr(out res : shortstring;const p : pwidechar); compilerproc; procedure fpc_PWideChar_To_ShortStr(out res : shortstring;const p : pwidechar); compilerproc;
{$endif FPC_STRTOSHORTSTRINGPROC} {$endif FPC_STRTOSHORTSTRINGPROC}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$endif VER2_2}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
Function fpc_Char_To_WChar(const c : Char): WideChar; compilerproc;
Function fpc_WChar_To_Char(const c : WideChar): Char; compilerproc;
{$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$ifdef FPC_HAS_FEATURE_TEXTIO} {$ifdef FPC_HAS_FEATURE_TEXTIO}
{ from text.inc } { from text.inc }
@ -325,7 +466,10 @@ Procedure fpc_Write_Text_ShortStr(Len : Longint;var f : Text;const s : String);
Procedure fpc_Write_Text_Pchar_as_Array(Len : Longint;var f : Text;const s : array of char; zerobased: boolean = true); compilerproc; Procedure fpc_Write_Text_Pchar_as_Array(Len : Longint;var f : Text;const s : array of char; zerobased: boolean = true); compilerproc;
Procedure fpc_Write_Text_PChar_As_Pointer(Len : Longint;var f : Text;p : PChar); compilerproc; Procedure fpc_Write_Text_PChar_As_Pointer(Len : Longint;var f : Text;p : PChar); compilerproc;
Procedure fpc_Write_Text_AnsiStr (Len : Longint; Var f : Text; const S : AnsiString); compilerproc; Procedure fpc_Write_Text_AnsiStr (Len : Longint; Var f : Text; const S : AnsiString); compilerproc;
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
Procedure fpc_Write_Text_WideStr (Len : Longint; Var f : Text; const S : WideString); compilerproc; Procedure fpc_Write_Text_WideStr (Len : Longint; Var f : Text; const S : WideString); compilerproc;
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
Procedure fpc_Write_Text_UnicodeStr (Len : Longint; Var f : Text; const S : WideString); compilerproc;
Procedure fpc_Write_Text_SInt(Len : Longint;var t : Text;l : ValSInt); compilerproc; Procedure fpc_Write_Text_SInt(Len : Longint;var t : Text;l : ValSInt); compilerproc;
Procedure fpc_Write_Text_UInt(Len : Longint;var t : Text;l : ValUInt); compilerproc; Procedure fpc_Write_Text_UInt(Len : Longint;var t : Text;l : ValUInt); compilerproc;
{$ifndef CPU64} {$ifndef CPU64}

View File

@ -40,6 +40,9 @@ Const
tkInt64 = 19; tkInt64 = 19;
tkQWord = 20; tkQWord = 20;
tkDynArray = 21; tkDynArray = 21;
tkInterfaceCorba = 22;
tkProcVar = 23;
tkUString = 24;
type type
@ -130,7 +133,7 @@ end;
Procedure fpc_Initialize (Data,TypeInfo : pointer);[Public,Alias : 'FPC_INITIALIZE']; compilerproc; Procedure fpc_Initialize (Data,TypeInfo : pointer);[Public,Alias : 'FPC_INITIALIZE']; compilerproc;
begin begin
case PByte(TypeInfo)^ of case PByte(TypeInfo)^ of
tkAstring,tkWstring,tkInterface,tkDynArray: tkAstring,tkWstring,tkUString,tkInterface,tkDynArray:
PPchar(Data)^:=Nil; PPchar(Data)^:=Nil;
tkArray: tkArray:
arrayrtti(data,typeinfo,@int_initialize); arrayrtti(data,typeinfo,@int_initialize);
@ -151,11 +154,20 @@ begin
fpc_AnsiStr_Decr_Ref(PPointer(Data)^); fpc_AnsiStr_Decr_Ref(PPointer(Data)^);
PPointer(Data)^:=nil; PPointer(Data)^:=nil;
end; end;
{$ifndef VER2_2}
tkUstring :
begin
fpc_UnicodeStr_Decr_Ref(PPointer(Data)^);
PPointer(Data)^:=nil;
end;
{$endif VER2_2}
{$ifdef WINDOWS}
tkWstring : tkWstring :
begin begin
fpc_WideStr_Decr_Ref(PPointer(Data)^); fpc_WideStr_Decr_Ref(PPointer(Data)^);
PPointer(Data)^:=nil; PPointer(Data)^:=nil;
end; end;
{$endif WINDOWS}
tkArray : tkArray :
arrayrtti(data,typeinfo,@int_finalize); arrayrtti(data,typeinfo,@int_finalize);
tkObject, tkObject,
@ -179,8 +191,14 @@ begin
case PByte(TypeInfo)^ of case PByte(TypeInfo)^ of
tkAstring : tkAstring :
fpc_AnsiStr_Incr_Ref(PPointer(Data)^); fpc_AnsiStr_Incr_Ref(PPointer(Data)^);
{$ifdef WINDOWS}
tkWstring : tkWstring :
fpc_WideStr_Incr_Ref(PPointer(Data)^); fpc_WideStr_Incr_Ref(PPointer(Data)^);
{$endif WINDOWS}
{$ifndef VER2_2}
tkUstring :
fpc_UnicodeStr_Incr_Ref(PPointer(Data)^);
{$endif VER2_2}
tkArray : tkArray :
arrayrtti(data,typeinfo,@int_addref); arrayrtti(data,typeinfo,@int_addref);
tkobject, tkobject,
@ -206,8 +224,14 @@ begin
{ see AddRef for comment about below construct (JM) } { see AddRef for comment about below construct (JM) }
tkAstring: tkAstring:
fpc_AnsiStr_Decr_Ref(PPointer(Data)^); fpc_AnsiStr_Decr_Ref(PPointer(Data)^);
{$ifdef WINDOWS}
tkWstring: tkWstring:
fpc_WideStr_Decr_Ref(PPointer(Data)^); fpc_WideStr_Decr_Ref(PPointer(Data)^);
{$endif WINDOWS}
{$ifndef VER2_2}
tkUString:
fpc_UnicodeStr_Decr_Ref(PPointer(Data)^);
{$endif VER2_2}
tkArray: tkArray:
arrayrtti(data,typeinfo,@fpc_systemDecRef); arrayrtti(data,typeinfo,@fpc_systemDecRef);
tkobject, tkobject,
@ -245,8 +269,14 @@ begin
fpc_AnsiStr_Decr_Ref(PPointer(Dest)^); fpc_AnsiStr_Decr_Ref(PPointer(Dest)^);
PPointer(Dest)^:=PPointer(Src)^; PPointer(Dest)^:=PPointer(Src)^;
end; end;
{$ifdef WINDOWS}
tkWstring: tkWstring:
fpc_WideStr_Assign(PPointer(Dest)^,PPointer(Src)^); fpc_WideStr_Assign(PPointer(Dest)^,PPointer(Src)^);
{$endif WINDOWS}
{$ifndef VER2_2}
tkUstring:
fpc_UnicodeStr_Assign(PPointer(Dest)^,PPointer(Src)^);
{$endif VER2_2}
tkArray: tkArray:
begin begin
Temp:=PByte(TypeInfo); Temp:=PByte(TypeInfo);

View File

@ -331,7 +331,15 @@ function aligntoptr(p : pointer) : pointer;inline;
{$endif FPC_HAS_FEATURE_ANSISTRINGS} {$endif FPC_HAS_FEATURE_ANSISTRINGS}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{ this is for bootstrappung with 2.2.x }
{$ifdef VER2_2}
{$i wustring22.inc}
{$else VER2_2}
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
{$i wstrings.inc} {$i wstrings.inc}
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{$i ustrings.inc}
{$endif VER2_2}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}
{$i aliases.inc} {$i aliases.inc}

View File

@ -345,6 +345,14 @@ Type
PUCS2Char = PWideChar; PUCS2Char = PWideChar;
PWideString = ^WideString; PWideString = ^WideString;
UnicodeChar = type WideChar;
PUnicodeChar = ^UnicodeChar;
{$ifdef VER2_2}
{ this is only to avoid too much ifdefs in the code }
UnicodeString = type WideString;
{$endif VER2_2}
PUnicodeString = ^UnicodeString;
{ Needed for fpc_get_output } { Needed for fpc_get_output }
PText = ^Text; PText = ^Text;
@ -761,7 +769,14 @@ function lowercase(const s : ansistring) : ansistring;
****************************************************************************} ****************************************************************************}
{$ifdef FPC_HAS_FEATURE_WIDESTRINGS} {$ifdef FPC_HAS_FEATURE_WIDESTRINGS}
{$ifdef VER2_2}
{$i wstring22h.inc}
{$else VER2_2}
{$i ustringh.inc}
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
{$i wstringh.inc} {$i wstringh.inc}
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{$endif VER2_2}
{$endif FPC_HAS_FEATURE_WIDESTRINGS} {$endif FPC_HAS_FEATURE_WIDESTRINGS}

View File

@ -617,6 +617,32 @@ begin
end; end;
Procedure fpc_Write_Text_UnicodeStr (Len : Longint; Var f : Text; const S : WideString); iocheck; [Public,alias:'FPC_WRITE_TEXT_UNICODESTR']; compilerproc;
{
Writes a UnicodeString to the Text file T
}
var
SLen : longint;
a: ansistring;
begin
If (pointer(S)=nil) or (InOutRes<>0) then
exit;
case TextRec(f).mode of
fmOutput { fmAppend gets changed to fmOutPut in do_open (JM) }:
begin
SLen:=Length(s);
If Len>SLen Then
fpc_WriteBlanks(f,Len-SLen);
a:=s;
{ length(a) can be > slen, e.g. after utf-16 -> utf-8 }
fpc_WriteBuffer(f,pchar(a)^,length(a));
end;
fmInput: InOutRes:=105
else InOutRes:=103;
end;
end;
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
Procedure fpc_Write_Text_WideStr (Len : Longint; Var f : Text; const S : WideString); iocheck; [Public,alias:'FPC_WRITE_TEXT_WIDESTR']; compilerproc; Procedure fpc_Write_Text_WideStr (Len : Longint; Var f : Text; const S : WideString); iocheck; [Public,alias:'FPC_WRITE_TEXT_WIDESTR']; compilerproc;
{ {
Writes a WideString to the Text file T Writes a WideString to the Text file T
@ -641,7 +667,7 @@ begin
else InOutRes:=103; else InOutRes:=103;
end; end;
end; end;
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
Procedure fpc_Write_Text_SInt(Len : Longint;var t : Text;l : ValSInt); iocheck; [Public,Alias:'FPC_WRITE_TEXT_SINT']; compilerproc; Procedure fpc_Write_Text_SInt(Len : Longint;var t : Text;l : ValSInt); iocheck; [Public,Alias:'FPC_WRITE_TEXT_SINT']; compilerproc;
var var

119
rtl/inc/ustringh.inc Normal file
View File

@ -0,0 +1,119 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2005 by Florian Klaempfl,
member of the Free Pascal development team.
This file implements support routines for UnicodeStrings with FPC
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
Procedure UniqueString (Var S : UnicodeString);external name 'FPC_UNICODESTR_UNIQUE';
Function Pos (Const Substr : UnicodeString; Const Source : UnicodeString) : SizeInt;
Function Pos (c : Char; Const s : UnicodeString) : SizeInt;
Function Pos (c : UnicodeChar; Const s : UnicodeString) : SizeInt;
Function Pos (c : AnsiString; Const s : UnicodeString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (c : UnicodeString; Const s : AnsiString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (c : ShortString; Const s : UnicodeString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function UpCase(const s : UnicodeString) : UnicodeString;
Function UpCase(c:UnicodeChar):UnicodeChar;
Procedure Insert (Const Source : UnicodeString; Var S : UnicodeString; Index : SizeInt);
Procedure Delete (Var S : UnicodeString; Index,Size: SizeInt);
Procedure SetString (Out S : UnicodeString; Buf : PUnicodeChar; Len : SizeInt);
Procedure SetString (Out S : UnicodeString; Buf : PChar; Len : SizeInt);
function WideCharToString(S : PWideChar) : AnsiString;
function StringToWideChar(const Src : AnsiString;Dest : PWideChar;DestSize : SizeInt) : PWideChar;
function WideCharLenToString(S : PWideChar;Len : SizeInt) : AnsiString;
procedure WideCharLenToStrVar(Src : PWideChar;Len : SizeInt;out Dest : AnsiString);
procedure WideCharToStrVar(S : PWideChar;out Dest : AnsiString);
function UnicodeCharToString(S : PUnicodeChar) : AnsiString;
function StringToUnicodeChar(const Src : AnsiString;Dest : PUnicodeChar;DestSize : SizeInt) : PUnicodeChar;
function UnicodeCharLenToString(S : PUnicodeChar;Len : SizeInt) : AnsiString;
procedure UnicodeCharLenToStrVar(Src : PUnicodeChar;Len : SizeInt;out Dest : AnsiString);
procedure UnicodeCharToStrVar(S : PUnicodeChar;out Dest : AnsiString);
procedure DefaultUnicode2AnsiMove(source:punicodechar;var dest:ansistring;len:SizeInt);
procedure DefaultAnsi2UnicodeMove(source:pchar;var dest:unicodestring;len:SizeInt);
Type
{ hooks for internationalization
please add new procedures at the end, it makes it easier to detect new procedures }
TUnicodeStringManager = record
Wide2AnsiMoveProc : procedure(source:pwidechar;var dest:ansistring;len:SizeInt);
Ansi2WideMoveProc : procedure(source:pchar;var dest:widestring;len:SizeInt);
// UpperUTF8 : procedure(p:PUTF8String);
UpperWideStringProc : function(const S: WideString): WideString;
// UpperUCS4 : procedure(p:PUCS4Char);
// LowerUTF8 : procedure(p:PUTF8String);
LowerWideStringProc : function(const S: WideString): WideString;
// LowerUCS4 : procedure(p:PUCS4Char);
{
CompUTF8 : function(p1,p2:PUTF8String) : shortint;
CompUCS2 : function(p1,p2:PUCS2Char) : shortint;
CompUCS4 : function(p1,p2:PUC42Char) : shortint;
}
CompareWideStringProc : function(const s1, s2 : WideString) : PtrInt;
CompareTextWideStringProc : function(const s1, s2 : WideString): PtrInt;
CharLengthPCharProc : function(const Str: PChar): PtrInt;
UpperAnsiStringProc : function(const s : ansistring) : ansistring;
LowerAnsiStringProc : function(const s : ansistring) : ansistring;
CompareStrAnsiStringProc : function(const S1, S2: ansistring): PtrInt;
CompareTextAnsiStringProc : function(const S1, S2: ansistring): PtrInt;
StrCompAnsiStringProc : function(S1, S2: PChar): PtrInt;
StrICompAnsiStringProc : function(S1, S2: PChar): PtrInt;
StrLCompAnsiStringProc : function(S1, S2: PChar; MaxLen: PtrUInt): PtrInt;
StrLICompAnsiStringProc : function(S1, S2: PChar; MaxLen: PtrUInt): PtrInt;
StrLowerAnsiStringProc : function(Str: PChar): PChar;
StrUpperAnsiStringProc : function(Str: PChar): PChar;
ThreadInitProc : procedure;
ThreadFiniProc : procedure;
{ this is only different on windows }
Unicode2AnsiMoveProc : procedure(source:punicodechar;var dest:ansistring;len:SizeInt);
Ansi2UnicodeMoveProc : procedure(source:pchar;var dest:unicodestring;len:SizeInt);
UpperUnicodeStringProc : function(const S: UnicodeString): UnicodeString;
LowerUnicodeStringProc : function(const S: UnicodeString): UnicodeString;
CompareUnicodeStringProc : function(const s1, s2 : UnicodeString) : PtrInt;
CompareTextUnicodeStringProc : function(const s1, s2 : UnicodeString): PtrInt;
end;
var
widestringmanager : TUnicodeStringManager;
function UnicodeToUtf8(Dest: PChar; Source: PUnicodeChar; MaxBytes: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PUnicodeChar; SourceChars: SizeUInt): SizeUInt;
function Utf8ToUnicode(Dest: PUnicodeChar; Source: PChar; MaxChars: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
function Utf8ToUnicode(Dest: PUnicodeChar; MaxDestChars: SizeUInt; Source: PChar; SourceBytes: SizeUInt): SizeUInt;
function UTF8Encode(const s : Ansistring) : UTF8String; inline;
function UTF8Encode(const s : UnicodeString) : UTF8String;
function UTF8Decode(const s : UTF8String): UnicodeString;
function AnsiToUtf8(const s : ansistring): UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
function Utf8ToAnsi(const s : UTF8String) : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
function UnicodeStringToUCS4String(const s : UnicodeString) : UCS4String;
function UCS4StringToUnicodeString(const s : UCS4String) : UnicodeString;
function WideStringToUCS4String(const s : WideString) : UCS4String;
function UCS4StringToWideString(const s : UCS4String) : WideString;
Procedure GetWideStringManager (Var Manager : TUnicodeStringManager);
Procedure SetWideStringManager (Const New : TUnicodeStringManager);
Procedure SetWideStringManager (Const New : TUnicodeStringManager; Var Old: TUnicodeStringManager);
Procedure GetUnicodeStringManager (Var Manager : TUnicodeStringManager);
Procedure SetUnicodeStringManager (Const New : TUnicodeStringManager);
Procedure SetUnicodeStringManager (Const New : TUnicodeStringManager; Var Old: TUnicodeStringManager);

2325
rtl/inc/ustrings.inc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -225,25 +225,30 @@ end;
{ Strings } { Strings }
operator :=(const source : shortstring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : shortstring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
begin begin
VariantManager.VarFromPStr(Dest,Source); VariantManager.VarFromPStr(Dest,Source);
end; end;
operator :=(const source : ansistring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : ansistring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
begin begin
VariantManager.VarFromLStr(Dest,Source); VariantManager.VarFromLStr(Dest,Source);
end; end;
operator :=(const source : widestring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : widestring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
begin begin
VariantManager.VarFromWStr(Dest,Source); VariantManager.VarFromWStr(Dest,Source);
end; end;
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
operator :=(const source : UnicodeString) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
begin
VariantManager.VarFromWStr(Dest,Source);
end;
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{ Floats } { Floats }
{$ifdef SUPPORT_SINGLE} {$ifdef SUPPORT_SINGLE}
@ -412,23 +417,34 @@ end;
{ Strings } { Strings }
operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
begin begin
VariantManager.VarToPStr(Dest,Source); VariantManager.VarToPStr(Dest,Source);
end; end;
operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
begin begin
VariantManager.vartolstr(dest,source); VariantManager.vartolstr(dest,source);
end; end;
operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
begin begin
variantmanager.vartowstr(dest,source); variantmanager.vartowstr(dest,source);
end; end;
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
operator :=(const source : variant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif}
var
res : WideString;
begin
variantmanager.vartowstr(res,source);
dest:=res;
end;
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{ Floats } { Floats }
{$ifdef SUPPORT_SINGLE} {$ifdef SUPPORT_SINGLE}
@ -763,6 +779,16 @@ operator :=(const source : olevariant) dest : widestring;{$ifdef SYSTEMINLINE}in
end; end;
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
operator :=(const source : olevariant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif}
var
res : WideString;
begin
variantmanager.vartowstr(res,variant(tvardata(source)));
dest:=res;
end;
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{ Floats } { Floats }
{$ifdef SUPPORT_SINGLE} {$ifdef SUPPORT_SINGLE}
operator :=(const source : olevariant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : olevariant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif}
@ -931,6 +957,14 @@ operator :=(const source : widestring) dest : olevariant;{$ifdef SYSTEMINLINE}in
end; end;
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
operator :=(const source : UnicodeString) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
begin
variantmanager.varfromwstr(variant(tvardata(dest)),source);
end;
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{ Floats } { Floats }
{$ifdef SUPPORT_SINGLE} {$ifdef SUPPORT_SINGLE}
operator :=(const source : single) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : single) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
@ -1050,6 +1084,14 @@ Function Pos (w : WideString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}
end; end;
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
Function Pos (w : UnicodeString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
begin
Result:=Pos(w,UnicodeString(v));
end;
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
Function Pos (v : Variant; Const c : Char) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (v : Variant; Const c : Char) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
begin begin
Result:=Pos(ShortString(v),c); Result:=Pos(ShortString(v),c);
@ -1074,6 +1116,14 @@ Function Pos (v : Variant; Const w : WideString) : SizeInt;{$ifdef SYSTEMINLINE}
end; end;
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
Function Pos (v : Variant; Const w : UnicodeString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
begin
Result:=Pos(UnicodeString(v),w);
end;
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
Function Pos (v1 : Variant; Const v2 : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (v1 : Variant; Const v2 : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
begin begin
Result:=Pos(WideString(v1),WideString(v2)); Result:=Pos(WideString(v1),WideString(v2));

View File

@ -243,6 +243,9 @@ operator :=(const source : widechar) dest : variant;{$ifdef SYSTEMINLINE}inline;
operator :=(const source : shortstring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : shortstring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : ansistring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : ansistring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : widestring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : widestring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
operator :=(const source : UnicodeString) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{ Floats } { Floats }
{$ifdef SUPPORT_SINGLE} {$ifdef SUPPORT_SINGLE}
@ -297,6 +300,9 @@ operator :=(const source : variant) dest : widechar;{$ifdef SYSTEMINLINE}inline;
operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
operator :=(const source : variant) dest : unicodestring;{$ifdef SYSTEMINLINE}inline;{$endif}
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{ Floats } { Floats }
{$ifdef SUPPORT_SINGLE} {$ifdef SUPPORT_SINGLE}
@ -388,6 +394,9 @@ operator :=(const source : olevariant) dest : widechar;{$ifdef SYSTEMINLINE}inli
operator :=(const source : olevariant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : olevariant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : olevariant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : olevariant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : olevariant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : olevariant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
operator :=(const source : olevariant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif}
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{ Floats } { Floats }
{$ifdef SUPPORT_SINGLE} {$ifdef SUPPORT_SINGLE}
@ -442,6 +451,9 @@ operator :=(const source : widechar) dest : olevariant;{$ifdef SYSTEMINLINE}inli
operator :=(const source : shortstring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : shortstring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : ansistring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : ansistring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
operator :=(const source : widestring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : widestring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
operator :=(const source : UnicodeString) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
{ Floats } { Floats }
{$ifdef SUPPORT_SINGLE} {$ifdef SUPPORT_SINGLE}
@ -474,10 +486,16 @@ Function Pos (c : Char; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline
Function Pos (s : ShortString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (s : ShortString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (a : AnsiString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (a : AnsiString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (w : WideString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (w : WideString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
Function Pos (w : UnicodeString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
Function Pos (v : Variant; Const c : Char) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (v : Variant; Const c : Char) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (v : Variant; Const s : ShortString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (v : Variant; Const s : ShortString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (v : Variant; Const a : AnsiString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (v : Variant; Const a : AnsiString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (v : Variant; Const w : WideString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (v : Variant; Const w : WideString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
Function Pos (v : Variant; Const w : UnicodeString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
{$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
Function Pos (v1 : Variant; Const v2 : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} Function Pos (v1 : Variant; Const v2 : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
{********************************************************************** {**********************************************************************

108
rtl/inc/wstring22h.inc Normal file
View File

@ -0,0 +1,108 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2005 by Florian Klaempfl,
member of the Free Pascal development team.
This file implements support routines for WideStrings with FPC 2.2
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{ this file can be removed when the 2.2.x series is outdated }
Procedure UniqueString (Var S : WideString);external name 'FPC_WIDESTR_UNIQUE';
Function Pos (Const Substr : WideString; Const Source : WideString) : SizeInt;
Function Pos (c : Char; Const s : WideString) : SizeInt;
Function Pos (c : WideChar; Const s : WideString) : SizeInt;
Function Pos (c : WideChar; Const s : AnsiString) : SizeInt;
Function Pos (c : AnsiString; Const s : WideString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (c : WideString; Const s : AnsiString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function Pos (c : ShortString; Const s : WideString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
Function UpCase(const s : WideString) : WideString;
Procedure Insert (Const Source : WideString; Var S : WideString; Index : SizeInt);
Procedure Delete (Var S : WideString; Index,Size: SizeInt);
Procedure SetString (Out S : WideString; Buf : PWideChar; Len : SizeInt);
Procedure SetString (Out S : WideString; Buf : PChar; Len : SizeInt);
function WideCharToString(S : PWideChar) : AnsiString;
function StringToWideChar(const Src : AnsiString;Dest : PWideChar;DestSize : SizeInt) : PWideChar;
function WideCharLenToString(S : PWideChar;Len : SizeInt) : AnsiString;
procedure WideCharLenToStrVar(Src : PWideChar;Len : SizeInt;out Dest : AnsiString);
procedure WideCharToStrVar(S : PWideChar;out Dest : AnsiString);
procedure DefaultWide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt);
procedure DefaultAnsi2WideMove(source:pchar;var dest:widestring;len:SizeInt);
Type
{ hooks for internationalization
please add new procedures at the end, it makes it easier to detect new procedures }
TWideStringManager = record
Wide2AnsiMoveProc : procedure(source:pwidechar;var dest:ansistring;len:SizeInt);
Ansi2WideMoveProc : procedure(source:pchar;var dest:widestring;len:SizeInt);
// UpperUTF8 : procedure(p:PUTF8String);
UpperWideStringProc : function(const S: WideString): WideString;
// UpperUCS4 : procedure(p:PUCS4Char);
// LowerUTF8 : procedure(p:PUTF8String);
LowerWideStringProc : function(const S: WideString): WideString;
// LowerUCS4 : procedure(p:PUCS4Char);
{
CompUTF8 : function(p1,p2:PUTF8String) : shortint;
CompUCS2 : function(p1,p2:PUCS2Char) : shortint;
CompUCS4 : function(p1,p2:PUC42Char) : shortint;
}
CompareWideStringProc : function(const s1, s2 : WideString) : PtrInt;
CompareTextWideStringProc : function(const s1, s2 : WideString): PtrInt;
CharLengthPCharProc : function(const Str: PChar): PtrInt;
UpperAnsiStringProc : function(const s : ansistring) : ansistring;
LowerAnsiStringProc : function(const s : ansistring) : ansistring;
CompareStrAnsiStringProc : function(const S1, S2: ansistring): PtrInt;
CompareTextAnsiStringProc : function(const S1, S2: ansistring): PtrInt;
StrCompAnsiStringProc : function(S1, S2: PChar): PtrInt;
StrICompAnsiStringProc : function(S1, S2: PChar): PtrInt;
StrLCompAnsiStringProc : function(S1, S2: PChar; MaxLen: PtrUInt): PtrInt;
StrLICompAnsiStringProc : function(S1, S2: PChar; MaxLen: PtrUInt): PtrInt;
StrLowerAnsiStringProc : function(Str: PChar): PChar;
StrUpperAnsiStringProc : function(Str: PChar): PChar;
ThreadInitProc : procedure;
ThreadFiniProc : procedure;
end;
TUnicodeStringManager = TWideStringManager;
function UnicodeToUtf8(Dest: PChar; Source: PWideChar; MaxBytes: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PWideChar; SourceChars: SizeUInt): SizeUInt;
function Utf8ToUnicode(Dest: PWideChar; Source: PChar; MaxChars: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: SizeUInt; Source: PChar; SourceBytes: SizeUInt): SizeUInt;
function UTF8Encode(const s : WideString) : UTF8String;
function UTF8Decode(const s : UTF8String): WideString;
function AnsiToUtf8(const s : ansistring): UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
function Utf8ToAnsi(const s : UTF8String) : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
function WideStringToUCS4String(const s : WideString) : UCS4String;
function UCS4StringToWideString(const s : UCS4String) : WideString;
{$ifdef MSWINDOWS}
const
winwidestringalloc : boolean = true;
{$endif MSWINDOWS}
var
widestringmanager : TWideStringManager;
Procedure GetWideStringManager (Var Manager : TWideStringManager);
Procedure SetWideStringManager (Const New : TWideStringManager);
Procedure SetWideStringManager (Const New : TWideStringManager; Var Old: TWideStringManager);
Procedure GetUnicodeStringManager (Var Manager : TUnicodeStringManager);
Procedure SetUnicodeStringManager (Const New : TUnicodeStringManager);
Procedure SetUnicodeStringManager (Const New : TUnicodeStringManager; Var Old: TUnicodeStringManager);

View File

@ -31,73 +31,20 @@ Procedure Delete (Var S : WideString; Index,Size: SizeInt);
Procedure SetString (Out S : WideString; Buf : PWideChar; Len : SizeInt); Procedure SetString (Out S : WideString; Buf : PWideChar; Len : SizeInt);
Procedure SetString (Out S : WideString; Buf : PChar; Len : SizeInt); Procedure SetString (Out S : WideString; Buf : PChar; Len : SizeInt);
function WideCharToString(S : PWideChar) : AnsiString;
function StringToWideChar(const Src : AnsiString;Dest : PWideChar;DestSize : SizeInt) : PWideChar;
function WideCharLenToString(S : PWideChar;Len : SizeInt) : AnsiString;
procedure WideCharLenToStrVar(Src : PWideChar;Len : SizeInt;out Dest : AnsiString);
procedure WideCharToStrVar(S : PWideChar;out Dest : AnsiString);
procedure DefaultWide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); procedure DefaultWide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt);
procedure DefaultAnsi2WideMove(source:pchar;var dest:widestring;len:SizeInt); procedure DefaultAnsi2WideMove(source:pchar;var dest:widestring;len:SizeInt);
Type type
{ hooks for internationalization TWideStringManager = TUnicodeStringManager;
please add new procedures at the end, it makes it easier to detect new procedures }
TWideStringManager = record
Wide2AnsiMoveProc : procedure(source:pwidechar;var dest:ansistring;len:SizeInt);
Ansi2WideMoveProc : procedure(source:pchar;var dest:widestring;len:SizeInt);
// UpperUTF8 : procedure(p:PUTF8String);
UpperWideStringProc : function(const S: WideString): WideString;
// UpperUCS4 : procedure(p:PUCS4Char);
// LowerUTF8 : procedure(p:PUTF8String);
LowerWideStringProc : function(const S: WideString): WideString;
// LowerUCS4 : procedure(p:PUCS4Char);
{
CompUTF8 : function(p1,p2:PUTF8String) : shortint;
CompUCS2 : function(p1,p2:PUCS2Char) : shortint;
CompUCS4 : function(p1,p2:PUC42Char) : shortint;
}
CompareWideStringProc : function(const s1, s2 : WideString) : PtrInt;
CompareTextWideStringProc : function(const s1, s2 : WideString): PtrInt;
CharLengthPCharProc : function(const Str: PChar): PtrInt;
UpperAnsiStringProc : function(const s : ansistring) : ansistring;
LowerAnsiStringProc : function(const s : ansistring) : ansistring;
CompareStrAnsiStringProc : function(const S1, S2: ansistring): PtrInt;
CompareTextAnsiStringProc : function(const S1, S2: ansistring): PtrInt;
StrCompAnsiStringProc : function(S1, S2: PChar): PtrInt;
StrICompAnsiStringProc : function(S1, S2: PChar): PtrInt;
StrLCompAnsiStringProc : function(S1, S2: PChar; MaxLen: PtrUInt): PtrInt;
StrLICompAnsiStringProc : function(S1, S2: PChar; MaxLen: PtrUInt): PtrInt;
StrLowerAnsiStringProc : function(Str: PChar): PChar;
StrUpperAnsiStringProc : function(Str: PChar): PChar;
ThreadInitProc : procedure;
ThreadFiniProc : procedure;
end;
function UnicodeToUtf8(Dest: PChar; Source: PWideChar; MaxBytes: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} function UnicodeToUtf8(Dest: PChar; Source: PWideChar; MaxBytes: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PWideChar; SourceChars: SizeUInt): SizeUInt; function UnicodeToUtf8(Dest: PChar; MaxDestBytes: SizeUInt; Source: PWideChar; SourceChars: SizeUInt): SizeUInt;
function Utf8ToUnicode(Dest: PWideChar; Source: PChar; MaxChars: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif} function Utf8ToUnicode(Dest: PWideChar; Source: PChar; MaxChars: SizeInt): SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: SizeUInt; Source: PChar; SourceBytes: SizeUInt): SizeUInt; function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: SizeUInt; Source: PChar; SourceBytes: SizeUInt): SizeUInt;
function UTF8Encode(const s : WideString) : UTF8String; function UTF8Encode(const s : WideString) : UTF8String;
function UTF8Decode(const s : UTF8String): WideString;
function AnsiToUtf8(const s : ansistring): UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
function Utf8ToAnsi(const s : UTF8String) : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
function WideStringToUCS4String(const s : WideString) : UCS4String;
function UCS4StringToWideString(const s : UCS4String) : WideString;
{$ifdef MSWINDOWS} {$ifdef MSWINDOWS}
const const
winwidestringalloc : boolean = true; winwidestringalloc : boolean = true;
{$endif MSWINDOWS} {$endif MSWINDOWS}
var
widestringmanager : TWideStringManager;
Procedure GetWideStringManager (Var Manager : TWideStringManager);
Procedure SetWideStringManager (Const New : TWideStringManager);
Procedure SetWideStringManager (Const New : TWideStringManager; Var Old: TWideStringManager);

File diff suppressed because it is too large Load Diff

2021
rtl/inc/wustring22.inc Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

64
rtl/linux/buildrtl.lpi Normal file
View File

@ -0,0 +1,64 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<PathDelim Value="/"/>
<Version Value="6"/>
<General>
<Flags>
<MainUnitHasUsesSectionForAllUnits Value="False"/>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<Runnable Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<IconPath Value="./"/>
<TargetFileExt Value=".exe"/>
<Title Value="buildrtl"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<Units Count="1">
<Unit0>
<Filename Value="buildrtl.pp"/>
<IsPartOfProject Value="True"/>
<UnitName Value="buildrtl"/>
</Unit0>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<SearchPaths>
<IncludeFiles Value="../inc/;../$(TargetCPU)/;../unix/;../objpas/classes/;../objpas/sysutils/;../objpas/"/>
<OtherUnitFiles Value="../objpas/;../objpas/classes/;../objpas/sysutils/;../inc/;../unix/;../$(TargetCPU)/"/>
<UnitOutputDirectory Value="../units/$(TargetCPU)-linux"/>
</SearchPaths>
<Parsing>
<Style Value="2"/>
</Parsing>
<Other>
<Verbosity>
<ShowNotes Value="False"/>
<ShowHints Value="False"/>
</Verbosity>
<CompilerPath Value="$(CompPath)"/>
<ExecuteBefore>
<Command Value="cmd.exe /c &quot;if not exist ../units/$(TargetCPU)-linux mkdir ../units/$(TargetCPU)-linux&quot;"/>
<ShowAllMessages Value="True"/>
</ExecuteBefore>
</Other>
</CompilerOptions>
</CONFIG>

20
rtl/linux/buildrtl.pp Normal file
View File

@ -0,0 +1,20 @@
{ This unit is only used to edit the rtl with lazarus }
unit buildrtl;
interface
uses
system, unixtype, ctypes, baseunix, strings, objpas,b macpas, syscall, unixutil,
fpintres, heaptrc, lineinfo, lnfodwrf,
termio, unix, linux, initc, cmem, mmx,
crt, printer, linuxvcs,
sysutils, typinfo, math, matrix, varutils,
charset, ucomplex, getopts,
errors, sockets, gpm, ipc, serial, terminfo, dl, dynlibs,
video, mouse, keyboard, variants, types, dateutils, sysconst, fmtbcd,
cthreads, classes, fgl, convutils, stdconvs, strutils, rtlconsts, dos, objects, cwstring, fpcylix, clocale,
exeinfo;
implementation
end.

View File

@ -329,5 +329,9 @@ begin
{ threading } { threading }
InitSystemThreads; InitSystemThreads;
initvariantmanager; initvariantmanager;
{$ifdef VER2_2}
initwidestringmanager; initwidestringmanager;
{$else VER2_2}
initunicodestringmanager;
{$endif VER2_2}
end. end.

View File

@ -897,13 +897,16 @@ procedure ObjectBinaryToText(Input, Output: TStream);
end; end;
procedure OutString(s: String); procedure OutString(s: String);
begin begin
OutChars(Pointer(S),PChar(S)+Length(S),@CharToOrd); OutChars(Pointer(S),PChar(S)+Length(S),@CharToOrd);
end; end;
procedure OutWString(W: WideString); procedure OutWString(W: WideString);
begin
OutChars(Pointer(W),pwidechar(W)+Length(W),@WideCharToOrd);
end;
procedure OutUString(W: UnicodeString);
begin begin
OutChars(Pointer(W),pwidechar(W)+Length(W),@WideCharToOrd); OutChars(Pointer(W),pwidechar(W)+Length(W),@WideCharToOrd);
end; end;
@ -1047,6 +1050,25 @@ procedure ObjectBinaryToText(Input, Output: TStream);
end; end;
end; end;
function ReadUStr: UnicodeString;
var
len: DWord;
{$IFDEF ENDIAN_BIG}
i : integer;
{$ENDIF}
begin
len := ReadDWord;
SetLength(Result, len);
if (len > 0) then
begin
Input.ReadBuffer(Pointer(@Result[1])^, len*2);
{$IFDEF ENDIAN_BIG}
for i:=1 to len do
Result[i]:=widechar(SwapEndian(word(Result[i])));
{$ENDIF}
end;
end;
procedure ReadPropList(indent: String); procedure ReadPropList(indent: String);
procedure ProcessValue(ValueType: TValueType; Indent: String); procedure ProcessValue(ValueType: TValueType; Indent: String);
@ -1138,6 +1160,11 @@ procedure ObjectBinaryToText(Input, Output: TStream);
OutWString(ReadWStr); OutWString(ReadWStr);
OutLn(''); OutLn('');
end; end;
vaUString:
begin
OutWString(ReadWStr);
OutLn('');
end;
vaNil: vaNil:
OutLn('nil'); OutLn('nil');
vaCollection: begin vaCollection: begin

View File

@ -901,7 +901,8 @@ type
TValueType = (vaNull, vaList, vaInt8, vaInt16, vaInt32, vaExtended, TValueType = (vaNull, vaList, vaInt8, vaInt16, vaInt32, vaExtended,
vaString, vaIdent, vaFalse, vaTrue, vaBinary, vaSet, vaLString, vaString, vaIdent, vaFalse, vaTrue, vaBinary, vaSet, vaLString,
vaNil, vaCollection, vaSingle, vaCurrency, vaDate, vaWString, vaInt64, vaUTF8String); vaNil, vaCollection, vaSingle, vaCurrency, vaDate, vaWString, vaInt64,
vaUTF8String, vaUString);
TFilerFlag = (ffInherited, ffChildPos, ffInline); TFilerFlag = (ffInherited, ffChildPos, ffInline);
TFilerFlags = set of TFilerFlag; TFilerFlags = set of TFilerFlag;
@ -967,6 +968,7 @@ type
function ReadStr: String; virtual; abstract; function ReadStr: String; virtual; abstract;
function ReadString(StringType: TValueType): String; virtual; abstract; function ReadString(StringType: TValueType): String; virtual; abstract;
function ReadWideString: WideString;virtual;abstract; function ReadWideString: WideString;virtual;abstract;
function ReadUnicodeString: UnicodeString;virtual;abstract;
procedure SkipComponent(SkipComponentInfos: Boolean); virtual; abstract; procedure SkipComponent(SkipComponentInfos: Boolean); virtual; abstract;
procedure SkipValue; virtual; abstract; procedure SkipValue; virtual; abstract;
end; end;
@ -1018,6 +1020,7 @@ type
function ReadStr: String; override; function ReadStr: String; override;
function ReadString(StringType: TValueType): String; override; function ReadString(StringType: TValueType): String; override;
function ReadWideString: WideString;override; function ReadWideString: WideString;override;
function ReadUnicodeString: UnicodeString;override;
procedure SkipComponent(SkipComponentInfos: Boolean); override; procedure SkipComponent(SkipComponentInfos: Boolean); override;
procedure SkipValue; override; procedure SkipValue; override;
end; end;
@ -1103,6 +1106,7 @@ type
function ReadBoolean: Boolean; function ReadBoolean: Boolean;
function ReadChar: Char; function ReadChar: Char;
function ReadWideChar: WideChar; function ReadWideChar: WideChar;
function ReadUnicodeChar: UnicodeChar;
procedure ReadCollection(Collection: TCollection); procedure ReadCollection(Collection: TCollection);
function ReadComponent(Component: TComponent): TComponent; function ReadComponent(Component: TComponent): TComponent;
procedure ReadComponents(AOwner, AParent: TComponent; procedure ReadComponents(AOwner, AParent: TComponent;
@ -1121,6 +1125,7 @@ type
function ReadRootComponent(ARoot: TComponent): TComponent; function ReadRootComponent(ARoot: TComponent): TComponent;
function ReadString: string; function ReadString: string;
function ReadWideString: WideString; function ReadWideString: WideString;
function ReadUnicodeString: UnicodeString;
function ReadValue: TValueType; function ReadValue: TValueType;
procedure CopyValue(Writer: TWriter); procedure CopyValue(Writer: TWriter);
property Driver: TAbstractObjectReader read FDriver; property Driver: TAbstractObjectReader read FDriver;
@ -1172,6 +1177,7 @@ type
procedure WriteSet(Value: LongInt; SetType: Pointer); virtual; abstract; procedure WriteSet(Value: LongInt; SetType: Pointer); virtual; abstract;
procedure WriteString(const Value: String); virtual; abstract; procedure WriteString(const Value: String); virtual; abstract;
procedure WriteWideString(const Value: WideString);virtual;abstract; procedure WriteWideString(const Value: WideString);virtual;abstract;
procedure WriteUnicodeString(const Value: UnicodeString);virtual;abstract;
end; end;
{ TBinaryObjectWriter } { TBinaryObjectWriter }
@ -1222,6 +1228,7 @@ type
procedure WriteSet(Value: LongInt; SetType: Pointer); override; procedure WriteSet(Value: LongInt; SetType: Pointer); override;
procedure WriteString(const Value: String); override; procedure WriteString(const Value: String); override;
procedure WriteWideString(const Value: WideString); override; procedure WriteWideString(const Value: WideString); override;
procedure WriteUnicodeString(const Value: UnicodeString); override;
end; end;
TTextObjectWriter = class(TAbstractObjectWriter) TTextObjectWriter = class(TAbstractObjectWriter)
@ -1291,6 +1298,7 @@ type
procedure WriteRootComponent(ARoot: TComponent); procedure WriteRootComponent(ARoot: TComponent);
procedure WriteString(const Value: string); procedure WriteString(const Value: string);
procedure WriteWideString(const Value: WideString); procedure WriteWideString(const Value: WideString);
procedure WriteUnicodeString(const Value: UnicodeString);
property RootAncestor: TComponent read FRootAncestor write FRootAncestor; property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
property OnFindAncestor: TFindAncestorEvent read FOnFindAncestor write FOnFindAncestor; property OnFindAncestor: TFindAncestorEvent read FOnFindAncestor write FOnFindAncestor;
property OnWriteMethodProperty: TWriteMethodPropertyEvent read FOnWriteMethodProperty write FOnWriteMethodProperty; property OnWriteMethodProperty: TWriteMethodPropertyEvent read FOnWriteMethodProperty write FOnWriteMethodProperty;

View File

@ -339,6 +339,25 @@ begin
end; end;
end; end;
function TBinaryObjectReader.ReadUnicodeString: UnicodeString;
var
len: DWord;
{$IFDEF ENDIAN_BIG}
i : integer;
{$ENDIF}
begin
len := ReadDWord;
SetLength(Result, len);
if (len > 0) then
begin
Read(Pointer(@Result[1])^, len*2);
{$IFDEF ENDIAN_BIG}
for i:=1 to len do
Result[i]:=UnicodeChar(SwapEndian(word(Result[i])));
{$ENDIF}
end;
end;
procedure TBinaryObjectReader.SkipComponent(SkipComponentInfos: Boolean); procedure TBinaryObjectReader.SkipComponent(SkipComponentInfos: Boolean);
var var
Flags: TFilerFlags; Flags: TFilerFlags;
@ -409,6 +428,11 @@ begin
Count:=LongInt(ReadDWord); Count:=LongInt(ReadDWord);
SkipBytes(Count*sizeof(widechar)); SkipBytes(Count*sizeof(widechar));
end; end;
vaUString:
begin
Count:=LongInt(ReadDWord);
SkipBytes(Count*sizeof(widechar));
end;
vaSet: vaSet:
SkipSetBody; SkipSetBody;
vaCollection: vaCollection:
@ -749,6 +773,19 @@ begin
raise EReadError.Create(SInvalidPropertyValue); raise EReadError.Create(SInvalidPropertyValue);
end; end;
function TReader.ReadUnicodeChar: UnicodeChar;
var
U: UnicodeString;
begin
U := ReadUnicodeString;
if Length(U) = 1 then
Result := U[1]
else
raise EReadError.Create(SInvalidPropertyValue);
end;
procedure TReader.ReadCollection(Collection: TCollection); procedure TReader.ReadCollection(Collection: TCollection);
var var
Item: TCollectionItem; Item: TCollectionItem;
@ -1172,7 +1209,7 @@ begin
SetOrdProp(Instance, PropInfo, Ord(ReadBoolean)); SetOrdProp(Instance, PropInfo, Ord(ReadBoolean));
tkChar: tkChar:
SetOrdProp(Instance, PropInfo, Ord(ReadChar)); SetOrdProp(Instance, PropInfo, Ord(ReadChar));
tkWChar: tkWChar,tkUChar:
SetOrdProp(Instance, PropInfo, Ord(ReadWideChar)); SetOrdProp(Instance, PropInfo, Ord(ReadWideChar));
tkEnumeration: tkEnumeration:
begin begin
@ -1217,7 +1254,9 @@ begin
FOnReadStringProperty(Self,Instance,PropInfo,TmpStr); FOnReadStringProperty(Self,Instance,PropInfo,TmpStr);
SetStrProp(Instance, PropInfo, TmpStr); SetStrProp(Instance, PropInfo, TmpStr);
end; end;
tkWstring: tkUstring:
SetUnicodeStrProp(Instance,PropInfo,ReadUnicodeString);
tkWString:
SetWideStrProp(Instance,PropInfo,ReadWideString); SetWideStrProp(Instance,PropInfo,ReadWideString);
{!!!: tkVariant} {!!!: tkVariant}
tkClass: tkClass:
@ -1365,6 +1404,8 @@ begin
end end
else if StringType in [vaWString] then else if StringType in [vaWString] then
Result:= FDriver.ReadWidestring Result:= FDriver.ReadWidestring
else if StringType in [vaUString] then
Result:= FDriver.ReadUnicodeString
else else
raise EReadError.Create(SInvalidPropertyValue); raise EReadError.Create(SInvalidPropertyValue);
end; end;
@ -1375,12 +1416,14 @@ var
s: String; s: String;
i: Integer; i: Integer;
begin begin
if NextValue in [vaWString,vaUTF8String] then if NextValue in [vaWString,vaUString,vaUTF8String] then
//vaUTF8String needs conversion? 2008-09-06 mse
begin begin
ReadValue; ReadValue;
Result := FDriver.ReadWideString Result := FDriver.ReadWideString
end end
else begin else
begin
//data probable from ObjectTextToBinary //data probable from ObjectTextToBinary
s := ReadString; s := ReadString;
setlength(result,length(s)); setlength(result,length(s));
@ -1390,6 +1433,30 @@ begin
end; end;
end; end;
function TReader.ReadUnicodeString: UnicodeString;
var
s: String;
i: Integer;
begin
if NextValue in [vaWString,vaUString,vaUTF8String] then
//vaUTF8String needs conversion? 2008-09-06 mse
begin
ReadValue;
Result := FDriver.ReadUnicodeString
end
else
begin
//data probable from ObjectTextToBinary
s := ReadString;
setlength(result,length(s));
for i:= 1 to length(s) do begin
result[i]:= UnicodeChar(ord(s[i])); //no code conversion
end;
end;
end;
function TReader.ReadValue: TValueType; function TReader.ReadValue: TValueType;
begin begin
Result := FDriver.ReadValue; Result := FDriver.ReadValue;

View File

@ -320,6 +320,29 @@ begin
end; end;
end; end;
procedure TBinaryObjectWriter.WriteUnicodeString(const Value: UnicodeString);
var len : longword;
{$IFDEF ENDIAN_BIG}
i : integer;
us : UnicodeString;
{$ENDIF}
begin
WriteValue(vaUString);
len:=Length(Value);
WriteDWord(len);
if len > 0 then
begin
{$IFDEF ENDIAN_BIG}
setlength(us,len);
for i:=1 to len do
us[i]:=widechar(SwapEndian(word(Value[i])));
Write(us[1], len*sizeof(UnicodeChar));
{$ELSE}
Write(Value[1], len*sizeof(UnicodeChar));
{$ENDIF}
end;
end;
procedure TBinaryObjectWriter.FlushBuffer; procedure TBinaryObjectWriter.FlushBuffer;
begin begin
FStream.WriteBuffer(FBuffer^, FBufPos); FStream.WriteBuffer(FBuffer^, FBufPos);
@ -737,6 +760,7 @@ var
DefMethodValue: TMethod; DefMethodValue: TMethod;
WStrValue, WDefStrValue: WideString; WStrValue, WDefStrValue: WideString;
StrValue, DefStrValue: String; StrValue, DefStrValue: String;
UStrValue, UDefStrValue: UnicodeString;
AncestorObj: TObject; AncestorObj: TObject;
Component: TComponent; Component: TComponent;
ObjValue: TObject; ObjValue: TObject;
@ -876,6 +900,21 @@ begin
Driver.EndProperty; Driver.EndProperty;
end; end;
end; end;
tkUString:
begin
UStrValue := GetUnicodeStrProp(Instance, PropInfo);
if HasAncestor then
UDefStrValue := GetUnicodeStrProp(Ancestor, PropInfo)
else
SetLength(UDefStrValue, 0);
if UStrValue <> UDefStrValue then
begin
Driver.BeginProperty(FPropPath + PPropInfo(PropInfo)^.Name);
WriteUnicodeString(UStrValue);
Driver.EndProperty;
end;
end;
{!!!: tkVariant:} {!!!: tkVariant:}
tkClass: tkClass:
begin begin
@ -1013,3 +1052,8 @@ begin
Driver.WriteWideString(Value); Driver.WriteWideString(Value);
end; end;
procedure TWriter.WriteUnicodeString(const Value: UnicodeString);
begin
Driver.WriteUnicodeString(Value);
end;

View File

@ -143,7 +143,11 @@ Var ChPos,OldPos,ArgPos,DoArg,Len : SizeInt;
ReadWidth; ReadWidth;
ReadPrec; ReadPrec;
{$ifdef INWIDEFORMAT} {$ifdef INWIDEFORMAT}
{$ifdef VER2_2}
FormatChar:=UpCase(Fmt[ChPos])[1]; FormatChar:=UpCase(Fmt[ChPos])[1];
{$else VER2_2}
FormatChar:=UpCase(UnicodeChar(Fmt[ChPos]));
{$endif VER2_2}
if word(FormatChar)>255 then if word(FormatChar)>255 then
ReadFormat:=#255 ReadFormat:=#255
else else

View File

@ -38,7 +38,7 @@ unit typinfo;
tkSet,tkMethod,tkSString,tkLString,tkAString, tkSet,tkMethod,tkSString,tkLString,tkAString,
tkWString,tkVariant,tkArray,tkRecord,tkInterface, tkWString,tkVariant,tkArray,tkRecord,tkInterface,
tkClass,tkObject,tkWChar,tkBool,tkInt64,tkQWord, tkClass,tkObject,tkWChar,tkBool,tkInt64,tkQWord,
tkDynArray,tkInterfaceRaw); tkDynArray,tkInterfaceRaw,tkProcVar,tkUString,tkUChar);
TOrdType = (otSByte,otUByte,otSWord,otUWord,otSLong,otULong); TOrdType = (otSByte,otUByte,otSWord,otUWord,otSLong,otULong);
@ -85,7 +85,7 @@ unit typinfo;
{$endif FPC_REQUIRES_PROPER_ALIGNMENT} {$endif FPC_REQUIRES_PROPER_ALIGNMENT}
record record
case TTypeKind of case TTypeKind of
tkUnKnown,tkLString,tkWString,tkAString,tkVariant: tkUnKnown,tkLString,tkWString,tkAString,tkVariant,tkUString:
(); ();
tkInteger,tkChar,tkEnumeration,tkWChar,tkSet: tkInteger,tkChar,tkEnumeration,tkWChar,tkSet:
(OrdType : TOrdType; (OrdType : TOrdType;
@ -252,6 +252,11 @@ Function GetWideStrProp(Instance: TObject; const PropName: string): WideString;
Procedure SetWideStrProp(Instance: TObject; const PropName: string; const Value: WideString); Procedure SetWideStrProp(Instance: TObject; const PropName: string; const Value: WideString);
Procedure SetWideStrProp(Instance: TObject; PropInfo: PPropInfo; const Value: WideString); Procedure SetWideStrProp(Instance: TObject; PropInfo: PPropInfo; const Value: WideString);
Function GetUnicodeStrProp(Instance: TObject; PropInfo: PPropInfo): UnicodeString;
Function GetUnicodeStrProp(Instance: TObject; const PropName: string): UnicodeString;
Procedure SetUnicodeStrProp(Instance: TObject; const PropName: string; const Value: UnicodeString);
Procedure SetUnicodeStrProp(Instance: TObject; PropInfo: PPropInfo; const Value: UnicodeString);
{$ifndef FPUNONE} {$ifndef FPUNONE}
Function GetFloatProp(Instance: TObject; PropInfo : PPropInfo) : Extended; Function GetFloatProp(Instance: TObject; PropInfo : PPropInfo) : Extended;
Function GetFloatProp(Instance: TObject; const PropName: string): Extended; Function GetFloatProp(Instance: TObject; const PropName: string): Extended;
@ -1397,6 +1402,91 @@ begin
end; end;
end; end;
Function GetUnicodeStrProp(Instance: TObject; const PropName: string): UnicodeString;
begin
Result:=GetUnicodeStrProp(Instance, FindPropInfo(Instance, PropName));
end;
procedure SetUnicodeStrProp(Instance: TObject; const PropName: string; const Value: UnicodeString);
begin
SetUnicodeStrProp(Instance,FindPropInfo(Instance,PropName),Value);
end;
Function GetUnicodeStrProp(Instance: TObject; PropInfo: PPropInfo): UnicodeString;
type
TGetUnicodeStrProcIndex=function(index:longint):UnicodeString of object;
TGetUnicodeStrProc=function():UnicodeString of object;
var
AMethod : TMethod;
begin
Result:='';
case Propinfo^.PropType^.Kind of
tkSString,tkAString:
Result:=GetStrProp(Instance,PropInfo);
tkWString:
Result:=GetWideStrProp(Instance,PropInfo);
tkUString:
begin
case (PropInfo^.PropProcs) and 3 of
ptField:
Result := PUnicodeString(Pointer(Instance)+PtrUInt(PropInfo^.GetProc))^;
ptstatic,
ptvirtual :
begin
if (PropInfo^.PropProcs and 3)=ptStatic then
AMethod.Code:=PropInfo^.GetProc
else
AMethod.Code:=PPointer(Pointer(Instance.ClassType)+PtrUInt(PropInfo^.GetProc))^;
AMethod.Data:=Instance;
if ((PropInfo^.PropProcs shr 6) and 1)<>0 then
Result:=TGetUnicodeStrProcIndex(AMethod)(PropInfo^.Index)
else
Result:=TGetUnicodeStrProc(AMethod)();
end;
end;
end;
end;
end;
Procedure SetUnicodeStrProp(Instance: TObject; PropInfo: PPropInfo; const Value: UnicodeString);
type
TSetUnicodeStrProcIndex=procedure(index:longint;s:UnicodeString) of object;
TSetUnicodeStrProc=procedure(s:UnicodeString) of object;
var
AMethod : TMethod;
begin
case Propinfo^.PropType^.Kind of
tkSString,tkAString:
SetStrProp(Instance,PropInfo,Value);
tkWString:
SetWideStrProp(Instance,PropInfo,Value);
tkUString:
begin
case (PropInfo^.PropProcs shr 2) and 3 of
ptField:
PUnicodeString(Pointer(Instance)+PtrUInt(PropInfo^.SetProc))^:=Value;
ptstatic,
ptvirtual :
begin
if ((PropInfo^.PropProcs shr 2) and 3)=ptStatic then
AMethod.Code:=PropInfo^.SetProc
else
AMethod.Code:=PPointer(Pointer(Instance.ClassType)+PtrUInt(PropInfo^.SetProc))^;
AMethod.Data:=Instance;
if ((PropInfo^.PropProcs shr 6) and 1)<>0 then
TSetUnicodeStrProcIndex(AMethod)(PropInfo^.Index,Value)
else
TSetUnicodeStrProc(AMethod)(Value);
end;
end;
end;
end;
end;
{$ifndef FPUNONE} {$ifndef FPUNONE}

View File

@ -705,7 +705,7 @@ end;
Procedure SetCWideStringManager; Procedure SetCWideStringManager;
Var Var
CWideStringManager : TWideStringManager; CWideStringManager : TUnicodeStringManager;
begin begin
CWideStringManager:=widestringmanager; CWideStringManager:=widestringmanager;
With CWideStringManager do With CWideStringManager do
@ -733,8 +733,15 @@ begin
StrUpperAnsiStringProc:=@AnsiStrUpper; StrUpperAnsiStringProc:=@AnsiStrUpper;
ThreadInitProc:=@InitThread; ThreadInitProc:=@InitThread;
ThreadFiniProc:=@FiniThread; ThreadFiniProc:=@FiniThread;
{$ifndef VER2_2}
{ Unicode }
Unicode2AnsiMoveProc:=@Wide2AnsiMove;
Ansi2UnicodeMoveProc:=@Ansi2WideMove;
UpperUnicodeStringProc:=@UpperWideString;
LowerUnicodeStringProc:=@LowerWideString;
{$endif VER2_2}
end; end;
SetWideStringManager(CWideStringManager); SetUnicodeStringManager(CWideStringManager);
end; end;
@ -752,3 +759,4 @@ finalization
{ fini conversion tables for main program } { fini conversion tables for main program }
FiniThread; FiniThread;
end. end.

View File

@ -12,6 +12,7 @@
</Flags> </Flags>
<SessionStorage Value="InProjectDir"/> <SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/> <MainUnit Value="0"/>
<IconPath Value="./"/>
<TargetFileExt Value=".exe"/> <TargetFileExt Value=".exe"/>
<Title Value="buildrtl"/> <Title Value="buildrtl"/>
</General> </General>

View File

@ -899,10 +899,6 @@ end;
{$endif Set_i386_Exception_handler} {$endif Set_i386_Exception_handler}
{****************************************************************************
OS dependend widestrings
****************************************************************************}
const const
{ MultiByteToWideChar } { MultiByteToWideChar }
MB_PRECOMPOSED = 1; MB_PRECOMPOSED = 1;
@ -918,6 +914,9 @@ function CharUpperBuff(lpsz:LPWSTR; cchLength:DWORD):DWORD;
function CharLowerBuff(lpsz:LPWSTR; cchLength:DWORD):DWORD; function CharLowerBuff(lpsz:LPWSTR; cchLength:DWORD):DWORD;
stdcall; external 'user32' name 'CharLowerBuffW'; stdcall; external 'user32' name 'CharLowerBuffW';
{******************************************************************************
Widestring
******************************************************************************}
procedure Win32Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); procedure Win32Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt);
var var
@ -947,13 +946,57 @@ procedure Win32Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt);
function Win32WideUpper(const s : WideString) : WideString; function Win32WideUpper(const s : WideString) : WideString;
begin begin
result:=s; result:=s;
UniqueString(result);
if length(result)>0 then if length(result)>0 then
CharUpperBuff(LPWSTR(result),length(result)); CharUpperBuff(LPWSTR(result),length(result));
end; end;
function Win32WideLower(const s : WideString) : WideString; function Win32WideLower(const s : WideString) : WideString;
begin
result:=s;
if length(result)>0 then
CharLowerBuff(LPWSTR(result),length(result));
end;
{******************************************************************************
Unicode
******************************************************************************}
procedure Win32Unicode2AnsiMove(source:punicodechar;var dest:ansistring;len:SizeInt);
var
destlen: SizeInt;
begin
// retrieve length including trailing #0
// not anymore, because this must also be usable for single characters
destlen:=WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, source, len, nil, 0, nil, nil);
// this will null-terminate
setlength(dest, destlen);
WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, source, len, @dest[1], destlen, nil, nil);
end;
procedure Win32Ansi2UnicodeMove(source:pchar;var dest:UnicodeString;len:SizeInt);
var
destlen: SizeInt;
begin
// retrieve length including trailing #0
// not anymore, because this must also be usable for single characters
destlen:=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, source, len, nil, 0);
// this will null-terminate
setlength(dest, destlen);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, source, len, @dest[1], destlen);
end;
function Win32UnicodeUpper(const s : UnicodeString) : UnicodeString;
begin
result:=s;
UniqueString(result);
if length(result)>0 then
CharUpperBuff(LPWSTR(result),length(result));
end;
function Win32UnicodeLower(const s : UnicodeString) : UnicodeString;
begin begin
result:=s; result:=s;
UniqueString(result); UniqueString(result);
@ -966,10 +1009,18 @@ function Win32WideLower(const s : WideString) : WideString;
are only relevant for the sysutils units } are only relevant for the sysutils units }
procedure InitWin32Widestrings; procedure InitWin32Widestrings;
begin begin
{ Widestring }
widestringmanager.Wide2AnsiMoveProc:=@Win32Wide2AnsiMove; widestringmanager.Wide2AnsiMoveProc:=@Win32Wide2AnsiMove;
widestringmanager.Ansi2WideMoveProc:=@Win32Ansi2WideMove; widestringmanager.Ansi2WideMoveProc:=@Win32Ansi2WideMove;
widestringmanager.UpperWideStringProc:=@Win32WideUpper; widestringmanager.UpperWideStringProc:=@Win32WideUpper;
widestringmanager.LowerWideStringProc:=@Win32WideLower; widestringmanager.LowerWideStringProc:=@Win32WideLower;
{$ifndef VER2_2}
{ Unicode }
widestringmanager.Unicode2AnsiMoveProc:=@Win32Unicode2AnsiMove;
widestringmanager.Ansi2UnicodeMoveProc:=@Win32Ansi2UnicodeMove;
widestringmanager.UpperUnicodeStringProc:=@Win32UnicodeUpper;
widestringmanager.LowerUnicodeStringProc:=@Win32UnicodeLower;
{$endif VER2_2}
end; end;
@ -1192,6 +1243,10 @@ begin
errno:=0; errno:=0;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;
{$ifndef VER2_2}
initunicodestringmanager;
{$endif VER2_2}
InitWin32Widestrings; InitWin32Widestrings;
DispCallByIDProc:=@DoDispCallByIDError; DispCallByIDProc:=@DoDispCallByIDError;
end. end.

View File

@ -11,7 +11,7 @@ Const TypeNames : Array [TTYpeKind] of string[15] =
'Float','Set','Method','ShortString','LongString', 'Float','Set','Method','ShortString','LongString',
'AnsiString','WideString','Variant','Array','Record', 'AnsiString','WideString','Variant','Array','Record',
'Interface','Class','Object','WideChar','Bool','Int64','QWord', 'Interface','Class','Object','WideChar','Bool','Int64','QWord',
'DynamicArray','RawInterface'); 'DynamicArray','RawInterface','ProcVar','UnicodeString','UnicodeChar');
Const OrdinalTypes = [tkInteger,tkChar,tkENumeration,tkbool]; Const OrdinalTypes = [tkInteger,tkChar,tkENumeration,tkbool];

27
tests/test/tstring10.pp Normal file
View File

@ -0,0 +1,27 @@
program punicodechartest;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
{$ifdef mswindows}{$apptype console}{$endif}
uses
{$ifdef FPC}{$ifdef linux}cthreads,{$endif}{$endif}
sysutils;
var
astr: ansistring;
wstr: widestring;
ustr: unicodestring;
begin
astr:= '';
wstr:= '';
ustr:= '';
writeln(ptrint(pansichar(astr)));
flush(output);
writeln(ptrint(pwidechar(wstr)));
flush(output);
writeln(ptrint(punicodechar(ustr)));
flush(output);
writeln(ord(pansichar(astr)^));
flush(output);
writeln(ord(pwidechar(wstr)^));
flush(output);
writeln(ord(punicodechar(ustr)^));
flush(output);
end.

19
tests/test/tunistr1.pp Normal file
View File

@ -0,0 +1,19 @@
{$ifdef unix}
uses
cwstring;
{$endif unix}
var
w : unicodestring;
a : ansistring;
begin
a:='A';
w:=a;
if w[1]<>#65 then
halt(1);
a:=w;
if a[1]<>'A' then
halt(1);
writeln('ok');
end.

21
tests/test/tunistr2.pp Normal file
View File

@ -0,0 +1,21 @@
{$ifdef UNIX}
uses
cwstring;
{$endif UNIX}
var
i : longint;
w,w2 : unicodestring;
a : ansistring;
begin
setlength(w,1000);
for i:=1 to 1000 do
w[i]:=widechar(i);
for i:=1 to 10 do
begin
a:=w;
w2:=a;
end;
writeln('ok');
end.

92
tests/test/tunistr4.pp Normal file
View File

@ -0,0 +1,92 @@

{$ifdef fpc}
{$mode objfpc}
{$endif fpc}
uses
{$ifdef unix}
cthreads, cwstring,
{$endif}
Classes, SysUtils;
type
tc = class(tthread)
orgstr: ansistring;
cnvstr: unicodestring;
constructor create(const s: ansistring; const w: unicodestring);
procedure execute; override;
end;
const
// string with an invalid utf-8 code sequence
str1 = #$c1#$34'Życie'#$c1#$34' jest jak papier '#$c1#$34'toaletowy'#$c1#$34' : długie, szare i '#$c1#$34'do'#$c1#$34' dupy';
str2 = 'Życie '#$c1#$34'jest'#$c1#$34' jak papier toaletowy : '#$c1#$34'długie'#$c1#$34', szare i do '#$c1#$34'dupy'#$c1#$34'222222222222222222222222222222222222222222222222';
str3 = 'Życie jest '#$c1#$34'jak'#$c1#$34' papier 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 toaletowy : długie, '#$c1#$34'szare'#$c1#$34' i do dupy';
str4 = 'Życie jest 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 jak '#$c1#$34'papier'#$c1#$34' toaletowy : długie, szare '#$c1#$34'i'#$c1#$34' do dupy';
count = 20000;
var
wstr: unicodestring;
// cnvstr: ansistring;
error: boolean;
constructor tc.create(const s: ansistring; const w: unicodestring);
begin
orgstr:=s;
cnvstr:=w;
inherited create(true);
end;
procedure tc.execute;
var
i: longint;
w: unicodestring;
begin
for i := 1 to count do
begin
w:=orgstr;
if (w<>cnvstr) then
error:=true;
end;
end;
var
a: array[1..4] of tc;
w1,w2,w3,w4: unicodestring;
cnvstr: ansistring;
begin
error:=false;
cnvstr:=str1;
w1:=cnvstr;
cnvstr:=str2;
w2:=cnvstr;
cnvstr:=str3;
w3:=cnvstr;
cnvstr:=str4;
w4:=cnvstr;
writeln(w1);
writeln(w2);
writeln(w3);
writeln(w4);
a[1]:=tc.create(str1,w1);
a[2]:=tc.create(str2,w2);
a[3]:=tc.create(str3,w3);
a[4]:=tc.create(str4,w4);
a[1].resume;
a[2].resume;
a[3].resume;
a[4].resume;
a[1].waitfor;
a[2].waitfor;
a[3].waitfor;
a[4].waitfor;
a[1].free;
a[2].free;
a[3].free;
a[4].free;
if error then
halt(1);
end.

45
tests/test/tunistr5.pp Normal file
View File

@ -0,0 +1,45 @@
{$codepage utf-8}
var
ws: unicodestring;
us: UCS4String;
begin
// the compiler does not yet support characters which require
// a surrogate pair in utf-16
// ws:='鳣ćçŹ你';
// so write the last character directly using a utf-16 surrogate pair
ws:='鳣ćçŹ'#$d87e#$dc04;
if (length(ws)<>8) or
(ws[1]<>'é') or
(ws[2]<>'ł') or
(ws[3]<>'Ł') or
(ws[4]<>'ć') or
(ws[5]<>'ç') or
(ws[6]<>'Ź') or
(ws[7]<>#$d87e) or
(ws[8]<>#$dc04) then
halt(1);
us:=UnicodeStringToUCS4String(ws);
if (length(us)<>8) or
(us[0]<>UCS4Char(unicodechar('é'))) or
(us[1]<>UCS4Char(unicodechar('ł'))) or
(us[2]<>UCS4Char(unicodechar('Ł'))) or
(us[3]<>UCS4Char(unicodechar('ć'))) or
(us[4]<>UCS4Char(unicodechar('ç'))) or
(us[5]<>UCS4Char(unicodechar('Ź'))) or
(us[6]<>UCS4Char($2F804)) or
(us[7]<>UCS4Char(0)) then
halt(2);
ws:=UCS4StringToUnicodeString(us);
if (length(ws)<>8) or
(ws[1]<>'é') or
(ws[2]<>'ł') or
(ws[3]<>'Ł') or
(ws[4]<>'ć') or
(ws[5]<>'ç') or
(ws[6]<>'Ź') or
(ws[7]<>#$d87e) or
(ws[8]<>#$dc04) then
halt(3);
end.

397
tests/test/tunistr6.pp Normal file
View File

@ -0,0 +1,397 @@
{%skiptarget=wince}
{$codepage utf-8}
uses
{$ifdef unix}
cwstring,
{$endif}
sysutils;
procedure doerror(i : integer);
begin
writeln('Error: ',i);
halt(i);
end;
{ normal upper case testing }
procedure testupper;
var
s: ansistring;
w1,w2,w3,w4: unicodestring;
i: longint;
begin
w1:='aé'#0'èàł'#$d87e#$dc04;
w2:='AÉ'#0'ÈÀŁ'#$d87e#$dc04;
{$ifdef print}
// the utf-8 output can confuse the testsuite parser
writeln('original: ',w1);
writeln('original upper: ',w2);
{$endif print}
s:=w1;
{$ifdef print}
writeln('ansi: ',s);
{$endif print}
w3:=s;
w4:=AnsiUpperCase(s);
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeUpperCase(w1);
{$ifdef print}
writeln('unicodeupper: ',w1);
writeln('original upper: ',w2);
writeln('ansiupper: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(1);
if (w4 <> w2) then
doerror(2);
w1:='aéèàł'#$d87e#$dc04;
w2:='AÉÈÀŁ'#$d87e#$dc04;
s:=w1;
w3:=s;
w4:=AnsiStrUpper(pchar(s));
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeUpperCase(w1);
{$ifdef print}
writeln('unicodeupper: ',w1);
writeln('ansistrupper: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(21);
if (w4 <> w2) then
doerror(22);
end;
{ normal lower case testing }
procedure testlower;
var
s: ansistring;
w1,w2,w3,w4: unicodestring;
i: longint;
begin
w1:='AÉ'#0'ÈÀŁ'#$d87e#$dc04;
w2:='aé'#0'èàł'#$d87e#$dc04;
{$ifdef print}
// the utf-8 output can confuse the testsuite parser
writeln('original: ',w1);
writeln('original lower: ',w2);
{$endif print}
s:=w1;
w3:=s;
w4:=AnsiLowerCase(s);
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeLowerCase(w1);
{$ifdef print}
writeln('unicodelower: ',w1);
writeln('ansilower: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(3);
if (w4 <> w2) then
doerror(4);
w1:='AÉÈÀŁ'#$d87e#$dc04;
w2:='aéèàł'#$d87e#$dc04;
s:=w1;
w3:=s;
w4:=AnsiStrLower(pchar(s));
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeLowerCase(w1);
{$ifdef print}
writeln('unicodelower: ',w1);
writeln('ansistrlower: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(3);
if (w4 <> w2) then
doerror(4);
end;
{ upper case testing with a missing utf-16 pair at the end }
procedure testupperinvalid;
var
s: ansistring;
w1,w2,w3,w4: unicodestring;
i: longint;
begin
{ missing utf-16 pair at end }
w1:='aé'#0'èàł'#$d87e;
w2:='AÉ'#0'ÈÀŁ'#$d87e;
{$ifdef print}
// the utf-8 output can confuse the testsuite parser
writeln('original: ',w1);
writeln('original upper: ',w2);
{$endif print}
s:=w1;
w3:=s;
w4:=AnsiUpperCase(s);
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeUpperCase(w1);
{$ifdef print}
writeln('unicodeupper: ',w1);
writeln('ansiupper: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(5);
if (w4 <> w2) then
doerror(6);
end;
{ lower case testing with a missing utf-16 pair at the end }
procedure testlowerinvalid;
var
s: ansistring;
w1,w2,w3,w4: unicodestring;
i: longint;
begin
{ missing utf-16 pair at end}
w1:='AÉ'#0'ÈÀŁ'#$d87e;
w2:='aé'#0'èàł'#$d87e;
{$ifdef print}
// the utf-8 output can confuse the testsuite parser
writeln('original: ',w1);
writeln('original lower: ',w2);
{$endif print}
s:=w1;
w3:=s;
w4:=AnsiLowerCase(s);
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeLowerCase(w1);
{$ifdef print}
writeln('unicodelower: ',w1);
writeln('ansilower: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(7);
if (w4 <> w2) then
doerror(8);
end;
{ upper case testing with a missing utf-16 pair at the end, followed by a normal char }
procedure testupperinvalid1;
var
s: ansistring;
w1,w2,w3,w4: unicodestring;
i: longint;
begin
{ missing utf-16 pair at end with char after it}
w1:='aé'#0'èàł'#$d87e'j';
w2:='AÉ'#0'ÈÀŁ'#$d87e'J';
{$ifdef print}
// the utf-8 output can confuse the testsuite parser
writeln('original: ',w1);
writeln('original upper: ',w2);
{$endif print}
s:=w1;
w3:=s;
w4:=AnsiUpperCase(s);
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeUpperCase(w1);
{$ifdef print}
writeln('unicodeupper: ',w1);
writeln('ansiupper: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(9);
if (w4 <> w2) then
doerror(10);
end;
{ lower case testing with a missing utf-16 pair at the end, followed by a normal char }
procedure testlowerinvalid1;
var
s: ansistring;
w1,w2,w3,w4: unicodestring;
i: longint;
begin
{ missing utf-16 pair at end with char after it}
w1:='AÉ'#0'ÈÀŁ'#$d87e'J';
w2:='aé'#0'èàł'#$d87e'j';
{$ifdef print}
// the utf-8 output can confuse the testsuite parser
writeln('original: ',w1);
writeln('original lower: ',w2);
{$endif print}
s:=w1;
w3:=s;
w4:=AnsiLowerCase(s);
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeLowerCase(w1);
{$ifdef print}
writeln('unicodelower: ',w1);
writeln('ansilower: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(11);
if (w4 <> w2) then
doerror(12);
end;
{ upper case testing with corrupting the utf-8 string after conversion }
procedure testupperinvalid2;
var
s: ansistring;
w1,w2,w3,w4: unicodestring;
i: longint;
begin
w1:='aé'#0'èàł'#$d87e#$dc04'ö';
w2:='AÉ'#0'ÈÀŁ'#$d87e#$dc04'Ö';
{$ifdef print}
// the utf-8 output can confuse the testsuite parser
writeln('original: ',w1);
writeln('original upper: ',w2);
{$endif print}
s:=w1;
{ truncate the last utf-8 character }
setlength(s,length(s)-1);
w3:=s;
{ adjust checking values for new length due to corruption }
if length(w3)<>length(w2) then
begin
setlength(w2,length(w3));
setlength(w1,length(w3));
end;
w4:=AnsiUpperCase(s);
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeUpperCase(w1);
{$ifdef print}
writeln('unicodeupper: ',w1);
writeln('ansiupper: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(13);
if (w4 <> w2) then
doerror(14);
end;
{ lower case testing with corrupting the utf-8 string after conversion }
procedure testlowerinvalid2;
var
s: ansistring;
w1,w2,w3,w4: unicodestring;
i: longint;
begin
w1:='AÉ'#0'ÈÀŁ'#$d87e#$dc04'Ö';
w2:='aé'#0'èàł'#$d87e#$dc04'ö';
{$ifdef print}
// the utf-8 output can confuse the testsuite parser
writeln('original: ',w1);
writeln('original lower: ',w2);
{$endif print}
s:=w1;
{ truncate the last utf-8 character }
setlength(s,length(s)-1);
w3:=s;
{ adjust checking values for new length due to corruption }
if length(w3)<>length(w2) then
begin
setlength(w2,length(w3));
setlength(w1,length(w3));
end;
w4:=AnsiLowerCase(s);
{ filter out unsupported characters }
for i:=1 to length(w3) do
if w3[i]='?' then
begin
w2[i]:='?';
w1[i]:='?';
end;
w1:=UnicodeLowerCase(w1);
{$ifdef print}
writeln('unicodelower: ',w1);
writeln('ansilower: ',w4);
{$endif print}
if (w1 <> w2) then
doerror(15);
if (w4 <> w2) then
doerror(16);
end;
begin
testupper;
writeln;
testlower;
writeln;
writeln;
testupperinvalid;
writeln;
testlowerinvalid;
writeln;
writeln;
testupperinvalid1;
writeln;
testlowerinvalid1;
writeln;
writeln;
testupperinvalid2;
writeln;
testlowerinvalid2;
writeln('ok');
end.

47
tests/test/tunistr7.pp Normal file
View File

@ -0,0 +1,47 @@
{$codepage utf-8}
uses
{$ifdef unix}
cwstring,
{$endif unix}
sysutils;
procedure testwcmp;
var
w1,w2: unicodestring;
s: ansistring;
begin
w1:='aécde';
{ filter unsupported characters }
s:=w1;
w1:=s;
w2:=w1;
if (w1<>w2) then
halt(1);
w1[2]:='f';
if (w1=w2) or
WideSameStr(w1,w2) or
(WideCompareText(w1,w2)=0) or
(WideCompareStr(w1,w2)<0) or
(WideCompareStr(w2,w1)>0) then
halt(2);
w1[2]:=#0;
w2[2]:=#0;
if (w1<>w2) or
not WideSameStr(w1,w2) or
(WideCompareStr(w1,w2)<>0) or
(WideCompareText(w1,w2)<>0) then
halt(3);
w1[3]:='m';
if WideSameStr(w1,w2) or
(WideCompareText(w1,w2)=0) or
(WideCompareStr(w1,w2)<0) or
(WideCompareStr(w2,w1)>0) then
halt(4);
end;
begin
testwcmp;
end.