00001
00016 #include <stdlib.h>
00017 #include <unistd.h>
00018 #include <signal.h>
00019 #include <string.h>
00020 #include <sys/types.h>
00021 #include <dirent.h>
00022
00023 #include <grass/gis.h>
00024 #include <grass/glocale.h>
00025
00026 static int broken_pipe;
00027 static int hit_return = 0;
00028 static int list_element(FILE *, const char *, const char *, const char *,
00029 int (*)(const char *, const char *, const char *));
00030 static void sigpipe_catch(int);
00031
00032 int G_set_list_hit_return(int flag)
00033 {
00034 hit_return = flag;
00035 return 0;
00036 }
00037
00060 int G_list_element(const char *element,
00061 const char *desc,
00062 const char *mapset,
00063 int (*lister) (const char *, const char *, const char *))
00064 {
00065 int n;
00066 FILE *more;
00067 int count;
00068
00069 #ifdef SIGPIPE
00070 void (*sigpipe) ();
00071 #endif
00072
00073
00074 broken_pipe = 0;
00075 #ifdef SIGPIPE
00076 sigpipe = signal(SIGPIPE, sigpipe_catch);
00077 #endif
00078
00079 count = 0;
00080 if (desc == 0 || *desc == 0)
00081 desc = element;
00082
00083
00084 #ifndef __MINGW32__
00085
00086
00087
00088 if (isatty(1)) {
00089 #ifdef __MINGW32__
00090 more = G_popen("%GRASS_PAGER%", "w");
00091 #else
00092 more = G_popen("$GRASS_PAGER", "w");
00093 #endif
00094 if (!more)
00095 more = stdout;
00096 }
00097 else
00098 #endif
00099 more = stdout;
00100 fprintf(more, "----------------------------------------------\n");
00101
00102
00103
00104
00105
00106
00107 if (mapset == 0 || *mapset == 0)
00108 for (n = 0; !broken_pipe && (mapset = G__mapset_name(n)); n++)
00109 count += list_element(more, element, desc, mapset, lister);
00110 else
00111 count += list_element(more, element, desc, mapset, lister);
00112
00113 if (!broken_pipe) {
00114 if (count == 0) {
00115 if (mapset == 0 || *mapset == 0)
00116 fprintf(more, _("no %s files available in current mapset\n"),
00117 desc);
00118 else
00119 fprintf(more, _("no %s files available in mapset <%s>\n"),
00120 desc, mapset);
00121 }
00122
00123 fprintf(more, "----------------------------------------------\n");
00124 }
00125
00126
00127
00128 if (more != stdout)
00129 G_pclose(more);
00130 #ifdef SIGPIPE
00131 signal(SIGPIPE, sigpipe);
00132 #endif
00133 if (hit_return && isatty(1)) {
00134 fprintf(stderr, _("hit RETURN to continue -->"));
00135 while (getchar() != '\n') ;
00136 }
00137
00138 return 0;
00139 }
00140
00141 static void sigpipe_catch(int n)
00142 {
00143 broken_pipe = 1;
00144 signal(n, sigpipe_catch);
00145 }
00146
00147 static int list_element(FILE * out,
00148 const char *element, const char *desc,
00149 const char *mapset, int (*lister) (const char *,
00150 const char *,
00151 const char *))
00152 {
00153 char path[GPATH_MAX];
00154 int count = 0;
00155 char **list;
00156 int i;
00157
00158
00159
00160
00161 if (strcmp(mapset, ".") == 0)
00162 mapset = G_mapset();
00163
00164
00165
00166
00167
00168
00169
00170
00171 G__file_name(path, element, "", mapset);
00172 if (access(path, 0) != 0) {
00173 fprintf(out, "\n");
00174 return count;
00175 }
00176
00177
00178
00179
00180
00181
00182 list = G__ls(path, &count);
00183
00184 if (count > 0) {
00185 fprintf(out, _("%s files available in mapset <%s>:\n"), desc, mapset);
00186 if (lister) {
00187 char title[400];
00188 char name[GNAME_MAX];
00189
00190 *name = *title = 0;
00191 lister(name, mapset, title);
00192 if (*title)
00193 fprintf(out, "\n%-18s %-.60s\n", name, title);
00194 }
00195 }
00196
00197 if (lister) {
00198 for (i = 0; i < count; i++) {
00199 char title[400];
00200
00201 lister(list[i], mapset, title);
00202 fprintf(out, "%-18s %-.60s\n", list[i], title);
00203 }
00204 }
00205 else
00206 G_ls_format(list, count, 0, out);
00207
00208 fprintf(out, "\n");
00209
00210 for (i = 0; i < count; i++)
00211 G_free((char *)list[i]);
00212 if (list)
00213 G_free(list);
00214
00215 return count;
00216 }
00217
00228 char **G_list(int element, const char *gisbase, const char *location,
00229 const char *mapset)
00230 {
00231 char *el;
00232 char *buf;
00233 DIR *dirp;
00234 struct dirent *dp;
00235 int count;
00236 char **list;
00237
00238 switch (element) {
00239 case G_ELEMENT_RASTER:
00240 el = "cell";
00241 break;
00242
00243 case G_ELEMENT_GROUP:
00244 el = "group";
00245 break;
00246
00247 case G_ELEMENT_VECTOR:
00248 el = "vector";
00249 break;
00250
00251 case G_ELEMENT_REGION:
00252 el = "windows";
00253 break;
00254
00255 default:
00256 G_fatal_error(_("G_list: Unknown element type"));
00257 }
00258
00259 buf = (char *)G_malloc(strlen(gisbase) + strlen(location)
00260 + strlen(mapset) + strlen(el) + 4);
00261
00262 sprintf(buf, "%s/%s/%s/%s", gisbase, location, mapset, el);
00263
00264 dirp = opendir(buf);
00265 G_free(buf);
00266
00267 if (dirp == NULL) {
00268 list = (char **)G_calloc(1, sizeof(char *));
00269 return list;
00270 }
00271
00272 count = 0;
00273 while ((dp = readdir(dirp)) != NULL) {
00274 if (dp->d_name[0] == '.')
00275 continue;
00276 count++;
00277 }
00278 rewinddir(dirp);
00279
00280 list = (char **)G_calloc(count + 1, sizeof(char *));
00281
00282 count = 0;
00283 while ((dp = readdir(dirp)) != NULL) {
00284 if (dp->d_name[0] == '.')
00285 continue;
00286
00287 list[count] = (char *)G_malloc(strlen(dp->d_name) + 1);
00288 strcpy(list[count], dp->d_name);
00289 count++;
00290 }
00291 closedir(dirp);
00292
00293 return list;
00294 }
00295
00303 void G_free_list(char **list)
00304 {
00305 int i = 0;
00306
00307 if (!list)
00308 return;
00309
00310 while (list[i]) {
00311 G_free(list[i]);
00312 i++;
00313 }
00314 G_free(list);
00315 }