pike.git/src/stralloc.c:10:
#include "dynamic_buffer.h"
#include "pike_macros.h"
#include "pike_memory.h"
#include "pike_error.h"
#include "gc.h"
#include "stuff.h"
#include "bignum.h"
#include "interpret.h"
#include "operators.h"
#include "pike_float.h"
+ #include "pike_types.h"
#include "block_allocator.h"
#include <errno.h>
#include <float.h>
#include <ctype.h>
#include <math.h>
#define SET_HSIZE(X) htable_mask=(htable_size=(X))-1
#define HMODULO(X) ((X) & (htable_mask))
pike.git/src/stralloc.c:2917: Inside #if defined(INT64)
return va_arg(VA_LIST_DEREF(args), unsigned INT64);
case APPEND_WIDTH_LONG_LONG|APPEND_SIGNED:
return va_arg(VA_LIST_DEREF(args), INT64);
#endif /* INT64 */
}
Pike_fatal("string_builder_append_integerv(): Unsupported flags: 0x%04x\n",
flags);
return 0;
}
+ /* Standard formats supported by string_builder_{v,}sprintf():
+ *
+ * '%' Insert %.
+ * 'a' Insert double.
+ * 'c' Insert character.
+ * 'd' Insert decimal integer.
+ * 'e' Insert double.
+ * 'f' Insert double.
+ * 'g' Insert double.
+ * 'o' Insert octal integer.
+ * 's' Insert string.
+ * 'u' Insert unsigned decimal integer.
+ * 'x' Insert lower-case hexadecimal integer.
+ * 'E' Insert double.
+ * 'G' Insert double.
+ * 'X' Insert upper-case hexadecimal integer.
+ *
+ * Format modifiers supported by string_builder_{v,}sprintf():
+ *
+ * '+' Explicit sign for non-negative numeric values.
+ * '-' Align left.
+ * '0' Zero pad.
+ * '0'..'9' Field width.
+ * '.' Precision field width follows.
+ * 'h' Half-width input.
+ * 'l' Long(-er) input.
+ * 't' Pointer-width input (ptrdiff_t).
+ * 'w' Wide input (same as 'l', but only for strings).
+ * 'z' Pointer-width input (size_t).
+ *
+ * Extended formats supported by string_builder_{v,}sprintf():
+ *
+ * 'b' Insert binary integer.
+ * 'O' Insert description of svalue.
+ * 'S' Insert pike_string.
+ * 'T' Insert pike_type.
+ */
+
/* Values used internally in string_builder_vsprintf() */
#define STATE_MIN_WIDTH 1
#define STATE_PRECISION 2
PMOD_EXPORT void string_builder_vsprintf(struct string_builder *s,
const char *fmt,
va_list args)
{
while (*fmt) {
if (*fmt == '%') {
pike.git/src/stralloc.c:2984:
} else {
flags |= APPEND_WIDTH_LONG;
}
continue;
case 't': /* ptrdiff_t */
case 'z': /* size_t */
flags = (flags & ~APPEND_WIDTH_MASK) | APPEND_WIDTH_PTR;
continue;
+ case 'T': /* struct pike_type */
+ /* FIXME: Doesn't care about field or integer widths yet. */
+ low_describe_type(s, va_arg(args, struct pike_type *));
+ break;
+
case 'O':
{
/* FIXME: Doesn't care about field or integer widths yet. */
dynamic_buffer old_buf;
init_buf(&old_buf);
describe_svalue(va_arg(args, struct svalue *), 0, NULL);
string_builder_binary_strcat(s, pike_global_buffer.s.str,
pike_global_buffer.s.len);
toss_buffer(&pike_global_buffer);
restore_buffer(&old_buf);
pike.git/src/stralloc.c:3115:
char nfmt[] = { '%', fmt[-1], 0 };
if (PIKE_ISNAN(val)) {
/* NaN */
string_builder_strcat(s, "nan");
break;
}
if (val < 0.0) {
string_builder_putchar(s, '-');
val = -val;
- } else if (flags & APPEND_SIGNED) {
+ } else if (flags & APPEND_POSITIVE) {
string_builder_putchar(s, '+');
}
if ((val+val == val) && (val > 0.0)) {
/* Infinity */
string_builder_strcat(s, "inf");
break;
}
/* FIXME: Field lengths and precision. */
if ((bytes = snprintf(NULL, 0, nfmt, val))) {
p_wchar0 *p = string_builder_allocate(s, bytes, 0);