[GRASS-SVN] r63772 - in grass/branches/releasebranch_7_0: . lib/gis

svn_grass at osgeo.org svn_grass at osgeo.org
Fri Dec 26 15:08:45 PST 2014


Author: neteler
Date: 2014-12-26 15:08:45 -0800 (Fri, 26 Dec 2014)
New Revision: 63772

Modified:
   grass/branches/releasebranch_7_0/
   grass/branches/releasebranch_7_0/lib/gis/parser.c
Log:
libgis parser: Change handling of ambiguous matches (issue #2409) (trunk, r63744)


Property changes on: grass/branches/releasebranch_7_0
___________________________________________________________________
Modified: svn:mergeinfo
   - /grass/trunk:60817,61096,61141,61994,62105,62179-62180,62182,62190,62403,62422,62424,62437,62466,62469,62487,62491,62494,62501,62506,62508-62509,62515,62518-62519,62521,62526,62533,62539,62541,62555,62562,62566,62570,62573,62575,62585,62588,62597,62603,62606,62608-62609,62614,62618,62628,62632,62638,62642,62648-62649,62652,62654-62657,62666,62691,62705,62709,62723,62730,62739,62741,62743,62746,62750-62752,62757,62762,62785,62798,62800-62801,62803,62805,62812,62822,62824,62828,62831,62838,62845,62847,62850,62856,62879,62881,62886,62904,62907-62908,62910,62912,62914,62916,62918,62920,62925,62932-62933,62935,62940,62942,62944-62946,62949,62955-62956,62958,62960,62962,62964,62966-62968,62970,62973,62975,62977,62981,62983,62985,62987,62989,62991,62993,62995,62997,62999-63000,63003,63005,63007,63009,63011,63013,63015,63017,63020,63022,63024,63026,63028-63031,63033,63035,63037,63040,63043-63044,63047,63049,63051,63053,63055,63057,63060,63062-63064,63066,63068,63070-63071,63074,
 63076,63079,63081,63083,63085,63087,63089,63091,63093,63095,63098,63100,63102,63105,63107,63109,63111,63113-63114,63116,63119,63121,63123,63125,63130,63132-63133,63135,63137,63140,63143,63145,63147,63149,63151,63153-63154,63157,63160,63165,63170,63173,63175,63187,63192-63193,63196,63199-63200,63202,63209,63216,63220-63221,63224,63227,63240,63246,63250,63255,63259,63261,63275-63276,63279,63281,63283,63287,63290,63292,63297,63302,63304-63307,63315,63319,63327,63330,63332,63339,63342,63345,63361-63363,63367,63379,63389,63391,63393,63402,63408-63409,63416-63417,63425,63427,63429,63431,63433,63448,63451,63453,63457,63459,63464-63470,63473,63482,63497,63505,63508,63510,63515,63521-63524,63526,63536-63537,63551-63552,63554,63556,63558-63559,63562,63570,63576,63582,63589-63593,63602,63604,63608-63609,63616,63618,63624,63626,63628,63630,63634,63639,63642,63644,63650,63652,63656,63679,63685,63689,63691,63693,63695,63698,63700-63702,63704,63706-63707,63709,63711,63713,63715,63717-63718
 ,63721-63727,63731,63733,63740-63742,63747-63749,63751-63752,63756,63758,63761,63767
   + /grass/trunk:60817,61096,61141,61994,62105,62179-62180,62182,62190,62403,62422,62424,62437,62466,62469,62487,62491,62494,62501,62506,62508-62509,62515,62518-62519,62521,62526,62533,62539,62541,62555,62562,62566,62570,62573,62575,62585,62588,62597,62603,62606,62608-62609,62614,62618,62628,62632,62638,62642,62648-62649,62652,62654-62657,62666,62691,62705,62709,62723,62730,62739,62741,62743,62746,62750-62752,62757,62762,62785,62798,62800-62801,62803,62805,62812,62822,62824,62828,62831,62838,62845,62847,62850,62856,62879,62881,62886,62904,62907-62908,62910,62912,62914,62916,62918,62920,62925,62932-62933,62935,62940,62942,62944-62946,62949,62955-62956,62958,62960,62962,62964,62966-62968,62970,62973,62975,62977,62981,62983,62985,62987,62989,62991,62993,62995,62997,62999-63000,63003,63005,63007,63009,63011,63013,63015,63017,63020,63022,63024,63026,63028-63031,63033,63035,63037,63040,63043-63044,63047,63049,63051,63053,63055,63057,63060,63062-63064,63066,63068,63070-63071,63074,
 63076,63079,63081,63083,63085,63087,63089,63091,63093,63095,63098,63100,63102,63105,63107,63109,63111,63113-63114,63116,63119,63121,63123,63125,63130,63132-63133,63135,63137,63140,63143,63145,63147,63149,63151,63153-63154,63157,63160,63165,63170,63173,63175,63187,63192-63193,63196,63199-63200,63202,63209,63216,63220-63221,63224,63227,63240,63246,63250,63255,63259,63261,63275-63276,63279,63281,63283,63287,63290,63292,63297,63302,63304-63307,63315,63319,63327,63330,63332,63339,63342,63345,63361-63363,63367,63379,63389,63391,63393,63402,63408-63409,63416-63417,63425,63427,63429,63431,63433,63448,63451,63453,63457,63459,63464-63470,63473,63482,63497,63505,63508,63510,63515,63521-63524,63526,63536-63537,63551-63552,63554,63556,63558-63559,63562,63570,63576,63582,63589-63593,63602,63604,63608-63609,63616,63618,63624,63626,63628,63630,63634,63639,63642,63644,63650,63652,63656,63679,63685,63689,63691,63693,63695,63698,63700-63702,63704,63706-63707,63709,63711,63713,63715,63717-63718
 ,63721-63727,63731,63733,63740-63742,63744,63747-63749,63751-63752,63756,63758,63761,63767

Modified: grass/branches/releasebranch_7_0/lib/gis/parser.c
===================================================================
--- grass/branches/releasebranch_7_0/lib/gis/parser.c	2014-12-26 22:44:16 UTC (rev 63771)
+++ grass/branches/releasebranch_7_0/lib/gis/parser.c	2014-12-26 23:08:45 UTC (rev 63772)
@@ -94,6 +94,8 @@
 
 #define KEYLENGTH 64
 
+#define MAX_MATCHES 50
+
 /* initialize the global struct */
 struct state state;
 struct state *st = &state;
@@ -941,11 +943,11 @@
 {
     struct Option *at_opt = NULL;
     struct Option *opt = NULL;
-    int found;
-    int prefix;
     size_t key_len;
     char the_key[KEYLENGTH];
     char *ptr, *err;
+    struct Option *matches[MAX_MATCHES];
+    int found = 0;
 
     err = NULL;
 
@@ -955,37 +957,58 @@
     string++;
 
     /* Find option with best keyword match */
-    found = 0;
-    prefix = 0;
     key_len = strlen(the_key);
     for (at_opt = &st->first_option; at_opt; at_opt = at_opt->next_opt) {
 	if (!at_opt->key)
 	    continue;
 
         if (strcmp(the_key, at_opt->key) == 0) {
-	    opt = at_opt;
+	    matches[0] = at_opt;
 	    found = 1;
 	    break; 
 	}
 
-        if (strncmp(the_key, at_opt->key, key_len) == 0) {
-	    opt = at_opt;
-	    found++;
-	    prefix++;
+        if (strncmp(the_key, at_opt->key, key_len) == 0 ||
+	    match_option(the_key, at_opt->key)) {
+	    if (found >= MAX_MATCHES)
+		G_fatal_error("too many matches (limit %d)", MAX_MATCHES);
+	    matches[found++] = at_opt;
 	}
-	else if (match_option(the_key, at_opt->key)) {
-	    if (!found)
-		opt = at_opt;
-	    found++;
-	}
     }
 
-    if (found > 1 && prefix > 1) {
-	G_asprintf(&err, _("%s: Sorry, <%s=> is ambiguous"), G_program_name(), the_key);
-	append_error(err);
-	return;
+    if (found > 1) {
+	int shortest = 0;
+	int length = strlen(matches[0]->key);
+	int prefix = 1;
+	int i;
+	for (i = 1; i < found; i++) {
+	    int len = strlen(matches[i]->key);
+	    if (len < length) {
+		length = len;
+		shortest = i;
+	    }
+	}
+	for (i = 0; prefix && i < found; i++)
+	    if (strncmp(matches[i]->key, matches[shortest]->key, length) != 0)
+		prefix = 0;
+	if (prefix) {
+	    matches[0] = matches[shortest];
+	    found = 1;
+	}
+	else {
+	    G_asprintf(&err, _("%s: Sorry, <%s=> is ambiguous"), G_program_name(), the_key);
+	    append_error(err);
+	    for (i = 0; i < found; i++) {
+		G_asprintf(&err, _("Option <%s=> matches"), matches[i]->key);
+		append_error(err);
+	    }
+	    return;
+	}
     }
 
+    if (found)
+	opt = matches[0];
+
     /* First, check if key has been renamed in GRASS 7 */
     if (found == 0) {
         const char *renamed_key = NULL;
@@ -1214,7 +1237,7 @@
 {
     int len = strlen(ans);
     int found = 0;
-    int prefix = 0;
+    int matches[MAX_MATCHES];
     int i;
 
     if (!opts)
@@ -1223,26 +1246,41 @@
     for (i = 0; opts[i]; i++) {
 	if (strcmp(ans, opts[i]) == 0)
 	    return 0;
-	if (strncmp(ans, opts[i], len) == 0) {
-	    *result = i;
-	    found++;
-	    prefix++;
+	if (strncmp(ans, opts[i], len) == 0 || match_option(ans, opts[i])) {
+	    if (found >= MAX_MATCHES)
+		G_fatal_error("too many matches (limit %d)", MAX_MATCHES);
+	    matches[found++] = i;
 	}
-	else if (match_option(ans, opts[i])) {
-	    if (!found)
-		*result = i;
-	    found++;
+    }
+
+    if (found > 1) {
+	int shortest = 0;
+	int length = strlen(opts[matches[0]]);
+	int prefix = 1;
+	int i;
+	for (i = 1; i < found; i++) {
+	    int len = strlen(opts[matches[i]]);
+	    if (len < length) {
+		length = len;
+		shortest = i;
+	    }
 	}
+	for (i = 0; prefix && i < found; i++)
+	    if (strncmp(opts[matches[i]], opts[matches[shortest]], length) != 0)
+		prefix = 0;
+	if (prefix) {
+	    matches[0] = matches[shortest];
+	    found = 1;
+	}
     }
 
+    if (found == 1)
+	*result = matches[0];
+
     switch (found) {
     case 0: return OUT_OF_RANGE;
     case 1: return REPLACED;
-    default:
-	switch (prefix) {
-	case 1: return REPLACED;
-	default: return AMBIGUOUS;
-	}
+    default: return AMBIGUOUS;
     }
 }
 



More information about the grass-commit mailing list