[mapcode] 03/06: Stricter tests on territories and illegal characters

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


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

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

commit 92ae2f9d46858afd851992f2c4dadc148d29eabd
Author: Mapcode C Developer <pieter.geelen at mapcode.com>
Date:   Sun Aug 23 21:18:45 2015 +0200

    Stricter tests on territories and illegal characters
---
 mapcodelib/mapcoder.c | 45 +++++++++++++++++++++++++++++----------------
 1 file changed, 29 insertions(+), 16 deletions(-)

diff --git a/mapcodelib/mapcoder.c b/mapcodelib/mapcoder.c
index 510b510..e5ebbe3 100644
--- a/mapcodelib/mapcoder.c
+++ b/mapcodelib/mapcoder.c
@@ -185,6 +185,7 @@ static int disambiguate_str(const char *s, int len) // returns disambiguation 1-
 }
 
 
+#ifndef FAST_ALPHA
 // returns coode, or negative if invalid
 static int ccode_of_iso3(const char *in_iso, int parentcode) {
     const char *aliases = ALIASES;
@@ -196,12 +197,14 @@ static int ccode_of_iso3(const char *in_iso, int parentcode) {
         if (in_iso[2]) {
             if (in_iso[2] == '-') {
                 parentcode = disambiguate_str(in_iso, 2);
-                hyphenated = (parentcode > 0);
+                if (parentcode < 0) { return parentcode; }
+                hyphenated = 1;
                 in_iso += 3;
             }
             else if (in_iso[3] == '-') {
                 parentcode = disambiguate_str(in_iso, 3);
-                hyphenated = (parentcode > 0);
+                if (parentcode < 0) { return parentcode; }
+                hyphenated = 1;
                 in_iso += 4;
             }
         }
@@ -211,11 +214,12 @@ static int ccode_of_iso3(const char *in_iso, int parentcode) {
     iso[0] = (char) toupper(in_iso[0]);
     if (iso[0]) { iso[1] = (char) toupper(in_iso[1]); }
     if (iso[1]) { iso[2] = (char) toupper(in_iso[2]); }
+    if (iso[2] && in_iso[3]!=0 && in_iso[3]!='-') { return -41; }
     iso[3] = 0;
 
     if (iso[2] == 0 || iso[2] == ' ') // 2-letter iso code?
     {
-        static char disambiguate_iso3[4] = {'1', '?', '?', 0}; // cache for disambiguation
+        static char disambiguate_iso3[4] = {'0', '?', '?', 0}; // cache for disambiguation
         if (parentcode > 0) {
             disambiguate_iso3[0] = (char) ('0' + parentcode);
         }
@@ -227,7 +231,7 @@ static int ccode_of_iso3(const char *in_iso, int parentcode) {
             s = strstr(aliases, disambiguate_iso3); // search in aliases
             if (s == NULL || s[3] != '=') {
                 s = NULL;
-                if (disambiguate_iso3[0] <= '9') {
+                if (disambiguate_iso3[0] <= '9' && !hyphenated) {
                     disambiguate_iso3[0] = '0';
                     s = strstr(aliases, disambiguate_iso3); // search in aliases
                 }
@@ -237,7 +241,7 @@ static int ccode_of_iso3(const char *in_iso, int parentcode) {
                 s = strstr(entity_iso, iso); // search disambiguated 2-letter iso
             }
         }
-        if (s == NULL) {
+        if (s == NULL && !hyphenated) {
             // find the FIRST disambiguation option, if any
             for (s = entity_iso - 1; ;) {
                 s = strstr(s + 1, disambiguate_iso3 + 1);
@@ -293,7 +297,7 @@ static int ccode_of_iso3(const char *in_iso, int parentcode) {
     // return result
     return (int) ((s - entity_iso) / 4);
 }
-
+#endif
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //
@@ -357,6 +361,9 @@ static int decodeExtension(decodeRec *dec, int dividerx4, int dividery0, int lon
     int lat32 = 0;
     int processor = 1;
     int odd = 0;
+    if (strlen(extrapostfix)>MAX_PRECISION_DIGITS) {
+        return -79; // too many digits
+    }
     while (*extrapostfix) {
         int column1, row1, column2, row2;
         int c1 = *extrapostfix++;
@@ -978,8 +985,8 @@ static void repack_if_alldigits(char *input, int aonly) {
     }
 }
 
-static int unpack_if_alldigits(
-        char *input) // returns 1 if unpacked, 0 if left unchanged, negative if unchanged and an error was detected
+// returns 1 if unpacked, 0 if left unchanged, negative if unchanged and an error was detected
+static int unpack_if_alldigits(char *input) 
 { // rewrite all-digit codes
     char *s = input;
     char *dotpos = NULL;
@@ -1029,6 +1036,8 @@ static int unpack_if_alldigits(
             if (v < 100) {
                 *s = encode_chars[(unsigned int) v / 10];
                 *e = encode_chars[(unsigned int) v % 10];
+            } else {
+                return -31; // overflow (ending in UE or UU)
             }
             return 1;
         }
@@ -1397,14 +1406,14 @@ static int decoderEngine(decodeRec *dec) {
         if (s) {
             *s++ = 0;
             while (*s > 0 && *s <= 32) { s++; }
-            ccode = ccode_of_iso3(w, dec->context);
+            ccode = convertTerritoryIsoNameToCode(w, dec->context-1) - 1;
         }
         else {
             ccode = dec->context - 1;
             s = w;
         }
         if (ccode == ccode_mex && len < 8) {
-            ccode = ccode_of_iso3("5MX", -1);
+            ccode = convertTerritoryIsoNameToCode("5MX", -1) - 1;
         } // special case for mexico country vs state
         if (*s=='u' || *s=='U') {
             strcpy(s,s+1);
@@ -1412,7 +1421,7 @@ static int decoderEngine(decodeRec *dec) {
         }
         dec->context = ccode;
         dec->mapcode = s;
-        dec->extension = "";
+        dec->extension = NULL;
         // make upper, handle i and o, split off high precision characters if any
         for (w = s; *w != 0; w++) {
             // uppercase
@@ -1427,7 +1436,7 @@ static int decoderEngine(decodeRec *dec) {
                     *w = '1';
                 } else if (*w == 'A' || *w == 'E' || *w == 'U') {
                     hasvowels = 1;
-                } else {
+                } else if (dec->extension == NULL) {
                     hasletters = 1;
                 }
             }
@@ -1438,9 +1447,9 @@ static int decoderEngine(decodeRec *dec) {
                 prelen = (int) ((dot = w) - s);
             }
             else if (*w == '-') {
-                if (*dec->extension) {
-                    return -17;
-                } // already had a hyphen
+                if (dec->extension != NULL) {
+                    return -17; // already had a hyphen
+                } 
                 dec->extension = w + 1;
                 *w = 0;
             }
@@ -1451,6 +1460,9 @@ static int decoderEngine(decodeRec *dec) {
         if (!dot) {
             return -27;
         }
+        if (dec->extension == NULL) { 
+            dec->extension = "";
+        }
 
         codex = prelen * 10 + strlen(dot) - 1;
 
@@ -1642,7 +1654,7 @@ static int decoderEngine(decodeRec *dec) {
 #ifdef SUPPORT_FOREIGN_ALPHABETS
 
 // WARNING - these alphabets have NOT yet been released as standard! use at your own risk! check www.mapcode.com for details.
-static UWORD asc2lan[MAX_LANGUAGES][36] = // A-Z equivalents for ascii characters A to Z, 0-9
+static UWORD asc2lan[MAPCODE_ALPHABETS_TOTAL][36] = // A-Z equivalents for ascii characters A to Z, 0-9
         {
                 {0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039}, // roman
                 {0x0391, 0x0392, 0x039e, 0x0394, 0x003f, 0x0395, 0x0393, 0x0397, 0x0399, 0x03a0, 0x039a, 0x039b, 0x039c, 0x039d, 0x039f, 0x03a1, 0x0398, 0x03a8, 0x03a3, 0x03a4, 0x003f, 0x03a6, 0x03a9, 0x03a7, 0x03a5, 0x0396, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039}, // greek
@@ -2118,6 +2130,7 @@ int decodeMapcodeToLatLon(double *lat, double *lon, const char *input,
 
 #ifdef SUPPORT_FOREIGN_ALPHABETS
 
+// convert as much as will fit of mapcode into unibuf
 UWORD *convertToAlphabet(UWORD *unibuf, int maxlength, const char *mapcode, int alphabet) // 0=roman, 2=cyrillic
 {
     UWORD *startbuf = unibuf;

-- 
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