GRASS GIS 8 Programmer's Manual 8.2.1RC1(2022)-exported
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 */
34int 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 */
68int 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}
#define NULL
Definition: ccmath.h:32
const char * G_find_raster2(const char *name, const char *mapset)
Find a raster map (look but don't touch)
Definition: find_rast.c:76
void G_fatal_error(const char *msg,...)
Print a fatal error message to stderr.
Definition: gis/error.c:160
void G_warning(const char *msg,...)
Print a warning message to stderr.
Definition: gis/error.c:204
int G_legal_filename(const char *s)
Check for legal database file name.
Definition: legal_name.c:34
int G_check_input_output_name(const char *input, const char *output, int error)
Check input and output file names.
Definition: legal_name.c:68
const char * G_mapset(void)
Get current mapset name.
Definition: mapset.c:33
const char * name
Definition: named_colr.c:7
int G_name_is_fully_qualified(const char *fullname, char *name, char *mapset)
Check if map name is fully qualified (map @ mapset)
Definition: nme_in_mps.c:36
void output(const char *fmt,...)