From 732c8c36e8e6063ad3a3003068824428c9dc55b6 Mon Sep 17 00:00:00 2001 From: bfernhomberg Date: Thu, 6 Nov 2003 09:23:35 +0000 Subject: [PATCH] unicode endian fixes --- libatalk/unicode/byteorder.h | 18 ++++++++++++++++++ libatalk/unicode/charcnv.c | 8 ++++---- libatalk/unicode/iconv.c | 3 ++- libatalk/unicode/util_unistr.c | 1 + 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/libatalk/unicode/byteorder.h b/libatalk/unicode/byteorder.h index 11e6681e..3cf3dccf 100644 --- a/libatalk/unicode/byteorder.h +++ b/libatalk/unicode/byteorder.h @@ -20,6 +20,7 @@ #ifndef _BYTEORDER_H #define _BYTEORDER_H +#include /* This file implements macros for machine independent short and @@ -113,6 +114,21 @@ it also defines lots of intermediate macros, just ignore those :-) #if CAREFUL_ALIGNMENT +#if BYTE_ORDER==BIG_ENDIAN + +#define SVAL(buf,pos) (PVAL(buf,(pos)+1)|PVAL(buf,pos)<<8) +#define IVAL(buf,pos) (SVAL(buf,pos)|SVAL(buf,(pos)+2)<<16) +#define SSVALX(buf,pos,val) (CVAL_NC(buf,pos+1)=(unsigned char)((val)&0xFF),CVAL_NC(buf,pos)=(unsigned char)((val)>>8)) +#define SIVALX(buf,pos,val) (SSVALX(buf,pos,val&0xFFFF),SSVALX(buf,pos+2,val>>16)) +#define SVALS(buf,pos) ((int16)SVAL(buf,pos)) +#define IVALS(buf,pos) ((int32_t)IVAL(buf,pos)) +#define SSVAL(buf,pos,val) SSVALX((buf),(pos),((u_int16_t)(val))) +#define SIVAL(buf,pos,val) SIVALX((buf),(pos),((u_int32_t)(val))) +#define SSVALS(buf,pos,val) SSVALX((buf),(pos),((int16)(val))) +#define SIVALS(buf,pos,val) SIVALX((buf),(pos),((int32_t)(val))) + +#else + #define SVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+1)<<8) #define IVAL(buf,pos) (SVAL(buf,pos)|SVAL(buf,(pos)+2)<<16) #define SSVALX(buf,pos,val) (CVAL_NC(buf,pos)=(unsigned char)((val)&0xFF),CVAL_NC(buf,pos+1)=(unsigned char)((val)>>8)) @@ -124,6 +140,8 @@ it also defines lots of intermediate macros, just ignore those :-) #define SSVALS(buf,pos,val) SSVALX((buf),(pos),((int16)(val))) #define SIVALS(buf,pos,val) SIVALX((buf),(pos),((int32_t)(val))) +#endif + #else /* CAREFUL_ALIGNMENT */ /* this handles things for architectures like the 386 that can handle diff --git a/libatalk/unicode/charcnv.c b/libatalk/unicode/charcnv.c index 797c6b75..c6dd068e 100644 --- a/libatalk/unicode/charcnv.c +++ b/libatalk/unicode/charcnv.c @@ -116,7 +116,7 @@ static const char *charset_name(charset_t ch) ret = ln; } #else /* system doesn't have LOCALE support */ -ret = NULL; +if (ch == CH_UNIX) ret = NULL; #endif if (!ret || !*ret) ret = "ASCII"; @@ -423,12 +423,12 @@ convert: /* Terminate the string */ if (to == CH_UCS2 && destlen-o_len >= 2) { - *(++outbuf) = 0; - *outbuf = 0; + ob[destlen] = 0; + ob[destlen+1] = 0; *dest = (char *)realloc(ob,destlen+2); } else if ( destlen-o_len > 0) { - *(++outbuf) = 0; + ob[destlen] = 0; *dest = (char *)realloc(ob,destlen+1); } diff --git a/libatalk/unicode/iconv.c b/libatalk/unicode/iconv.c index 924f2d43..6411c903 100644 --- a/libatalk/unicode/iconv.c +++ b/libatalk/unicode/iconv.c @@ -380,10 +380,11 @@ static size_t ascii_pull(void *cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) { ucs2_t curchar; + while (*inbytesleft >= 1 && *outbytesleft >= 2) { if ((unsigned char)(*inbuf)[0] < 0x80) { curchar = (ucs2_t) (*inbuf)[0]; - SSVAL((*outbuf),0,curchar); + SSVAL((*outbuf),0,curchar); } else { errno = EILSEQ; diff --git a/libatalk/unicode/util_unistr.c b/libatalk/unicode/util_unistr.c index 7276b95c..92ee1b3f 100644 --- a/libatalk/unicode/util_unistr.c +++ b/libatalk/unicode/util_unistr.c @@ -15,6 +15,7 @@ #include #include "ucs2_casetable.h" #include "precompose.h" +#include "byteorder.h" ucs2_t toupper_w(ucs2_t val) -- 2.39.2