OLD | NEW |
1 /* | 1 /* |
2 ** 2013-03-14 | 2 ** 2013-03-14 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 if( strcmp(zFrom,"?")==0 && strcmp(zTo,"")==0 ){ | 618 if( strcmp(zFrom,"?")==0 && strcmp(zTo,"")==0 ){ |
619 if( p->rDel==0 || p->rDel>rCost ) p->rDel = rCost; | 619 if( p->rDel==0 || p->rDel>rCost ) p->rDel = rCost; |
620 }else | 620 }else |
621 { | 621 { |
622 pRule = sqlite3_malloc( sizeof(*pRule) + nFrom + nTo ); | 622 pRule = sqlite3_malloc( sizeof(*pRule) + nFrom + nTo ); |
623 if( pRule==0 ){ | 623 if( pRule==0 ){ |
624 rc = SQLITE_NOMEM; | 624 rc = SQLITE_NOMEM; |
625 }else{ | 625 }else{ |
626 memset(pRule, 0, sizeof(*pRule)); | 626 memset(pRule, 0, sizeof(*pRule)); |
627 pRule->zFrom = &pRule->zTo[nTo+1]; | 627 pRule->zFrom = &pRule->zTo[nTo+1]; |
628 pRule->nFrom = nFrom; | 628 pRule->nFrom = (amatch_len)nFrom; |
629 memcpy(pRule->zFrom, zFrom, nFrom+1); | 629 memcpy(pRule->zFrom, zFrom, nFrom+1); |
630 memcpy(pRule->zTo, zTo, nTo+1); | 630 memcpy(pRule->zTo, zTo, nTo+1); |
631 pRule->nTo = nTo; | 631 pRule->nTo = (amatch_len)nTo; |
632 pRule->rCost = rCost; | 632 pRule->rCost = rCost; |
633 pRule->iLang = (int)iLang; | 633 pRule->iLang = (int)iLang; |
634 } | 634 } |
635 } | 635 } |
636 | 636 |
637 *ppRule = pRule; | 637 *ppRule = pRule; |
638 return rc; | 638 return rc; |
639 } | 639 } |
640 | 640 |
641 /* | 641 /* |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 assert( pOther==0 ); (void)pOther; | 1074 assert( pOther==0 ); (void)pOther; |
1075 } | 1075 } |
1076 return; | 1076 return; |
1077 } | 1077 } |
1078 pWord = sqlite3_malloc( sizeof(*pWord) + nBase + nTail - 1 ); | 1078 pWord = sqlite3_malloc( sizeof(*pWord) + nBase + nTail - 1 ); |
1079 if( pWord==0 ) return; | 1079 if( pWord==0 ) return; |
1080 memset(pWord, 0, sizeof(*pWord)); | 1080 memset(pWord, 0, sizeof(*pWord)); |
1081 pWord->rCost = rCost; | 1081 pWord->rCost = rCost; |
1082 pWord->iSeq = pCur->nWord++; | 1082 pWord->iSeq = pCur->nWord++; |
1083 amatchWriteCost(pWord); | 1083 amatchWriteCost(pWord); |
1084 pWord->nMatch = nMatch; | 1084 pWord->nMatch = (short)nMatch; |
1085 pWord->pNext = pCur->pAllWords; | 1085 pWord->pNext = pCur->pAllWords; |
1086 pCur->pAllWords = pWord; | 1086 pCur->pAllWords = pWord; |
1087 pWord->sCost.zKey = pWord->zCost; | 1087 pWord->sCost.zKey = pWord->zCost; |
1088 pWord->sCost.pWord = pWord; | 1088 pWord->sCost.pWord = pWord; |
1089 pOther = amatchAvlInsert(&pCur->pCost, &pWord->sCost); | 1089 pOther = amatchAvlInsert(&pCur->pCost, &pWord->sCost); |
1090 assert( pOther==0 ); (void)pOther; | 1090 assert( pOther==0 ); (void)pOther; |
1091 pWord->sWord.zKey = pWord->zWord; | 1091 pWord->sWord.zKey = pWord->zWord; |
1092 pWord->sWord.pWord = pWord; | 1092 pWord->sWord.pWord = pWord; |
1093 amatchStrcpy(pWord->zWord, pCur->zBuf); | 1093 amatchStrcpy(pWord->zWord, pCur->zBuf); |
1094 pOther = amatchAvlInsert(&pCur->pWord, &pWord->sWord); | 1094 pOther = amatchAvlInsert(&pCur->pWord, &pWord->sWord); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 pWord = pNode->pWord; | 1155 pWord = pNode->pWord; |
1156 amatchAvlRemove(&pCur->pCost, &pWord->sCost); | 1156 amatchAvlRemove(&pCur->pCost, &pWord->sCost); |
1157 | 1157 |
1158 #ifdef AMATCH_TRACE_1 | 1158 #ifdef AMATCH_TRACE_1 |
1159 printf("PROCESS [%s][%.*s^%s] %d (\"%s\" \"%s\")\n", | 1159 printf("PROCESS [%s][%.*s^%s] %d (\"%s\" \"%s\")\n", |
1160 pWord->zWord+2, pWord->nMatch, pCur->zInput, pCur->zInput+pWord->nMatch, | 1160 pWord->zWord+2, pWord->nMatch, pCur->zInput, pCur->zInput+pWord->nMatch, |
1161 pWord->rCost, pWord->zWord, pWord->zCost); | 1161 pWord->rCost, pWord->zWord, pWord->zCost); |
1162 #endif | 1162 #endif |
1163 nWord = (int)strlen(pWord->zWord+2); | 1163 nWord = (int)strlen(pWord->zWord+2); |
1164 if( nWord+20>nBuf ){ | 1164 if( nWord+20>nBuf ){ |
1165 nBuf = nWord+100; | 1165 nBuf = (char)(nWord+100); |
1166 zBuf = sqlite3_realloc(zBuf, nBuf); | 1166 zBuf = sqlite3_realloc(zBuf, nBuf); |
1167 if( zBuf==0 ) return SQLITE_NOMEM; | 1167 if( zBuf==0 ) return SQLITE_NOMEM; |
1168 } | 1168 } |
1169 amatchStrcpy(zBuf, pWord->zWord+2); | 1169 amatchStrcpy(zBuf, pWord->zWord+2); |
1170 zNext[0] = 0; | 1170 zNext[0] = 0; |
1171 zNextIn[0] = pCur->zInput[pWord->nMatch]; | 1171 zNextIn[0] = pCur->zInput[pWord->nMatch]; |
1172 if( zNextIn[0] ){ | 1172 if( zNextIn[0] ){ |
1173 for(i=1; i<=4 && (pCur->zInput[pWord->nMatch+i]&0xc0)==0x80; i++){ | 1173 for(i=1; i<=4 && (pCur->zInput[pWord->nMatch+i]&0xc0)==0x80; i++){ |
1174 zNextIn[i] = pCur->zInput[pWord->nMatch+i]; | 1174 zNextIn[i] = pCur->zInput[pWord->nMatch+i]; |
1175 } | 1175 } |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1496 const sqlite3_api_routines *pApi | 1496 const sqlite3_api_routines *pApi |
1497 ){ | 1497 ){ |
1498 int rc = SQLITE_OK; | 1498 int rc = SQLITE_OK; |
1499 SQLITE_EXTENSION_INIT2(pApi); | 1499 SQLITE_EXTENSION_INIT2(pApi); |
1500 (void)pzErrMsg; /* Not used */ | 1500 (void)pzErrMsg; /* Not used */ |
1501 #ifndef SQLITE_OMIT_VIRTUALTABLE | 1501 #ifndef SQLITE_OMIT_VIRTUALTABLE |
1502 rc = sqlite3_create_module(db, "approximate_match", &amatchModule, 0); | 1502 rc = sqlite3_create_module(db, "approximate_match", &amatchModule, 0); |
1503 #endif /* SQLITE_OMIT_VIRTUALTABLE */ | 1503 #endif /* SQLITE_OMIT_VIRTUALTABLE */ |
1504 return rc; | 1504 return rc; |
1505 } | 1505 } |
OLD | NEW |