/*
* Helper functions for outputting text.
- * Copyright © 2011, 2021, 2023 Nick Bowler
+ * Copyright © 2011, 2021, 2023-2024 Nick Bowler
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*/
#include <config.h>
#include <stdio.h>
+#include <limits.h>
#include <assert.h>
#include "cdecl.h"
#include "cdecl-internal.h"
+#include "parse.h"
#include "specstr.h"
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-
size_t cdecl__advance(struct output_state *dst, size_t amount)
{
size_t x = MIN(amount, dst->dstlen);
return amount;
}
+size_t cdecl__strlcpy(char *dst, const char *src, size_t dstlen)
+{
+ size_t srclen = strlen(src);
+
+ if (dstlen > 0) {
+ memcpy(dst, src, MIN(dstlen, srclen+1));
+ if (dstlen <= srclen)
+ dst[dstlen-1] = 0;
+ }
+
+ return srclen;
+}
+
size_t cdecl__emit(struct output_state *dst, const char *src)
{
- size_t rc = snprintf(dst->dst, dst->dstlen, "%s", src);
+ size_t rc = cdecl__strlcpy(dst->dst, src, dst->dstlen);
return cdecl__advance(dst, rc);
}
+enum {
+ /*
+ * upper bound on number of decimal digits required to convert
+ * cdecl_uintmax.
+ */
+ MAX_UINT_DIGITS = (CHAR_BIT * sizeof (cdecl_uintmax) + 2)/3
+};
+
+size_t cdecl__emit_uint(struct output_state *dst, cdecl_uintmax val)
+{
+ char buf[MAX_UINT_DIGITS + 1], *p = &buf[sizeof buf];
+
+ *(--p) = 0;
+ while (val > 0) {
+ *(--p) = '0' + val % 10;
+ val /= 10;
+ }
+
+ return cdecl__emit(dst, p);
+}
+
static void explain_spec(struct output_state *dst, struct cdecl_declspec *s)
{
size_t rc;