#include <ctype.h>
#include <wctype.h>
+#include "adt/util.h"
#include "format_check.h"
#include "symbol_t.h"
#include "ast_t.h"
[FMT_MOD_I32] = "I32",
[FMT_MOD_I64] = "I64"
};
- assert(mod < sizeof(names) / sizeof(*names));
+ assert(mod < lengthof(names));
return names[mod];
}
int (*is_digit)(unsigned vchar);
};
-static unsigned string_first(vchar_t *self) {
+static unsigned string_first(vchar_t *self)
+{
self->position = 0;
const string_t *string = self->string;
return string->begin[0];
}
-static unsigned string_next(vchar_t *self) {
+static unsigned string_next(vchar_t *self)
+{
++self->position;
const string_t *string = self->string;
return string->begin[self->position];
}
-static int string_isdigit(unsigned vchar) {
+static int string_isdigit(unsigned vchar)
+{
return isdigit(vchar);
}
-static unsigned wstring_first(vchar_t *self) {
+static unsigned wstring_first(vchar_t *self)
+{
self->position = 0;
const wide_string_t *wstring = self->string;
return wstring->begin[0];
}
-static unsigned wstring_next(vchar_t *self) {
+static unsigned wstring_next(vchar_t *self)
+{
++self->position;
const wide_string_t *wstring = self->string;
return wstring->begin[self->position];
}
-static int wstring_isdigit(unsigned vchar) {
+static int wstring_isdigit(unsigned vchar)
+{
return iswdigit(vchar);
}
-static bool atend(vchar_t *self) {
+static bool atend(vchar_t *self)
+{
return self->position + 1 == self->size;
}
arg = arg->next;
}
if (!atend(&vchar)) {
- warningf(pos, "format string contains NUL");
+ warningf(pos, "format string contains '\\0'");
}
if (arg != NULL) {
unsigned num_args = num_fmt;
arg = arg->next;
}
if (!atend(&vchar)) {
- warningf(pos, "format string contains NUL");
+ warningf(pos, "format string contains '\\0'");
}
if (arg != NULL) {
unsigned num_args = num_fmt;
++num_args;
arg = arg->next;
}
- warningf(pos, "%u argument%s but only %u format string%s",
+ warningf(pos, "%u argument%s but only %u format specifier%s",
num_args, num_args != 1 ? "s" : "",
num_fmt, num_fmt != 1 ? "s" : "");
}
* This allows to check format even in MS mode or without header included.
*/
const char *const name = entity->base.symbol->string;
- for (size_t i = 0; i < sizeof(builtin_table) / sizeof(builtin_table[0]); ++i) {
+ for (size_t i = 0; i < lengthof(builtin_table); ++i) {
if (strcmp(name, builtin_table[i].name) == 0) {
switch (builtin_table[i].fmt_kind) {
case FORMAT_PRINTF: