[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