Use yaz_read_UTF8_char instead of xmlGetUTF8Char
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 4 Aug 2006 14:35:39 +0000 (14:35 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 4 Aug 2006 14:35:39 +0000 (14:35 +0000)
include/yaz/yaz-iconv.h
src/nfaxml.c
src/siconv.c

index b629e92..599f8ad 100644 (file)
@@ -23,7 +23,7 @@
  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  * OF THIS SOFTWARE.
  *
- * $Id: yaz-iconv.h,v 1.9 2006-04-19 23:15:39 adam Exp $
+ * $Id: yaz-iconv.h,v 1.10 2006-08-04 14:35:39 adam Exp $
  */
 /**
  * \file yaz-iconv.h
@@ -69,6 +69,11 @@ YAZ_EXPORT int yaz_matchstr(const char *s1, const char *s2);
 
 YAZ_EXPORT int yaz_strcmp_del(const char *a, const char *b, const char *b_del);
 
+YAZ_EXPORT unsigned long yaz_read_UTF8_char(unsigned char *inp,
+                                            size_t inbytesleft,
+                                            size_t *no_read,
+                                            int *error);
+
 YAZ_END_CDECL
 
 #endif
index 94ef5e6..8a49693 100644 (file)
@@ -1,7 +1,7 @@
 /*  Copyright (C) 2006, Index Data ApS
  *  See the file LICENSE for details.
  * 
- *  $Id: nfaxml.c,v 1.9 2006-07-14 13:06:38 heikki Exp $ 
+ *  $Id: nfaxml.c,v 1.10 2006-08-04 14:35:40 adam Exp $ 
  */
 
 /**
@@ -22,6 +22,7 @@
 #include <yaz/nmem.h> 
 #include <yaz/yconfig.h>
 #include <yaz/nfa.h>
+#include <yaz/yaz-iconv.h>
 #include <yaz/nfaxml.h>
 #include <yaz/libxml2_error.h>
 
@@ -34,14 +35,14 @@ static int utf16_content(xmlNodePtr node, yaz_nfa_char *buf, int maxlen,
 {
     int bufidx=0;
     xmlChar *content = xmlNodeGetContent(node);
-    xmlChar *cp=content;
-    int conlen=strlen((char *)content);
-    int len;
-    int res;
-    while (*cp && (bufidx<maxlen) ) {
-        len=conlen;
-        res=xmlGetUTF8Char(cp,&len);
-        if (res==-1) {
+    xmlChar *cp = content;
+    size_t conlen = strlen((char *)content);
+    while (*cp && bufidx<maxlen )
+    {
+        int error;
+        size_t no_read;
+        int res = yaz_read_UTF8_char(cp, conlen, &no_read, &error);
+        if (res == 0) {
             /* should be caught earlier */
             yaz_log(YLOG_FATAL,"Illegal utf-8 sequence "
                     "%d bytes into '%s' in %s, rule %d ",
@@ -49,9 +50,9 @@ static int utf16_content(xmlNodePtr node, yaz_nfa_char *buf, int maxlen,
             xmlFree(content);
             return -1;
         }
-        buf[bufidx++]=res;
-        cp +=len;
-        conlen -=len;
+        buf[bufidx++] = res;
+        cp += no_read;
+        conlen -= no_read;
     }
     buf[bufidx]=0;
     xmlFree(content);
@@ -65,31 +66,28 @@ static int parse_range(xmlNodePtr node,
 {
     xmlChar *content = xmlNodeGetContent(node);
     xmlChar *cp=content;
-    int conlen=strlen((char *)content);
-    int len;
-    int res;
-    len=conlen;
-    res=xmlGetUTF8Char(cp,&len);
-    if ( res != -1 ) {
+    size_t conlen = strlen((char *)content);
+    size_t no_read;
+    int error;
+    int res = yaz_read_UTF8_char(cp, conlen, &no_read, &error);
+    if ( res != 0 ) {
         *range_start=res;
-        cp +=len;
-        conlen -=len;
-        len=conlen;
-        res=xmlGetUTF8Char(cp,&len);
+        cp += no_read;
+        conlen -= no_read;
+        res = yaz_read_UTF8_char(cp, conlen, &no_read, &error);
         if (res != '-' )
-            res = -1;
+            res = 0;
     }
-    if ( res != -1 ) {
-        cp +=len;
-        conlen -=len;
-        len=conlen;
-        res=xmlGetUTF8Char(cp,&len);
+    if ( res != 0 ) {
+        cp += no_read;
+        conlen -= no_read;
+        res = yaz_read_UTF8_char(cp, conlen, &no_read, &error);
     }
-    if ( res != -1 ) {
-        *range_end=res;
+    if ( res != 0) {
+        *range_end = res;
     }
     xmlFree(content);
-    if (res==-1) {
+    if (res == 0) {
         yaz_log(YLOG_FATAL,"Illegal range. '%s'. Must be like 'a-z' "
                 "'in %s, rule %d ",
                 content, filename, rulenumber);
index 7b2bf0f..ba54b16 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2006, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: siconv.c,v 1.23 2006-05-09 21:37:02 adam Exp $
+ * $Id: siconv.c,v 1.24 2006-08-04 14:35:40 adam Exp $
  */
 /**
  * \file siconv.c
@@ -198,8 +198,9 @@ static size_t yaz_init_UTF8 (yaz_iconv_t cd, unsigned char *inp,
     return 0;
 }
 
-static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
-                                    size_t inbytesleft, size_t *no_read)
+unsigned long yaz_read_UTF8_char(unsigned char *inp,
+                                 size_t inbytesleft, size_t *no_read,
+                                 int *error)
 {
     unsigned long x = 0;
 
@@ -211,7 +212,7 @@ static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
     else if (inp[0] <= 0xbf || inp[0] >= 0xfe)
     {
         *no_read = 0;
-        cd->my_errno = YAZ_ICONV_EILSEQ;
+        *error = YAZ_ICONV_EILSEQ;
     }
     else if (inp[0] <= 0xdf && inbytesleft >= 2)
     {
@@ -221,7 +222,7 @@ static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
         else
         {
             *no_read = 0;
-            cd->my_errno = YAZ_ICONV_EILSEQ;
+            *error = YAZ_ICONV_EILSEQ;
         }
     }
     else if (inp[0] <= 0xef && inbytesleft >= 3)
@@ -233,7 +234,7 @@ static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
         else
         {
             *no_read = 0;
-            cd->my_errno = YAZ_ICONV_EILSEQ;
+            *error = YAZ_ICONV_EILSEQ;
         }
     }
     else if (inp[0] <= 0xf7 && inbytesleft >= 4)
@@ -245,7 +246,7 @@ static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
         else
         {
             *no_read = 0;
-            cd->my_errno = YAZ_ICONV_EILSEQ;
+            *error = YAZ_ICONV_EILSEQ;
         }
     }
     else if (inp[0] <= 0xfb && inbytesleft >= 5)
@@ -258,7 +259,7 @@ static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
         else
         {
             *no_read = 0;
-            cd->my_errno = YAZ_ICONV_EILSEQ;
+            *error = YAZ_ICONV_EILSEQ;
         }
     }
     else if (inp[0] <= 0xfd && inbytesleft >= 6)
@@ -271,17 +272,23 @@ static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
         else
         {
             *no_read = 0;
-            cd->my_errno = YAZ_ICONV_EILSEQ;
+            *error = YAZ_ICONV_EILSEQ;
         }
     }
     else
     {
         *no_read = 0;
-        cd->my_errno = YAZ_ICONV_EINVAL;
+        *error = YAZ_ICONV_EINVAL;
     }
     return x;
 }
 
+static unsigned long yaz_read_UTF8 (yaz_iconv_t cd, unsigned char *inp,
+                                    size_t inbytesleft, size_t *no_read)
+{
+    return yaz_read_UTF8_char(inp, inbytesleft, no_read, &cd->my_errno);
+}
+
 static unsigned long yaz_read_UCS4 (yaz_iconv_t cd, unsigned char *inp,
                                     size_t inbytesleft, size_t *no_read)
 {