return r;
}
-#define IPADDR_NBUFS_SHIFT 4
-#define IPADDR_NBUFS (1 << IPADDR_NBUFS_SHIFT)
#define IPADDR_BUFLEN 20
static char *ipaddr_getbuf(void)
{
- static int b;
- static char bufs[IPADDR_NBUFS][IPADDR_BUFLEN];
-
- b++;
- b &= IPADDR_NBUFS-1;
+ SBUF_DEFINE(16, IPADDR_BUFLEN);
return SBUF;
}
#endif /* CONFIG_IPV6 */
}
-#define IADDR_NBUFS_SHIFT 3
-#define IADDR_NBUFS (1 << IADDR_NBUFS_SHIFT)
+#define IADDR_NBUFS 8
const char *iaddr_to_string(const union iaddr *ia)
{
- static int b;
-
- b++;
- b &= IADDR_NBUFS-1;
-
#ifndef CONFIG_IPV6
- static char bufs[IADDR_NBUFS][100];
+ SBUF_DEFINE(IADDR_NBUFS, 100);
assert(ia->sa.sa_family == AF_INET);
#else /* CONFIG_IPV6 => we have adns_addr2text */
- static char bufs[IADDR_NBUFS][1+ADNS_ADDR2TEXT_BUFLEN+20];
+ SBUF_DEFINE(IADDR_NBUFS, 1+ADNS_ADDR2TEXT_BUFLEN+20);
int port;
const char *desc);
-#define SBUF (bufs[b]) /* temporary macro */
+/*
+ * SBUF_DEFINE(int nbufs, size_t size);
+ * // Generates a number of definitions and statements organising
+ * // nbufs rotating char[size] buffers such that subsequent code
+ * // may refer to:
+ * char *const SBUF;
+ */
+#define SBUF_DEFINE(nbufs, size) \
+ static int static_bufs__bufnum; \
+ static char static_bufs__bufs[(nbufs)][(size)]; \
+ static_bufs__bufnum++; \
+ static_bufs__bufnum %= (nbufs); \
+ static_bufs__bufs[static_bufs__bufnum]
+#define SBUF (static_bufs__bufs[static_bufs__bufnum])
/*----- line-buffered asynch input -----*/