* Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: siconv.c,v 1.17 2006-02-10 12:45:39 adam Exp $
+ * $Id: siconv.c,v 1.18 2006-03-25 14:41:53 adam Exp $
*/
/**
* \file siconv.c
int last)
{
unsigned char *outp = (unsigned char *) *outbuf;
+
if (x <= 0x7f && *outbytesleft >= 1)
{
*outp++ = (unsigned char) x;
};
unsigned char *outp = (unsigned char *) *outbuf;
- if (!last && x > 32 && x < 127 && cd->compose_char == 0)
- {
- cd->compose_char = x;
- return 0;
- }
- else if (cd->compose_char)
+ if (cd->compose_char)
{
int i;
for (i = 0; comb[i].x1; i++)
x = comb[i].y;
break;
}
+ if (*outbytesleft < 1)
+ { /* no room. Retain compose_char and bail out */
+ cd->my_errno = YAZ_ICONV_E2BIG;
+ return (size_t)(-1);
+ }
if (!comb[i].x1)
- { /* not found */
- if (*outbytesleft >= 1)
- {
- *outp++ = (unsigned char) cd->compose_char;
- (*outbytesleft)--;
- *outbuf = (char *) outp;
- if (!last && x > 32 && x < 127)
- {
- cd->compose_char = x;
- return 0;
- }
- }
- else
- {
- cd->my_errno = YAZ_ICONV_E2BIG;
- return (size_t)(-1);
- }
+ { /* not found. Just write compose_char */
+ *outp++ = (unsigned char) cd->compose_char;
+ (*outbytesleft)--;
+ *outbuf = (char *) outp;
}
- /* compose_char and old x combined to one new char: x */
+ /* compose_char used so reset it. x now holds current char */
cd->compose_char = 0;
}
- if (x > 255 || x < 1)
+
+ if (!last && x > 32 && x < 127 && cd->compose_char == 0)
{
- cd->my_errno = YAZ_ICONV_EILSEQ;
- return (size_t) -1;
+ cd->compose_char = x;
+ return 0;
}
- else if (*outbytesleft >= 1)
+ else if (x > 255 || x < 1)
{
- *outp++ = (unsigned char) x;
- (*outbytesleft)--;
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ return (size_t) -1;
}
- else
+ else if (*outbytesleft < 1)
{
cd->my_errno = YAZ_ICONV_E2BIG;
return (size_t)(-1);
}
+ *outp++ = (unsigned char) x;
+ (*outbytesleft)--;
*outbuf = (char *) outp;
return 0;
}
{
char *inbuf0;
size_t r = 0;
+
#if HAVE_ICONV_H
if (cd->iconv_cd)
{
{
/* unable to write it. save it because read_handle cannot
rewind .. */
- cd->unget_x = x;
- cd->no_read_x = no_read;
- break;
+ if (cd->my_errno == YAZ_ICONV_E2BIG)
+ {
+ cd->unget_x = x;
+ cd->no_read_x = no_read;
+ break;
+ }
}
cd->unget_x = 0;
}