.SH EXAMPLES
.\" SRC BEGIN (bpf.c)
.EX
+#define NITEMS(a) (sizeof(a) / sizeof(*(a)))
+\&
/* bpf+sockets example:
* 1. create array map of 256 elements
* 2. load program that counts number of packets received
};
\&
prog_fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, prog,
- sizeof(prog) / sizeof(prog[0]), "GPL");
+ NITEMS(prog), "GPL");
\&
sock = open_raw_sock("lo");
\&
#include <unistd.h>
\&
#define X32_SYSCALL_BIT 0x40000000
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#define NITEMS(arr) (sizeof(arr) / sizeof((arr)[0]))
\&
static int
install_filter(int syscall_nr, unsigned int t_arch, int f_errno)
};
\&
struct sock_fprog prog = {
- .len = ARRAY_SIZE(filter),
+ .len = NITEMS(filter),
.filter = filter,
};
\&
#include <sys/un.h>
#include <unistd.h>
\&
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#define NITEMS(arr) (sizeof(arr) / sizeof((arr)[0]))
\&
/* Send the file descriptor \[aq]fd\[aq] over the connected UNIX domain socket
\[aq]sockfd\[aq]. Returns 0 on success, or \-1 on error. */
};
\&
struct sock_fprog prog = {
- .len = ARRAY_SIZE(filter),
+ .len = NITEMS(filter),
.filter = filter,
};
\&
\&
#include <linux/sysctl.h>
\&
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#define NITEMS(arr) (sizeof(arr) / sizeof((arr)[0]))
\&
int _sysctl(struct __sysctl_args *args);
\&
\&
memset(&args, 0, sizeof(args));
args.name = name;
- args.nlen = ARRAY_SIZE(name);
+ args.nlen = NITEMS(name);
args.oldval = osname;
args.oldlenp = &osnamelth;
\&
#include <stdlib.h>
#include <string.h>
\&
-#define ARRAY_SIZE(arr) (sizeof((arr)) / sizeof((arr)[0]))
+#define NITEMS(arr) (sizeof((arr)) / sizeof((arr)[0]))
\&
struct mi {
int nr;
int
main(int argc, char *argv[])
{
- qsort(months, ARRAY_SIZE(months), sizeof(months[0]), compmi);
+ qsort(months, NITEMS(months), sizeof(months[0]), compmi);
for (size_t i = 1; i < argc; i++) {
struct mi key;
struct mi *res;
\&
key.name = argv[i];
- res = bsearch(&key, months, ARRAY_SIZE(months),
+ res = bsearch(&key, months, NITEMS(months),
sizeof(months[0]), compmi);
if (res == NULL)
printf("\[aq]%s\[aq]: unknown month\[rs]n", argv[i]);
#include <stdio.h>
#include <stdlib.h>
\&
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#define NITEMS(arr) (sizeof(arr) / sizeof((arr)[0]))
\&
int
main(void)
return EXIT_FAILURE;
}
\&
- ret = fread(buffer, sizeof(*buffer), ARRAY_SIZE(buffer), fp);
- if (ret != ARRAY_SIZE(buffer)) {
+ ret = fread(buffer, sizeof(*buffer), NITEMS(buffer), fp);
+ if (ret != NITEMS(buffer)) {
fprintf(stderr, "fread() failed: %zu\[rs]n", ret);
exit(EXIT_FAILURE);
}
#include <stdlib.h>
#include <regex.h>
\&
-#define ARRAY_SIZE(arr) (sizeof((arr)) / sizeof((arr)[0]))
+#define NITEMS(arr) (sizeof((arr)) / sizeof((arr)[0]))
\&
static const char *const str =
"1) John Driverhacker;\[rs]n2) John Doe;\[rs]n3) John Foo;\[rs]n";
printf("Matches:\[rs]n");
\&
for (unsigned int i = 0; ; i++) {
- if (regexec(®ex, s, ARRAY_SIZE(pmatch), pmatch, 0))
+ if (regexec(®ex, s, NITEMS(pmatch), pmatch, 0))
break;
\&
off = pmatch[0].rm_so + (s \- str);
#define must_be_array(arr) must_be(is_array(arr))
\&
#define sizeof_array(arr) (sizeof(arr) + must_be_array(arr))
-#define nitems(arr) (sizeof((arr)) / sizeof((arr)[0]) \[rs]
+#define NITEMS(arr) (sizeof((arr)) / sizeof((arr)[0]) \[rs]
+ must_be_array(arr))
\&
int foo[10];
int
main(void)
{
- for (size_t i = 0; i < nitems(foo); i++) {
+ for (size_t i = 0; i < NITEMS(foo); i++) {
foo[i] = i;
}
\&
memcpy(bar, foo, sizeof_array(bar));
\&
- for (size_t i = 0; i < nitems(bar); i++) {
+ for (size_t i = 0; i < NITEMS(bar); i++) {
printf("%d,", bar[i]);
}
\&
#include <stdlib.h>
#include <string.h>
\&
-#define nitems(arr) (sizeof((arr)) / sizeof((arr)[0]))
+#define NITEMS(arr) (sizeof((arr)) / sizeof((arr)[0]))
\&
int
main(void)
char src[] = "some_long_body.post";
char *dest;
\&
- n = nitems(pre) + strlen(src) \- strlen(post) + nitems(new_post) + 1;
+ n = NITEMS(pre) + strlen(src) \- strlen(post) + NITEMS(new_post) + 1;
dest = malloc(sizeof(*dest) * n);
if (dest == NULL)
err(EXIT_FAILURE, "malloc()");
\&
dest[0] = \[aq]\[rs]0\[aq]; // There's no 'cpy' function to this 'cat'.
- strncat(dest, pre, nitems(pre));
+ strncat(dest, pre, NITEMS(pre));
strncat(dest, src, strlen(src) \- strlen(post));
- strncat(dest, new_post, nitems(new_post));
+ strncat(dest, new_post, NITEMS(new_post));
\&
puts(dest); // "pre.some_long_body.foo.bar"
free(dest);