/* -*- Mode: c; c-basic-offset: 2 -*- * * raptor_nfc_test.c - Raptor Unicode NFC validation check * * $Id$ * * Copyright (C) 2004 David Beckett - http://purl.org/net/dajobe/ * Institute for Learning and Research Technology - http://www.ilrt.org/ * University of Bristol - http://www.bristol.ac.uk/ * * This package is Free Software or Open Source available under the * following licenses (these are alternatives): * 1. GNU Lesser General Public License (LGPL) * 2. GNU General Public License (GPL) * 3. Mozilla Public License (MPL) * * See LICENSE.html or LICENSE.txt at the top of this package for the * full license terms. * */ #ifdef HAVE_CONFIG_H #include #endif #ifdef WIN32 #include #endif #include #include #include /* for isprint() */ #include #ifdef HAVE_ERRNO_H #include #endif /* Raptor includes */ #include "raptor.h" #include "raptor_internal.h" #include "raptor_nfc.h" #undef RAPTOR_NFC_DECODE_DEBUG /** * utf8_string: destination utf8 buffer (FIXME big enough!) * unicode_string: first char of string * end: last char of unicode_string */ static int decode_to_utf8(unsigned char *utf8_string, size_t utf8_string_length, const char *unicode_string, const char *end) { unsigned char *u=utf8_string; const char *p=unicode_string; #ifdef RAPTOR_NFC_DECODE_DEBUG fputs("decode_to_utf8: string '", stderr); fwrite(unicode_string, sizeof(char), (end-unicode_string)+1, stderr); fputs("' converts to:\n ", stderr); #endif while(p < end) { unsigned long c=0; char *endptr; if(*p == ' ') { p++; continue; } c=(unsigned long)strtol(p, &endptr, 16); #ifdef RAPTOR_NFC_DECODE_DEBUG fprintf(stderr, "U+%04lX ", c); #endif p=(unsigned char*)endptr; u+= raptor_unicode_char_to_utf8(c, u); if((u-utf8_string) > utf8_string_length) { fprintf(stderr, "decode_to_utf8 overwote utf8_string buffer at byte %d\n", (u-utf8_string)); abort(); } } #ifdef RAPTOR_NFC_DECODE_DEBUG fputs("\n", stderr); #endif return u-utf8_string; } static void utf8_print(const unsigned char *input, int length, FILE *stream) { int i=0; while(i max_c2_len) max_c2_len=nfc1_len; /* skip column 3 */ while(*p++ != ';') ; start=p; /* find end column 4 */ while(*p++ != ';') ; nfc2_len=decode_to_utf8(nfc2, UNISTR_SIZE, start, p-1); if(nfc2_len > max_c4_len) max_c4_len=nfc2_len; nfc_rc=raptor_nfc_check(nfc1, nfc1_len, &error); if(!nfc_rc) { fprintf(stderr, "%s:%d: NFC check 1 failed on: '", filename, line); utf8_print(nfc1, nfc1_len, stderr); fprintf(stderr, "' at byte %d of %d\n", error, (int)nfc1_len); fails++; } else passes++; if(nfc1_len == nfc2_len && !memcmp(nfc1, nfc2, nfc1_len)) continue; nfc_rc=raptor_nfc_check(nfc2, nfc2_len, &error); if(!nfc_rc) { fprintf(stderr, "%s:%d: NFC check 2 failed on: '", filename, line); utf8_print(nfc2, nfc2_len, stderr); fprintf(stderr, "' at byte %d of %d\n", error, (int)nfc2_len); fails++; } else passes++; } fclose(fh); fprintf(stderr, "%s: max c2 len: %d, max c4 len: %d\n", program, (int)max_c2_len, (int)max_c4_len); fprintf(stderr, "%s: passes: %d fails: %d\n", program, passes, fails); return rc; }