You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@hyperreal.org on 1999/05/22 00:41:44 UTC
cvs commit: apache-1.3/src/ap ap_snprintf.c
jim 99/05/21 15:41:44
Modified: src/ap ap_snprintf.c
Log:
Add the needed logic in ap_snprint to handle
quads (long longs). Note that we depend on AP_LONGEST_LONG being
set correctly. This change does not effect the current operation
of ap_snprintf, so it's OK to add right now while we work on
the rest of it
Revision Changes Path
1.28 +52 -29 apache-1.3/src/ap/ap_snprintf.c
Index: ap_snprintf.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/ap/ap_snprintf.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- ap_snprintf.c 1999/01/01 19:04:37 1.27
+++ ap_snprintf.c 1999/05/21 22:41:43 1.28
@@ -78,12 +78,18 @@
#ifndef TRUE
#define TRUE 1
#endif
+#ifndef AP_LONGEST_LONG
+#define AP_LONGEST_LONG long
+#endif
#define NUL '\0'
#define INT_NULL ((int *)0)
#define WIDE_INT long
+#define WIDEST_INT AP_LONGEST_LONG
typedef WIDE_INT wide_int;
typedef unsigned WIDE_INT u_wide_int;
+typedef WIDEST_INT widest_int;
+typedef unsigned WIDEST_INT u_widest_int;
typedef int bool_int;
#define S_NULL "(null)"
@@ -339,15 +345,15 @@
* which is a pointer to the END of the buffer + 1 (i.e. if the buffer
* is declared as buf[ 100 ], buf_end should be &buf[ 100 ])
*/
-static char *conv_10(register wide_int num, register bool_int is_unsigned,
+static char *conv_10(register widest_int num, register bool_int is_unsigned,
register bool_int *is_negative, char *buf_end,
register int *len)
{
register char *p = buf_end;
- register u_wide_int magnitude;
+ register u_widest_int magnitude;
if (is_unsigned) {
- magnitude = (u_wide_int) num;
+ magnitude = (u_widest_int) num;
*is_negative = FALSE;
}
else {
@@ -363,19 +369,19 @@
* d. add 1
*/
if (*is_negative) {
- wide_int t = num + 1;
+ widest_int t = num + 1;
- magnitude = ((u_wide_int) -t) + 1;
+ magnitude = ((u_widest_int) -t) + 1;
}
else
- magnitude = (u_wide_int) num;
+ magnitude = (u_widest_int) num;
}
/*
* We use a do-while loop so that we write at least 1 digit
*/
do {
- register u_wide_int new_magnitude = magnitude / 10;
+ register u_widest_int new_magnitude = magnitude / 10;
*--p = (char) (magnitude - new_magnitude * 10 + '0');
magnitude = new_magnitude;
@@ -492,7 +498,7 @@
*s++ = format; /* either e or E */
decimal_point--;
if (decimal_point != 0) {
- p = conv_10((wide_int) decimal_point, FALSE, &exponent_is_negative,
+ p = conv_10((widest_int) decimal_point, FALSE, &exponent_is_negative,
&temp[EXPONENT_LENGTH], &t_len);
*s++ = exponent_is_negative ? '-' : '+';
@@ -526,7 +532,7 @@
* which is a pointer to the END of the buffer + 1 (i.e. if the buffer
* is declared as buf[ 100 ], buf_end should be &buf[ 100 ])
*/
-static char *conv_p2(register u_wide_int num, register int nbits,
+static char *conv_p2(register u_widest_int num, register int nbits,
char format, char *buf_end, register int *len)
{
register int mask = (1 << nbits) - 1;
@@ -570,8 +576,8 @@
char prefix_char;
double fp_num;
- wide_int i_num = (wide_int) 0;
- u_wide_int ui_num;
+ widest_int i_num = (widest_int) 0;
+ u_widest_int ui_num;
char num_buf[NUM_BUF_SIZE];
char char_buf[2]; /* for printing %% and %<unknown> */
@@ -580,6 +586,7 @@
* Flag variables
*/
boolean_e is_long;
+ boolean_e is_quad;
boolean_e alternate_form;
boolean_e print_sign;
boolean_e print_blank;
@@ -677,14 +684,21 @@
/*
* Modifier check
*/
- if (*fmt == 'l') {
+ if (*fmt == 'q') {
+ is_quad = YES;
+ is_long = NO;
+ fmt++;
+ }
+ else if (*fmt == 'l') {
is_long = YES;
+ is_quad = NO;
fmt++;
}
else {
if (*fmt == 'h') /* "short" backward compatibility */
++fmt;
is_long = NO;
+ is_quad = NO;
}
/*
@@ -700,10 +714,12 @@
*/
switch (*fmt) {
case 'u':
- if (is_long)
- i_num = va_arg(ap, u_wide_int);
+ if (is_quad)
+ i_num = va_arg(ap, u_widest_int);
+ else if (is_long)
+ i_num = (widest_int) va_arg(ap, u_wide_int);
else
- i_num = (wide_int) va_arg(ap, unsigned int);
+ i_num = (widest_int) va_arg(ap, unsigned int);
s = conv_10(i_num, 1, &is_negative,
&num_buf[NUM_BUF_SIZE], &s_len);
FIX_PRECISION(adjust_precision, precision, s, s_len);
@@ -711,10 +727,12 @@
case 'd':
case 'i':
- if (is_long)
- i_num = va_arg(ap, wide_int);
+ if (is_quad)
+ i_num = va_arg(ap, widest_int);
+ else if (is_long)
+ i_num = (widest_int) va_arg(ap, wide_int);
else
- i_num = (wide_int) va_arg(ap, int);
+ i_num = (widest_int) va_arg(ap, int);
s = conv_10(i_num, 0, &is_negative,
&num_buf[NUM_BUF_SIZE], &s_len);
FIX_PRECISION(adjust_precision, precision, s, s_len);
@@ -729,10 +747,12 @@
case 'o':
- if (is_long)
- ui_num = va_arg(ap, u_wide_int);
+ if (is_quad)
+ ui_num = va_arg(ap, u_widest_int);
+ else if (is_long)
+ ui_num = (u_widest_int) va_arg(ap, u_wide_int);
else
- ui_num = (u_wide_int) va_arg(ap, unsigned int);
+ ui_num = (u_widest_int) va_arg(ap, unsigned int);
s = conv_p2(ui_num, 3, *fmt,
&num_buf[NUM_BUF_SIZE], &s_len);
FIX_PRECISION(adjust_precision, precision, s, s_len);
@@ -745,10 +765,12 @@
case 'x':
case 'X':
- if (is_long)
- ui_num = (u_wide_int) va_arg(ap, u_wide_int);
+ if (is_quad)
+ ui_num = va_arg(ap, u_widest_int);
+ else if (is_long)
+ ui_num = (u_widest_int) va_arg(ap, u_wide_int);
else
- ui_num = (u_wide_int) va_arg(ap, unsigned int);
+ ui_num = (u_widest_int) va_arg(ap, unsigned int);
s = conv_p2(ui_num, 4, *fmt,
&num_buf[NUM_BUF_SIZE], &s_len);
FIX_PRECISION(adjust_precision, precision, s, s_len);
@@ -850,14 +872,15 @@
case 'p':
switch(*++fmt) {
/*
- * If the pointer size is equal to the size of an unsigned
- * integer we convert the pointer to a hex number, otherwise
- * we print "%p" to indicate that we don't handle "%p".
+ * If the pointer size is equal to or smaller than the size
+ * of the largest unsigned int, we convert the pointer to a
+ * hex number, otherwise we print "%p" to indicate that we
+ * don't handle "%p".
*/
case 'p':
- ui_num = (u_wide_int) va_arg(ap, void *);
+ ui_num = (u_widest_int) va_arg(ap, void *);
- if (sizeof(char *) <= sizeof(u_wide_int))
+ if (sizeof(char *) <= sizeof(u_widest_int))
s = conv_p2(ui_num, 4, 'x',
&num_buf[NUM_BUF_SIZE], &s_len);
else {