* iconvenc packages, first version. Tested on Linux/x86 and FreeBSD/x86

git-svn-id: trunk@11407 -
This commit is contained in:
marco 2008-07-19 10:58:53 +00:00
parent c2e5f885c6
commit 0ea254295f
9 changed files with 5145 additions and 0 deletions

8
.gitattributes vendored
View File

@ -2692,6 +2692,14 @@ packages/ibase/src/ibase60.pp svneol=native#text/plain
packages/ibase/src/ibase60dyn.pp svneol=native#text/plain
packages/ibase/tests/testib40.pp svneol=native#text/plain
packages/ibase/tests/testib60.pp svneol=native#text/plain
packages/iconvenc/Makefile svneol=native#text/plain
packages/iconvenc/Makefile.fpc svneol=native#text/plain
packages/iconvenc/examples/Makefile svneol=native#text/plain
packages/iconvenc/examples/Makefile.fpc svneol=native#text/plain
packages/iconvenc/examples/iconvtest.pp svneol=native#text/plain
packages/iconvenc/fpmake.pp svneol=native#text/plain
packages/iconvenc/manifest.xml svneol=native#text/plain
packages/iconvenc/src/iconvenc.pas svneol=native#text/plain
packages/imagemagick/Makefile svneol=native#text/plain
packages/imagemagick/Makefile.fpc svneol=native#text/plain
packages/imagemagick/examples/image.png -text svneol=unset#image/png

2783
packages/iconvenc/Makefile Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
#
# Makefile.fpc for Free Pascal ImLib 1.x Packages
#
[package]
name=iconvenc
version=2.2.0
[target]
units=iconvenc
exampledirs=examples
[require]
libc=y
[compiler]
includedir=src
sourcedir=src
[install]
fpcpackage=y
fpcsubdir=packages
[default]
fpcdir=../..
[shared]
build=n
[rules]
.NOTPARALLEL:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
#
# Makefile.fpc for Free Pascal GTK 2.x.y Examples
#
[target]
programs=iconvtest
[require]
packages=iconvenc
[install]
fpcpackage=y
[default]
fpcdir=../../..
[rules]
.NOTPARALLEL:

View File

