[GRASS-SVN] r60500 - grass/trunk/general/g.mlist

svn_grass at osgeo.org svn_grass at osgeo.org
Tue May 27 00:26:01 PDT 2014


Author: hcho
Date: 2014-05-27 00:26:01 -0700 (Tue, 27 May 2014)
New Revision: 60500

Modified:
   grass/trunk/general/g.mlist/main.c
Log:
g.mlist: output= implemented by Martin & Huidae; check for mutually exclusive options/flags

Modified: grass/trunk/general/g.mlist/main.c
===================================================================
--- grass/trunk/general/g.mlist/main.c	2014-05-27 04:41:47 UTC (rev 60499)
+++ grass/trunk/general/g.mlist/main.c	2014-05-27 07:26:01 UTC (rev 60500)
@@ -9,7 +9,7 @@
  * PURPOSE:      Lists available GRASS data base files of the
  *               user-specified data type to standard output
  *
- * COPYRIGHT:    (C) 1999-2011 by the GRASS Development Team
+ * COPYRIGHT:    (C) 1999-2014 by the GRASS Development Team
  *
  *               This program is free software under the GNU General Public
  *               License (>=v2). Read the file COPYING that comes with GRASS
@@ -27,9 +27,8 @@
 
 static int any = 0;
 
-static void make_list(const struct list *,
-		      const char *, const char *,
-		      int, int, int, int);
+static void make_list(FILE *, const struct list *, const char *, const char *,
+		      int, int, int);
 
 int main(int argc, char *argv[])
 {
@@ -41,6 +40,7 @@
 	struct Option *exclude;
 	struct Option *separator;
 	struct Option *mapset;
+	struct Option *output;
     } opt;
     struct
     {
@@ -53,6 +53,7 @@
     } flag;
     int i, n, all, num_types, nlist;
     void *filter = NULL, *exclude = NULL;
+    FILE *fp;
     const char *mapset;
     char separator[2];
 
@@ -96,6 +97,11 @@
     opt.separator = G_define_standard_option(G_OPT_F_SEP);
     opt.separator->answer = "newline";
 
+    opt.output = G_define_standard_option(G_OPT_F_OUTPUT);
+    opt.output->required = NO;
+    opt.output->label = _("Name for output file");
+    opt.output->description = _("If not given or '-' then standard output");
+
     flag.regex = G_define_flag();
     flag.regex->key = 'r';
     flag.regex->description =
@@ -131,6 +137,21 @@
     if (G_parser(argc, argv))
 	exit(EXIT_FAILURE);
 
+    if (opt.output->answer && flag.pretty->answer)
+	G_fatal_error(_("output and -p are mutually exclusive"));
+
+    if (opt.output->answer && flag.full->answer)
+	G_fatal_error(_("output and -f are mutually exclusive"));
+
+    if (flag.type->answer && flag.pretty->answer)
+	G_fatal_error(_("-t and -p are mutually exclusive"));
+
+    if (flag.type->answer && flag.full->answer)
+	G_fatal_error(_("-t and -f are mutually exclusive"));
+
+    if (flag.full->answer && flag.pretty->answer)
+	G_fatal_error(_("-f and -p are mutually exclusive"));
+
     if (flag.regex->answer && flag.extended->answer)
 	G_fatal_error(_("-r and -e are mutually exclusive"));
 
@@ -160,12 +181,14 @@
 	separator[0] = opt.separator->answer[0];
     separator[1] = 0;
 
-    mapset = opt.mapset->answer;
+    if (!opt.output->answer || strcmp(opt.output->answer, "-") == 0)
+	fp = stdout;
+    else if ((fp = fopen(opt.output->answer, "w")) == NULL)
+	G_fatal_error(_("Failed to create file [%s]"), opt.output->answer);
 
-    if (mapset == NULL)
+    if ((mapset = opt.mapset->answer) == NULL)
 	mapset = "";
