[GRASS-dev] MASK_OVERRIDE
Ivan Shmakov
ivan at theory.asu.ru
Wed Feb 20 00:12:24 EST 2008
Here's a revised patch.
lib/gis/auto_mask.c (G__check_for_auto_masking): Handle `MASK_OVERRIDE';
allow mask to be in any mapset in the search path.
lib/gis/mask_info.c (G__mask_info): Likewise.
I believe I've fixed all the `strncpy' issues that my previous
patch has had. Also, I've changed the interpretation of the
empty string value for `MASK_OVERRIDE' to ``ignore the
variable's value'', since I believe it matches the rest of the
Unix world. (One still can ask for ``no mask'' by specifying a
non-existent raster via `MASK_OVERRIDE'.)
Since there're some modules accessing `MASK', there should be a
libgis function to obtain the name of the mask currently in use
(besides, this would simplify the code below.) Any suggestions?
diff --git a/lib/gis/auto_mask.c b/lib/gis/auto_mask.c
index 6828018..ada9adb 100644
--- a/lib/gis/auto_mask.c
+++ b/lib/gis/auto_mask.c
@@ -32,6 +32,7 @@
int G__check_for_auto_masking (void)
{
+ char name[GNAME_MAX] = "MASK", mapset[GMAPSET_MAX] = "";
struct Cell_head cellhd;
/* if mask is switched off (-2) return -2
@@ -42,14 +43,32 @@ int G__check_for_auto_masking (void)
/* if(G__.mask_fd > 0) G_free (G__.mask_buf);*/
- /* look for the existence of the MASK file */
- G__.auto_mask = (G_find_cell ("MASK", G_mapset()) != 0);
+ /* check for MASK_OVERRIDE */
+ {
+ const char *override = getenv ("MASK_OVERRIDE");
+
+ /* an empty string value makes the variable to be ignored */
+ if (override && override[0] != '\0') {
+ strncpy (name, override, sizeof (name) - 1);
+ name[sizeof (name) - 1] = '\0';
+ }
+ }
+
+ /* look for the existence of the MASK file; get the mapset name */
+ {
+ char *mask_mapset = G_find_cell (name, mapset);
+
+ if ((G__.auto_mask = (mask_mapset != 0)) > 0) {
+ strncpy (mapset, mask_mapset, sizeof (mapset) - 1);
+ mapset[sizeof (mapset) - 1] = '\0';
+ }
+ }
if (G__.auto_mask <= 0)
return 0;
/* check MASK projection/zone against current region */
- if (G_get_cellhd ("MASK", G_mapset(), &cellhd) >= 0)
+ if (G_get_cellhd (name, mapset, &cellhd) >= 0)
{
if (cellhd.zone != G_zone() || cellhd.proj != G_projection())
{
@@ -59,11 +78,12 @@ int G__check_for_auto_masking (void)
}
G_unopen_cell(G__.mask_fd );
- G__.mask_fd = G__open_cell_old ("MASK", G_mapset());
+ G__.mask_fd = G__open_cell_old (name, mapset);
if (G__.mask_fd < 0)
{
G__.auto_mask = 0;
- G_warning (_("Unable to open automatic MASK file"));
+ G_warning (_("Unable to open automatic MASK (<%s@%s>) file"),
+ name, mapset);
return 0;
}
diff --git a/lib/gis/mask_info.c b/lib/gis/mask_info.c
index b82e8ea..3687ab1 100644
--- a/lib/gis/mask_info.c
+++ b/lib/gis/mask_info.c
@@ -58,11 +58,34 @@ int G__mask_info (
{
char rname[GNAME_MAX], rmapset[GMAPSET_MAX];
- strcpy (name, "MASK");
- strcpy (mapset, G_mapset());
+ /* NB: the following is painfully close to G__check_for_auto_masking
+ * (); consider a separate function here
+ */
- if(!G_find_cell (name, mapset))
- return -1;
+ /* check for MASK_OVERRIDE */
+ {
+ const char *override = getenv ("MASK_OVERRIDE");
+ if (override != 0) {
+ strncpy (name, override, GNAME_MAX - 1);
+ name[GNAME_MAX - 1] = '\0';
+ } else {
+ strcpy (name, "MASK");
+ }
+ }
+
+ /* look for the existence of the MASK file; get the mapset name */
+ {
+ char *mask_mapset = G_find_cell (name, "");
+
+ if (mask_mapset == 0) {
+ /* NB: `mapset' won't be initialized */
+ /* . */
+ return -1;
+ }
+
+ strncpy (mapset, mask_mapset, GMAPSET_MAX - 1);
+ mapset[GMAPSET_MAX - 1] = '\0';
+ }
if(G_is_reclass (name, mapset, rname, rmapset) > 0)
{
More information about the grass-dev
mailing list