This is the mail archive of the libc-alpha@sourceware.cygnus.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: utf-16 iconv requires aligned buffer



Thanks for fixing that, Ulrich. But your put16 and put32 macros look like
they contain typos. Here is a fix for this.

Also, I think you wouldn't need get32/put32 on the "INTERNAL" side of each
converter, if the internal buffers were allocated aligned (at gconv_open.c:78).

Bruno



2000-03-29  Bruno Haible  <haible@clisp.cons.org>

	* iconv/loop.c (put16): Remove __const. Fix access index.
	(put32): Remove __const. Use uint32_t instead of uint16_t.
	* iconv/skeleton.c: Likewise.

*** iconv/loop.c.bak	Wed Mar 29 17:14:36 2000
--- iconv/loop.c	Wed Mar 29 17:46:54 2000
***************
*** 84,101 ****
  
  # define put16(addr, val) \
       ({ uint16_t __val = (val);						      \
! 	((__const unsigned char *) (addr))[0] = __val;			      \
! 	((__const unsigned char *) (addr))[1] = __val >> 8;		      \
  	(void) 0; })
  # define put32(addr, val) \
!      ({ uint16_t __val = (val);						      \
! 	((__const unsigned char *) (addr))[0] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[1] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[2] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[3] = __val;			      \
  	(void) 0; })
  # else
  #  define get16(addr) \
--- 84,101 ----
  
  # define put16(addr, val) \
       ({ uint16_t __val = (val);						      \
! 	((unsigned char *) (addr))[0] = __val;				      \
! 	((unsigned char *) (addr))[1] = __val >> 8;			      \
  	(void) 0; })
  # define put32(addr, val) \
!      ({ uint32_t __val = (val);						      \
! 	((unsigned char *) (addr))[0] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[1] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[2] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[3] = __val;				      \
  	(void) 0; })
  # else
  #  define get16(addr) \
***************
*** 109,126 ****
  
  # define put16(addr, val) \
       ({ uint16_t __val = (val);						      \
! 	((__const unsigned char *) (addr))[1] = __val;			      \
! 	((__const unsigned char *) (addr))[2] = __val >> 8;		      \
  	(void) 0; })
  # define put32(addr, val) \
!      ({ uint16_t __val = (val);						      \
! 	((__const unsigned char *) (addr))[3] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[2] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[1] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[0] = __val;			      \
  	(void) 0; })
  # endif
  
--- 109,126 ----
  
  # define put16(addr, val) \
       ({ uint16_t __val = (val);						      \
! 	((unsigned char *) (addr))[1] = __val;				      \
! 	((unsigned char *) (addr))[0] = __val >> 8;			      \
  	(void) 0; })
  # define put32(addr, val) \
!      ({ uint32_t __val = (val);						      \
! 	((unsigned char *) (addr))[3] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[2] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[1] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[0] = __val;				      \
  	(void) 0; })
  # endif
  
*** iconv/skeleton.c.bak	Wed Mar 29 17:14:36 2000
--- iconv/skeleton.c	Wed Mar 29 17:47:50 2000
***************
*** 142,159 ****
  
  # define put16(addr, val) \
       ({ uint16_t __val = (val);						      \
! 	((__const unsigned char *) (addr))[0] = __val;			      \
! 	((__const unsigned char *) (addr))[1] = __val >> 8;		      \
  	(void) 0; })
  # define put32(addr, val) \
!      ({ uint16_t __val = (val);						      \
! 	((__const unsigned char *) (addr))[0] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[1] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[2] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[3] = __val;			      \
  	(void) 0; })
  # else
  #  define get16(addr) \
--- 142,159 ----
  
  # define put16(addr, val) \
       ({ uint16_t __val = (val);						      \
! 	((unsigned char *) (addr))[0] = __val;				      \
! 	((unsigned char *) (addr))[1] = __val >> 8;			      \
  	(void) 0; })
  # define put32(addr, val) \
!      ({ uint32_t __val = (val);						      \
! 	((unsigned char *) (addr))[0] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[1] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[2] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[3] = __val;				      \
  	(void) 0; })
  # else
  #  define get16(addr) \
***************
*** 167,184 ****
  
  # define put16(addr, val) \
       ({ uint16_t __val = (val);						      \
! 	((__const unsigned char *) (addr))[1] = __val;			      \
! 	((__const unsigned char *) (addr))[2] = __val >> 8;		      \
  	(void) 0; })
  # define put32(addr, val) \
!      ({ uint16_t __val = (val);						      \
! 	((__const unsigned char *) (addr))[3] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[2] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[1] = __val;			      \
  	__val >>= 8;							      \
! 	((__const unsigned char *) (addr))[0] = __val;			      \
  	(void) 0; })
  # endif
  #endif
--- 167,184 ----
  
  # define put16(addr, val) \
       ({ uint16_t __val = (val);						      \
! 	((unsigned char *) (addr))[1] = __val;				      \
! 	((unsigned char *) (addr))[0] = __val >> 8;			      \
  	(void) 0; })
  # define put32(addr, val) \
!      ({ uint32_t __val = (val);						      \
! 	((unsigned char *) (addr))[3] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[2] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[1] = __val;				      \
  	__val >>= 8;							      \
! 	((unsigned char *) (addr))[0] = __val;				      \
  	(void) 0; })
  # endif
  #endif

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]