/*
- * Copyright (C) 1995-2007, Index Data ApS
+ * Copyright (C) 1995-2008, Index Data ApS
* See the file LICENSE for details.
*
* $Id: siconv.c,v 1.50 2008-03-12 08:53:28 adam Exp $
int *comb)
{
*no_read = 0;
- while(inbytesleft >= 1 && inp[0] == 27)
+ while (inbytesleft > 0 && *inp == 27)
{
- int ch;
+ int *modep = &cd->g0_mode;
size_t inbytesleft0 = inbytesleft;
- inp++;
+
inbytesleft--;
- if (inbytesleft > 0 && *inp == '$')
+ inp++;
+ if (inbytesleft == 0)
+ goto incomplete;
+ if (*inp == '$') /* set with multiple bytes */
{
inbytesleft--;
inp++;
}
- if (inbytesleft <= 1)
+ if (inbytesleft == 0)
+ goto incomplete;
+ if (*inp == '(' || *inp == ',') /* G0 */
{
- *no_read = 0;
- cd->my_errno = YAZ_ICONV_EINVAL;
- return 0;
+ inbytesleft--;
+ inp++;
}
- inbytesleft--;
- ch = *inp++;
- if (inbytesleft > 0 && (ch == '(' || ch == ','))
+ else if (*inp == ')' || *inp == '-') /* G1 */
{
inbytesleft--;
- cd->g0_mode = *inp++;
+ inp++;
+ modep = &cd->g1_mode;
}
- else if (inbytesleft > 0 && (ch == ')' || ch == '-'))
+ if (inbytesleft == 0)
+ goto incomplete;
+ if (*inp == '!') /* ANSEL is a special case */
{
inbytesleft--;
- cd->g1_mode = *inp++;
+ inp++;
}
- else
- cd->g0_mode = ch;
+ if (inbytesleft == 0)
+ goto incomplete;
+ *modep = *inp++; /* Final character */
+ inbytesleft--;
(*no_read) += inbytesleft0 - inbytesleft;
}
- if (inbytesleft <= 0)
+ if (inbytesleft == 0)
return 0;
else if (*inp == ' ')
{
*no_read += no_read_sub;
return x;
}
+incomplete:
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EINVAL;
+ return 0;
}
static size_t yaz_write_UTF8(yaz_iconv_t cd, unsigned long x,
outbuf - outbuf0, outbuf0);
}
-static int tst_convert(yaz_iconv_t cd, const char *buf, const char *cmpbuf)
+static int tst_convert_x(yaz_iconv_t cd, const char *buf, const char *cmpbuf,
+ int expect_error)
{
- int ret = 0;
+ int ret = 1;
WRBUF b = wrbuf_alloc();
char outbuf[12];
size_t inbytesleft = strlen(buf);
{
int e = yaz_iconv_error(cd);
if (e != YAZ_ICONV_E2BIG)
+ {
+ if (expect_error != -1)
+ if (e != expect_error)
+ ret = 0;
break;
+ }
}
else
{
char *outp = outbuf;
r = yaz_iconv(cd, 0, 0, &outp, &outbytesleft);
wrbuf_write(b, outbuf, outp - outbuf);
+ if (expect_error != -1)
+ if (expect_error)
+ ret = 0;
break;
}
}
if (wrbuf_len(b) == strlen(cmpbuf)
&& !memcmp(cmpbuf, wrbuf_buf(b), wrbuf_len(b)))
- ret = 1;
+ ;
else
{
WRBUF w = wrbuf_alloc();
+ ret = 0;
wrbuf_rewind(w);
wrbuf_puts_escaped(w, buf);
yaz_log(YLOG_LOG, "input %s", wrbuf_cstr(w));
return ret;
}
+static int tst_convert(yaz_iconv_t cd, const char *buf, const char *cmpbuf)
+{
+ return tst_convert_x(cd, buf, cmpbuf, 0);
+}
/* some test strings in ISO-8859-1 format */
static const char *iso_8859_1_a[] = {
if (!cd)
return;
- /* bug #2115 */
- YAZ_CHECK(tst_convert(cd, ESC "(N" ESC ")Qp" ESC "(B", "\xd0\x9f"));
-
-
YAZ_CHECK(tst_convert(cd, "Cours de math",
"Cours de math"));
/* COMBINING ACUTE ACCENT */
YAZ_CHECK(tst_convert(cd, "Cours de mathâe",
"Cours de mathe\xcc\x81"));
- YAZ_CHECK(tst_convert(cd, "a\xea\x1e", "a\x1e\xcc\x8a"));
+ YAZ_CHECK(tst_convert(cd, "\xea" "a", "a\xcc\x8a"));
+ YAZ_CHECK(tst_convert(cd, "a" "\xea" "\x1e", "a" "\x1e\xcc\x8a"));
+ YAZ_CHECK(tst_convert(cd, "a" "\xea" "p", "a" "p\xcc\x8a"));
+
+ YAZ_CHECK(tst_convert_x(cd, "a\xea", "a", YAZ_ICONV_EINVAL));
+ YAZ_CHECK(tst_convert(cd, "p", "\xcc\x8a")); /* note: missing p */
+ yaz_iconv(cd, 0, 0, 0, 0); /* incomplete. so we have to reset */
+
+ /* bug #2115 */
+ YAZ_CHECK(tst_convert(cd, ESC "(N" ESC ")Qp" ESC "(B", "\xd0\x9f"));
- YAZ_CHECK(tst_convert(cd, "a\xea", "a"));
+ YAZ_CHECK(tst_convert_x(cd, ESC , "", YAZ_ICONV_EINVAL));
+ YAZ_CHECK(tst_convert_x(cd, ESC "(", "", YAZ_ICONV_EINVAL));
+ YAZ_CHECK(tst_convert_x(cd, ESC "(B", "", 0));
yaz_iconv_close(cd);
}