summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pfmtlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/pfmtlog.c')
-rw-r--r--src/lib/netlist/plib/pfmtlog.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/lib/netlist/plib/pfmtlog.c b/src/lib/netlist/plib/pfmtlog.c
new file mode 100644
index 00000000000..2b08bb2fa98
--- /dev/null
+++ b/src/lib/netlist/plib/pfmtlog.c
@@ -0,0 +1,166 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nl_string.c
+ *
+ */
+
+#if 0
+#include <cstring>
+//FIXME:: pstring should be locale free
+#include <cctype>
+#include <cstdlib>
+#include <cstdio>
+#endif
+
+#include <algorithm>
+
+#include "pfmtlog.h"
+#include "palloc.h"
+
+pfmt::pfmt(const pstring &fmt)
+: m_str(m_str_buf), m_allocated(0), m_arg(0)
+{
+ unsigned l = fmt.blen() + 1;
+ if (l>sizeof(m_str_buf))
+ {
+ m_allocated = 2 * l;
+ m_str = palloc_array(char, 2 * l);
+ }
+ memcpy(m_str, fmt.cstr(), l);
+}
+
+pfmt::pfmt(const char *fmt)
+: m_str(m_str_buf), m_allocated(0), m_arg(0)
+{
+ unsigned l = strlen(fmt) + 1;
+ if (l>sizeof(m_str_buf))
+ {
+ m_allocated = 2 * l;
+ m_str = palloc_array(char, 2 * l);
+ }
+ memcpy(m_str, fmt, l);
+}
+
+pfmt::~pfmt()
+{
+ if (m_allocated > 0)
+ pfree_array(m_str);
+}
+
+#if 0
+void pformat::format_element(const char *f, const char *l, const char *fmt_spec, ...)
+{
+ va_list ap;
+ va_start(ap, fmt_spec);
+ char fmt[30] = "%";
+ char search[10] = "";
+ char buf[1024];
+ strcat(fmt, f);
+ strcat(fmt, l);
+ strcat(fmt, fmt_spec);
+ int nl = vsprintf(buf, fmt, ap);
+ m_arg++;
+ int sl = sprintf(search, "%%%d", m_arg);
+ char *p = strstr(m_str, search);
+ if (p != NULL)
+ {
+ // Make room
+ memmove(p+nl, p+sl, strlen(p) + 1 - sl);
+ memcpy(p, buf, nl);
+ }
+ va_end(ap);
+}
+#else
+void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, ...)
+{
+ va_list ap;
+ va_start(ap, fmt_spec);
+ char fmt[30] = "%";
+ char search[10] = "";
+ char buf[2048];
+ m_arg++;
+ int sl = sprintf(search, "{%d:", m_arg);
+ char *p = strstr(m_str, search);
+ if (p == NULL)
+ {
+ sl = sprintf(search, "{%d}", m_arg);
+ p = strstr(m_str, search);
+ if (p == NULL)
+ {
+ sl = 2;
+ p = strstr(m_str, "{}");
+ }
+ if (p==NULL)
+ {
+ sl=1;
+ p = strstr(m_str, "{");
+ if (p != NULL)
+ {
+ char *p1 = strstr(p, "}");
+ if (p1 != NULL)
+ {
+ sl = p1 - p + 1;
+ strncat(fmt, p+1, p1 - p - 2);
+ }
+ else
+ strcat(fmt, f);
+ }
+ else
+ strcat(fmt, f);
+ }
+ }
+ else
+ {
+ char *p1 = strstr(p, "}");
+ if (p1 != NULL)
+ {
+ sl = p1 - p + 1;
+ if (m_arg>=10)
+ strncat(fmt, p+4, p1 - p - 4);
+ else
+ strncat(fmt, p+3, p1 - p - 3);
+ }
+ else
+ strcat(fmt, f);
+ }
+ strcat(fmt, l);
+ char *pend = fmt + strlen(fmt) - 1;
+ if (strchr("fge", *fmt_spec) != NULL)
+ {
+ if (strchr("fge", *pend) == NULL)
+ strcat(fmt, fmt_spec);
+ }
+ else if (strchr("duxo", *fmt_spec) != NULL)
+ {
+ if (strchr("duxo", *pend) == NULL)
+ strcat(fmt, fmt_spec);
+ }
+ else
+ strcat(fmt, fmt_spec);
+ int nl = vsprintf(buf, fmt, ap);
+ if (p != NULL)
+ {
+ // check room
+ unsigned new_size = (p - m_str) + nl + strlen(p) + 1 - sl;
+ if (new_size > m_allocated)
+ {
+ unsigned old_alloc = std::max(m_allocated, (unsigned) sizeof(m_str_buf));
+ if (m_allocated < old_alloc)
+ m_allocated = old_alloc;
+ while (new_size > m_allocated)
+ m_allocated *= 2;
+ char *np = palloc_array(char, m_allocated);
+ memcpy(np, m_str, old_alloc);
+ p = np + (p - m_str);
+ if (m_str != m_str_buf)
+ pfree_array(m_str);
+ m_str = np;
+ }
+ // Make room
+ memmove(p+nl, p+sl, strlen(p) + 1 - sl);
+ memcpy(p, buf, nl);
+ }
+ va_end(ap);
+}
+#endif