[mapcode] 01/03: Minor improvements

Stefan Fritsch sf at moszumanska.debian.org
Wed Nov 2 23:28:02 UTC 2016


This is an automated email from the git hooks/post-receive script.

sf pushed a commit to tag v2.1.0
in repository mapcode.

commit 606bc87414e691c958bd86fa9ac86742e41feb00
Author: Mapcode C Developer <pieter.geelen at mapcode.com>
Date:   Thu Aug 20 13:49:45 2015 +0200

    Minor improvements
    
    Protect binfindmatch against too-long territory strings, or lowercase
    strings;
---
 mapcodelib/mapcoder.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/mapcodelib/mapcoder.c b/mapcodelib/mapcoder.c
index fa4fa0a..3f1b181 100644
--- a/mapcodelib/mapcoder.c
+++ b/mapcodelib/mapcoder.c
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-#include <string.h> // strlen strcpy strcat memcpy memmove strstr strchr memcmp
+#include <string.h> // strlen strcpy strcat memcpy memmove strstr strchr memcmp strupr
 #include <stdlib.h> // atof
 #include <ctype.h>  // toupper
+#include <math.h>   // floor
 #include "mapcoder.h"
 #include "basics.h"
 
@@ -170,12 +171,7 @@ static int disambiguate_str(const char *s, int len) // returns disambiguation 1-
     if (len != 2 && len != 3) { return -923; } // solve bad args
     memcpy(country, s, len);
     country[len] = 0;
-    {
-        char *t;
-        for (t = country; *t != 0; t++) {
-            *t = (char) toupper(*t);
-        }
-    }
+    strupr(country);
     f = strstr(p, country);
     if (f == NULL) {
         return -23; // unknown country
@@ -1357,6 +1353,10 @@ static int decoderEngine(decodeRec *dec) {
         if (ccode == ccode_mex && len < 8) {
             ccode = ccode_of_iso3("5MX", -1);
         } // special case for mexico country vs state
+        if (*s=='u' || *s=='U') {
+            strcpy(s,s+1);
+            repack_if_alldigits(s, 1);
+        }
         dec->context = ccode;
         dec->mapcode = s;
         dec->extension = "";
@@ -1905,23 +1905,25 @@ int cmp_alphacode(const void *e1, const void *e2) {
 } // cmp
 
 int binfindmatch(int parentcode, const char *str) {
+    // build a 4-letter uppercase search term
     char tmp[5];
     if (parentcode < 0) { return -1; }
     if (parentcode > 0) {
         tmp[0] = '0' + parentcode;
         memcpy(tmp + 1, str, 3);
-        tmp[4] = 0;
-        str = tmp;
-    } //
+    } else {
+        memcpy(tmp, str, 4);
+    }
+    tmp[4] = 0;
     { // binary-search the result
         const alphaRec *p;
         alphaRec t;
-        t.alphaCode = str;
+        t.alphaCode = strupr(tmp);
         t.ccode = parentcode;
 
         p = (const alphaRec *) bsearch(&t, alphaSearch, NRTERREC, sizeof(alphaRec), cmp_alphacode);
         if (p) {
-            if (strcmp(str, p->alphaCode) == 0) {
+            if (strcmp(t.alphaCode, p->alphaCode) == 0) { // only interested in PERFECT match
                 return p->ccode + 1;
             } // match
         } // found

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapcode.git



More information about the Pkg-grass-devel mailing list