diff --git a/rtl/objpas/sysutils/stre.inc b/rtl/objpas/sysutils/stre.inc index a04441c446..dac0e9e0f3 100644 --- a/rtl/objpas/sysutils/stre.inc +++ b/rtl/objpas/sysutils/stre.inc @@ -73,4 +73,4 @@ Const SVarArrayBounds = 'Variant array bounds error'; SVarArrayCreate = 'Variant array cannot be created'; SVarNotArray = 'Variant doesn''t contain an array'; - + SVarArrayBounds = 'iconv error'; diff --git a/rtl/objpas/sysutils/sysutils.inc b/rtl/objpas/sysutils/sysutils.inc index 400b934702..474ba8ed4d 100644 --- a/rtl/objpas/sysutils/sysutils.inc +++ b/rtl/objpas/sysutils/sysutils.inc @@ -306,6 +306,7 @@ begin 228 : E:=EExternalException.Create(SExternalException); 229 : E:=EIntfCastError.Create(SIntfCastError); 230 : E:=ESafecallException.Create(SSafecallException); + 231 : E:=EConvertError.Create(SiconvError); 232 : E:=ENoThreadSupport.Create(SNoThreadSupport); else E:=Exception.CreateFmt (SUnKnownRunTimeError,[Errno]); diff --git a/rtl/unix/cwstring.pp b/rtl/unix/cwstring.pp index e26f486876..bf4f2ca8dd 100644 --- a/rtl/unix/cwstring.pp +++ b/rtl/unix/cwstring.pp @@ -35,7 +35,6 @@ Uses ctypes, unix, unixtype, - sysutils, initc; Const @@ -120,6 +119,9 @@ var lock_ansi2wide : integer = -1; lock_wide2ansi : integer = -1; + iconv_lock : TRTLcriticalsection; + +{ procedure lockiconv(var lockcount: integer); begin while interlockedincrement(lockcount) <> 0 do begin @@ -132,7 +134,8 @@ procedure unlockiconv(var lockcount: integer); begin interlockeddecrement(lockcount); end; - +} + procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); var outlength, @@ -153,7 +156,7 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); srcpos:=source; destpos:=pchar(dest); outleft:=outlength; - lockiconv(lock_wide2ansi); + entercriticalsection(iconv_lock); while iconv(iconv_wide2ansi,ppchar(@srcpos),@srclen,@destpos,@outleft)=size_t(-1) do begin case fpgetCerrno of @@ -179,13 +182,11 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); destpos:=pchar(dest)+outoffset; end; else - begin - unlockiconv(lock_wide2ansi); - raise EConvertError.Create('iconv error '+IntToStr(fpgetCerrno)); - end; + leavecriticalsection(iconv_lock); + runerror(231); end; end; - unlockiconv(lock_wide2ansi); + leavecriticalsection(iconv_lock); // truncate string setlength(dest,length(dest)-outleft); end; @@ -210,7 +211,7 @@ procedure Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt); srcpos:=source; destpos:=pchar(dest); outleft:=outlength*2; - lockiconv(lock_ansi2wide); + entercriticalsection(iconv_lock); while iconv(iconv_ansi2wide,@srcpos,psize(@len),@destpos,@outleft)=size_t(-1) do begin case fpgetCerrno of @@ -235,13 +236,11 @@ procedure Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt); destpos:=pchar(dest)+outoffset; end; else - begin - unlockiconv(lock_ansi2wide); - raise EConvertError.Create('iconv error '+IntToStr(fpgetCerrno)); - end; + leavecriticalsection(iconv_lock); + runerror(231); end; end; - unlockiconv(lock_ansi2wide); + leavecriticalsection(iconv_lock); // truncate string setlength(dest,length(dest)-outleft div 2); end; @@ -286,7 +285,7 @@ procedure Ansi2UCS4Move(source:pchar;var dest:UCS4String;len:SizeInt); srcpos:=source; destpos:=pchar(dest); outleft:=outlength*4; - lockiconv(lock_ansi2ucs4); + entercriticalsection(iconv_lock); while iconv(iconv_ansi2ucs4,@srcpos,psize(@len),@destpos,@outleft)=size_t(-1) do begin case fpgetCerrno of @@ -301,13 +300,11 @@ procedure Ansi2UCS4Move(source:pchar;var dest:UCS4String;len:SizeInt); destpos:=pchar(dest)+outoffset; end; else - begin - unlockiconv(lock_ansi2ucs4); - raise EConvertError.Create('iconv error '+IntToStr(fpgetCerrno)); - end; + leavecriticalsection(iconv_lock); + runerror(231); end; end; - unlockiconv(lock_ansi2ucs4); + leavecriticalsection(iconv_lock); // truncate string setlength(dest,length(dest)-outleft div 4); end;