#include <limits.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
size_t commafmt(char *buf, /* Buffer for formatted string */
int bufsize, /* Size of buffer */
long N) /* Number to convert */
{
int places = 0;
int i, len = 1, posn = 1, sign = 1;
char *ptr = buf + bufsize - 1;
if (2 > bufsize)
{
ABORT: *buf = '\0';
return 0;
}
*ptr-- = '\0';
--bufsize;
if (0L > N)
{
sign = -1;
N = -N;
}
for (; len <= bufsize; ++len, ++posn)
{
*ptr-- = (char)((N % 10L) + '0');
if (0L == (N /= 10L))
break;
if (fmt_info->grouping[places] && 0 == (posn % fmt_info->grouping[places]))
{
if (fmt_info->grouping[places + 1] != '\0')
places = fmt_info->grouping[places + 1] == CHAR_MAX ? 0 : places + 1;
for (i = 0; fmt_info->thousands_sep[i]; i++, ++len) {
*ptr-- = fmt_info->thousands_sep[i];
if (len >= bufsize)
goto ABORT;
}
}
if (len >= bufsize)
goto ABORT;
}
if (0 > sign)
{
if (len >= bufsize)
goto ABORT;
for (i = 0; fmt_info->negative_sign[i]; ++i) {
*ptr-- = fmt_info->negative_sign[i];
if (++len >= bufsize)
goto ABORT;
}
}
return (size_t)len;
}
int main() {
char buffer[16];
commafmt(buffer, sizeof(buffer), -12345678);
return 0;
}
I2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnNpemVfdCBjb21tYWZtdChjaGFyICAgKmJ1ZiwgICAgICAgICAgICAvKiBCdWZmZXIgZm9yIGZvcm1hdHRlZCBzdHJpbmcgICovCglpbnQgICAgIGJ1ZnNpemUsICAgICAgICAvKiBTaXplIG9mIGJ1ZmZlciAgICAgICAgICAgICAgICovCglsb25nICAgIE4pICAgICAgICAgICAgICAvKiBOdW1iZXIgdG8gY29udmVydCAgICAgICAgICAgICovCnsKCWNvbnN0IHN0cnVjdCBsY29udiAqZm10X2luZm8gPSBsb2NhbGVjb252KCk7CglpbnQgcGxhY2VzID0gMDsKCWludCBpLCBsZW4gPSAxLCBwb3NuID0gMSwgc2lnbiA9IDE7CgljaGFyICpwdHIgPSBidWYgKyBidWZzaXplIC0gMTsKCglpZiAoMiA+IGJ1ZnNpemUpCgl7CglBQk9SVDogICAgICAqYnVmID0gJ1wwJzsKCQlyZXR1cm4gMDsKCX0KCgkqcHRyLS0gPSAnXDAnOwoJLS1idWZzaXplOwoJaWYgKDBMID4gTikKCXsKCQlzaWduID0gLTE7CgkJTiA9IC1OOwoJfQoKCWZvciAoOyBsZW4gPD0gYnVmc2l6ZTsgKytsZW4sICsrcG9zbikKCXsKCQkqcHRyLS0gPSAoY2hhcikoKE4gJSAxMEwpICsgJzAnKTsKCQlpZiAoMEwgPT0gKE4gLz0gMTBMKSkKCQkJYnJlYWs7CgkJaWYgKGZtdF9pbmZvLT5ncm91cGluZ1twbGFjZXNdICYmIDAgPT0gKHBvc24gJSBmbXRfaW5mby0+Z3JvdXBpbmdbcGxhY2VzXSkpCgkJewoJCQlpZiAoZm10X2luZm8tPmdyb3VwaW5nW3BsYWNlcyArIDFdICE9ICdcMCcpCgkJCQlwbGFjZXMgPSBmbXRfaW5mby0+Z3JvdXBpbmdbcGxhY2VzICsgMV0gPT0gQ0hBUl9NQVggPyAwIDogcGxhY2VzICsgMTsKCQkJZm9yIChpID0gMDsgZm10X2luZm8tPnRob3VzYW5kc19zZXBbaV07IGkrKywgKytsZW4pIHsKCQkJCSpwdHItLSA9IGZtdF9pbmZvLT50aG91c2FuZHNfc2VwW2ldOwoJCQkJaWYgKGxlbiA+PSBidWZzaXplKQoJCQkJCWdvdG8gQUJPUlQ7CgkJCX0KCQl9CgkJaWYgKGxlbiA+PSBidWZzaXplKQoJCQlnb3RvIEFCT1JUOwoJfQoKCWlmICgwID4gc2lnbikKCXsKCQlpZiAobGVuID49IGJ1ZnNpemUpCgkJCWdvdG8gQUJPUlQ7CgkJZm9yIChpID0gMDsgZm10X2luZm8tPm5lZ2F0aXZlX3NpZ25baV07ICsraSkgewoJCQkqcHRyLS0gPSBmbXRfaW5mby0+bmVnYXRpdmVfc2lnbltpXTsKCQkJaWYgKCsrbGVuID49IGJ1ZnNpemUpCgkJCQlnb3RvIEFCT1JUOwoJCX0KCX0KCgltZW1tb3ZlKGJ1ZiwgKytwdHIsIGxlbiArIDEpOwoJcmV0dXJuIChzaXplX3QpbGVuOwp9CgppbnQgbWFpbigpIHsKCWNoYXIgYnVmZmVyWzE2XTsKCglzZXRsb2NhbGUoTENfQUxMLCAiIik7Cgljb21tYWZtdChidWZmZXIsIHNpemVvZihidWZmZXIpLCAtMTIzNDU2NzgpOwoKCXByaW50ZigiJXNcbiIsIGJ1ZmZlcik7CglyZXR1cm4gMDsKfQ==