view gsm-fw/sprintf/integer.c @ 884:353daaa6014d

gsm-fw/gpf/conf/gsmcomp.c: increased max partition in the voice-only config The code we got from TCS211 had the maximum prim pool partition size set to 900 bytes in the voice-only config (no FAX_AND_DATA, no GPRS) and to 1600 bytes in every other config. As it turns out, this "minimized" config breaks when the AT command interface is used with %CPI enabled, as the responsible code in ATI does an ACI_MALLOC of 1012 bytes. TI may have considered this case to be unsupported usage (perhaps they didn't care about the combination of a voice-only PS with AT command control), but we do want this use case to work without crashing. Solution: I made the largest prim pool the same as it is with FAX_AND_DATA: 3 partitions of 1600 bytes.
author Space Falcon <falcon@ivan.Harhan.ORG>
date Sat, 27 Jun 2015 07:31:30 +0000
parents 7e45ada9c365
children
line wrap: on
line source

/*
 * Embedded [v]sprintf() implementation by Michael Spacefalcon,
 * loosely based on the 4.3BSD-Tahoe version.
 *
 * This module contains the integer conversion functions.
 */

#include <sys/types.h>
#include <ctype.h>
#include "defs.h"

extern u_char * _sprintf_field(u_char *op, int width, int flags, int sign,
			u_char *body, int size, int dprec, int fpprec);

static const char lcdigits[] = "0123456789abcdef";
static const char ucdigits[] = "0123456789ABCDEF";

u_char *
_sprintf_integer(u_char *op, int width, int flags, int sign,
		unsigned number, int base, int prec)
{
	const char *digits;
	char buf[12];
	char *t, *endp;

	/*
	 * ``... diouXx conversions ... if a precision is
	 * specified, the 0 flag will be ignored.''
	 *	-- ANSI X3J11
	 */
	if (prec >= 0)
		flags &= ~ZEROPAD;

	if (flags & UPPERCASE)
		digits = ucdigits;
	else
		digits = lcdigits;

	/*
	 * ``The result of converting a zero value with an
	 * explicit precision of zero is no characters.''
	 *	-- ANSI X3J11
	 */
	t = endp = buf + sizeof(buf);
	if (number != 0 || prec != 0) {
		do {
			*--t = digits[number % base];
			number /= base;
		} while (number);
		if (flags & ALT && base == 8 && *t != '0')
			*--t = '0'; /* octal leading 0 */
	}
	return _sprintf_field(op, width, flags, sign, t, endp - t, prec, 0);
}