inline static void
php_sprintf_appendint(char **buffer, int *pos, int *size, long number,
- int width, char padding, int alignment)
+ int width, char padding, int alignment,
+ int always_sign)
{
char numbuf[NUM_BUF_SIZE];
register unsigned long magn, nmagn;
while (magn > 0 && i > 0);
if (neg) {
numbuf[--i] = '-';
+ } else if (always_sign) {
+ numbuf[--i] = '+';
}
PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n",
number, &numbuf[i], i));
inline static void
php_sprintf_appenduint(char **buffer, int *pos, int *size,
unsigned long number,
- int width, char padding, int alignment)
+ int width, char padding, int alignment, int always_sign)
{
char numbuf[NUM_BUF_SIZE];
register unsigned long magn, nmagn;
numbuf[--i] = (unsigned char)(magn - (nmagn * 10)) + '0';
magn = nmagn;
- }
- while (magn > 0 && i > 0);
+ } while (magn > 0 && i > 0);
+
+ if (always_sign)
+ numbuf[--i] = '+';
PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n", number, &numbuf[i], i));
php_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0,
padding, alignment, (NUM_BUF_SIZE - 1) - i, 0, 0);
int *size, double number,
int width, char padding,
int alignment, int precision,
- int adjust, char fmt)
+ int adjust, char fmt,
+ int always_sign)
{
char numbuf[NUM_BUF_SIZE];
char *cvt;
if (sign) {
numbuf[i++] = '-';
+ } else if (always_sign) {
+ numbuf[i++] = '+';
}
if (fmt == 'f') {
* "-" left adjusted field
* n field size
* "."n precision (floats only)
+ * "+" Always place a sign (+ or -) in front of a number
*
* Type specifiers:
*
int argc, size = 240, inpos = 0, outpos = 0, temppos;
int alignment, width, precision, currarg, adjusting, argnum;
char *format, *result, padding;
+ int always_sign;
argc = ZEND_NUM_ARGS();
alignment = ALIGN_RIGHT;
adjusting = 0;
padding = ' ';
+ always_sign = 0;
inpos++; /* skip the '%' */
PRINTF_DEBUG(("sprintf: first looking at '%c', inpos=%d\n",
} else if (format[inpos] == '-') {
alignment = ALIGN_LEFT;
/* space padding, the default */
+ } else if (format[inpos] == '+') {
+ always_sign = 1;
} else if (format[inpos] == '\'') {
padding = format[++inpos];
} else {
convert_to_long_ex(args[argnum]);
php_sprintf_appendint(&result, &outpos, &size,
Z_LVAL_PP(args[argnum]),
- width, padding, alignment);
+ width, padding, alignment,
+ always_sign);
break;
case 'u':
convert_to_long_ex(args[argnum]);
php_sprintf_appenduint(&result, &outpos, &size,
Z_LVAL_PP(args[argnum]),
- width, padding, alignment);
+ width, padding, alignment,
+ always_sign);
break;
case 'e':
Z_DVAL_PP(args[argnum]),
width, padding, alignment,
precision, adjusting,
- format[inpos]);
+ format[inpos], always_sign);
break;
case 'c':