diff options
Diffstat (limited to 'extra/libtextcat')
-rw-r--r-- | extra/libtextcat/PKGBUILD | 50 | ||||
-rw-r--r-- | extra/libtextcat/fpdb.conf | 86 | ||||
-rw-r--r-- | extra/libtextcat/libtextcat-2.2-OOo.patch | 634 | ||||
-rw-r--r-- | extra/libtextcat/libtextcat-2.2-exportapi.patch | 305 |
4 files changed, 1075 insertions, 0 deletions
diff --git a/extra/libtextcat/PKGBUILD b/extra/libtextcat/PKGBUILD new file mode 100644 index 000000000..dfccfb8db --- /dev/null +++ b/extra/libtextcat/PKGBUILD @@ -0,0 +1,50 @@ +# $Id: PKGBUILD 122957 2011-05-07 14:06:48Z andyrtr $ +# Maintainer: AndyRTR <andyrtr@archlinux.org> +# Contributor: Alexander Fehr <pizzapunk gmail com> +# Contributor: William Rea <sillywilly@gmail.com> +# Contributor: Daniel J Griffiths <ghost1227@archlinux.us> + +pkgname=libtextcat +pkgver=2.2 +pkgrel=8 +pkgdesc="Library that implements N-gram-based text categorization" +arch=('i686' 'x86_64') +url="http://software.wise-guys.nl/libtextcat/" +license=('BSD') +depends=('glibc') +options=(!libtool) +source=(http://software.wise-guys.nl/download/${pkgname}-${pkgver}.tar.gz + # from http://hg.services.openoffice.org/hg/DEV300/raw-file/tip/libtextcat/data/new_fingerprints/fpdb.conf + fpdb.conf + libtextcat-2.2-exportapi.patch + libtextcat-2.2-OOo.patch) +md5sums=('128cfc86ed5953e57fe0f5ae98b62c2e' + 'f4fafe97d3aa184f5476e4918dba045d' + '4c46fcb825ec13e9f7ae3728f5f4c834' + '1d5f1026392365c58f7a7406e923f886') + +build() { + cd ${srcdir}/${pkgname}-${pkgver} + patch -Np1 -i ${srcdir}/libtextcat-2.2-exportapi.patch + patch -Np1 -i ${srcdir}/libtextcat-2.2-OOo.patch + autoreconf -fi + ./configure --prefix=/usr \ + --disable-static + make +} + +package() { + cd ${srcdir}/${pkgname}-${pkgver} + make DESTDIR=${pkgdir} install +# install -D -m644 src/textcat.h ${pkgdir}/usr/include/textcat.h + + install -dm755 ${pkgdir}/usr/share/libtextcat/{LM,ShortTexts} + install -m644 ${srcdir}/fpdb.conf ${pkgdir}/usr/share/libtextcat + install -m644 langclass/conf.txt ${pkgdir}/usr/share/libtextcat + install -m644 langclass/LM/*.lm ${pkgdir}/usr/share/libtextcat/LM + install -m644 langclass/ShortTexts/*.txt ${pkgdir}/usr/share/libtextcat/ShortTexts + + install -D -m644 LICENSE ${pkgdir}/usr/share/licenses/${pkgname}/LICENSE + sed -i 's|LM|/usr/share/libtextcat/LM|' ${pkgdir}/usr/share/libtextcat/conf.txt +} + diff --git a/extra/libtextcat/fpdb.conf b/extra/libtextcat/fpdb.conf new file mode 100644 index 000000000..329184d51 --- /dev/null +++ b/extra/libtextcat/fpdb.conf @@ -0,0 +1,86 @@ +# +# A sample config file for the language models +# provided with Gertjan van Noords language guesser +# (http://odur.let.rug.nl/~vannoord/TextCat/) +# +# Notes: +# - You may consider eliminating a couple of small languages from this +# list because they cause false positives with big languages and are +# bad for performance. (Do you really want to recognize Drents?) +# - Putting the most probable languages at the top of the list +# improves performance, because this will raise the threshold for +# likely candidates more quickly. +# + +# this file have been modified (to OOo by Jocelyn MERAND joc.mer@gmail.com) to include country and encoding +# guess strings are made as following : language-country-encoding + +afrikaans.lm af--utf8 +albanian.lm sq--utf8 +amharic_utf.lm am--utf8 +arabic.lm ar--utf8 +basque.lm eu--utf8 +belarus.lm be--utf8 +bosnian.lm bs--utf8 +breton.lm br--utf8 +catalan.lm ca--utf8 +chinese_simplified.lm zh-CN-utf8 +chinese_traditional.lm zh-TW-utf8 +croatian.lm hr--utf8 +czech.lm cs--utf8 +danish.lm da--utf8 +dutch.lm nl--utf8 +english.lm en--utf8 +esperanto.lm eo--utf8 +estonian.lm et--utf8 +finnish.lm fi--utf8 +french.lm fr--utf8 +frisian.lm fy--utf8 +georgian.lm ka--utf8 +german.lm de--utf8 +greek.lm el--utf8 +hebrew.lm he--utf8 +hindi.lm hi--utf8 +hungarian.lm hu--utf8 +icelandic.lm is--utf8 +indonesian.lm id--utf8 +irish_gaelic.lm ga--utf8 +italian.lm it--utf8 +japanese.lm ja--utf8 +korean.lm ko--utf8 +latin.lm la--utf8 +latvian.lm lv--utf8 +lithuanian.lm lt--utf8 +luxembourgish.lm lb--utf8 +malay.lm ms--utf8 +manx_gaelic.lm gv--utf8 +marathi.lm mr--utf8 +mongolian_cyrillic.lm mn--utf8 +nepali.lm ne--utf8 +norwegian.lm nb--utf8 # Norwegian (Bokmal) +persian.lm fa--utf8 # Farsi +polish.lm pl--utf8 +portuguese.lm pt-PT-utf8 +quechua.lm qu--utf8 +romanian.lm ro--utf8 +romansh.lm rm--utf8 +russian.lm ru--utf8 +sanskrit.lm sa--utf8 +scots.lm sco--utf8 +scots_gaelic.lm gd--utf8 +serbian.lm sr--utf-8 +serbian-latin.lm sh--utf-8 +slovak_ascii.lm sk-SK-utf8 +slovenian.lm sl--utf8 +spanish.lm es--utf8 +swahili.lm sw--utf8 +swedish.lm sv--utf8 +tagalog.lm tl--utf8 +tamil.lm ta--utf8 +thai.lm th--utf8 +turkish.lm tr--utf8 +ukrainian.lm uk--utf8 +vietnamese.lm vi--utf8 +welsh.lm cy--utf8 +yiddish_utf.lm yi--utf8 +zulu.lm zu--utf8 diff --git a/extra/libtextcat/libtextcat-2.2-OOo.patch b/extra/libtextcat/libtextcat-2.2-OOo.patch new file mode 100644 index 000000000..70f9d8d23 --- /dev/null +++ b/extra/libtextcat/libtextcat-2.2-OOo.patch @@ -0,0 +1,634 @@ +diff -ruN libtextcat-2.2.part1/src/constants.h libtextcat-2.2/src/constants.h +--- libtextcat-2.2.part1/src/constants.h 2007-07-25 10:46:49.000000000 +0100 ++++ libtextcat-2.2/src/constants.h 2007-07-25 10:47:25.000000000 +0100 +@@ -39,6 +39,8 @@ + */ + #include <limits.h> + ++#define _UTF8_ ++ + #define DESCRIPTION "out of place" + + /* Reported matches are those fingerprints with a score less than best +@@ -59,14 +61,21 @@ + /* Maximum number of n-grams in a fingerprint */ + #define MAXNGRAMS 400 + +-/* Maximum size of an n-gram? */ +-#define MAXNGRAMSIZE 5 ++/* Maximum number of character of an n-gram? */ ++#define MAXNGRAMSYMBOL 5 ++ ++/* Maximum size of the string representing an n-gram (must be greater than number of symbol) */ ++#ifdef _UTF8_ ++#define MAXNGRAMSIZE 20 ++#else ++#define MAXNGRAMSIZE MAXNGRAMSYMBOL ++#endif + + /* Which characters are not acceptable in n-grams? */ + #define INVALID(c) (isspace((int)c) || isdigit((int)c)) + + /* Minimum size (in characters) for accepting a document */ +-#define MINDOCSIZE 25 ++#define MINDOCSIZE 6 + + /* Maximum penalty for missing an n-gram in fingerprint */ + #define MAXOUTOFPLACE 400 +@@ -76,4 +85,7 @@ + + #define MAXSCORE INT_MAX + ++/* where the fingerprints files are stored */ ++#define DEFAULT_FINGERPRINTS_PATH "" ++ + #endif +diff -ruN libtextcat-2.2.part1/src/fingerprint.c libtextcat-2.2/src/fingerprint.c +--- libtextcat-2.2.part1/src/fingerprint.c 2007-07-25 10:46:49.000000000 +0100 ++++ libtextcat-2.2/src/fingerprint.c 2007-07-25 10:47:25.000000000 +0100 +@@ -63,6 +63,10 @@ + * - put table/heap datastructure in a separate file. + */ + ++#ifndef _UTF8_ ++#define _UTF8_ ++#endif ++ + #include "config.h" + #include <stdio.h> + #ifdef HAVE_STDLIB_H +@@ -80,10 +84,12 @@ + #include "wg_mempool.h" + #include "constants.h" + ++#include "utf8misc.h" + + #define TABLESIZE (1<<TABLEPOW) + #define TABLEMASK ((TABLESIZE)-1) + ++ + typedef struct { + + sint2 rank; +@@ -134,29 +140,14 @@ + } + + +-/* checks if n-gram lex is a prefix of key and of length len */ +-inline int issame( char *lex, char *key, int len ) +-{ +- int i; +- for (i=0; i<len; i++) { +- if ( key[i] != lex[i] ) { +- return 0; +- } +- } +- if ( lex[i] != 0 ) { +- return 0; +- } +- return 1; +-} +- + + /* increases frequency of ngram(p,len) */ +-static inline int increasefreq( table_t *t, char *p, int len ) +-{ +- uint4 hash = simplehash( p, len ) & TABLEMASK; ++static int increasefreq( table_t *t, char *p, int len ) ++{ ++ uint4 hash = simplehash( p, len ) & TABLEMASK; + entry_t *entry = t->table[ hash ]; +- +- while ( entry ) { ++ ++ while ( entry ) { + if ( issame( entry->str, p, len ) ) { + /*** Found it! ***/ + entry->cnt++; +@@ -168,7 +159,7 @@ + } + + /*** Not found, so create ***/ +- entry = wgmempool_alloc( t->pool, sizeof(entry_t) ); ++ entry = (entry_t*)(wgmempool_alloc( t->pool, sizeof(entry_t) )); + strcpy( entry->str, p ); + entry->cnt = 1; + +@@ -181,12 +172,12 @@ + #if 0 + + /* looks up ngram(p,len) */ +-static entry_t *findfreq( table_t *t, char *p, int len ) +-{ +- uint4 hash = simplehash( p, len ) & TABLEMASK; ++static entry_t *findfreq( table_t *t, char *p, int len ) ++{ ++ uint4 hash = simplehash( p, len ) & TABLEMASK; + entry_t *entry = t->table[ hash ]; +- +- while ( entry ) { ++ ++ while ( entry ) { + if ( issame( entry->str, p, len ) ) { + return entry; + } +@@ -219,7 +210,7 @@ + #define GREATER(x,y) ((x).cnt > (y).cnt) + #define LESS(x,y) ((x).cnt < (y).cnt) + +-inline static void siftup( table_t *t, unsigned int child ) ++static void siftup( table_t *t, unsigned int child ) + { + entry_t *heap = t->heap; + unsigned int parent = (child-1) >> 1; +@@ -241,7 +232,7 @@ + } + + +-inline static void siftdown( table_t *t, unsigned int heapsize, uint4 parent ) ++static void siftdown( table_t *t, unsigned int heapsize, uint4 parent ) + { + entry_t *heap = t->heap; + unsigned int child = parent*2 + 1; +@@ -458,21 +449,27 @@ + return dest; + } + +- ++/** ++* this function extract all n-gram from past buffer and put them into the table "t" ++* [modified] by Jocelyn Merand to accept utf-8 multi-character symbols to be used in OpenOffice ++*/ + static void createngramtable( table_t *t, const char *buf ) + { + char n[MAXNGRAMSIZE+1]; + const char *p = buf; + int i; ++ int pointer = 0; + + /*** Get all n-grams where 1<=n<=MAXNGRAMSIZE. Allow underscores only at borders. ***/ +- for (;;p++) { ++ while(1) { + +- const char *q = p; ++ const char *q = &p[pointer]; /*[modified] previously p++ above (for(;;p++)) now, it's pointer wich is increased so we have to get the new pointer on the buffer*/ + char *m = n; + + /*** First char may be an underscore ***/ +- *m++ = *q++; ++ int decay = charcopy(q, m); /*[modified] previously *q++ = *m++*/ ++ q = &(p[pointer+decay]); /*[modified] the old copying method do not manage multi-character symbols*/ ++ m += decay; /*[modified]*/ + *m = '\0'; + + increasefreq( t, n, 1 ); +@@ -482,19 +479,22 @@ + } + + /*** Let the compiler unroll this ***/ +- for ( i=2; i<=MAXNGRAMSIZE; i++) { ++ for ( i=2; i<=MAXNGRAMSYMBOL; i++) { + +- *m++ = *q; ++ decay = charcopy(q, m); /*[modified] like above*/ ++ m += decay; + *m = '\0'; + + increasefreq( t, n, i ); + + if ( *q == '_' ) break; +- q++; ++ q += decay; + if ( *q == '\0' ) { + return; + } + } ++ ++ pointer = nextcharstart(p,pointer); /*[modified] p[pointer] must point on the next start of symbol, but whith utf next start is not surely next char*/ + } + return; + } +diff -ruN libtextcat-2.2.part1/src/fingerprint.h.orig libtextcat-2.2/src/fingerprint.h.orig +--- libtextcat-2.2.part1/src/fingerprint.h.orig 1970-01-01 01:00:00.000000000 +0100 ++++ libtextcat-2.2/src/fingerprint.h.orig 2007-07-25 10:47:22.000000000 +0100 +@@ -0,0 +1,55 @@ ++#ifndef _FINGERPRINT_H_ ++#define _FINGERPRINT_H_ ++/* ++ * Copyright (C) 2003 WiseGuys Internet B.V. ++ * ++ * THE BSD LICENSE ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * - Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * ++ * - Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the ++ * distribution. ++ * ++ * - Neither the name of the WiseGuys Internet B.V. nor the names of ++ * its contributors may be used to endorse or promote products derived ++ * from this software without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++#include "common.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++extern void *fp_Init(const char *name); ++extern void fp_Done( void *handle ); ++extern int fp_Create( void *handle, const char *buffer, uint4 bufsize, uint4 maxngrams ); ++extern int fp_Read( void *handle, const char *fname, int maxngrams ); ++extern sint4 fp_Compare( void *cat, void *unknown, int cutoff ); ++extern void fp_Show( void *handle ); ++extern const char *fp_Name( void *handle ); ++extern void fp_Print( void *handle, FILE *fp ); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff -ruN libtextcat-2.2.part1/src/textcat.c libtextcat-2.2/src/textcat.c +--- libtextcat-2.2.part1/src/textcat.c 2007-07-25 10:46:49.000000000 +0100 ++++ libtextcat-2.2/src/textcat.c 2007-07-25 10:47:25.000000000 +0100 +@@ -74,6 +74,7 @@ + typedef struct { + + void **fprint; ++ char *fprint_disable; + uint4 size; + uint4 maxsize; + +@@ -112,11 +113,21 @@ + fp_Done( h->fprint[i] ); + } + wg_free( h->fprint ); ++ wg_free( h->fprint_disable ); + wg_free( h ); + + } + +-extern void *textcat_Init( const char *conffile ) ++/** Replaces older function */ ++extern void *textcat_Init( const char *conffile ){ ++ return special_textcat_Init( conffile, DEFAULT_FINGERPRINTS_PATH ); ++} ++ ++/** ++ * Originaly this function had only one parameter (conffile) it has been modified since OOo use ++ * Basicaly prefix is the directory path where fingerprints are stored ++ */ ++extern void *special_textcat_Init( const char *conffile, const char *prefix ) + { + textcat_t *h; + char line[1024]; +@@ -134,11 +145,13 @@ + h->size = 0; + h->maxsize = 16; + h->fprint = (void **)wg_malloc( sizeof(void*) * h->maxsize ); ++ h->fprint_disable = (char *)wg_malloc( sizeof(char*) * h->maxsize ); /*added to store the state of languages*/ + + while ( wg_getline( line, 1024, fp ) ) { + char *p; + char *segment[4]; +- int res; ++ char finger_print_file_name[512]; ++ int res; + + /*** Skip comments ***/ + #ifdef HAVE_STRCHR +@@ -156,17 +169,23 @@ + /*** Ensure enough space ***/ + if ( h->size == h->maxsize ) { + h->maxsize *= 2; +- h->fprint = (void *)wg_realloc( h->fprint, sizeof(void*) * h->maxsize ); ++ h->fprint = (void **)wg_realloc( h->fprint, sizeof(void*) * h->maxsize ); ++ h->fprint_disable = (char *)wg_realloc( h->fprint_disable, sizeof(char*) * h->maxsize ); + } + + /*** Load data ***/ + if ((h->fprint[ h->size ] = fp_Init( segment[1] ))==NULL) { + goto ERROR; + } +- if ( fp_Read( h->fprint[h->size], segment[0], 400 ) == 0 ) { ++ finger_print_file_name[0] = '\0'; ++ strcat(finger_print_file_name, prefix); ++ strcat(finger_print_file_name, segment[0]); ++ ++ if ( fp_Read( h->fprint[h->size], finger_print_file_name, 400 ) == 0 ) { + textcat_Done(h); + goto ERROR; +- } ++ } ++ h->fprint_disable[h->size] = 0xF0; /*0xF0 is the code for enabled languages, 0x0F is for disabled*/ + h->size++; + } + +@@ -203,11 +222,18 @@ + result = _TEXTCAT_RESULT_SHORT; + goto READY; + } +- ++ + /*** Calculate the score for each category. ***/ + for (i=0; i<h->size; i++) { +- int score = fp_Compare( h->fprint[i], unknown, threshold ); +- candidates[i].score = score; ++ int score; ++ if(h->fprint_disable[i] & 0x0F){ /*if this language is disabled*/ ++ score = MAXSCORE; ++ } ++ else{ ++ score = fp_Compare( h->fprint[i], unknown, threshold ); ++ /*printf("Score for %s : %i\n", fp_Name(h->fprint[i]), score);*/ ++ } ++ candidates[i].score = score; + candidates[i].name = fp_Name( h->fprint[i] ); + if ( score < minscore ) { + minscore = score; +diff -ruN libtextcat-2.2.part1/src/textcat.h libtextcat-2.2/src/textcat.h +--- libtextcat-2.2.part1/src/textcat.h 2007-07-25 10:46:49.000000000 +0100 ++++ libtextcat-2.2/src/textcat.h 2007-07-25 10:48:18.000000000 +0100 +@@ -55,10 +54,19 @@ + * Returns: handle on success, NULL on error. (At the moment, the + * only way errors can occur, is when the library cannot read the + * conffile, or one of the fingerprint files listed in it.) ++ * ++ * Replace older function (and has exacly the same behaviour) ++ * see below + */ + extern void *textcat_Init( const char *conffile ); + + /** ++ * Originaly this function had only one parameter (conffile) it has been modified since OOo must be able to load alternativ DB ++ * Basicaly prefix is the directory path where fingerprints are stored ++ */ ++extern void *special_textcat_Init( const char *conffile, const char *prefix ); ++ ++/** + * textcat_Done() - Free up resources for handle + */ + extern void textcat_Done( void *handle ); +diff -ruN libtextcat-2.2.part1/src/utf8misc.c libtextcat-2.2/src/utf8misc.c +--- libtextcat-2.2.part1/src/utf8misc.c 1970-01-01 01:00:00.000000000 +0100 ++++ libtextcat-2.2/src/utf8misc.c 2007-07-25 10:48:57.000000000 +0100 +@@ -0,0 +1,132 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Jocelyn Merand * ++ * joc.mer@gmail.com * ++ * * ++ * THE BSD LICENSE ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * - Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * ++ * - Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the ++ * distribution. ++ * ++ * - Neither the name of the WiseGuys Internet B.V. nor the names of ++ * its contributors may be used to endorse or promote products derived ++ * from this software without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ***************************************************************************/ ++ ++#ifndef _UTF8_MISC_H_ ++#include "utf8misc.h" ++#endif ++ ++ ++int nextcharstart(const char *str, int position){ ++ int pointer = position; ++ ++ if(str[pointer] & ESCAPE_MASK){ /*if the first bit of the current char is 1*/ ++ ++ /*then str[pointer] is an escape character*/ ++ ++ char escape_char = ((str[pointer] & WEIGHT_MASK) << 1); /*and we use it to count (by bit translation) following characters (only the weightest part)*/ ++ ++ while(escape_char & ESCAPE_MASK && str[pointer]){/*every step, we move the byte of 1 bit left, when first bit is 0, it's finished*/ ++ escape_char = escape_char <<1; ++ ++pointer; ++ } ++ } ++ if(str[pointer]){ /*finaly, if we are not on the \0 character, we jump to the next character*/ ++ ++pointer; ++ } ++ return pointer; ++} ++ ++ ++int charcopy(const char *str, char *dest){ ++ ++ int pointer = 0; ++ if(str[pointer] & ESCAPE_MASK){ /*if the first bit of the current char is 1*/ ++ ++ /*then str[pointer] is an escape character*/ ++ ++ char escape_char = ((str[pointer] & WEIGHT_MASK) << 1); /*and we use it to count following characters (only the weightest part)*/ ++ ++ while(escape_char & ESCAPE_MASK && str[pointer]){ /*every step, we move the byte of 1 bit left, when first bit is 0, it's finished*/ ++ dest[pointer] = str[pointer]; ++ escape_char = escape_char <<1; ++ ++pointer; ++ } ++ } ++ if(str[pointer]){ ++ dest[pointer] = str[pointer]; ++ ++pointer; ++ } ++ ++ return pointer; ++} ++ ++ ++int issame( char *lex, char *key, int len ) ++{ ++ /*printf("[%s] prefix of [%s] with length %i", lex, key, len);*/ ++ int char_counter = 0; ++ int pointer = 0; ++ while(char_counter < len) { ++ ++ if(key[pointer] & ESCAPE_MASK){ /*if the first bit of the current char is 1*/ ++ ++ /*then key[pointer] is an escap character*/ ++ ++ char escape_char = ((key[pointer] & WEIGHT_MASK) << 1); /*and we use it to count (only the weightest part)*/ ++ ++ while(escape_char & ESCAPE_MASK && key[pointer] == lex[pointer] ){ ++ escape_char = escape_char <<1; ++ ++pointer; ++ } ++ } ++ ++char_counter; /*and we are on a new utf8 character*/ ++ if ( key[pointer] != lex[pointer] ) { ++ return 0; ++ /*printf(" NO\n", lex, key, len);*/ ++ } ++ ++pointer; ++ } ++ if ( lex[pointer] != '\0' ) { ++ return 0; ++ /*printf(" NO\n");*/ ++ } ++ ++ /*printf(" YES\n");*/ ++ ++ return 1; ++} ++ ++ ++extern int utfstrlen(const char* str){ ++ int char_counter = 0; ++ int pointer = 0; ++ while(str[pointer]) { ++ pointer = nextcharstart(str, pointer); ++ ++ ++char_counter; /*and we are on a new utf8 character*/ ++ } ++ return char_counter; ++} ++ +diff -ruN libtextcat-2.2.part1/src/utf8misc.h libtextcat-2.2/src/utf8misc.h +--- libtextcat-2.2.part1/src/utf8misc.h 1970-01-01 01:00:00.000000000 +0100 ++++ libtextcat-2.2/src/utf8misc.h 2007-07-25 10:48:57.000000000 +0100 +@@ -0,0 +1,88 @@ ++/*************************************************************************** ++ * Copyright (C) 2006 by Jocelyn Merand * ++ * joc.mer@gmail.com * ++ * * ++ * THE BSD LICENSE ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * - Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * ++ * - Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the ++ * distribution. ++ * ++ * - Neither the name of the WiseGuys Internet B.V. nor the names of ++ * its contributors may be used to endorse or promote products derived ++ * from this software without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ***************************************************************************/ ++ ++#ifndef _UTF8_MISC_H_ ++#define _UTF8_MISC_H_ ++ ++/** ++ * These variables are used in character processing functions ++ * These have been added to manage utf-8 symbols, particularly escape chars ++ */ ++#ifdef _UTF8_ ++#define ESCAPE_MASK 0x80 ++#define WEIGHT_MASK 0xF0 ++#else ++#define ESCAPE_MASK 0xFF ++#define WEIGHT_MASK 0x00 ++#endif ++ ++ ++/* ++ * Is used to jump to the next start of char ++ * of course it's only usefull when encoding is utf-8 ++ * This function have been added by Jocelyn Merand to use libtextcat in OOo ++ */ ++int nextcharstart(const char *str, int position); ++ ++ ++/*Copy the char in str to dest ++ * of course it's only usefull when encoding is utf8 and the symbol is encoded with more than 1 char ++ * return the number of char jumped ++ * This function have been added by Jocelyn Merand to use libtextcat in OOo ++ */ ++int charcopy(const char *str, char *dest); ++ ++ ++/* checks if n-gram lex is a prefix of key and of length len ++* if _UTF8_ is defined, it uses escap characters and len is not realy the length of lex ++* in this case, len is the number of utf-8 char strlen("€") == 3 but len == 1 ++*/ ++int issame( char *lex, char *key, int len ); ++ ++ ++/* Counts the number of characters ++* if _UTF8_ is defined, it uses escap characters and the result is not realy the length of str ++* in this case, the result is the number of utf-8 char strlen("€") == 3 but utfstrlen("€") == 1 ++*/ ++#ifdef __cplusplus ++extern "C" { ++#endif ++extern int utfstrlen(const char* str); ++#ifdef __cplusplus ++} ++#endif ++ ++#endif ++ +--- libtextcat-2.2.part2/src/Makefile.am 2007-07-25 10:55:02.000000000 +0100 ++++ libtextcat-2.2/src/Makefile.am 2007-07-25 10:55:52.000000000 +0100 +@@ -12,11 +12,11 @@ + + libtextcat_includedir = $(includedir)/libtextcat + libtextcat_include_HEADERS = \ +- common.h constants.h fingerprint.h textcat.h ++ common.h constants.h fingerprint.h textcat.h utf8misc.h + + lib_LTLIBRARIES = libtextcat.la + libtextcat_la_SOURCES = \ +- common.c fingerprint.c textcat.c wg_mempool.c ++ common.c fingerprint.c textcat.c wg_mempool.c utf8misc.c + + bin_PROGRAMS = createfp + createfp_SOURCES = createfp.c diff --git a/extra/libtextcat/libtextcat-2.2-exportapi.patch b/extra/libtextcat/libtextcat-2.2-exportapi.patch new file mode 100644 index 000000000..acf84e099 --- /dev/null +++ b/extra/libtextcat/libtextcat-2.2-exportapi.patch @@ -0,0 +1,305 @@ +diff -ruN libtextcat-2.2.orig/src/common.c libtextcat-2.2/src/common.c +--- libtextcat-2.2.orig/src/common.c 2007-06-27 17:02:34.000000000 +0100 ++++ libtextcat-2.2/src/common.c 2007-06-27 17:45:16.000000000 +0100 +@@ -45,7 +45,7 @@ + #endif + #include <stdarg.h> + #include <ctype.h> +-#include "common.h" ++#include "common_impl.h" + + extern void wgmem_error( const char *fmt, ... ) + { +@@ -55,8 +55,6 @@ + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); +- +- exit(-1); + } + + +diff -ruN libtextcat-2.2.orig/src/common_impl.h libtextcat-2.2/src/common_impl.h +--- libtextcat-2.2.orig/src/common_impl.h 1970-01-01 01:00:00.000000000 +0100 ++++ libtextcat-2.2/src/common_impl.h 2007-06-27 17:45:16.000000000 +0100 +@@ -0,0 +1,66 @@ ++#ifndef _COMMON_IMPL_H_ ++#define _COMMON_IMPL_H_ ++/** ++ * common_impl.h -- a mixed bag of helper functions ++ * ++ * Copyright (C) 2003 WiseGuys Internet B.V. ++ * ++ * THE BSD LICENSE ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * - Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * ++ * - Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the ++ * distribution. ++ * ++ * - Neither the name of the WiseGuys Internet B.V. nor the names of ++ * its contributors may be used to endorse or promote products derived ++ * from this software without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include "config.h" ++#ifndef HAVE_MALLOC ++#error "This library needs a GNU like malloc to compile. 'configure' says there isn't one." ++#endif ++#ifndef HAVE_REALLOC ++#error "This library needs a GNU like realloc to compile. 'configure' says there isn't one." ++#endif ++#ifndef HAVE_STRDUP ++#error "This library needs a GNU like strdup to compile. 'configure' says there isn't one." ++#endif ++#ifdef HAVE_INTTYPES_H ++#include <inttypes.h> ++#else ++#ifdef HAVE_STDINT_H ++#include <stdint.h> ++#endif ++#endif ++#ifdef HAVE_SYS_TIME_H ++#include <sys/time.h> ++#endif ++#include "common.h" ++ ++#define WGMIN(x,y) ((x)<=(y)?(x):(y)) ++#define WGMAX(x,y) ((x)<=(y)?(y):(x)) ++#define __STR__(x) #x ++#define WGSTR(x) __STR__(x) ++ ++#endif +diff -ruN libtextcat-2.2.orig/src/createfp.c libtextcat-2.2/src/createfp.c +--- libtextcat-2.2.orig/src/createfp.c 2007-06-27 17:02:34.000000000 +0100 ++++ libtextcat-2.2/src/createfp.c 2007-06-27 17:45:16.000000000 +0100 +@@ -44,7 +44,7 @@ + #endif + + #include "fingerprint.h" +-#include "common.h" ++#include "common_impl.h" + + #define BLOCKSIZE 4096 + +diff -ruN libtextcat-2.2.orig/src/fingerprint.c libtextcat-2.2/src/fingerprint.c +--- libtextcat-2.2.orig/src/fingerprint.c 2007-06-27 17:02:34.000000000 +0100 ++++ libtextcat-2.2/src/fingerprint.c 2007-06-27 17:45:16.000000000 +0100 +@@ -76,7 +76,7 @@ + #endif + #include <ctype.h> + +-#include "common.h" ++#include "common_impl.h" + #include "wg_mempool.h" + #include "constants.h" + +diff -ruN libtextcat-2.2.orig/src/Makefile.am libtextcat-2.2/src/Makefile.am +--- libtextcat-2.2.orig/src/Makefile.am 2007-06-27 17:02:34.000000000 +0100 ++++ libtextcat-2.2/src/Makefile.am 2007-06-27 17:47:40.000000000 +0100 +@@ -8,7 +8,11 @@ + AM_LDFLAGS = -g + + noinst_HEADERS = \ +- common.h constants.h fingerprint.h textcat.h wg_mempool.h ++ common_impl.h wg_mempool.h ++ ++libtextcat_includedir = $(includedir)/libtextcat ++libtextcat_include_HEADERS = \ ++ common.h constants.h fingerprint.h textcat.h + + lib_LTLIBRARIES = libtextcat.la + libtextcat_la_SOURCES = \ +diff -ruN libtextcat-2.2.orig/src/testtextcat.c libtextcat-2.2/src/testtextcat.c +--- libtextcat-2.2.orig/src/testtextcat.c 2007-06-27 17:02:34.000000000 +0100 ++++ libtextcat-2.2/src/testtextcat.c 2007-06-27 17:45:16.000000000 +0100 +@@ -47,7 +47,7 @@ + #endif + + #include "textcat.h" +-#include "common.h" ++#include "common_impl.h" + + #define BLOCKSIZE 4096 + +diff -ruN libtextcat-2.2.orig/src/textcat.c libtextcat-2.2/src/textcat.c +--- libtextcat-2.2.orig/src/textcat.c 2007-06-27 17:02:34.000000000 +0100 ++++ libtextcat-2.2/src/textcat.c 2007-06-27 17:45:16.000000000 +0100 +@@ -65,7 +65,7 @@ + #include <alloca.h> + #endif + +-#include "common.h" ++#include "common_impl.h" + #include "fingerprint.h" + #include "textcat.h" + #include "constants.h" +diff -ruN libtextcat-2.2.orig/src/wg_mempool.c libtextcat-2.2/src/wg_mempool.c +--- libtextcat-2.2.orig/src/wg_mempool.c 2007-06-27 17:02:34.000000000 +0100 ++++ libtextcat-2.2/src/wg_mempool.c 2007-06-27 17:45:16.000000000 +0100 +@@ -41,7 +41,7 @@ + #ifdef HAVE_STRING_H + #include <string.h> + #endif +-#include "common.h" ++#include "common_impl.h" + + typedef struct memblock_s { + char *pool; +diff -ru libtextcat-2.2.orig/src/common.h libtextcat-2.2/src/common.h +--- libtextcat-2.2.orig/src/common.h 2003-05-22 14:02:29.000000000 +0100 ++++ libtextcat-2.2/src/common.h 2007-06-28 09:10:42.000000000 +0100 +@@ -1,7 +1,7 @@ + #ifndef _COMMON_H_ + #define _COMMON_H_ + /** +- * common.h -- a mixed bag of helper functions ++ * common.h + * + * Copyright (C) 2003 WiseGuys Internet B.V. + * +@@ -36,56 +36,25 @@ + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +-#include "config.h" +-#ifndef HAVE_MALLOC +-#error "This library needs a GNU like malloc to compile. 'configure' says there isn't one." +-#endif +-#ifndef HAVE_REALLOC +-#error "This library needs a GNU like realloc to compile. 'configure' says there isn't one." +-#endif +-#ifndef HAVE_STRDUP +-#error "This library needs a GNU like strdup to compile. 'configure' says there isn't one." +-#endif + #include <stdio.h> +-#ifdef HAVE_INTTYPES_H + #include <inttypes.h> +-#else +-#ifdef HAVE_STDINT_H +-#include <stdint.h> +-#endif +-#endif +-#ifdef HAVE_SYS_TIME_H +-#include <sys/time.h> +-#endif + #include <time.h> + +-#define WGMIN(x,y) ((x)<=(y)?(x):(y)) +-#define WGMAX(x,y) ((x)<=(y)?(y):(x)) +-#define __STR__(x) #x +-#define WGSTR(x) __STR__(x) +- +-#ifdef HAVE_INTTYPES_H +-typedef uint32_t uint4; +-typedef uint16_t uint2; +-typedef uint8_t uchar; +- +-typedef int32_t sint4; +-typedef int16_t sint2; +-typedef int8_t schar; +- +-typedef int8_t boole; +-#else +-typedef unsigned long uint4; +-typedef unsigned int uint2; +-typedef unsigned char uchar; +- +-typedef long sint4; +-typedef int sint2; +-typedef char schar; +- +-typedef char boole; ++#include <sys/time.h> ++#ifdef __cplusplus ++extern "C" { + #endif + ++typedef uint32_t uint4; ++typedef uint16_t uint2; ++typedef uint8_t uchar; ++ ++typedef int32_t sint4; ++typedef int16_t sint2; ++typedef int8_t schar; ++ ++typedef int8_t boole; ++ + typedef struct wgtimer_s { + struct timeval start; + struct timeval stop; +@@ -108,6 +76,8 @@ + extern char *wg_strgmov( char *dest, const char *src, const char *destlimit ); + extern char *wg_trim( char *dest, const char *src ); + ++#ifdef __cplusplus ++} ++#endif + + #endif +- +diff -ru libtextcat-2.2.orig/src/fingerprint.h libtextcat-2.2/src/fingerprint.h +--- libtextcat-2.2.orig/src/fingerprint.h 2003-05-19 13:16:31.000000000 +0100 ++++ libtextcat-2.2/src/fingerprint.h 2007-06-28 09:11:17.000000000 +0100 +@@ -35,6 +35,10 @@ + */ + #include "common.h" + ++#ifdef __cplusplus ++extern "C" { ++#endif ++ + extern void *fp_Init(const char *name); + extern void fp_Done( void *handle ); + extern int fp_Create( void *handle, const char *buffer, uint4 bufsize, uint4 maxngrams ); +@@ -44,4 +48,8 @@ + extern const char *fp_Name( void *handle ); + extern void fp_Print( void *handle, FILE *fp ); + ++#ifdef __cplusplus ++} ++#endif ++ + #endif +--- libtextcat-2.2.orig/src/textcat.h 2007-06-28 09:19:26.000000000 +0100 ++++ libtextcat-2.2/src/textcat.h 2007-06-28 09:20:19.000000000 +0100 +@@ -37,6 +37,10 @@ + */ + #include <stdio.h> + ++#ifdef __cplusplus ++extern "C" { ++#endif ++ + #define _TEXTCAT_RESULT_UNKOWN "UNKNOWN" + #define _TEXTCAT_RESULT_SHORT "SHORT" + +@@ -77,4 +81,9 @@ + * textcat_Version() - Returns a string describing the version of this classifier. + */ + extern char *textcat_Version(); ++ ++#ifdef __cplusplus ++} ++#endif ++ + #endif |