diff --git a/libchewing-0.3.3.multilibConflict.patch b/libchewing-0.3.3.multilibConflict.patch new file mode 100644 index 0000000..cb947ba --- /dev/null +++ b/libchewing-0.3.3.multilibConflict.patch @@ -0,0 +1,495 @@ +diff -up ./data/Makefile.am.orig ./data/Makefile.am +--- ./data/Makefile.am.orig 2012-07-19 13:51:44.417897943 +1000 ++++ ./data/Makefile.am 2012-07-19 15:00:08.067960510 +1000 +@@ -9,8 +9,11 @@ datas = \ + us_freq.dat \ + dict.dat \ + ph_index.dat \ +- fonetree.dat \ + $(chindexs) ++ ++datas_lib = \ ++ fonetree.dat ++ + generated_header = $(top_builddir)/src/chewing-definition.h + + all: checkdata_stamp gendata_stamp +@@ -37,4 +40,7 @@ install-data-local: $(datas) pinyin.tab + $(mkinstalldirs) $(DESTDIR)/$(datadir)/chewing + $(INSTALL_DATA) $(datas) pinyin.tab swkb.dat symbols.dat \ + $(DESTDIR)/$(datadir)/chewing +-CLEANFILES = $(datas) gendata_stamp checkdata_stamp $(generated_header) ++ $(mkinstalldirs) $(DESTDIR)/$(libdir)/chewing ++ $(INSTALL_DATA) $(datas_lib) $(DESTDIR)/$(libdir)/chewing ++ ++CLEANFILES = $(datas) $(datas_lib) gendata_stamp checkdata_stamp $(generated_header) +diff -up ./src/Makefile.am.orig ./src/Makefile.am +--- ./src/Makefile.am.orig 2012-07-19 13:52:45.633807454 +1000 ++++ ./src/Makefile.am 2012-07-19 15:01:05.563605235 +1000 +@@ -1,3 +1,5 @@ ++AM_CPPFLAGS = ${CFLAGS} -DLIBDIR=\"${libdir}\" ++ + SUBDIRS = porting_layer + INCLUDES = \ + -I$(top_srcdir)/include \ +diff -up ./src/tree.c.orig ./src/tree.c +--- ./src/tree.c.orig 2012-07-19 13:52:04.111868256 +1000 ++++ ./src/tree.c 2012-07-19 15:16:55.864761600 +1000 +@@ -114,7 +114,7 @@ void InitTree( const char *prefix ) + int i; + #endif + +- sprintf( filename, "%s" PLAT_SEPARATOR "%s", prefix, PHONE_TREE_FILE ); ++ sprintf( filename, "%s" PLAT_SEPARATOR "chewing" PLAT_SEPARATOR "%s", LIBDIR, PHONE_TREE_FILE ); + #ifdef USE_BINARY_DATA + plat_mmap_set_invalid( &tree_mmap ); + tree_size = plat_mmap_create( &tree_mmap, filename, FLAG_ATTRIBUTE_READ ); +@@ -151,10 +151,10 @@ static int CheckBreakpoint( int from, in + return 1; + } + +-static int CheckUserChoose( ++static int CheckUserChoose( + uint16 *new_phoneSeq, int from , int to, +- Phrase **pp_phr, +- char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], ++ Phrase **pp_phr, ++ char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], + IntervalType selectInterval[], int nSelect ) + { + IntervalType inte, c; +@@ -191,9 +191,9 @@ static int CheckUserChoose( + c = selectInterval[ chno ]; + + if ( IsContain( inte, c ) ) { +- /* +- * find a phrase of ph_id where the text contains +- * 'selectStr[chno]' test if not ok then return 0, ++ /* ++ * find a phrase of ph_id where the text contains ++ * 'selectStr[chno]' test if not ok then return 0, + * if ok then continue to test. */ + len = c.to - c.from; + if ( memcmp( +@@ -218,19 +218,19 @@ static int CheckUserChoose( + } + } while ( ( pUserPhraseData = UserGetPhraseNext( new_phoneSeq ) ) != NULL ); + +- if ( p_phr->freq != -1 ) ++ if ( p_phr->freq != -1 ) + return 1; +- ++ + free( p_phr ); + return 0; + } + + /* +- * phrase is said to satisfy a choose interval if ++ * phrase is said to satisfy a choose interval if + * their intersections are the same */ + static int CheckChoose( +- int ph_id, int from, int to, Phrase **pp_phr, +- char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], ++ int ph_id, int from, int to, Phrase **pp_phr, ++ char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], + IntervalType selectInterval[], int nSelect ) + { + IntervalType inte, c; +@@ -249,8 +249,8 @@ static int CheckChoose( + c = selectInterval[ chno ]; + + if ( IsContain( inte, c ) ) { +- /* find a phrase of ph_id where the text contains +- * 'selectStr[chno]' test if not ok then return 0, if ok ++ /* find a phrase of ph_id where the text contains ++ * 'selectStr[chno]' test if not ok then return 0, if ok + * then continue to test + */ + len = c.to - c.from; +@@ -263,7 +263,7 @@ static int CheckChoose( + else if ( IsIntersect( inte, selectInterval[ chno ] ) ) { + free( phrase ); + return 0; +- } ++ } + } + if ( chno == nSelect ) { + *pp_phr = phrase; +@@ -283,7 +283,7 @@ int TreeFindPhrase( int begin, int end, + + tree_p = 0; + for ( i = begin; i <= end; i++ ) { +- for ( ++ for ( + child = tree[ tree_p ].child_begin; + child != -1 && child <= tree[ tree_p ].child_end; + child++ ) { +@@ -304,7 +304,7 @@ int TreeFindPhrase( int begin, int end, + } + + static void AddInterval( +- TreeDataType *ptd, int begin , int end, ++ TreeDataType *ptd, int begin , int end, + int p_id, Phrase *p_phrase, int dict_or_user ) + { + ptd->interval[ ptd->nInterval ].from = begin; +@@ -344,9 +344,9 @@ static void internal_release_Phrase( Use + } + + static void FindInterval( +- uint16 *phoneSeq, int nPhoneSeq, +- char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], +- IntervalType selectInterval[], int nSelect, ++ uint16 *phoneSeq, int nPhoneSeq, ++ char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], ++ IntervalType selectInterval[], int nSelect, + int bArrBrkpt[], TreeDataType *ptd ) + { + int end, begin, pho_id; +@@ -360,9 +360,9 @@ static void FindInterval( + continue; + + /* set new_phoneSeq */ +- memcpy( +- new_phoneSeq, +- &phoneSeq[ begin ], ++ memcpy( ++ new_phoneSeq, ++ &phoneSeq[ begin ], + sizeof( uint16 ) * ( end - begin + 1 ) ); + new_phoneSeq[ end - begin + 1 ] = 0; + puserphrase = pdictphrase = NULL; +@@ -370,24 +370,24 @@ static void FindInterval( + + /* check user phrase */ + if ( UserGetPhraseFirst( new_phoneSeq ) && +- CheckUserChoose( new_phoneSeq, begin, end + 1, ++ CheckUserChoose( new_phoneSeq, begin, end + 1, + &p_phrase, selectStr, selectInterval, nSelect ) ) { + puserphrase = p_phrase; + } + + /* check dict phrase */ + pho_id = TreeFindPhrase( begin, end, phoneSeq ); +- if ( +- ( pho_id != -1 ) && +- CheckChoose( +- pho_id, begin, end + 1, +- &p_phrase, selectStr, ++ if ( ++ ( pho_id != -1 ) && ++ CheckChoose( ++ pho_id, begin, end + 1, ++ &p_phrase, selectStr, + selectInterval, nSelect ) ) { + pdictphrase = p_phrase; + } + + /* add only one interval, which has the largest freqency +- * but when the phrase is the same, the user phrase overrides ++ * but when the phrase is the same, the user phrase overrides + * static dict + */ + if ( puserphrase != NULL && pdictphrase == NULL ) { +@@ -399,7 +399,7 @@ static void FindInterval( + else if ( puserphrase != NULL && pdictphrase != NULL ) { + /* the same phrase, userphrase overrides */ + if ( ! strcmp( +- puserphrase->phrase, ++ puserphrase->phrase, + pdictphrase->phrase ) ) { + i_used_phrase = USED_PHRASE_USER; + } +@@ -475,7 +475,7 @@ static int CompFrom( IntervalType *pa, I + } + #endif + +-/* ++/* + * First we compare the 'nMatchCnnct'. + * If the values are the same, we will compare the 'score' + */ +@@ -497,32 +497,32 @@ static void Discard1( TreeDataType *ptd + + memset( failflag, 0, sizeof( failflag ) ); + for ( a = 0; a < ptd->nInterval; a++ ) { +- if ( failflag[ a ] ) ++ if ( failflag[ a ] ) + continue; + for ( b = 0; b < ptd->nInterval; b++ ) { + if ( a == b || failflag[ b ] ) + continue ; +- if ( ptd->interval[ b ].from >= ptd->interval[ a ].from && ++ if ( ptd->interval[ b ].from >= ptd->interval[ a ].from && + ptd->interval[ b ].to <= ptd->interval[ a ].to ) + continue; +- if ( ptd->interval[ b ].from <= ptd->interval[ a ].from && ++ if ( ptd->interval[ b ].from <= ptd->interval[ a ].from && + ptd->interval[ b ].to <= ptd->interval[ a ].from ) + continue; +- if ( ptd->interval[ b ].from >= ptd->interval[ a ].to && ++ if ( ptd->interval[ b ].from >= ptd->interval[ a ].to && + ptd->interval[ b ].to >= ptd->interval[ a ].to ) + continue; + break; + } +- /* if any other interval b is inside or leftside or rightside the ++ /* if any other interval b is inside or leftside or rightside the + * interval a */ + if ( b >= ptd->nInterval ) { + /* then kill all the intervals inside the interval a */ + int i; + for ( i = 0; i < ptd->nInterval; i++ ) { +- if ( ++ if ( + ! failflag[ i ] && i != a && +- ptd->interval[ i ].from >= +- ptd->interval[ a ].from && ++ ptd->interval[ i ].from >= ++ ptd->interval[ a ].from && + ptd->interval[ i ].to <= ptd->interval[ a ].to ) { + failflag[ i ] = 1; + } +@@ -559,14 +559,14 @@ static void Discard2( TreeDataType *ptd + for ( j = 0; j < ptd->nInterval; j++ ) { + if ( j == i ) + continue; +- memset( ++ memset( + &overwrite[ ptd->interval[ j ].from ], +- 1, ++ 1, + ptd->interval[ j ].to - ptd->interval[ j ].from ); + } +- if ( memchr( ++ if ( memchr( + &overwrite[ ptd->interval[ i ].from ], +- 1, ++ 1, + ptd->interval[ i ].to - ptd->interval[ i ].from ) ) + failflag[ i ] = 1; + } +@@ -594,9 +594,9 @@ static void LoadChar( char *buf, int buf + /* kpchen said, record is the index array of interval */ + static void OutputRecordStr( + char *out_buf, int out_buf_len, +- int *record, int nRecord, +- uint16 phoneSeq[], int nPhoneSeq, +- char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], ++ int *record, int nRecord, ++ uint16 phoneSeq[], int nPhoneSeq, ++ char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], + IntervalType selectInterval[], + int nSelect, TreeDataType *ptd ) + { +@@ -664,7 +664,7 @@ static int rule_largest_freqsum( int *re + for ( i = 0; i < nRecord; i++ ) { + inter = ptd->interval[ record[ i ] ]; + assert( inter.p_phr ); +- ++ + /* We adjust the 'freq' of One-word Phrase */ + score += ( inter.to - inter.from == 1 ) ? + ( inter.p_phr->freq / 512 ) : +@@ -691,19 +691,19 @@ static int IsRecContain( int *intA, int + int big, sml; + + for ( big = 0, sml = 0; sml < nB; sml++ ) { +- while ( +- ( big < nA ) && +- ptd->interval[ intA[ big ] ].from < ++ while ( ++ ( big < nA ) && ++ ptd->interval[ intA[ big ] ].from < + ptd->interval[ intB[ sml ] ].to ) { + if ( PhraseIntervalContain( +- ptd->interval[ intA[ big ] ], ++ ptd->interval[ intA[ big ] ], + ptd->interval[ intB[ sml ] ] ) ) + break; + big++; + } +- if ( +- ( big >= nA ) || +- ptd->interval[ intA[ big ] ].from >= ++ if ( ++ ( big >= nA ) || ++ ptd->interval[ intA[ big ] ].from >= + ptd->interval[ intB[ sml ] ].to ) + return 0; + } +@@ -715,9 +715,9 @@ static void SortListByScore( TreeDataTyp + int i, listLen; + RecordNode *p, **arr; + +- for ( +- listLen = 0, p = ptd->phList; +- p; ++ for ( ++ listLen = 0, p = ptd->phList; ++ p; + listLen++, p = p->next ) + ; + ptd->nPhListLen = listLen; +@@ -725,7 +725,7 @@ static void SortListByScore( TreeDataTyp + arr = ALC( RecordNode *, listLen ); + assert( arr ); + +- for ( ++ for ( + i = 0, p = ptd->phList; + i < listLen; + p = p->next, i++ ) { +@@ -755,23 +755,23 @@ static void SaveRecord( int *record, int + pre = NULL; + for ( p = ptd->phList; p; ) { + /* if 'p' contains 'record', then discard 'record'. */ +- if ( IsRecContain( p->arrIndex, p->nInter, record, nInter, ptd ) ) ++ if ( IsRecContain( p->arrIndex, p->nInter, record, nInter, ptd ) ) + return; + +- /* if 'record' contains 'p', then discard 'p' ++ /* if 'record' contains 'p', then discard 'p' + * -- We must deal with the linked list. */ + if ( IsRecContain( record, nInter, p->arrIndex, p->nInter, ptd ) ) { + RecordNode *tp = p; + +- if ( pre ) ++ if ( pre ) + pre->next = p->next; + else + ptd->phList = ptd->phList->next; + p = p->next; +- free( tp->arrIndex ); ++ free( tp->arrIndex ); + free( tp ); + } +- else ++ else + pre = p, p = p->next; + } + now = ALC( RecordNode, 1 ); +@@ -780,7 +780,7 @@ static void SaveRecord( int *record, int + now->arrIndex = ALC( int, nInter ); + assert( now->arrIndex ); + now->nInter = nInter; +- memcpy( now->arrIndex, record, nInter * sizeof( int ) ); ++ memcpy( now->arrIndex, record, nInter * sizeof( int ) ); + ptd->phList = now; + } + +@@ -788,9 +788,9 @@ static void RecursiveSave( int depth, in + { + int first, i; + /* to find first interval */ +- for ( +- first = record[ depth - 1 ] + 1; +- ptd->interval[ first ].from < to && first < ptd->nInterval; ++ for ( ++ first = record[ depth - 1 ] + 1; ++ ptd->interval[ first ].from < to && first < ptd->nInterval; + first++ ) + ; + +@@ -801,10 +801,10 @@ static void RecursiveSave( int depth, in + record[ depth ] = first; + RecursiveSave( depth + 1, ptd->interval[ first ].to, record, ptd ); + /* for each interval which intersects first */ +- for ( +- i= first + 1; ++ for ( ++ i= first + 1; + PhraseIntervalIntersect( +- ptd->interval[ first ], ++ ptd->interval[ first ], + ptd->interval[ i ] ) && i < ptd->nInterval; + i++ ) { + record[ depth ] = i; +@@ -816,10 +816,10 @@ static void SaveList( TreeDataType *ptd + { + int record[ MAX_PHONE_SEQ_LEN + 1 ] = { -1 }; + +- RecursiveSave( 1, 0, record, ptd ); ++ RecursiveSave( 1, 0, record, ptd ); + } + +-static void InitPhrasing( TreeDataType *ptd ) ++static void InitPhrasing( TreeDataType *ptd ) + { + memset( ptd, 0, sizeof( TreeDataType ) ); + } +@@ -829,9 +829,9 @@ static void SaveDispInterval( PhrasingOu + int i; + + for ( i = 0; i < ptd->phList->nInter; i++ ) { +- ppo->dispInterval[ i ].from = ++ ppo->dispInterval[ i ].from = + ptd->interval[ ptd->phList->arrIndex[ i ] ].from; +- ppo->dispInterval[ i ].to = ++ ppo->dispInterval[ i ].to = + ptd->interval[ ptd->phList->arrIndex[ i ] ].to; + } + ppo->nDispInterval = ptd->phList->nInter; +@@ -864,11 +864,11 @@ static void CountMatchCnnct( TreeDataTyp + for ( p = ptd->phList; p; p = p->next ) { + /* for each record, count its 'nMatchCnnct' */ + for ( sum = 0, i = 1; i < nPhoneSeq; i++ ) { +- if ( !bUserArrCnnct[ i ] ) ++ if ( !bUserArrCnnct[ i ] ) + continue; + /* check if matching 'cnnct' */ + for ( k = 0; k < p->nInter; k++ ) { +- if ( ++ if ( + ptd->interval[ p->arrIndex[ k ] ].from < i && + ptd->interval[ p->arrIndex[ k ] ].to > i ) { + sum++; +@@ -891,7 +891,7 @@ static void ShowList( TreeDataType *ptd + DEBUG_OUT( " interval : " ); + for ( i = 0; i < p->nInter; i++ ) { + DEBUG_OUT( +- "[%d %d] ", ++ "[%d %d] ", + ptd->interval[ p->arrIndex[ i ] ].from, + ptd->interval[ p->arrIndex[ i ] ].to ); + } +@@ -937,17 +937,17 @@ static RecordNode* NextCut( TreeDataType + } + + int Phrasing( +- PhrasingOutput *ppo, uint16 phoneSeq[], int nPhoneSeq, +- char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], +- IntervalType selectInterval[], int nSelect, +- int bArrBrkpt[], int bUserArrCnnct[] ) ++ PhrasingOutput *ppo, uint16 phoneSeq[], int nPhoneSeq, ++ char selectStr[][ MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1 ], ++ IntervalType selectInterval[], int nSelect, ++ int bArrBrkpt[], int bUserArrCnnct[] ) + { + TreeDataType treeData; + + InitPhrasing( &treeData ); + +- FindInterval( +- phoneSeq, nPhoneSeq, selectStr, selectInterval, nSelect, ++ FindInterval( ++ phoneSeq, nPhoneSeq, selectStr, selectInterval, nSelect, + bArrBrkpt, &treeData ); + SetInfo( nPhoneSeq, &treeData ); + Discard1( &treeData ); +@@ -965,10 +965,10 @@ int Phrasing( + /* set phrasing output */ + OutputRecordStr( + ppo->chiBuf, sizeof(ppo->chiBuf), +- ( treeData.phList )->arrIndex, +- ( treeData.phList )->nInter, +- phoneSeq, +- nPhoneSeq, ++ ( treeData.phList )->arrIndex, ++ ( treeData.phList )->nInter, ++ phoneSeq, ++ nPhoneSeq, + selectStr, selectInterval, nSelect, &treeData ); + SaveDispInterval( ppo, &treeData ); + diff --git a/libchewing.spec b/libchewing.spec index 44dd970..eae921f 100644 --- a/libchewing.spec +++ b/libchewing.spec @@ -2,14 +2,14 @@ %define name_zh_TW %{im_name_zh_TW}函式庫 Name: libchewing Version: 0.3.3 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Intelligent phonetic input method library for Traditional Chinese Summary(zh_TW): %{name_zh_TW} Group: System Environment/Libraries License: LGPLv2+ URL: http://chewing.csie.net/ -Source: http://chewing.csie.net/download/libchewing/%{name}-%{version}.tar.bz2 +Source: https://github.com/downloads/chewing/libchewing/%{name}-%{version}.tar.bz2 #Patch0: libchewing-0.3.0-3.bz199353.patch #Patch1: libchewing-0.3.0-4.bz206232.patch #Patch2: libchewing-0.3.0-5.bz216581a.patch @@ -26,6 +26,8 @@ Source: http://chewing.csie.net/download/libchewing/%{name}-%{version}.t #Patch13: libchewing-0.3.2.hsu.2.patch # Rhbz#625980 #Patch14: libchewing-0.3.2.align.patch +# RHBZ$477690 +Patch15: libchewing-0.3.3.multilibConflict.patch %{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")} @@ -93,6 +95,7 @@ Python binding of libchewing. #%patch12 -p0 -b .hsu #%patch13 -p0 -b .hsu.2 #%patch14 -p0 -b .align +%patch15 -p0 -b .multilibConflict %build export CFLAGS=-DLIBINSTDIR='\"%{_libdir}\" -g' @@ -138,6 +141,9 @@ touch $RPM_BUILD_ROOT%{libchewing_python_dir}/__init__.py %changelog +* Thu Jul 19 2012 Fedora Release Engineering - 0.3.3-3 +- Fixed Bug 477690 - libchewing multilib conflict + * Fri Jan 13 2012 Fedora Release Engineering - 0.3.3-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild @@ -159,17 +165,17 @@ touch $RPM_BUILD_ROOT%{libchewing_python_dir}/__init__.py Add padding to wch_t to ensure it's word aligned. * Wed Mar 04 2010 Ding-Yi Chen - 0.3.2-27 -- Fix Dvorak Hsu 4th tone key (ibus google issue 755 comment 12, +- Fix Dvorak Hsu 4th tone key (ibus google issue 755 comment 12, chewing google issue 10) - Resolves: #555192 * Mon Feb 15 2010 Ding-Yi Chen - 0.3.2-24 -- Fix Hsu and Dvorak Hsu input (ibus google issue 755, +- Fix Hsu and Dvorak Hsu input (ibus google issue 755, chewing google issue 10) - Resolves: #555192 * Mon Feb 15 2010 Ding-Yi Chen - 0.3.2-23 -- Fix Hsu and Dvorak Hsu input (ibus google issue 755, +- Fix Hsu and Dvorak Hsu input (ibus google issue 755, chewing google issue 10) - Resolves: #555192 @@ -196,8 +202,8 @@ touch $RPM_BUILD_ROOT%{libchewing_python_dir}/__init__.py - Fix for package wrangler. * Wed Sep 30 2009 Ding-Yi Chen - 0.3.2-16 -- Fix chewing Google issue 352: - zuin_count in chewing_zuin_String( ChewingContext *ctx, int *zuin_count ) +- Fix chewing Google issue 352: + zuin_count in chewing_zuin_String( ChewingContext *ctx, int *zuin_count ) does not count correctly. * Mon Aug 03 2009 Ding-Yi Chen - 0.3.2-15