extensions/spellcheck/hunspell/src/replist.cpp

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

michael@0 1 /******* BEGIN LICENSE BLOCK *******
michael@0 2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
michael@0 3 *
michael@0 4 * The contents of this file are subject to the Mozilla Public License Version
michael@0 5 * 1.1 (the "License"); you may not use this file except in compliance with
michael@0 6 * the License. You may obtain a copy of the License at
michael@0 7 * http://www.mozilla.org/MPL/
michael@0 8 *
michael@0 9 * Software distributed under the License is distributed on an "AS IS" basis,
michael@0 10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
michael@0 11 * for the specific language governing rights and limitations under the
michael@0 12 * License.
michael@0 13 *
michael@0 14 * The Initial Developers of the Original Code are Kevin Hendricks (MySpell)
michael@0 15 * and László Németh (Hunspell). Portions created by the Initial Developers
michael@0 16 * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved.
michael@0 17 *
michael@0 18 * Contributor(s): László Németh (nemethl@gyorsposta.hu)
michael@0 19 * Caolan McNamara (caolanm@redhat.com)
michael@0 20 *
michael@0 21 * Alternatively, the contents of this file may be used under the terms of
michael@0 22 * either the GNU General Public License Version 2 or later (the "GPL"), or
michael@0 23 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
michael@0 24 * in which case the provisions of the GPL or the LGPL are applicable instead
michael@0 25 * of those above. If you wish to allow use of your version of this file only
michael@0 26 * under the terms of either the GPL or the LGPL, and not to allow others to
michael@0 27 * use your version of this file under the terms of the MPL, indicate your
michael@0 28 * decision by deleting the provisions above and replace them with the notice
michael@0 29 * and other provisions required by the GPL or the LGPL. If you do not delete
michael@0 30 * the provisions above, a recipient may use your version of this file under
michael@0 31 * the terms of any one of the MPL, the GPL or the LGPL.
michael@0 32 *
michael@0 33 ******* END LICENSE BLOCK *******/
michael@0 34
michael@0 35 #include <stdlib.h>
michael@0 36 #include <string.h>
michael@0 37 #include <stdio.h>
michael@0 38
michael@0 39 #include "replist.hxx"
michael@0 40 #include "csutil.hxx"
michael@0 41
michael@0 42 RepList::RepList(int n) {
michael@0 43 dat = (replentry **) malloc(sizeof(replentry *) * n);
michael@0 44 if (dat == 0) size = 0; else size = n;
michael@0 45 pos = 0;
michael@0 46 }
michael@0 47
michael@0 48 RepList::~RepList()
michael@0 49 {
michael@0 50 for (int i = 0; i < pos; i++) {
michael@0 51 free(dat[i]->pattern);
michael@0 52 free(dat[i]->pattern2);
michael@0 53 free(dat[i]);
michael@0 54 }
michael@0 55 free(dat);
michael@0 56 }
michael@0 57
michael@0 58 int RepList::get_pos() {
michael@0 59 return pos;
michael@0 60 }
michael@0 61
michael@0 62 replentry * RepList::item(int n) {
michael@0 63 return dat[n];
michael@0 64 }
michael@0 65
michael@0 66 int RepList::near(const char * word) {
michael@0 67 int p1 = 0;
michael@0 68 int p2 = pos;
michael@0 69 while ((p2 - p1) > 1) {
michael@0 70 int m = (p1 + p2) / 2;
michael@0 71 int c = strcmp(word, dat[m]->pattern);
michael@0 72 if (c <= 0) {
michael@0 73 if (c < 0) p2 = m; else p1 = p2 = m;
michael@0 74 } else p1 = m;
michael@0 75 }
michael@0 76 return p1;
michael@0 77 }
michael@0 78
michael@0 79 int RepList::match(const char * word, int n) {
michael@0 80 if (strncmp(word, dat[n]->pattern, strlen(dat[n]->pattern)) == 0) return strlen(dat[n]->pattern);
michael@0 81 return 0;
michael@0 82 }
michael@0 83
michael@0 84 int RepList::add(char * pat1, char * pat2) {
michael@0 85 if (pos >= size || pat1 == NULL || pat2 == NULL) return 1;
michael@0 86 replentry * r = (replentry *) malloc(sizeof(replentry));
michael@0 87 if (r == NULL) return 1;
michael@0 88 r->pattern = mystrrep(pat1, "_", " ");
michael@0 89 r->pattern2 = mystrrep(pat2, "_", " ");
michael@0 90 r->start = false;
michael@0 91 r->end = false;
michael@0 92 dat[pos++] = r;
michael@0 93 for (int i = pos - 1; i > 0; i--) {
michael@0 94 r = dat[i];
michael@0 95 if (strcmp(r->pattern, dat[i - 1]->pattern) < 0) {
michael@0 96 dat[i] = dat[i - 1];
michael@0 97 dat[i - 1] = r;
michael@0 98 } else break;
michael@0 99 }
michael@0 100 return 0;
michael@0 101 }
michael@0 102
michael@0 103 int RepList::conv(const char * word, char * dest) {
michael@0 104 int stl = 0;
michael@0 105 int change = 0;
michael@0 106 for (size_t i = 0; i < strlen(word); i++) {
michael@0 107 int n = near(word + i);
michael@0 108 int l = match(word + i, n);
michael@0 109 if (l) {
michael@0 110 strcpy(dest + stl, dat[n]->pattern2);
michael@0 111 stl += strlen(dat[n]->pattern2);
michael@0 112 i += l - 1;
michael@0 113 change = 1;
michael@0 114 } else dest[stl++] = word[i];
michael@0 115 }
michael@0 116 dest[stl] = '\0';
michael@0 117 return change;
michael@0 118 }

mercurial