@ -0,0 +1,69 @@
program doiconv;
{
Copyright (c) 2008 by Marco van de Voort(marco@freepascal.org)
member of the Free Pascal development team
Test program for the iconvenc package.
See the file COPYING.FPC, included in this distribution,
for details about the copyright. (LGPL)
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.
Seems not to have memory leaks atm. If you experience them, check procedure
newcalc first.
}
{$mode objfpc}{$H+}
uses
SysUtils,
iconvenc;
// some random Hebrew string for testing in CP1255
Const InputString : array[0..21] of char =
(#$e0,#$e1,#$e2,#$e3,#$e4,#$e5,#$e6,#$e7,
#$e8,#$e9,#$eb,#$ec,#$ee,#$f0,#$f1,#$f2,
#$f4,#$f6,#$f7,#$f8,#$f9,#$fa);
InputEncoding = 'CP1255';
procedure DoOneConversion(TargetEncoding:string);
var
fn,res: string;
f1:text;
convres: integer;
begin
// note that while the iconvert function is easy, it opens and closes
// a iconv handle each time, and also requires exceptions.
// I do not know how costly this is.
// also iconvert skips unknown chars (EILSEQ).
convres:=Iconvert(inputstring,res,inputencoding,targetencoding);
if convres=0 then
begin
fn:='result-'+targetencoding+'.txt';
Writeln('Succes: writing file ',fn,' with results');
assignfile(f1,fn);
rewrite(f1);
Write(f1,res);
closefile(f1);
end
else
Writeln('Failure for ',TargetEncoding,' error: ',convres);
end;
var s : string;
begin
{$IFDEF LOADDYNAMIC}
if not InitIconv(s) then
begin
Writeln('Iconv initialization failed:',s);
halt;
end ;
{$ENDIF}
DoOneConversion('UTF-8');
DoOneConversion('UTF-16');
end.

View File

@ -0,0 +1,29 @@
{$ifndef ALLPACKAGES}
{$mode objfpc}{$H+}
program fpmake;
uses fpmkunit;
Var
P : TPackage;
T : TTarget;
begin
With Installer do
begin
{$endif ALLPACKAGES}
P:=AddPackage('iconvenc');
{$ifdef ALLPACKAGES}
P.Directory:='iconvenc';
{$endif ALLPACKAGES}
P.Version:='2.0.0';
P.SourcePath.Add('src');
P.IncludePath.Add('src');
T:=P.Targets.AddUnit('iconvenc.pas');
{$ifndef ALLPACKAGES}
Run;
end;
end.
{$endif ALLPACKAGES}

View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<packages>
<package name="iconvenc">
<version release="2" major="0" minor="0" suffix=""/>
<filename>iconvenc-2.0.0.zip</filename>
<author>Marco van de Voort</author>
<license>modified LGPL</license>
<email>marco@freepascal.org</email>
<dependencies>
<dependency><package packagename="rtl"/></dependency>
</dependencies>
</package>
</packages>

View File

@ -0,0 +1,168 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 2000 by Marco van de Voort(marco@freepascal.org)
member of the Free Pascal development team
libiconv header translation + a helper routine
http://wiki.freepascal.org/iconvenc
See the file COPYING.FPC, included in this distribution,
for details about the copyright. (LGPL)
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.
}
unit iconvenc;
interface
{$mode objfpc}{$H+}
{DEFINE LOADDYNAMIC}
uses
baseunix,
{$ifdef LOADDYNAMIC}
dl,
{$endif}
initc;
const
n=1;
type
Piconv_t = ^iconv_t;
iconv_t = pointer;
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_close = function (__cd:iconv_t):longint;cdecl;
{$IFNDEF LOADDYNAMIC}
{$ifndef Linux} // and other OSes with iconv in libc.
{$linklib iconv}
{$endif}
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_close (__cd:iconv_t):longint;cdecl; external;
var
IconvLibFound: Boolean = False;
{$ELSE}
var
iconv_lib: Pointer;
iconv_open: Ticonv_open;
iconv: Ticonv;
iconv_close: Ticonv_close;
IconvLibFound: Boolean = True;
function TryLoadLib(LibName:String;var error:string):Boolean; // can be used to load non standard libname
{$endif}
function Iconvert(S:string;var res:string; FromEncoding, ToEncoding: string): cint;
function InitIconv (Var error:string): Boolean;
implementation
{$IFDEF LOADDYNAMIC}
function TryLoadLib(LibName:String;var error:string):Boolean;
function resolvesymbol (var funcptr; symbol:string):boolean;
begin
pointer(funcptr):=pointer(dlsym(iconv_lib, pchar(symbol)));
result:=assigned(pointer(funcptr));
if not result then
error:=error+#13#10+dlerror();
end;
var res:boolean;
begin
result:=false;
Error:=Error+#13#10'Trying '+LibName;
iconv_lib:=dlopen(pchar(libname), RTLD_NOW);
if Assigned(iconv_lib) then
begin
result:=true;
result := result and resolvesymbol(pointer(iconv),'iconv');
result := result and resolvesymbol(pointer(iconv_open),'iconv_open');
result := result and resolvesymbol(pointer(iconv_close),'iconv_close');
// if not res then
// dlclose(iconv_lib);
end
else
error:=error+#13#10+dlerror();
end;
{$ENDIF}
function InitIconv(Var error:string): Boolean;
var
err: PChar;
begin
result:=true;
{$ifdef LOADDYNAMIC}
error:='';
if not TryLoadLib('libc.so.6',error) then
if not TryLoadLib('libiconv.so',error) then
result:=false;
{$endif}
end;
function Iconvert(S:string;var res:string; FromEncoding, ToEncoding: string): cint;
var
InLen, OutLen, Offset: longint;
Src, Dst: PChar;
H: iconv_t;
lerr: cint;
iconvres : cint;
begin
H:=iconv_open(PChar(ToEncoding), PChar(FromEncoding));
if not assigned(H) then
begin
Res:=S;
Exit(-1);
end;
try
SetLength(Res, Length(S));
InLen:=Length(S);
OutLen:=Length(Res);
Src:=PChar(S);
Dst:=PChar(Res);
while InLen>0 do
begin
iconvres:= iconv(H, @Src, @InLen, @Dst, @OutLen);
if iconvres=Cint(-1) then
begin
lerr:=cerrno;
if lerr=ESysEILSEQ then // unknown char, skip
begin
Dst^:=Src^;
Inc(Src);
Inc(Dst);
Dec(InLen);
Dec(OutLen);
end
else
if lerr=ESysE2BIG then
begin
Offset:=Dst-PChar(Res);
SetLength(Res, Length(Res)+InLen*2+5); // 5 is minimally one utf-8 char
Dst:=PChar(Res)+Offset;
OutLen:=Length(Res)-Offset;
end
else
exit(-1)
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);
finally
iconv_close(H);
end;
result:=0;
end;
end.