[GRASS-dev] g.mlist as C implementation?
Martin Landa
landa.martin at gmail.com
Thu Sep 13 04:34:10 EDT 2007
Hi,
I modified my previous patch, now with -g flag...
$ g.list rast map=overlay
----------------------------------------------
raster files available in mapset <overlay>:
r r1
$ g.list rast map=overlay -f
----------------------------------------------
raster files available in mapset <overlay>:
r1: test
r:
$ g.list rast map=overlay -g
r1 at overlay
r at overlay
$ g.list rast map=overlay -gf
r1 at overlay:test
r at overlay:
BTW the patch is really not nice, maybe it would be better to modify
G_list() to add mapset to the element name automatically and lister()
fn for titles...
Martin
2007/9/12, Markus Neteler <neteler at itc.it>:
> Hamish wrote on 09/12/2007 12:47 PM:
> > what should a the C flat 'g.list -g' output look like? how about:
> > [user1]
> > map1
> > map2
> > map3
> > [PERMANENT]
> > map_a
> > map_b
> > map_c
> >
> For parsing reasons, it should be
> [user1] map1
> [user1] map2
> [user1] map3
> [PERMANENT] map1
> [PERMANENT] map2
> [PERMANENT] map3
>
> or even
> user1:map1
> user1:map2
> user1:map3
> PERMANENT:map1
> PERMANENT:map2
> PERMANENT:map3
>
> and 'g.list -gf':
> user1:map1:title1
> user1:map2:title2
> PERMANENT:map1:title1
>
> Markus
>
> ------------------
> ITC -> dall'1 marzo 2007 Fondazione Bruno Kessler
> ITC -> since 1 March 2007 Fondazione Bruno Kessler
> ------------------
>
> _______________________________________________
> grass-dev mailing list
> grass-dev at grass.itc.it
> http://grass.itc.it/mailman/listinfo/grass-dev
>
--
Martin Landa <landa.martin at gmail.com> * http://gama.fsv.cvut.cz/~landa *
-------------- next part --------------
? general/manage/cmd/OBJ.i686-pc-linux-gnu
? general/manage/lib/OBJ.i686-pc-linux-gnu
? general/manage/lister/OBJ.i686-pc-linux-gnu
? lib/gis/OBJ.i686-pc-linux-gnu
? lib/gis/html
? lib/gis/latex
Index: general/manage/list.h
===================================================================
RCS file: /home/grass/grassrepository/grass6/general/manage/list.h,v
retrieving revision 1.4
diff -u -r1.4 list.h
--- general/manage/list.h 13 Jan 2007 19:09:45 -0000 1.4
+++ general/manage/list.h 13 Sep 2007 08:27:41 -0000
@@ -39,6 +39,7 @@
int do_copy(int, char *, char *, char *);
/* do_list.c */
int do_list(int, char *);
+int do_list2(int, char *, int, int);
/* do_remove.c */
int do_remove(int, char *);
/* do_rename.c */
Index: general/manage/cmd/list.c
===================================================================
RCS file: /home/grass/grassrepository/grass6/general/manage/cmd/list.c,v
retrieving revision 1.7
diff -u -r1.7 list.c
--- general/manage/cmd/list.c 12 Feb 2007 15:01:02 -0000 1.7
+++ general/manage/cmd/list.c 13 Sep 2007 08:27:41 -0000
@@ -32,7 +32,7 @@
int i, n, len;
struct GModule *module;
struct Option *mapset;
- struct Flag *full;
+ struct Flag *full, *shell;
init (argv[0]);
@@ -48,7 +48,7 @@
element->type = TYPE_STRING;
element->required = YES;
element->multiple = YES;
- element->description = "Data type";
+ element->description = _("Data type");
for (len=0,n=0 ; n < nlist; n++)
len += strlen (list[n].alias)+1;
element->options = G_malloc(len);
@@ -74,9 +74,16 @@
full = G_define_flag();
full->key = 'f';
- full->description = _("Verbose listing (also list map titles)");
+ full->label = _("Verbose listing (also list map titles)");
+ full->description = _("Prints one element per line");
#define FULL full->answer
+ shell = G_define_flag();
+ shell->key = 'g';
+ shell->label = _("Print in shell script style");
+ shell->description = _("Prints one element per line");
+#define SHELL shell->answer
+
if (G_parser(argc, argv))
{
exit(EXIT_FAILURE);
@@ -92,22 +99,40 @@
while (element -> answers[i])
{
n = parse(element -> answers[i]);
-
- if (FULL)
+
+ /*
+ if (FULL)
{
+ G_warning (_("Parameter '%s' is ignored for verbose listing"),
+ "1");
char lister[300];
sprintf (lister, "%s/etc/lister/%s", G_gisbase(), list[n].element[0]);
G_debug(3,"lister CMD: %s",lister);
- if (access (lister, 1) == 0) /* execute permission? */
+ if (access (lister, 1) == 0)
G_spawn (lister, lister, MAPSET, NULL);
else
do_list (n, MAPSET);
}
+ else
+ {
+ */
+
+ /*
+ * if no specific mapset is requested, list the mapsets
+ * from the mapset search list
+ * otherwise just list the specified mapset
+ */
+ if (strcmp (MAPSET, "") == 0)
+ {
+ char *mapset;
+ int i;
+ for (i = 0; (mapset = G__mapset_name (i)); i++)
+ do_list2 (n, mapset, SHELL ? 1 : 0, FULL ? 1 : 0);
+ }
else
{
- do_list (n, MAPSET);
+ do_list2(n, MAPSET, SHELL ? 1 : 0, FULL ? 1: 0);
}
-
i++;
}
Index: general/manage/lib/do_list.c
===================================================================
RCS file: /home/grass/grassrepository/grass6/general/manage/lib/do_list.c,v
retrieving revision 1.1
diff -u -r1.1 do_list.c
--- general/manage/lib/do_list.c 23 Jan 2003 15:40:55 -0000 1.1
+++ general/manage/lib/do_list.c 13 Sep 2007 08:27:41 -0000
@@ -1,8 +1,87 @@
+#include <string.h>
#include "list.h"
+
+#define SEP "----------------------------------------------"
+
int
do_list (int n, char *mapset)
{
G_list_element (list[n].element[0], list[n].desc[0], mapset, (int(*)())0);
return 0;
+}
+
+int do_list2 (int n, char *mapset, int shell, int full)
+{
+ char **elements;
+ int nitems;
+
+ if (!shell)
+ G_message (SEP);
+
+ /* list elements */
+ elements = G_list (n+1, G_gisdbase(), G_location(), mapset);
+ /* deteremine number of elements */
+ nitems = 0;
+ while (elements[nitems++])
+ ;
+ nitems--;
+
+ /* if shell script style print map at mapset */
+ if (shell) {
+ int i;
+ char *title;
+ for (i = 0; i < nitems; i++) {
+ if (full) {
+ title = G_get_cell_title(elements[i], mapset);
+ elements[i] = (char *) G_realloc (elements[i],
+ strlen(elements[i]) + strlen(mapset) +
+ + strlen(title) + 3);
+ }
+ else {
+ elements[i] = (char *) G_realloc (elements[i],
+ strlen(elements[i]) + strlen(mapset) + 2);
+ }
+
+ G_strcat ( elements[i], "@" );
+ G_strcat ( elements[i], mapset);
+ if (full) {
+ G_strcat ( elements[i], ":");
+ G_strcat ( elements[i], title);
+ G_free (title);
+ }
+ }
+ }
+ else if (full) { /* print titles */
+ int i;
+ char * title;
+ for (i = 0; i < nitems; i++) {
+ title = G_get_cell_title(elements[i], mapset);
+ elements[i] = (char *) G_realloc (elements[i],
+ strlen(elements[i]) + strlen(title) + 3);
+ G_strcat ( elements[i], ": ");
+ G_strcat ( elements[i], title);
+ G_free (title);
+ }
+ }
+
+ if (nitems > 0) {
+ if (!shell)
+ G_important_message (_("%s files available in mapset <%s>:"),
+ list[n].desc[0], mapset);
+ /* print elements */
+ G_ls_format ((const char**) elements, nitems,
+ (shell || full) ? 1 : 0, /* one item per line */
+ stdout);
+ }
+ else {
+ if (!shell)
+ G_important_message (_("no %s files available in mapset <%s>:"),
+ list[n].desc[0], mapset);
+ }
+
+ /* free list of elements */
+ G_free_list (elements);
+
+ return nitems - 1;
}
Index: lib/gis/list.c
===================================================================
RCS file: /home/grass/grassrepository/grass6/lib/gis/list.c,v
retrieving revision 2.24
diff -u -r2.24 list.c
--- lib/gis/list.c 4 Sep 2007 08:34:38 -0000 2.24
+++ lib/gis/list.c 13 Sep 2007 08:27:42 -0000
@@ -238,24 +238,56 @@
switch ( element )
{
- case G_ELEMENT_RASTER:
- el = "cell";
- break;
-
- case G_ELEMENT_GROUP:
- el = "group";
- break;
-
- case G_ELEMENT_VECTOR:
- el = "vector";
- break;
-
- case G_ELEMENT_REGION:
- el = "windows";
- break;
+ case G_ELEMENT_RASTER:
+ el = "cell";
+ break;
+
+ case G_ELEMENT_RASTER3D:
+ el = "grid3";
+ break;
+
+ case G_ELEMENT_VECTOR:
+ el = "vector";
+ break;
- default:
- G_fatal_error (_("G_list: Unknown element type"));
+ case G_ELEMENT_OLDVECTOR:
+ el = "dig";
+ break;
+
+ case G_ELEMENT_ASCIIVECTOR:
+ el = "dig_ascii";
+ break;
+
+ case G_ELEMENT_ICON:
+ el = "icons";
+ break;
+
+ case G_ELEMENT_LABEL:
+ el = "paint/labels";
+ break;
+
+ case G_ELEMENT_SITE:
+ el = "site_lists";
+ break;
+
+ case G_ELEMENT_REGION:
+ el = "windows";
+ break;
+
+ case G_ELEMENT_REGION3D:
+ el = "windows3d";
+ break;
+
+ case G_ELEMENT_GROUP:
+ el = "group";
+ break;
+
+ case G_ELEMENT_3DVIEW:
+ el = "3d.view";
+ break;
+
+ default:
+ G_fatal_error (_("G_list: Unknown element type"));
}
buf = (char *) G_malloc ( strlen(gisbase) + strlen(location)
Index: lib/gis/ls.c
===================================================================
RCS file: /home/grass/grassrepository/grass6/lib/gis/ls.c,v
retrieving revision 1.8
diff -u -r1.8 ls.c
--- lib/gis/ls.c 4 Sep 2007 08:34:38 -0000 1.8
+++ lib/gis/ls.c 13 Sep 2007 08:27:42 -0000
@@ -142,6 +142,9 @@
}
#endif
+ /* Sort list of filenames alphabetically */
+ qsort(list, num_items, sizeof(char *), cmp_names);
+
if (perline == 0)
{
int max_len = 0;
More information about the grass-dev
mailing list