ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
cadical_format.cpp
Go to the documentation of this file.
1#include "global.h"
2
3#include "internal.hpp"
4
6
7namespace CaDiCaL {
8
9void Format::enlarge () {
10 char *old = buffer;
11 buffer = new char[size = size ? 2 * size : 1];
12 memcpy (buffer, old, count);
13 delete[] old;
14}
15
16inline void Format::push_char (char ch) {
17 if (size == count)
18 enlarge ();
19 buffer[count++] = ch;
20}
21
22void Format::push_string (const char *s) {
23 char ch;
24 while ((ch = *s++))
25 push_char (ch);
26}
27
28void Format::push_int (int d) {
29 char tmp[16];
30 snprintf (tmp, sizeof tmp, "%d", d);
31 push_string (tmp);
32}
33
34void Format::push_uint64 (uint64_t u) {
35 char tmp[16];
36 snprintf (tmp, sizeof tmp, "%" PRIu64, u);
37 push_string (tmp);
38}
39
40static bool match_format (const char *&str, const char *pattern) {
41 CADICAL_assert (pattern);
42 const char *p = str;
43 const char *q = pattern;
44 while (*q)
45 if (*q++ != *p++)
46 return false;
47 str = p;
48 return true;
49}
50
51const char *Format::add (const char *fmt, va_list &ap) {
52 const char *p = fmt;
53 char ch;
54 while ((ch = *p++)) {
55 if (ch != '%')
56 push_char (ch);
57 else if (*p == 'c')
58 push_char (va_arg (ap, int)), p++;
59 else if (*p == 'd')
60 push_int (va_arg (ap, int)), p++;
61 else if (*p == 's')
62 push_string (va_arg (ap, const char *)), p++;
63 else if (match_format (p, PRIu64))
64 push_uint64 (va_arg (ap, uint64_t));
65 else {
66 push_char ('%');
67 push_char (*p);
68 break;
69 } // unsupported
70 }
71 push_char (0);
72 count--; // thus automatic append in subsequent calls.
73 return buffer;
74}
75
76const char *Format::init (const char *fmt, ...) {
77 count = 0;
78 va_list ap;
79 va_start (ap, fmt);
80 const char *res = add (fmt, ap);
81 va_end (ap);
82 return res;
83}
84
85const char *Format::append (const char *fmt, ...) {
86 va_list ap;
87 va_start (ap, fmt);
88 const char *res = add (fmt, ap);
89 va_end (ap);
90 return res;
91}
92
93} // namespace CaDiCaL
94
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
Definition global.h:14
const char * init(const char *fmt,...) CADICAL_ATTRIBUTE_FORMAT(2
const char const char * append(const char *fmt,...) CADICAL_ATTRIBUTE_FORMAT(2
Cube * p
Definition exorList.c:222
char * memcpy()