summaryrefslogtreecommitdiff
path: root/external/hunspell/hunspell.rhbz918938.patch
blob: f1bdbd4ff8bae4b51512cae93d1742c7ef9f9c20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
--- misc/hunspell-1.3.2/src/hunspell/hunspell.cxx	2011-02-02 12:04:29.000000000 +0000
+++ misc/build/hunspell-1.3.2/src/hunspell/hunspell.cxx	2013-03-13 16:50:50.667928521 +0000
@@ -12,6 +12,8 @@
 #endif
 #include "csutil.hxx"
 
+#include <string>
+
 Hunspell::Hunspell(const char * affpath, const char * dpath, const char * key)
 {
     encoding = NULL;
@@ -1710,6 +1712,19 @@
     return n;
 }
 
+namespace
+{
+    void myrep(std::string& str, const std::string& search, const std::string& replace)
+    {
+        size_t pos = 0;
+        while ((pos = str.find(search, pos)) != std::string::npos)
+        {
+           str.replace(pos, search.length(), replace);
+           pos += replace.length();
+        }
+    }
+}
+
 int Hunspell::spellml(char*** slst, const char * word)
 {
   char *q, *q2;
@@ -1721,26 +1736,26 @@
   q2 = strstr(q2, "<word");
   if (!q2) return 0; // bad XML input
   if (check_xml_par(q, "type=", "analyze")) {
-      int n = 0, s = 0;
+      int n = 0;
       if (get_xml_par(cw, strchr(q2, '>'), MAXWORDUTF8LEN - 10)) n = analyze(slst, cw);
       if (n == 0) return 0;
       // convert the result to <code><a>ana1</a><a>ana2</a></code> format
-      for (int i = 0; i < n; i++) s+= strlen((*slst)[i]);
-      char * r = (char *) malloc(6 + 5 * s + 7 * n + 7 + 1); // XXX 5*s->&->&amp;
-      if (!r) return 0;
-      strcpy(r, "<code>");
+      std::string r;
+      r.append("<code>");
       for (int i = 0; i < n; i++) {
-        int l = strlen(r);
-        strcpy(r + l, "<a>");
-        strcpy(r + l + 3, (*slst)[i]);
-        mystrrep(r + l + 3, "\t", " ");
-        mystrrep(r + l + 3, "<", "&lt;");
-        mystrrep(r + l + 3, "&", "&amp;");
-        strcat(r, "</a>");
+        r.append("<a>");
+
+        std::string entry((*slst)[i]);
         free((*slst)[i]);
+        myrep(entry, "\t", " ");
+        myrep(entry, "&", "&amp;");
+        myrep(entry, "<", "&lt;");
+        r.append(entry);
+
+        r.append("</a>");
       }
-      strcat(r, "</code>");
-      (*slst)[0] = r;
+      r.append("</code>");
+      (*slst)[0] = mystrdup(r.c_str());
       return 1;
   } else if (check_xml_par(q, "type=", "stem")) {
       if (get_xml_par(cw, strchr(q2, '>'), MAXWORDUTF8LEN - 1)) return stem(slst, cw);