countof() is standard (ISO C2y).
Signed-off-by: Alejandro Colomar <[email protected]>
---
src/devices/grolbp/lbp.cpp | 5 +++--
src/devices/grolj4/lj4.cpp | 5 +++--
src/devices/grops/ps.cpp | 3 ++-
src/devices/grops/psrm.cpp | 11 ++++++-----
src/include/lib.h | 8 --------
src/libs/libgroff/font.cpp | 6 ++----
src/libs/libgroff/glyphuni.cpp | 4 +++-
src/libs/libgroff/make-uniuni | 4 +++-
src/libs/libgroff/uniuni.cpp | 4 +++-
src/preproc/eqn/box.cpp | 14 ++++++++------
src/preproc/eqn/lex.cpp | 11 ++++++-----
src/preproc/pic/pic.ypp | 7 ++++---
src/preproc/preconv/preconv.cpp | 5 ++---
src/roff/troff/input.cpp | 4 ++--
src/utils/addftinfo/addftinfo.cpp | 5 +++--
15 files changed, 50 insertions(+), 46 deletions(-)
diff --git a/src/devices/grolbp/lbp.cpp b/src/devices/grolbp/lbp.cpp
index 44783da4e..cf43a30bf 100644
--- a/src/devices/grolbp/lbp.cpp
+++ b/src/devices/grolbp/lbp.cpp
@@ -31,6 +31,7 @@ TODO
#include <errno.h>
#include <limits.h> // INT_MAX
#include <math.h> // fabs(), sqrt()
+#include <stdcountof.h>
#include <stdlib.h> // abs(), EXIT_SUCCESS, exit(), strtol()
#include <string.h> // strcmp(), strcpy(), strlen(), strncpy()
#include <strings.h> // strcasecmp()
@@ -42,7 +43,7 @@ TODO
#include "charset.h"
#include "driver.h"
#include "lbp.h"
-#include "lib.h" // array_length(), strsave()
+#include "lib.h" // strsave()
#include "paper.h"
extern "C" const char *Version_string;
@@ -599,7 +600,7 @@ static int set_papersize(const char *paperformat)
unsigned int i;
// First, test for a standard (i.e. supported directly by the printer)
// paper format.
- for (i = 0 ; i < array_length(lbp_papersizes); i++)
+ for (i = 0 ; i < countof(lbp_papersizes); i++)
{
if (strcasecmp(lbp_papersizes[i].name,paperformat) == 0)
return lbp_papersizes[i].code;
diff --git a/src/devices/grolj4/lj4.cpp b/src/devices/grolj4/lj4.cpp
index eb6f9274a..34ebb4b48 100644
--- a/src/devices/grolj4/lj4.cpp
+++ b/src/devices/grolj4/lj4.cpp
@@ -37,6 +37,7 @@ X command to include bitmap graphics
#include <assert.h>
#include <locale.h> // setlocale()
#include <math.h> // atan2(), floor()
+#include <stdcountof.h>
#include <stdio.h> // EOF, FILE, fflush(), fprintf(), printf(),
// setbuf(), stderr, stdout
#include <stdlib.h> // exit(), EXIT_SUCCESS, strtol()
@@ -144,7 +145,7 @@ void lj4_font::handle_unknown_font_command(const char
*command,
const char *fn,
int lineno)
{
- for (size_t i = 0; i < array_length(command_table); i++) {
+ for (size_t i = 0; i < countof(command_table); i++) {
if (strcmp(command, command_table[i].s) == 0) {
if (0 /* nullptr */ == arg)
fatal_with_file_and_line(fn, lineno,
@@ -179,7 +180,7 @@ void lj4_font::handle_unknown_font_command(const char
*command,
static ssize_t lookup_paper_size(const char *s)
{
// C++11: constexpr
- const size_t paper_table_length = array_length(paper_table);
+ const size_t paper_table_length = countof(paper_table);
// ...and once it's a constexpr, we can do this...
//static_assert(paper_table_length < INT_MAX);
// ...but until then...
diff --git a/src/devices/grops/ps.cpp b/src/devices/grops/ps.cpp
index ba42ad2b0..79bd769a7 100644
--- a/src/devices/grops/ps.cpp
+++ b/src/devices/grops/ps.cpp
@@ -30,6 +30,7 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <errno.h>
#include <locale.h> // setlocale()
#include <math.h> // atan2(), sqrt(), tan()
+#include <stdcountof.h>
#include <stdint.h> // uint16_t
#include <stdio.h> // EOF, FILE, fclose(), fgets(), fileno(), fseek(),
// getc(), SEEK_SET, setbuf(), stderr, stdout
@@ -1639,7 +1640,7 @@ void ps_printer::special(char *arg, const environment
*env, char type)
error("empty X command ignored");
return;
}
- for (size_t i = 0; i < array_length(proc_table); i++)
+ for (size_t i = 0; i < countof(proc_table); i++)
if (strncmp(command, proc_table[i].name, p - command) == 0) {
flush_sbuf();
if (sbuf_color != *env->col)
diff --git a/src/devices/grops/psrm.cpp b/src/devices/grops/psrm.cpp
index 5957d0dd9..b5a75a92e 100644
--- a/src/devices/grops/psrm.cpp
+++ b/src/devices/grops/psrm.cpp
@@ -21,13 +21,14 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#endif
#include <errno.h>
+#include <stdcountof.h>
#include <stdio.h> // EOF, FILE, fclose(), fgets(), getc(), ungetc()
#include <stdlib.h> // getenv(), putenv(), strtoul()
#include <string.h> // strerror(), strtok()
#include "cset.h"
#include "driver.h"
-#include "lib.h" // array_length(), strsave()
+#include "lib.h" // strsave()
#include "stringclass.h"
#include "ps.h"
@@ -72,7 +73,7 @@ const char *extension_table[] = {
"FileSystem",
};
-const size_t NEXTENSIONS = array_length(extension_table);
+const size_t NEXTENSIONS = countof(extension_table);
// this must stay in sync with 'resource_type' in 'ps.h'
const char *resource_table[] = {
@@ -85,7 +86,7 @@ const char *resource_table[] = {
"pattern",
};
-const size_t NRESOURCES = array_length(resource_table);
+const size_t NRESOURCES = countof(resource_table);
static bool read_uint_arg(const char **pp, unsigned *res)
{
@@ -952,7 +953,7 @@ void resource_manager::process_file(int rank, FILE *fp,
"DocumentSuppliedFiles:",
};
- const size_t NHEADER_COMMENTS = array_length(header_comment_table);
+ const size_t NHEADER_COMMENTS = countof(header_comment_table);
static const comment_info comment_table[] = {
{ "BeginResource:", &resource_manager::do_begin_resource },
@@ -973,7 +974,7 @@ void resource_manager::process_file(int rank, FILE *fp,
{ "BeginBinary:", &resource_manager::do_begin_binary },
};
- const size_t NCOMMENTS = array_length(comment_table);
+ const size_t NCOMMENTS = countof(comment_table);
string buf;
int saved_lineno = current_lineno;
const char *saved_filename = current_filename;
diff --git a/src/include/lib.h b/src/include/lib.h
index 5e92e3f4d..6b8ca2a59 100644
--- a/src/include/lib.h
+++ b/src/include/lib.h
@@ -121,14 +121,6 @@ int mksdir(char *tmpl);
static const double PI = 3.14159265358979323846;
-#ifdef __cplusplus
-template <typename T, size_t N>
-// constexpr // C++11
-size_t array_length(T(&)[N]) {
- return N;
-}
-#endif
-
#endif /* GROFF_LIB_H */
// Local Variables:
diff --git a/src/libs/libgroff/font.cpp b/src/libs/libgroff/font.cpp
index faef870fe..83b42c919 100644
--- a/src/libs/libgroff/font.cpp
+++ b/src/libs/libgroff/font.cpp
@@ -25,12 +25,11 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <errno.h>
#include <limits.h> // INT_MAX, INT_MIN, LONG_MAX
#include <math.h>
+#include <stdcountof.h>
#include <stdlib.h>
#include <string.h> // strerror()
#include <wchar.h>
-#include "lib.h" // array_length()
-
#include "errarg.h"
#include "error.h"
#include "cset.h"
@@ -1288,8 +1287,7 @@ const char *font::load_desc()
bool numeric_directive_found = false;
size_t idx;
for (idx = 0;
- (!numeric_directive_found
- && (idx < array_length(numeric_directive_table)));
+ !numeric_directive_found && (idx < countof(numeric_directive_table));
idx++)
if (strcmp(numeric_directive_table[idx].name, p) == 0)
numeric_directive_found = true;
diff --git a/src/libs/libgroff/glyphuni.cpp b/src/libs/libgroff/glyphuni.cpp
index 2de37f50c..850df0c99 100644
--- a/src/libs/libgroff/glyphuni.cpp
+++ b/src/libs/libgroff/glyphuni.cpp
@@ -20,6 +20,8 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <config.h>
#endif
+#include <stdcountof.h>
+
#include "lib.h"
#include "stringclass.h"
@@ -509,7 +511,7 @@ static struct glyph_to_unicode_init {
glyph_to_unicode_init::glyph_to_unicode_init()
{
- for (size_t i = 0; i < array_length(glyph_to_unicode_list); i++) {
+ for (size_t i = 0; i < countof(glyph_to_unicode_list); i++) {
glyph_to_unicode_map *gtu = new glyph_to_unicode_map[1];
gtu->value = (char *)glyph_to_unicode_list[i].value;
glyph_to_unicode_table.define(glyph_to_unicode_list[i].key, gtu);
diff --git a/src/libs/libgroff/make-uniuni b/src/libs/libgroff/make-uniuni
index c14ca170e..c63c54d2e 100755
--- a/src/libs/libgroff/make-uniuni
+++ b/src/libs/libgroff/make-uniuni
@@ -89,6 +89,8 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <config.h>
#endif
+#include <stdcountof.h>
+
#include "lib.h"
#include "stringclass.h"
@@ -137,7 +139,7 @@ static struct unicode_decompose_init {
unicode_decompose_init::unicode_decompose_init()
{
- for (size_t i = 0; i < array_length(unicode_decompose_list); i++) {
+ for (size_t i = 0; i < countof(unicode_decompose_list); i++) {
unicode_decompose *dec = new unicode_decompose[1];
dec->value = const_cast<char *>(unicode_decompose_list[i].value);
unicode_decompose_table.define(unicode_decompose_list[i].key, dec);
diff --git a/src/libs/libgroff/uniuni.cpp b/src/libs/libgroff/uniuni.cpp
index 5863028fe..15cbac027 100644
--- a/src/libs/libgroff/uniuni.cpp
+++ b/src/libs/libgroff/uniuni.cpp
@@ -20,6 +20,8 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <config.h>
#endif
+#include <stdcountof.h>
+
#include "lib.h"
#include "stringclass.h"
@@ -2117,7 +2119,7 @@ static struct unicode_decompose_init {
unicode_decompose_init::unicode_decompose_init()
{
- for (size_t i = 0; i < array_length(unicode_decompose_list); i++) {
+ for (size_t i = 0; i < countof(unicode_decompose_list); i++) {
unicode_decompose *dec = new unicode_decompose[1];
dec->value = const_cast<char *>(unicode_decompose_list[i].value);
unicode_decompose_table.define(unicode_decompose_list[i].key, dec);
diff --git a/src/preproc/eqn/box.cpp b/src/preproc/eqn/box.cpp
index 5000e5787..7d56ff2d8 100644
--- a/src/preproc/eqn/box.cpp
+++ b/src/preproc/eqn/box.cpp
@@ -20,6 +20,8 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <config.h>
#endif
+#include <stdcountof.h>
+
#include <assert.h>
#include "eqn.h"
@@ -139,7 +141,7 @@ struct param *param_table = 0 /* nullptr */;
void set_param(const char *name, int value)
{
- for (size_t i = 0; i <= array_length(default_param_table); i++)
+ for (size_t i = 0; i <= countof(default_param_table); i++)
if (strcmp(param_table[i].name, name) == 0) {
*(param_table[i].ptr) = value;
return;
@@ -149,7 +151,7 @@ void set_param(const char *name, int value)
void reset_param(const char *name)
{
- for (size_t i = 0; i < array_length(default_param_table); i++)
+ for (size_t i = 0; i < countof(default_param_table); i++)
if (strcmp(param_table[i].name, name) == 0) {
*param_table[i].ptr = *(default_param_table[i].ptr);
return;
@@ -160,7 +162,7 @@ void reset_param(const char *name)
int get_param(const char *name)
{
- for (size_t i = 0; i < array_length(default_param_table); i++)
+ for (size_t i = 0; i < countof(default_param_table); i++)
if (strcmp(param_table[i].name, name) == 0)
return *(param_table[i].ptr);
assert(0 == "attempted to access parameter not in table");
@@ -169,8 +171,8 @@ int get_param(const char *name)
void init_param_table()
{
- param_table = new param[array_length(default_param_table)];
- for (size_t i = 0; i < array_length(default_param_table); i++) {
+ param_table = new param[countof(default_param_table)];
+ for (size_t i = 0; i < countof(default_param_table); i++) {
param_table[i].name = default_param_table[i].name;
param_table[i].ptr = new int(*(default_param_table[i].ptr));
}
@@ -179,7 +181,7 @@ void init_param_table()
void free_param_table()
{
if (param_table != 0 /* nullptr */) {
- for (size_t i = 0; i < array_length(default_param_table); i++)
+ for (size_t i = 0; i < countof(default_param_table); i++)
delete param_table[i].ptr;
delete[] param_table;
param_table = 0 /* nullptr */;
diff --git a/src/preproc/eqn/lex.cpp b/src/preproc/eqn/lex.cpp
index 44aa576cd..cb49e0799 100644
--- a/src/preproc/eqn/lex.cpp
+++ b/src/preproc/eqn/lex.cpp
@@ -20,7 +20,8 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <config.h>
#endif
-#include "lib.h" // array_length()
+#include <stdcountof.h>
+
#include "ptable.h"
#include "stringclass.h"
@@ -285,13 +286,13 @@ static struct builtin_def mathml_defs[] = {
void init_table(const char *device)
{
unsigned int i;
- for (i = 0; i < array_length(token_table); i++) {
+ for (i = 0; i < countof(token_table); i++) {
definition *def = new definition[1];
def->is_macro = 0;
def->tok = token_table[i].token;
macro_table.define(token_table[i].name, def);
}
- for (i = 0; i < array_length(common_defs); i++) {
+ for (i = 0; i < countof(common_defs); i++) {
definition *def = new definition[1];
def->is_macro = 1;
def->contents = strsave(common_defs[i].def);
@@ -299,7 +300,7 @@ void init_table(const char *device)
macro_table.define(common_defs[i].name, def);
}
if (output_format == troff) {
- for (i = 0; i < array_length(troff_defs); i++) {
+ for (i = 0; i < countof(troff_defs); i++) {
definition *def = new definition[1];
def->is_macro = 1;
def->contents = strsave(troff_defs[i].def);
@@ -308,7 +309,7 @@ void init_table(const char *device)
}
}
else if (output_format == mathml) {
- for (i = 0; i < array_length(mathml_defs); i++) {
+ for (i = 0; i < countof(mathml_defs); i++) {
definition *def = new definition[1];
def->is_macro = 1;
def->contents = strsave(mathml_defs[i].def);
diff --git a/src/preproc/pic/pic.ypp b/src/preproc/pic/pic.ypp
index fdd0d197f..4d4e98b7c 100644
--- a/src/preproc/pic/pic.ypp
+++ b/src/preproc/pic/pic.ypp
@@ -25,6 +25,7 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <errno.h> // EDOM, ERANGE, errno
#include <math.h> // atan2(), cos(), floor(), fmod(), log10(), pow(),
// sin(), sqrt()
+#include <stdcountof.h>
#include <stdio.h> // fflush(), fprintf(), snprintf(), sprintf(), stderr
#include <stdlib.h> // rand(), srand(), system()
#include <string.h> // strcat(), strchr(), strcmp(), strcpy(), strlen()
@@ -1855,7 +1856,7 @@ void define_variable(const char *name, double val)
if (strcmp(name, "scale") == 0) {
// When the scale changes, reset all scaled predefined variables to
// their default values.
- for (size_t i = 0; i < array_length(defaults_table); i++)
+ for (size_t i = 0; i < countof(defaults_table); i++)
if (defaults_table[i].scaled)
define_variable(defaults_table[i].name,
(val * defaults_table[i].val));
@@ -1875,7 +1876,7 @@ void parse_init()
void reset(const char *nm)
{
- for (size_t i = 0; i < array_length(defaults_table); i++)
+ for (size_t i = 0; i < countof(defaults_table); i++)
if (strcmp(nm, defaults_table[i].name) == 0) {
double val = defaults_table[i].val;
if (defaults_table[i].scaled) {
@@ -1895,7 +1896,7 @@ void reset_all()
// aren't scaled because 'scale' is not scaled, and changing the
// value of 'scale' will reset all the predefined variables that
// are scaled.
- for (size_t i = 0; i < array_length(defaults_table); i++)
+ for (size_t i = 0; i < countof(defaults_table); i++)
if (!defaults_table[i].scaled)
define_variable(defaults_table[i].name, defaults_table[i].val);
}
diff --git a/src/preproc/preconv/preconv.cpp b/src/preproc/preconv/preconv.cpp
index 0ca91a62d..c66ec4558 100644
--- a/src/preproc/preconv/preconv.cpp
+++ b/src/preproc/preconv/preconv.cpp
@@ -31,6 +31,7 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
# endif
#endif
#include <locale.h> // setlocale()
+#include <stdcountof.h>
#include <stdio.h> // EOF, FILE, fclose(), ferror(), fflush(), fileno(),
// fopen(), fprintf(), fread(), fseek(), ftell(),
// getc(), printf(), putchar(), rewind(), SEEK_SET,
@@ -44,8 +45,6 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <getopt.h> // getopt_long()
-#include "lib.h" // array_length()
-
#include "errarg.h"
#include "error.h"
#include "localcharset.h"
@@ -809,7 +808,7 @@ get_BOM(FILE *fp, string &BOM, string &data)
// UTF-8: 0xEFBBBF
// UTF-16: 0xFEFF or 0xFFFE
// UTF-32: 0x0000FEFF or 0xFFFE0000
- const int BOM_table_len = array_length(BOM_table);
+ const int BOM_table_len = countof(BOM_table);
char BOM_string[4];
const char *retval = 0 /* nullptr */;
int len;
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index fe4fab6d3..13339d161 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -23,6 +23,7 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> // ENOENT, errno
#include <locale.h> // setlocale()
+#include <stdcountof.h>
#include <stdio.h> // EOF, FILE, clearerr(), fclose(), fflush(),
// fileno(), fopen(), fprintf(), fseek(), getc(),
// pclose(), popen(), printf(), SEEK_SET, snprintf(),
@@ -37,7 +38,6 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <stack>
#include "json-encode.h" // json_encode_char()
-#include "lib.h" // array_length()
#include "troff.h"
#include "dictionary.h"
@@ -9983,7 +9983,7 @@ static struct warning_category {
static unsigned int lookup_warning(const char *name)
{
- for (unsigned int i = 0U; i < array_length(warning_table); i++)
+ for (unsigned int i = 0U; i < countof(warning_table); i++)
if (strcmp(name, warning_table[i].name) == 0)
return warning_table[i].mask;
return 0U;
diff --git a/src/utils/addftinfo/addftinfo.cpp
b/src/utils/addftinfo/addftinfo.cpp
index 1ba334b36..900e87a69 100644
--- a/src/utils/addftinfo/addftinfo.cpp
+++ b/src/utils/addftinfo/addftinfo.cpp
@@ -21,6 +21,7 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#endif
#include <errno.h>
+#include <stdcountof.h>
#include <stdlib.h> // exit(), EXIT_SUCCESS, strtol()
#include "lib.h"
@@ -115,7 +116,7 @@ int main(int argc, char **argv)
usage("option requires argument");
size_t j;
for (j = 0;; j++) {
- if (j >= array_length(param_table))
+ if (j >= countof(param_table))
fatal("parameter '%1' not recognized", argv[i] + 1);
if (strcmp(param_table[j].name, argv[i] + 1) == 0)
break;
@@ -137,7 +138,7 @@ int main(int argc, char **argv)
static void usage(FILE *stream)
{
fprintf(stream, "usage: %s", program_name);
- size_t len = array_length(param_table);
+ size_t len = countof(param_table);
for (size_t i = 0; i < len; i++)
fprintf(stream, " [-%s n]", param_table[i].name);
fputs(" resolution unit-width font\n", stream);
--
2.51.0