#include "iobuf.h"

int obuf_sign_pad(obuf* out, int sign, unsigned width, char pad)
{
  if (!width) return !sign || obuf_putc(out, '-');
  if (pad != '0' && !obuf_pad(out, width, pad)) return 0;
  if (sign && !obuf_putc(out, '-')) return 0;
  if (pad == '0' && !obuf_pad(out, width, pad)) return 0;
  return 1;
}

static int obuf_putiw_rec(obuf* out, unsigned long data, int sign,
			  unsigned width, char pad)
{
  if (width) --width;
  if (data >= 10) {
    if (!obuf_putiw_rec(out, data/10, sign, width, pad)) return 0;
  }
  else {
    if (!obuf_sign_pad(out, sign, width, pad)) return 0;
  }
  return obuf_putc(out, (data % 10) + '0');
}

int obuf_putiw(obuf* out, long data, unsigned width, char pad)
{
  int sign;

  sign = 0;
  if (data < 0) {
    sign = 1;
    data = -data;
    if (width) -- width;
  }
  if (data < 10) {
    if (width && !obuf_sign_pad(out, sign, width-1, pad)) return 0;
    return obuf_putc(out, data + '0');
  }
  return obuf_putiw_rec(out, data, sign, width, pad);
}


syntax highlighted by Code2HTML, v. 0.9.1