Преглед на файлове

* apparantly broke linux since iconv is in glibc there, fixed + some minor gotchas

git-svn-id: trunk@806 -
marco преди 20 години
родител
ревизия
287e8317a6
променени са 1 файла, в които са добавени 14 реда и са изтрити 12 реда
  1. 14 12
      rtl/unix/cwstring.pp

+ 14 - 12
rtl/unix/cwstring.pp

@@ -25,10 +25,9 @@ implementation
 
 
 {$linklib c}
 {$linklib c}
 
 
-{$ifdef bsd}
+{$ifndef linux}  // Linux (and maybe glibc platforms in general), have iconv in glibc.
 {$linklib iconv}
 {$linklib iconv}
-{$endif bsd}
-
+{$endif linux}
 
 
 Uses
 Uses
   BaseUnix,
   BaseUnix,
@@ -39,7 +38,11 @@ Uses
   initc;
   initc;
 
 
 Const
 Const
+{$ifdef Linux}
+    libiconvname='c';  // is in libc under Linux.
+{$else}
     libiconvname='iconv';
     libiconvname='iconv';
+{$endif}
 
 
 { Case-mapping "arrays" }
 { Case-mapping "arrays" }
 var
 var
@@ -48,13 +51,12 @@ var
   WideUpperChars: WideString; // 1..65535
   WideUpperChars: WideString; // 1..65535
   WideLowerChars: WideString; // 1..65535
   WideLowerChars: WideString; // 1..65535
 
 
-
 { the following declarations are from the libc unit for linux so they
 { the following declarations are from the libc unit for linux so they
   might be very linux centric
   might be very linux centric
   maybe this needs to be splitted in an os depend way later }
   maybe this needs to be splitted in an os depend way later }
-function towlower(__wc:wint_t):wint_t;cdecl;external;
-function towupper(__wc:wint_t):wint_t;cdecl;external;
-function wcscoll(__s1:pwchar_t; __s2:pwchar_t):longint;cdecl;external;
+function towlower(__wc:wint_t):wint_t;cdecl;external libiconvname name 'towlower';
+function towupper(__wc:wint_t):wint_t;cdecl;external libiconvname name 'towupper';
+function wcscoll (__s1:pwchar_t; __s2:pwchar_t):cint;cdecl;external libiconvname name 'wcscoll';
 
 
 const
 const
 {$ifdef linux}
 {$ifdef linux}
@@ -70,8 +72,8 @@ const
   CODESET = 0;
   CODESET = 0;
 {$else freebsd}
 {$else freebsd}
 {$error lookup the value of CODESET in /usr/include/langinfo.h for your OS }
 {$error lookup the value of CODESET in /usr/include/langinfo.h for your OS }
-{$endif FreeNSD}
-
+// and while doing it, check if iconv is in libc, and if the symbols are prefixed with iconv_ or libiconv_
+{$endif FreeBSD}
 {$endif darwin}
 {$endif darwin}
 {$endif linux}
 {$endif linux}
 
 
@@ -85,17 +87,17 @@ const
 type
 type
   piconv_t = ^iconv_t;
   piconv_t = ^iconv_t;
   iconv_t = pointer;
   iconv_t = pointer;
-  nl_item = longint;
+  nl_item = cint;
 
 
 function nl_langinfo(__item:nl_item):pchar;cdecl;external libiconvname name 'nl_langinfo';
 function nl_langinfo(__item:nl_item):pchar;cdecl;external libiconvname name 'nl_langinfo';
 {$ifndef Darwin}
 {$ifndef Darwin}
 function iconv_open(__tocode:pchar; __fromcode:pchar):iconv_t;cdecl;external libiconvname name 'iconv_open';
 function iconv_open(__tocode:pchar; __fromcode:pchar):iconv_t;cdecl;external libiconvname name 'iconv_open';
 function iconv(__cd:iconv_t; __inbuf:ppchar; __inbytesleft:psize_t; __outbuf:ppchar; __outbytesleft:psize_t):size_t;cdecl;external libiconvname name 'iconv';
 function iconv(__cd:iconv_t; __inbuf:ppchar; __inbytesleft:psize_t; __outbuf:ppchar; __outbytesleft:psize_t):size_t;cdecl;external libiconvname name 'iconv';
-function iconv_close(__cd:iconv_t):longint;cdecl;external libiconvname name 'iconv_close';
+function iconv_close(__cd:iconv_t):cint;cdecl;external libiconvname name 'iconv_close';
 {$else}
 {$else}
 function iconv_open(__tocode:pchar; __fromcode:pchar):iconv_t;cdecl;external libiconvname name 'libiconv_open';
 function iconv_open(__tocode:pchar; __fromcode:pchar):iconv_t;cdecl;external libiconvname name 'libiconv_open';
 function iconv(__cd:iconv_t; __inbuf:ppchar; __inbytesleft:psize_t; __outbuf:ppchar; __outbytesleft:psize_t):size_t;cdecl;external libiconvname name 'libiconv';
 function iconv(__cd:iconv_t; __inbuf:ppchar; __inbytesleft:psize_t; __outbuf:ppchar; __outbytesleft:psize_t):size_t;cdecl;external libiconvname name 'libiconv';
-function iconv_close(__cd:iconv_t):longint;cdecl;external libiconvname name 'libiconv_close';
+function iconv_close(__cd:iconv_t):cint;cdecl;external libiconvname name 'libiconv_close';
 {$endif}
 {$endif}
 
 
 var
 var