Improve unicode handling

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@10947 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Adam Fedor 2001-09-21 16:13:11 +00:00
parent f8cf838ad5
commit c8fc73d329
6 changed files with 46 additions and 99 deletions

View file

@ -1,3 +1,10 @@
2001-09-21 Adam Fedor <fedor@gnu.org>
* configure.in: Typo in iconv cached value.
* Headers/gnustep/base/NSGeometry.h: Make const values static also.
* Source/NSConnection.m: Remove obsolete BROKEN_NESTED code.
* Source/Unicode.m: Dynamically determine best Unicode encoding.
2001-09-21 Richard Frith-Macdonald <rfm@gnu.org>
* Headers/gnustep/base/DistributedObjects.h:

View file

@ -80,9 +80,9 @@ enum _NSRectEdge
NSMaxYEdge
};
const NSPoint NSZeroPoint; /* A zero point. */
const NSRect NSZeroRect; /* A zero origin rectangle. */
const NSSize NSZeroSize; /* A zero size rectangle. */
static const NSPoint NSZeroPoint; /* A zero point. */
static const NSRect NSZeroRect; /* A zero origin rectangle. */
static const NSSize NSZeroSize; /* A zero size rectangle. */
/**** Function Prototypes ****************************************************/

View file

@ -1413,96 +1413,6 @@ static BOOL multi_threaded = NO;
RELEASE(arp);
}
#ifdef BROKEN_NESTED_FUNCTIONS
typedef struct _NSConnection_t {
@defs(NSConnection)
} NSConnection_t;
static NSConnection_t *c_self_t;
static NSPortCoder *op = nil;
static NSPortCoder *ip = nil;
static NSConnection *c_self;
static BOOL is_exception = NO;
static BOOL second_decode = NO;
static int seq_num;
void encoder (int argnum, void *datum, const char *type, int flags)
{
#define ENCODED_ARGNAME @"argument value"
switch (*type)
{
case _C_ID:
if (flags & _F_BYCOPY)
[op encodeBycopyObject: *(id*)datum];
#ifdef _F_BYREF
else if (flags & _F_BYREF)
[op encodeByrefObject: *(id*)datum];
#endif
else
[op encodeObject: *(id*)datum];
break;
default:
[op encodeValueOfObjCType: type at: datum];
}
}
void decoder(int argnum, void *datum, const char *type, int flags)
{
c_self_t = (NSConnection_t *)c_self;
if (type == 0)
{
if (ip != nil)
{
[c_self _doneInRmc: ip];
/* this must be here to avoid trashing alloca'ed retframe */
ip = (id)-1;
c_self_t->_repInCount++; /* received a reply */
}
return;
}
/* If we didn't get the reply packet yet, get it now. */
if (ip == nil)
{
if (c_self_t->_isValid == NO)
{
[NSException raise: NSGenericException
format: @"connection waiting for request was shut down"];
}
ip = [c_self _getReplyRmc: seq_num];
/*
* Find out if the server is returning an exception instead
* of the return values.
*/
[ip decodeValueOfObjCType: @encode(BOOL) at: &is_exception];
if (is_exception == YES)
{
/* Decode the exception object, and raise it. */
id exc;
[ip decodeValueOfObjCType: @encode(id) at: &exc];
[c_self _doneInRmc: ip];
ip = (id)-1;
/* xxx Is there anything else to clean up in
dissect_method_return()? */
[exc raise];
}
}
if (*type == _C_PTR)
else
[ip decodeValueOfObjCType: type+1 at: datum];
[ip decodeValueOfObjCType: type at: datum];
/* -decodeValueOfObjCType:at: malloc's new memory
for pointers. We need to make sure it gets freed eventually
so we don't have a memory leak. Request here that it be
autorelease'ed. Also autorelease created objects. */
if (second_decode == NO)
{
if ((*type == _C_CHARPTR || *type == _C_PTR) && *(void**)datum != 0)
[NSData dataWithBytesNoCopy: *(void**)datum length: 1];
}
else if (*type == _C_ID)
AUTORELEASE(*(id*)datum);
}
#endif
static void retDecoder(DOContext *ctxt)
{
NSPortCoder *coder = ctxt->decoder;

View file

@ -52,11 +52,15 @@ struct _ucc_ {unichar from; char to;};
// The rest of the GNUstep code stores UNICODE in internal byte order,
// so we do the same. This should be UCS-2-INTERNAL for libiconv
#ifdef WORDS_BIGENDIAN
#define UNICODE_ENC "UNICODEBIG"
#define UNICODE_INT "UNICODEBIGL"
#else
#define UNICODE_ENC "UNICODELITTLE"
#define UNICODE_INT "UNICODELITTLE"
#endif
#define UNICODE_ENC ((unicode_enc) ? unicode_enc : internal_unicode_enc())
static const char *unicode_enc = NULL;
#endif
@ -174,6 +178,8 @@ const struct _strenc_ str_encoding_table[]=
{0, "Unknown encoding"}
};
NSStringEncoding *GetAvailableEncodings()
{
// FIXME: This should check which iconv definitions are available and
@ -279,6 +285,30 @@ GetEncodingName(NSStringEncoding encoding)
#ifdef HAVE_ICONV
/* Check to see what type of internal unicode format the library supports */
static const char *
internal_unicode_enc()
{
iconv_t conv;
unicode_enc = UNICODE_INT;
conv = iconv_open(unicode_enc, "ASCII");
if (conv != (iconv_t)-1)
{
iconv_close(conv);
return unicode_enc;
}
unicode_enc = "UCS-2-INTERNAL";
conv = iconv_open(unicode_enc, "ASCII");
if (conv != (iconv_t)-1)
{
iconv_close(conv);
return unicode_enc;
}
unicode_enc = "UCS-2";
/* This had better work */
return unicode_enc;
}
static char *
iconv_stringforencoding(NSStringEncoding enc)
{

4
configure vendored
View file

@ -5463,7 +5463,7 @@ else
echo "$ac_t""no" 1>&6
fi
if test x"$av_cv_lib_giconv_main" = xyes; then
if test x"$ac_cv_lib_giconv_main" = xyes; then
cat >> confdefs.h <<\EOF
#define HAVE_ICONV 1
EOF
@ -5516,7 +5516,7 @@ else
echo "$ac_t""no" 1>&6
fi
if test x"$av_cv_lib_iconv_main" = xyes; then
if test x"$ac_cv_lib_iconv_main" = xyes; then
cat >> confdefs.h <<\EOF
#define HAVE_ICONV 1
EOF

View file

@ -916,12 +916,12 @@ if test $ac_cv_func_iconv = no; then
# BSDs install this lib as libgiconv
AC_CHECK_LIB(giconv, main)
if test x"$av_cv_lib_giconv_main" = xyes; then
if test x"$ac_cv_lib_giconv_main" = xyes; then
AC_DEFINE(HAVE_ICONV)
AC_DEFINE(HAVE_GICONV_H)
else
AC_CHECK_LIB(iconv, main)
if test x"$av_cv_lib_iconv_main" = xyes; then
if test x"$ac_cv_lib_iconv_main" = xyes; then
AC_DEFINE(HAVE_ICONV)
fi
fi