#define DP_F_ZERO (1 << 4)
#define DP_F_UP (1 << 5)
#define DP_F_UNSIGNED (1 << 6)
+#define DP_F_HEXPREFIX (1 << 7)
/* Conversion Flags */
#define DP_C_SHORT 1
int cflags;
size_t currlen;
va_list args;
+ SilcSnprintfRender render;
silc_va_copy(args, args_in);
fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
break;
case 'p':
+ flags |= (DP_F_UNSIGNED | DP_F_HEXPREFIX);
strvalue = va_arg (args, void *);
- fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags);
+ fmtint (buffer, &currlen, maxlen, (long )strvalue, 16, min, max,
+ flags);
break;
case 'n':
if (cflags == DP_C_SHORT) {
/* not supported yet, treat as next char */
ch = *format++;
break;
+ case '@':
+ /* Renderer function */
+ render = va_arg (args, SilcSnprintfRender);
+ if (render) {
+ void *ptr = va_arg (args, void *);
+ if (ptr) {
+ strvalue = render (ptr);
+ if (strvalue) {
+ if (max == -1)
+ max = strlen(strvalue);
+ if (min > 0 && max >= 0 && min > max) max = min;
+ fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
+ silc_free(strvalue);
+ }
+ }
+ }
+ break;
default:
/* Unknown, skip */
break;
/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
static void fmtint(char *buffer, size_t *currlen, size_t maxlen,
- long value, int base, int min, int max, int flags)
+ long value, int base, int min, int max, int flags)
{
int signvalue = 0;
unsigned long uvalue;
--spadlen;
}
+ /* 0x prefix */
+ if (flags & DP_F_HEXPREFIX) {
+ dopr_outch (buffer, currlen, maxlen, '0');
+ dopr_outch (buffer, currlen, maxlen, 'x');
+ }
+
/* Sign */
if (signvalue)
dopr_outch (buffer, currlen, maxlen, signvalue);