123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- /****************************************************************************
- *
- * MODULE: g.mlist
- *
- * AUTHOR(S): Huidae Cho
- * Based on general/manage/cmd/list.c by Michael Shapiro.
- *
- * 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
- *
- * This program is free software under the GNU General Public
- * License (>=v2). Read the file COPYING that comes with GRASS
- * for details.
- *
- *****************************************************************************/
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <grass/gis.h>
- #include <grass/manage.h>
- #include <grass/glocale.h>
- #include <grass/spawn.h>
- static int any = 0;
- static void make_list(const struct list *,
- const char *, const char *,
- int, int, int);
- int main(int argc, char *argv[])
- {
- struct GModule *module;
- struct
- {
- struct Option *type;
- struct Option *pattern;
- struct Option *exclude;
- struct Option *separator;
- struct Option *mapset;
- } opt;
- struct
- {
- struct Flag *regex;
- struct Flag *extended;
- struct Flag *type;
- struct Flag *mapset;
- struct Flag *pretty;
- struct Flag *full;
- } flag;
- int i, n, all, num_types, nlist;
- void *filter = NULL, *exclude = NULL;
- const char *mapset;
- char separator[2];
- G_gisinit(argv[0]);
- module = G_define_module();
- G_add_keyword(_("general"));
- G_add_keyword(_("map management"));
- G_add_keyword(_("list"));
- module->description =
- _("Lists available GRASS data base files "
- "of the user-specified data type optionally using the search pattern.");
- M_read_list(FALSE, &nlist);
- opt.type = G_define_standard_option(G_OPT_M_DATATYPE);
- opt.type->multiple = YES;
- opt.type->options = M_get_options(TRUE);
- opt.type->descriptions = M_get_option_desc(TRUE);
-
- opt.pattern = G_define_option();
- opt.pattern->key = "pattern";
- opt.pattern->type = TYPE_STRING;
- opt.pattern->required = NO;
- opt.pattern->multiple = NO;
- opt.pattern->description = _("Map name search pattern (default: all)");
- opt.pattern->guisection = _("Pattern");
- opt.exclude = G_define_option();
- opt.exclude->key = "exclude";
- opt.exclude->type = TYPE_STRING;
- opt.exclude->required = NO;
- opt.exclude->multiple = NO;
- opt.exclude->description = _("Map name exclusion pattern (default: none)");
- opt.exclude->guisection = _("Pattern");
- opt.mapset = G_define_standard_option(G_OPT_M_MAPSET);
- opt.mapset->label =
- _("Name of mapset to list (default: current search path)");
- opt.separator = G_define_standard_option(G_OPT_F_SEP);
- opt.separator->answer = "newline";
- flag.regex = G_define_flag();
- flag.regex->key = 'r';
- flag.regex->description =
- _("Use basic regular expressions instead of wildcards");
- flag.regex->guisection = _("Pattern");
- flag.extended = G_define_flag();
- flag.extended->key = 'e';
- flag.extended->description =
- _("Use extended regular expressions instead of wildcards");
- flag.extended->guisection = _("Pattern");
- flag.type = G_define_flag();
- flag.type->key = 't';
- flag.type->description = _("Print data types");
- flag.type->guisection = _("Print");
-
- flag.mapset = G_define_flag();
- flag.mapset->key = 'm';
- flag.mapset->description = _("Print fully-qualified map names (including mapsets)");
- flag.mapset->guisection = _("Print");
- flag.pretty = G_define_flag();
- flag.pretty->key = 'p';
- flag.pretty->description = _("Pretty printing in human readable format");
- flag.pretty->guisection = _("Print");
- flag.full = G_define_flag();
- flag.full->key = 'f';
- flag.full->description = _("Verbose listing (also list map titles)");
- flag.full->guisection = _("Print");
- if (G_parser(argc, argv))
- exit(EXIT_FAILURE);
- if (flag.regex->answer && flag.extended->answer)
- G_fatal_error(_("-r and -e are mutually exclusive"));
- if (opt.pattern->answer) {
- if (flag.regex->answer || flag.extended->answer)
- filter = G_ls_regex_filter(opt.pattern->answer, 0, (int) flag.extended->answer);
- else
- filter = G_ls_glob_filter(opt.pattern->answer, 0);
- }
- if (opt.exclude->answer) {
- if (flag.regex->answer || flag.extended->answer)
- exclude = G_ls_regex_filter(opt.exclude->answer, 1, (int) flag.extended->answer);
- else
- exclude = G_ls_glob_filter(opt.exclude->answer, 1);
- }
- if (strcmp(opt.separator->answer, "newline") == 0)
- separator[0] = '\n';
- else if (strcmp(opt.separator->answer, "comma") == 0)
- separator[0] = ',';
- else if (strcmp(opt.separator->answer, "space") == 0)
- separator[0] = ' ';
- else if (strcmp(opt.separator->answer, "tab") == 0)
- separator[0] = '\t';
- else
- separator[0] = opt.separator->answer[0];
- separator[1] = 0;
- mapset = opt.mapset->answer;
- if (mapset == NULL)
- mapset = "";
- if (G_strcasecmp(mapset, ".") == 0)
- mapset = G_mapset();
- for (i = 0; opt.type->answers[i]; i++) {
- if (strcmp(opt.type->answers[i], "all") == 0)
- break;
- }
- if (opt.type->answers[i]) {
- all = 1;
- num_types = nlist;
- }
- else {
- all = 0;
- num_types = i;
- }
- for (i = 0; i < num_types; i++) {
- n = all ? i : M_get_element(opt.type->answers[i]);
- if (flag.full->answer) {
- char lister[GPATH_MAX];
- sprintf(lister, "%s/etc/lister/%s", G_gisbase(),
- M_get_list(n)->element[0]);
- G_debug(3, "lister CMD: %s", lister);
- if (access(lister, 1) == 0) { /* execute permission? */
- G_spawn(lister, lister, mapset, NULL);
- continue;
- }
- }
- else
- make_list(M_get_list(n), mapset, separator,
- flag.pretty->answer, flag.type->answer,
- flag.mapset->answer);
- }
- if (!flag.pretty->answer && any)
- fprintf(stdout, "\n");
- if (filter)
- G_free_ls_filter(filter);
- if (exclude)
- G_free_ls_filter(exclude);
- 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)
- {
- char path[GPATH_MAX];
- const char *element = elem->element[0];
- const char *alias = elem->alias;
- char **list;
- 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);
- return;
- }
- G_file_name(path, element, "", mapset);
- if (access(path, 0) != 0)
- return;
- list = G__ls(path, &count);
- if (!list)
- 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);
- }
-
- for (i = 0; i < count; i++) {
- char *name = list[i];
- int need_mapset = 0;
- if (any && i != 0)
- fprintf(stdout, "%s", separator);
-
- if (add_type)
- fprintf(stdout, "%s/", alias);
- fprintf(stdout, "%s", name);
- if (!add_mapset) {
- const char *mapset2 = G_find_file2(element, name, "");
- need_mapset = strcmp(mapset, mapset2) != 0;
- }
- if (add_mapset || need_mapset)
- fprintf(stdout, "@%s", mapset);
- G_free(name);
- any++;
- }
- fflush(stdout);
-
- G_free(list);
- }
|