Use of Annex K for MSVS to reduce warnings.

This commit is contained in:
Patrick Pelissier committed 2020-06-21 23:36:34 +02:00
1 parent 3f84f54d65
commit 4f4605befb
3 files changed
+88 -24

No files matched your search

+63 -2
View File
@@ -1472,6 +1472,60 @@
/* IF FILE is supported */
#if M_USE_STDIO
/* Define internal wrappers around Annex K functions or classic functions for:
* - fopen
* - fscanf
* - strncpy
*
* There is no real usage outside of MSVS of Annex K,
* so the real standard compliant Annex K is not taken into account
* by this wrapper.
*
* If Microsoft Visual Studio C Library
* and the user wants to use the Annex K.
* ==> Use Annex K like functions to avoid warnings
*
* Only fscanf, fopen and strncpy produce warning,
* so we keep the wrapper as simple as possible by including only
* theses functions.
*/
#if defined(_MSC_VER) && defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__
/* Wrapper around fopen_s */
static inline FILE *
m_core_fopen(const char filename[], const char opt[])
{
FILE *f;
int err = fopen_s(&f, filename, opt);
if (err) return NULL;
return f;
}
/* Wrapper around strncpy_s */
#define m_core_strncpy(s1, s2, size) strncpy_s(s1, size, s2, size)
/* Wrapper around fscanf_s */
#define m_core_fscanf(...) fscanf_s(__VA_ARGS__)
/* Macro to be used in m_core_fscanf for argument associated
* to the format %c, %s or %[
* in order to specify the size of the argument */
#define m_core_arg_size(arg, size) arg, (unsigned) size
#else /* Use classic C functions */
/* Wrapper around fopen */
#define m_core_fopen(...) fopen(__VA_ARGS__)
/* Wrapper around strncpy */
#define m_core_strncpy(...) strncpy(__VA_ARGS__)
/* Wrapper around fscanf */
#define m_core_fscanf(...) fscanf(__VA_ARGS__)
/* Macro to be used in m_core_fscanf for argument associated
* to the format %c, %s or %[
* in order to specify the size of the argument */
#define m_core_arg_size(arg, size) arg
#endif
/* Print a C variable if it is a standard type to stdout.*/
#define M_PRINT_ARG(x) printf(M_PRINTF_FORMAT(x), x)
@@ -1509,13 +1563,20 @@ m_core_fscan_bool (bool *ptr, FILE *f)
return (c == '0' || c == '1');
}
static inline bool
m_core_fscan_char (char *ptr, FILE *f)
{
int c = fgetc(f);
*ptr = (char) c;
return c != EOF;
}
#define M_FSCAN_DEFAULT_TYPE_DEF(name, type, format) \
static inline bool \
name (type *ptr, FILE *f) \
{ \
return fscanf(f, format, ptr) == 1; \
return m_core_fscanf(f, format, ptr) == 1; \
}
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_char, char, "%c")
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_schar, signed char, "%hhd")
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_uchar, unsigned char, "%hhu")
M_FSCAN_DEFAULT_TYPE_DEF(m_core_fscan_sshort, signed short, "%hd")
+18 -15
View File
@@ -324,7 +324,7 @@ static inline m_serial_return_code_t
m_serial_json_read_integer(m_serial_read_t serial, long long *i, const size_t size_of_type){
(void) size_of_type; // Ignored
FILE *f = (FILE*) serial->data[0].p;
return fscanf(f, " %lld", i) == 1 ? M_SERIAL_OK_DONE : m_core_serial_fail();
return m_core_fscanf(f, " %lld", i) == 1 ? M_SERIAL_OK_DONE : m_core_serial_fail();
}
/* Read from the stream 'serial' a float that can be represented with 'size_of_type' bytes.
@@ -334,7 +334,7 @@ static inline m_serial_return_code_t
m_serial_json_read_float(m_serial_read_t serial, long double *r, const size_t size_of_type){
(void) size_of_type; // Ignored
FILE *f = (FILE*) serial->data[0].p;
return fscanf(f, " %Lf", r) == 1 ? M_SERIAL_OK_DONE : m_core_serial_fail();
return m_core_fscanf(f, " %Lf", r) == 1 ? M_SERIAL_OK_DONE : m_core_serial_fail();
}
/* Read from the stream 'serial' a string.
@@ -343,7 +343,7 @@ m_serial_json_read_float(m_serial_read_t serial, long double *r, const size_t si
static inline m_serial_return_code_t
m_serial_json_read_string(m_serial_read_t serial, struct string_s *s){
FILE *f = (FILE*) serial->data[0].p;
fscanf(f, " "); // Skip any leading spaces.
m_core_fscanf(f, " "); // Skip any leading spaces.
return string_in_str(s, f) ? M_SERIAL_OK_DONE : m_core_serial_fail();
}
@@ -360,7 +360,7 @@ m_serial_json_read_array_start(m_serial_local_t local, m_serial_read_t serial, s
(void) local; // argument not used
FILE *f = (FILE*) serial->data[0].p;
int final1 = -1, final2 = -1;
fscanf(f, " [%n ]%n", &final1, &final2);
m_core_fscanf(f, " [%n ]%n", &final1, &final2);
*num = 0; // don't know the size of the array.
// Test how much the parsing succeed.
if (final1 < 0) m_core_serial_fail();
@@ -377,7 +377,7 @@ m_serial_json_read_array_next(m_serial_local_t local, m_serial_read_t serial)
(void) local; // argument not used
FILE *f = (FILE*) serial->data[0].p;
char c = 0;
fscanf(f, " %c", &c);
m_core_fscanf(f, " %c", m_core_arg_size(&c, 1) );
return c == ',' ? M_SERIAL_OK_CONTINUE : c == ']' ? M_SERIAL_OK_DONE : m_core_serial_fail();
}
@@ -394,7 +394,7 @@ m_serial_json_read_map_start(m_serial_local_t local, m_serial_read_t serial, siz
(void) local; // argument not used
FILE *f = (FILE*) serial->data[0].p;
int final1 = -1, final2 = -1;
fscanf(f, " {%n }%n", &final1, &final2);
m_core_fscanf(f, " {%n }%n", &final1, &final2);
*num = 0; // don't know the size of the map.
// Test how much the parsing succeed.
if (final1 < 0) m_core_serial_fail();
@@ -410,7 +410,7 @@ m_serial_json_read_map_value(m_serial_local_t local, m_serial_read_t serial)
(void) local; // argument not used
FILE *f = (FILE*) serial->data[0].p;
int final = -1;
fscanf(f, " :%n", &final);
m_core_fscanf(f, " :%n", &final);
return final > 0 ? M_SERIAL_OK_CONTINUE : m_core_serial_fail();
}
@@ -424,7 +424,7 @@ m_serial_json_read_map_next(m_serial_local_t local, m_serial_read_t serial)
(void) local; // argument not used
FILE *f = (FILE*) serial->data[0].p;
char c = 0;
fscanf(f, " %c", &c);
m_core_fscanf(f, " %c", m_core_arg_size(&c, 1) );
return c == ',' ? M_SERIAL_OK_CONTINUE : c == '}' ? M_SERIAL_OK_DONE : m_core_serial_fail();
}
@@ -437,7 +437,7 @@ m_serial_json_read_tuple_start(m_serial_local_t local, m_serial_read_t serial)
(void) local; // argument not used
FILE *f = (FILE*) serial->data[0].p;
int final = -1;
fscanf(f, " {%n", &final);
m_core_fscanf(f, " {%n", &final);
return final > 0 ? M_SERIAL_OK_CONTINUE : m_core_serial_fail();
}
@@ -464,8 +464,9 @@ m_serial_json_read_tuple_id(m_serial_local_t local, m_serial_read_t serial, cons
}
/* Read the field in the JSON */
c = -1;
char field[M_MAX_IDENTIFIER_LENGTH+1]; // TODO: fix error detection below.
fscanf(f, " \"%" M_APPLY(M_AS_STR, M_MAX_IDENTIFIER_LENGTH) "[^ \t\n\"]\":%n", field, &c);
char field[M_MAX_IDENTIFIER_LENGTH+1];
m_core_fscanf(f, " \"%" M_APPLY(M_AS_STR, M_MAX_IDENTIFIER_LENGTH) "[^ \t\n\"]\":%n",
m_core_arg_size(field, M_MAX_IDENTIFIER_LENGTH+1), &c);
if (c <= 0)
return m_core_serial_fail();
/* Search for field in field_name */
@@ -491,23 +492,25 @@ m_serial_json_read_variant_start(m_serial_local_t local, m_serial_read_t serial,
FILE *f = (FILE*) serial->data[0].p;
int final1 = -1, final2 = -1;
fscanf(f, " {%n }%n", &final1, &final2);
m_core_fscanf(f, " {%n }%n", &final1, &final2);
// Test how much the parsing succeed.
if (final1 <= 0) return m_core_serial_fail();
if (final2 > 0) return M_SERIAL_OK_DONE;
/* Read the field in the JSON */
char field[M_MAX_IDENTIFIER_LENGTH+1];
fscanf(f, " \"%" M_APPLY(M_AS_STR, M_MAX_IDENTIFIER_LENGTH) "[^ \t\n\"]\":%n", field, &final2);
m_core_fscanf(f, " \"%" M_APPLY(M_AS_STR, M_MAX_IDENTIFIER_LENGTH) "[^ \t\n\"]\":%n",
m_core_arg_size(field, M_MAX_IDENTIFIER_LENGTH+1), &final2);
if (final2 <= 0) return m_core_serial_fail();
/* Search for field in field_name */
/* Linear Search for field in field_name */
for(int n = 0; n < max; n++) {
if (strcmp(field, field_name[n]) == 0) {
*id = n;
return M_SERIAL_OK_CONTINUE;
}
}
// Field not found
return m_core_serial_fail();
}
@@ -520,7 +523,7 @@ m_serial_json_read_variant_end(m_serial_local_t local, m_serial_read_t serial)
(void) local; // argument not used
FILE *f = (FILE*) serial->data[0].p;
int final = -1;
fscanf(f, " }%n", &final);
m_core_fscanf(f, " }%n", &final);
return final > 0 ? M_SERIAL_OK_DONE : m_core_serial_fail();
}
+7 -7
View File
@@ -918,7 +918,7 @@ string_fget_word (string_t v, const char separator[], FILE *f)
an opportunity for stack overflow */
while (snprintf(buffer, sizeof buffer -1, " %%%zu[^%s]%%c", (size_t) alloc-1-size, separator) > 0
/* We may read one or two argument(s) */
&& fscanf(f, buffer, &ptr[size], &c) >= 1) {
&& m_core_fscanf(f, buffer, m_core_arg_size(&ptr[size], alloc-size), &c) >= 1) {
retcode = true;
size += strlen(&ptr[size]);
/* If we read only one argument
@@ -1824,7 +1824,7 @@ namespace m_string {
M_C(name, _set_str)(M_C(name,_t) s, const char str[]) \
{ \
BOUNDED_STRINGI_CONTRACT(s, max_size); \
strncpy(s->s, str, max_size); \
m_core_strncpy(s->s, str, max_size); \
BOUNDED_STRINGI_CONTRACT(s, max_size); \
} \
\
@@ -1834,7 +1834,7 @@ namespace m_string {
BOUNDED_STRINGI_CONTRACT(s, max_size); \
assert(str != NULL); \
size_t len = M_MIN(max_size, n); \
strncpy(s->s, str, len); \
m_core_strncpy(s->s, str, len); \
s->s[len] = 0; \
BOUNDED_STRINGI_CONTRACT(s, max_size); \
} \
@@ -2045,7 +2045,7 @@ namespace m_string {
string_t v2; \
string_init(v2); \
bool ret = string_in_str(v2, f); \
strncpy(v->s, string_get_cstr(v2), max_size); \
m_core_strncpy(v->s, string_get_cstr(v2), max_size); \
string_clear(v2); \
return ret; \
} \
@@ -2058,7 +2058,7 @@ namespace m_string {
string_t v2; \
string_init(v2); \
bool ret = string_parse_str(v2, str, endptr); \
strncpy(v->s, string_get_cstr(v2), max_size); \
m_core_strncpy(v->s, string_get_cstr(v2), max_size); \
string_clear(v2); \
return ret; \
} \
@@ -2080,7 +2080,7 @@ namespace m_string {
/* TODO: Not optimum */ \
string_init(tmp); \
m_serial_return_code_t r = serial->m_interface->read_string(serial, tmp); \
strncpy(v->s, string_get_cstr(tmp), max_size); \
m_core_strncpy(v->s, string_get_cstr(tmp), max_size); \
string_clear(tmp); \
BOUNDED_STRINGI_CONTRACT(v, max_size); \
return r; \
@@ -2113,7 +2113,7 @@ namespace m_string {
inline m_bounded_string(const char lstr[])
{
memset(this->s, 0, N);
strncpy(this->s, lstr, N-1);
m_core_strncpy(this->s, lstr, N-1);
}
};
}