GRASS GIS 7 Programmer's Manual  7.9.dev(2021)-e5379bbd7
legal_name.c
Go to the documentation of this file.
1 /*!
2  * \file lib/gis/legal_name.c
3  *
4  * \brief GIS Library - Functions to handle file name legality.
5  *
6  * (C) 2001-2009, 2013 by the GRASS Development Team
7  *
8  * This program is free software under the GNU General Public License
9  * (>=v2). Read the file COPYING that comes with GRASS for details.
10  *
11  * \author Original author CERL
12  */
13 
14 #include <stdio.h>
15 #include <string.h>
16 #include <grass/gis.h>
17 #include <grass/glocale.h>
18 
19 /*!
20  * \brief Check for legal database file name.
21  *
22  * Legal file names will <b>not</b> begin with '.' or NULL and must
23  * not contain the characters, ' ' (space), '/', '"'. '\'' (single
24  * quote), '@', ',', '=', '*', and all other non-alphanumeric
25  * characters within.
26  *
27  * The function prints a warning on error.
28  *
29  * \param s file name to check
30  *
31  * \return 1 success
32  * \return -1 failure
33  */
34 int G_legal_filename(const char *s)
35 {
36  const char *name = s;
37 
38  if (*s == '.' || *s == 0) {
39  G_warning(_("Illegal filename <%s>. Cannot start with '.' or be 'NULL'."), name);
40  return -1;
41  }
42 
43  for (; *s; s++)
44  if (*s == '/' || *s == '"' || *s == '\'' || *s <= ' ' ||
45  *s == '@' || *s == ',' || *s == '=' || *s == '*' || *s > 0176) {
46  G_warning(_("Illegal filename <%s>. Character <%c> not allowed.\n"), name, *s);
47  return -1;
48  }
49 
50  return 1;
51 }
52 
53 /*!
54  * \brief Check input and output file names.
55  *
56  * Check:
57  * 1) output is legal map name,
58  * 2) if can find input map, and
59  * 3) if input was found in current mapset, check if input != output.
60  *
61  * \param input input map name
62  * \param output output map name
63  * \param error error type: G_FATAL_EXIT, G_FATAL_PRINT, G_FATAL_RETURN
64  *
65  * \return 0 OK
66  * \return 1 error
67  */
68 int G_check_input_output_name(const char *input, const char *output,
69  int error)
70 {
71  const char *mapset;
72 
73  if (output == NULL)
74  return 0; /* don't die on undefined parameters */
75  if (G_legal_filename(output) == -1) {
76  if (error == G_FATAL_EXIT) {
77  G_fatal_error(_("Output raster map name <%s> is not valid map name"),
78  output);
79  }
80  else if (error == G_FATAL_PRINT) {
81  G_warning(_("Output raster map name <%s> is not valid map name"),
82  output);
83  return 1;
84  }
85  else { /* G_FATAL_RETURN */
86  return 1;
87  }
88  }
89 
90  mapset = G_find_raster2(input, "");
91 
92  if (mapset == NULL) {
93  if (error == G_FATAL_EXIT) {
94  G_fatal_error(_("Raster map <%s> not found"), input);
95  }
96  else if (error == G_FATAL_PRINT) {
97  G_warning(_("Raster map <%s> not found"), input);
98  return 1;
99  }
100  else { /* G_FATAL_RETURN */
101  return 1;
102  }
103  }
104 
105  if (strcmp(mapset, G_mapset()) == 0) {
106  char nm[1000], ms[1000];
107  const char *in;
108 
109  if (G_name_is_fully_qualified(input, nm, ms)) {
110  in = nm;
111  }
112  else {
113  in = input;
114  }
115 
116  if (strcmp(in, output) == 0) {
117  if (error == G_FATAL_EXIT) {
118  G_fatal_error(_("Output raster map <%s> is used as input"),
119  output);
120  }
121  else if (error == G_FATAL_PRINT) {
122  G_warning(_("Output raster map <%s> is used as input"),
123  output);
124  return 1;
125  }
126  else { /* G_FATAL_RETURN */
127  return 1;
128  }
129  }
130  }
131 
132  return 0;
133 }
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
#define G_FATAL_EXIT
Definition: gis.h:375
#define NULL
Definition: ccmath.h:32
void output(const char *fmt,...)
const char * G_mapset(void)
Get current mapset name.
Definition: gis/mapset.c:33
void G_warning(const char *,...) __attribute__((format(printf
#define _(str)
Definition: glocale.h:10
const char * G_find_raster2(const char *, const char *)
Find a raster map (look but don&#39;t touch)
Definition: find_rast.c:76
const char * name
Definition: named_colr.c:7
int G_name_is_fully_qualified(const char *, char *, char *)
Check if map name is fully qualified (map @ mapset)
Definition: nme_in_mps.c:36
#define G_FATAL_PRINT
Definition: gis.h:376