-
-    if (G_strcasecmp(mapset, ".") == 0)
+    else if (G_strcasecmp(mapset, ".") == 0)
 	mapset = G_mapset();
 
     for (i = 0; opt.type->answers[i]; i++) {
@@ -182,13 +205,16 @@
     }
 
     for (i = 0; i < num_types; i++) {
+	const struct list *elem;
+
 	n = all ? i : M_get_element(opt.type->answers[i]);
 
+	elem = M_get_list(n);
+
 	if (flag.full->answer) {
 	    char lister[GPATH_MAX];
 
-	    sprintf(lister, "%s/etc/lister/%s", G_gisbase(),
-		    M_get_list(n)->element[0]);
+	    sprintf(lister, "%s/etc/lister/%s", G_gisbase(), elem->element[0]);
 
 	    G_debug(3, "lister CMD: %s", lister);
 
@@ -197,15 +223,19 @@
 		continue;
 	    }
 	}
+	else if (flag.pretty->answer)
+	    G_list_element(elem->element[0], elem->alias, mapset, NULL);
 	else
-	    make_list(M_get_list(n), mapset, separator,
-		      flag.pretty->answer, flag.type->answer,
+	    make_list(fp, elem, mapset, separator, flag.type->answer,
 		      flag.mapset->answer, mapset && *mapset);
     }
 
-    if (!flag.pretty->answer && any)
-	fprintf(stdout, "\n");
+    if (any)
+	fprintf(fp, "\n");
 
+    if (fp != stdout)
+	fclose(fp);
+
     if (filter)
 	G_free_ls_filter(filter);
 
@@ -215,10 +245,9 @@
     exit(EXIT_SUCCESS);
 }
 
-static void make_list(
-    const struct list *elem,
-    const char *mapset, const char *separator,
-    int pretty, int add_type, int add_mapset, int single_mapset)
+static void make_list(FILE *fp, const struct list *elem, const char *mapset,
+		      const char *separator, int add_type, int add_mapset,
+		      int single_mapset)
 {
     char path[GPATH_MAX];
     const char *element = elem->element[0];
@@ -227,16 +256,11 @@
     int count;
     int i;
 
-    if (pretty) {
-	G_list_element(element, alias, mapset, NULL);
-	return;
-    }
-
     if (!mapset || !*mapset) {
 	int n;
 	for (n = 0; mapset = G__mapset_name(n), mapset; n++)
-	    make_list(elem, mapset, separator,
-		      pretty, add_type, add_mapset, n == 0);
+	    make_list(fp, elem, mapset, separator, add_type, add_mapset,
+		      n == 0);
 	return;
     }
 
@@ -244,19 +268,14 @@
     if (access(path, 0) != 0)
 	return;
 
-    list = G__ls(path, &count);
-    if (!list)
+    if ((list = G__ls(path, &count)) == NULL)
 	return;
 
     if (count > 0) {
-	if (any) {
-	    if (pretty)
-		fprintf(stdout, "\n");
-	    else
-		fprintf(stdout, "%s", separator);
-	}
-	G_message(_("%s available in mapset <%s>:"),
-		  elem->text, mapset);
+	if (any)
+	    fprintf(fp, "%s", separator);
+	if (fp == stdout)
+	    G_message(_("%s available in mapset <%s>:"), elem->text, mapset);
     }
 
     /* Suppress "... found in more mapsets" warnings from G_find_file2. */
@@ -267,12 +286,12 @@
 	int need_mapset = 0;
 
 	if (any && i != 0)
-	    fprintf(stdout, "%s", separator);
+	    fprintf(fp, "%s", separator);
 	
 	if (add_type)
-	    fprintf(stdout, "%s/", alias);
+	    fprintf(fp, "%s/", alias);
 
-	fprintf(stdout, "%s", name);
+	fprintf(fp, "%s", name);
 
 	if (!add_mapset && !single_mapset) {
 	    const char *mapset2 = G_find_file2(element, name, "");
@@ -280,7 +299,7 @@
                 need_mapset = strcmp(mapset, mapset2) != 0;
 	}
 	if (add_mapset || need_mapset)
-	    fprintf(stdout, "@%s", mapset);
+	    fprintf(fp, "@%s", mapset);
 
 	G_free(name);
 
@@ -288,7 +307,7 @@
     }
 
     G_suppress_warnings(0);
-    fflush(stdout);
+    fflush(fp);
     
     G_free(list);
 }



More information about the grass-commit mailing list