/* $Id: sign_pad.c 616 2005-08-19 20:11:01Z bruce $ */
#include <string.h>
#include "number.h"

/** Format padding for a signed number. */
unsigned fmt_sign_pad(char* buffer, int sign, unsigned width, char pad)
{
  char* s = buffer;
  if (buffer == 0)
    return width + (sign != 0);
  if (!width) {
    if (sign)
      *s++ = '-';
  }
  else {
    if (pad != '0') {
      memset(s, pad, width);
      s += width;
    }
    if (sign)
      *s++ = '-';
    if (pad == '0') {
      memset(s, pad, width);
      s += width;
    }
  }
  return s - buffer;
}

#ifdef SELFTEST_MAIN
#include "selftest.c"
void test(int sign, unsigned width, char pad)
{
  char buf[10];
  obuf_putu(&outbuf, fmt_sign_pad(0, sign, width, pad));
  obuf_putc(&outbuf, ':');
  buf[fmt_sign_pad(buf, sign, width, pad)] = 0;
  obuf_puts(&outbuf, buf);
  NL();
}

MAIN
{
  test(0, 0,   0);
  test(1, 0,   0);
  test(0, 4, 'x');
  test(1, 4, 'x');
  test(0, 4, '0');
  test(1, 4, '0');
}
#endif
#ifdef SELFTEST_EXP
0:
1:-
4:xxxx
5:xxxx-
4:0000
5:-0000
#endif
