PUD: include nmealib v0.6.7
[olsrd.git] / lib / pud / nmealib / src / util.c
1 /*
2  * This file is part of nmealib.
3  *
4  * Copyright (c) 2011 Ferry Huberts
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <nmea/util.h>
21
22 #include <string.h>
23 #include <stdio.h>
24
25 /**
26  * Determine whether the given string contains characters that are not allowed
27  * for fields in an NMEA string.
28  *
29  * @param str
30  * The string to check
31  * @param strName
32  * The name of the string to report when invalid characters are encountered
33  * @param report
34  * A pointer to a buffer in which to place the report string when an invalid
35  * nmea character is detected
36  * @param reportSize
37  * The size of the report buffer
38  *
39  * @return
40  * - true when the string has invalid characters
41  * - false otherwise
42  */
43 bool nmea_string_has_invalid_chars(const char * str, const char * strName,
44                 char * report, size_t reportSize) {
45         static const char invalidChars[] = { '$', '*', ',', '!', '\\', '^', '~' };
46         static const char * invalidCharsNames[] = { "sentence delimiter ($)",
47                         "checksum field delimiter (*)", "comma (,)", "exclamation mark (!)",
48                         "backslash (\\)", "^ (^)", "tilde (~)" };
49
50         size_t i;
51         size_t j;
52
53         if (!str) {
54                 return false;
55         }
56
57         for (i = 0; i < strlen(str); i++) {
58                 char c = str[i];
59
60                 if ((c < 32) || (c > 126)) {
61                         if (report) {
62                                 snprintf((char*) report, reportSize, "Configured %s (%s),"
63                                                 " character %lu, can not contain non-printable"
64                                                 " characters (codes outside the range [32, 126])",
65                                                 strName, str, (unsigned long)i + 1);
66                                 report[reportSize - 1] = '\0';
67                         }
68                         return true;
69                 }
70
71                 for (j = 0; j < sizeof(invalidChars); j++) {
72                         if (c == invalidChars[j]) {
73                                 if (report) {
74                                         snprintf((char *) report, reportSize, "Configured %s (%s),"
75                                                         " character %lu, can not contain %s characters",
76                                                         strName, str, (unsigned long)i + 1, invalidCharsNames[j]);
77                                         report[reportSize - 1] = '\0';
78                                 }
79                                 return true;
80                         }
81                 }
82         }
83
84         return false;
85 }