[GRASS-SVN] r64135 - grass/trunk/general/g.rename
svn_grass at osgeo.org
svn_grass at osgeo.org
Tue Jan 13 08:50:08 PST 2015
Author: hcho
Date: 2015-01-13 08:50:08 -0800 (Tue, 13 Jan 2015)
New Revision: 64135
Modified:
grass/trunk/general/g.rename/main.c
Log:
g.rename: Update reclass info in base map (Fix #2546)
Modified: grass/trunk/general/g.rename/main.c
===================================================================
--- grass/trunk/general/g.rename/main.c 2015-01-13 16:42:34 UTC (rev 64134)
+++ grass/trunk/general/g.rename/main.c 2015-01-13 16:50:08 UTC (rev 64135)
@@ -25,15 +25,17 @@
#include <grass/glocale.h>
#include <grass/manage.h>
+void rename_child_reclass_maps(const char *, const char *);
+void update_basemap(const char *, const char *, const char *);
+
int main(int argc, char *argv[])
{
int i, n;
struct GModule *module;
struct Option **parm;
char *old, *new;
- int nrmaps, nlist;
- const char *mapset, *location_path;
- char **rmaps;
+ int nlist;
+ const char *mapset;
int result = EXIT_SUCCESS;
G_gisinit(argv[0]);
@@ -57,7 +59,6 @@
if (G_parser(argc, argv))
exit(EXIT_FAILURE);
- location_path = G_location_path();
mapset = G_mapset();
for (n = 0; n < nlist; n++) {
@@ -93,54 +94,113 @@
result = EXIT_FAILURE;
}
- if (!renamed && strcmp(parm[n]->key, "raster") == 0 &&
- Rast_is_reclassed_to(new, mapset, &nrmaps, &rmaps) > 0) {
- int ptr, l;
- char buf1[256], buf2[256], buf3[256], *str;
- FILE *fp;
+ if (!renamed && strcmp(parm[n]->key, "raster") == 0) {
+ rename_child_reclass_maps(new, mapset);
+ update_basemap(old, new, mapset);
+ }
+ }
+ }
+ exit(result);
+}
- G_message(_("Renaming reclass maps"));
+void rename_child_reclass_maps(const char *name, const char *mapset)
+{
+ int nrmaps, ptr, l;
+ char **rmaps, buf1[256], buf2[256], buf3[256], *str;
+ FILE *fp;
- for (; *rmaps; rmaps++) {
- G_message(" %s", *rmaps);
- sprintf(buf3, "%s", *rmaps);
- if ((str = strchr(buf3, '@'))) {
- *str = 0;
- sprintf(buf2, "%s", str + 1);
- }
- else {
- sprintf(buf2, "%s", mapset);
- }
- sprintf(buf1, "%s/%s/cellhd/%s", location_path, buf2,
- buf3);
+ if (Rast_is_reclassed_to(name, mapset, &nrmaps, &rmaps) <= 0)
+ return;
- fp = fopen(buf1, "r");
- if (fp == NULL)
- continue;
+ G_message(_("Renaming reclass maps"));
- fgets(buf2, 255, fp);
- fgets(buf2, 255, fp);
- fgets(buf2, 255, fp);
+ for (; *rmaps; rmaps++) {
+ G_message(" %s", *rmaps);
+ sprintf(buf3, "%s", *rmaps);
+ if ((str = strchr(buf3, '@'))) {
+ *str = 0;
+ sprintf(buf2, "%s", str + 1);
+ }
+ else {
+ sprintf(buf2, "%s", mapset);
+ }
+ G_file_name(buf1, "cellhd", buf3, buf2);
- ptr = G_ftell(fp);
- G_fseek(fp, 0L, SEEK_END);
- l = G_ftell(fp) - ptr;
+ fp = fopen(buf1, "r");
+ if (fp == NULL)
+ continue;
- str = (char *)G_malloc(l);
- G_fseek(fp, ptr, SEEK_SET);
- fread(str, l, 1, fp);
- fclose(fp);
+ fgets(buf2, 255, fp);
+ fgets(buf2, 255, fp);
+ fgets(buf2, 255, fp);
- fp = fopen(buf1, "w");
- fprintf(fp, "reclass\n");
- fprintf(fp, "name: %s\n", new);
- fprintf(fp, "mapset: %s\n", mapset);
- fwrite(str, l, 1, fp);
- G_free(str);
- fclose(fp);
- }
- }
+ ptr = G_ftell(fp);
+ G_fseek(fp, 0L, SEEK_END);
+ l = G_ftell(fp) - ptr;
+
+ str = (char *)G_malloc(l);
+ G_fseek(fp, ptr, SEEK_SET);
+ fread(str, l, 1, fp);
+ fclose(fp);
+
+ fp = fopen(buf1, "w");
+ fprintf(fp, "reclass\n");
+ fprintf(fp, "name: %s\n", name);
+ fprintf(fp, "mapset: %s\n", mapset);
+ fwrite(str, l, 1, fp);
+ G_free(str);
+ fclose(fp);
+ }
+}
+
+void update_basemap(const char *old, const char *new, const char *mapset)
+{
+ int i, nrmaps, found;
+ char bname[GNAME_MAX], bmapset[GMAPSET_MAX], rpath[GPATH_MAX];
+ char *xold, *xnew, **rmaps;
+ FILE *fp;
+
+ if (Rast_is_reclass(new, mapset, bname, bmapset) <= 0)
+ return;
+
+ if (Rast_is_reclassed_to(bname, bmapset, &nrmaps, &rmaps) <= 0)
+ nrmaps = 0;
+
+ found = 0;
+ xold = G_fully_qualified_name(old, mapset);
+ for (i = 0; i < nrmaps; i++) {
+ if (strcmp(xold, rmaps[i]) == 0) {
+ found = 1;
+ break;
}
}
- exit(result);
+
+ if (!found) {
+ G_fatal_error(_("Unable to find reclass information for <%s> in "
+ "base map <%s@%s>"), xold, bname, bmapset);
+ }
+
+ G_message(_("Updating base map <%s@%s>"), bname, bmapset);
+
+ G_file_name_misc(rpath, "cell_misc", "reclassed_to", bname, bmapset);
+
+ fp = fopen(rpath, "w");
+ if (fp == NULL) {
+ G_fatal_error(_("Unable to update dependency file in <%s@%s>"),
+ bname, bmapset);
+ }
+
+ xnew = G_fully_qualified_name(new, mapset);
+ for (; *rmaps; rmaps++) {
+ if (strcmp(xold, *rmaps) == 0) {
+ fprintf(fp, "%s\n", xnew);
+ }
+ else {
+ fprintf(fp, "%s\n", *rmaps);
+ }
+ }
+
+ G_free(xold);
+ G_free(xnew);
+ fclose(fp);
}
More information about the grass-commit
mailing list