jim 99/05/22 04:24:42
Modified: src/ap ap_snprintf.c
Log:
More mucking with ap_snprintf(). Some
speed "tuneups" but also a renaming of some internal functions.
After some sleep, I thought that making the 'quad' specific functions
as having the "noted" names made better sense, although the
code itself doesn't care.
Revision Changes Path
1.33 +89 -58 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.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- ap_snprintf.c 1999/05/22 03:49:32 1.32
+++ ap_snprintf.c 1999/05/22 11:24:41 1.33
@@ -345,10 +345,11 @@
* 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 ])
*
- * Note: we have 2 versions. One is used when we need to use quads (conv_10),
- * the other isn't (conv_10_l). We're assuming the latter is faster.
+ * Note: we have 2 versions. One is used when we need to use quads
+ * (conv_10_quad), the other when we don't (conv_10). We're assuming the
+ * latter is faster.
*/
-static char *conv_10_l(register wide_int num, register bool_int is_unsigned,
+static char *conv_10(register wide_int num, register bool_int is_unsigned,
register bool_int *is_negative, char *buf_end,
register int *len)
{
@@ -395,7 +396,7 @@
return (p);
}
-static char *conv_10(register widest_int num, register bool_int is_unsigned,
+static char *conv_10_quad(register widest_int num, register bool_int
is_unsigned,
register bool_int *is_negative, char *buf_end,
register int *len)
{
@@ -407,7 +408,7 @@
* then we know we aren't using quads, so use the faster function
*/
if (num <= ULONG_MAX)
- return(conv_10_l( (wide_int)num, is_unsigned, is_negative,
+ return(conv_10( (wide_int)num, is_unsigned, is_negative,
buf_end, len));
if (is_unsigned) {
@@ -459,13 +460,13 @@
bool_int is_negative;
int sub_len;
- p = conv_10_l((addr & 0x000000FF) , TRUE, &is_negative, p,
&sub_len);
+ p = conv_10((addr & 0x000000FF) , TRUE, &is_negative, p, &sub_len);
*--p = '.';
- p = conv_10_l((addr & 0x0000FF00) >> 8, TRUE, &is_negative, p,
&sub_len);
+ p = conv_10((addr & 0x0000FF00) >> 8, TRUE, &is_negative, p, &sub_len);
*--p = '.';
- p = conv_10_l((addr & 0x00FF0000) >> 16, TRUE, &is_negative, p,
&sub_len);
+ p = conv_10((addr & 0x00FF0000) >> 16, TRUE, &is_negative, p, &sub_len);
*--p = '.';
- p = conv_10_l((addr & 0xFF000000) >> 24, TRUE, &is_negative, p,
&sub_len);
+ p = conv_10((addr & 0xFF000000) >> 24, TRUE, &is_negative, p, &sub_len);
*len = buf_end - p;
return (p);
@@ -479,7 +480,7 @@
bool_int is_negative;
int sub_len;
- p = conv_10_l(ntohs(si->sin_port), TRUE, &is_negative, p, &sub_len);
+ p = conv_10(ntohs(si->sin_port), TRUE, &is_negative, p, &sub_len);
*--p = ':';
p = conv_in_addr(&si->sin_addr, p, &sub_len);
@@ -556,7 +557,7 @@
*s++ = format; /* either e or E */
decimal_point--;
if (decimal_point != 0) {
- p = conv_10_l((wide_int) decimal_point, FALSE,
&exponent_is_negative,
+ p = conv_10((wide_int) decimal_point, FALSE, &exponent_is_negative,
&temp[EXPONENT_LENGTH], &t_len);
*s++ = exponent_is_negative ? '-' : '+';
@@ -593,7 +594,7 @@
* As with conv_10, we have a faster version which is used when
* the number isn't quad size.
*/
-static char *conv_p2_l(register u_wide_int num, register int nbits,
+static char *conv_p2(register u_wide_int num, register int nbits,
char format, char *buf_end, register int *len)
{
register int mask = (1 << nbits) - 1;
@@ -612,7 +613,7 @@
return (p);
}
-static char *conv_p2(register u_widest_int num, register int nbits,
+static char *conv_p2_quad(register u_widest_int num, register int nbits,
char format, char *buf_end, register int *len)
{
register int mask = (1 << nbits) - 1;
@@ -622,7 +623,7 @@
register const char *digits = (format == 'X') ? upper_digits :
low_digits;
if (num <= ULONG_MAX)
- return(conv_p2_l( (u_wide_int)num, nbits, format, buf_end, len));
+ return(conv_p2( (u_wide_int)num, nbits, format, buf_end, len));
do {
*--p = digits[num & mask];
@@ -659,8 +660,10 @@
char prefix_char;
double fp_num;
- widest_int i_num = (widest_int) 0;
- u_widest_int ui_num;
+ widest_int i_quad = (widest_int) 0;
+ u_widest_int ui_quad;
+ wide_int i_num = (wide_int) 0;
+ u_wide_int ui_num;
char num_buf[NUM_BUF_SIZE];
char char_buf[2]; /* for printing %% and %<unknown> */
@@ -799,31 +802,41 @@
*/
switch (*fmt) {
case 'u':
- if (var_type == IS_QUAD)
- i_num = va_arg(ap, u_widest_int);
- else if (var_type == IS_LONG)
- i_num = (widest_int) va_arg(ap, u_wide_int);
- else if (var_type == IS_SHORT)
- i_num = (widest_int) (unsigned short) va_arg(ap, unsigned
int);
- else
- i_num = (widest_int) va_arg(ap, unsigned int);
- s = conv_10(i_num, 1, &is_negative,
+ if (var_type == IS_QUAD) {
+ i_quad = va_arg(ap, u_widest_int);
+ s = conv_10_quad(i_quad, 1, &is_negative,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else {
+ if (var_type == IS_LONG)
+ i_num = (wide_int) va_arg(ap, u_wide_int);
+ else if (var_type == IS_SHORT)
+ i_num = (wide_int) (unsigned short) va_arg(ap, unsigned
int);
+ else
+ i_num = (wide_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);
break;
case 'd':
case 'i':
- if (var_type == IS_QUAD)
- i_num = va_arg(ap, widest_int);
- else if (var_type == IS_LONG)
- i_num = (widest_int) va_arg(ap, wide_int);
- else if (var_type == IS_SHORT)
- i_num = (widest_int) (short) va_arg(ap, int);
- else
- i_num = (widest_int) va_arg(ap, int);
- s = conv_10(i_num, 0, &is_negative,
+ if (var_type == IS_QUAD) {
+ i_quad = va_arg(ap, widest_int);
+ s = conv_10_quad(i_quad, 0, &is_negative,
&num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else {
+ if (var_type == IS_LONG)
+ i_num = (wide_int) va_arg(ap, wide_int);
+ else if (var_type == IS_SHORT)
+ i_num = (wide_int) (short) va_arg(ap, int);
+ else
+ i_num = (wide_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);
if (is_negative)
@@ -836,16 +849,21 @@
case 'o':
- if (var_type == IS_QUAD)
- ui_num = va_arg(ap, u_widest_int);
- else if (var_type == IS_LONG)
- ui_num = (u_widest_int) va_arg(ap, u_wide_int);
- else if (var_type == IS_SHORT)
- ui_num = (u_widest_int) (unsigned short) va_arg(ap,
unsigned int);
- else
- ui_num = (u_widest_int) va_arg(ap, unsigned int);
- s = conv_p2(ui_num, 3, *fmt,
+ if (var_type == IS_QUAD) {
+ ui_quad = va_arg(ap, u_widest_int);
+ s = conv_p2_quad(ui_quad, 3, *fmt,
&num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else {
+ if (var_type == IS_LONG)
+ ui_num = (u_wide_int) va_arg(ap, u_wide_int);
+ else if (var_type == IS_SHORT)
+ ui_num = (u_wide_int) (unsigned short) va_arg(ap,
unsigned int);
+ else
+ ui_num = (u_wide_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);
if (alternate_form && *s != '0') {
*--s = '0';
@@ -856,16 +874,21 @@
case 'x':
case 'X':
- if (var_type == IS_QUAD)
- ui_num = va_arg(ap, u_widest_int);
- else if (var_type == IS_LONG)
- ui_num = (u_widest_int) va_arg(ap, u_wide_int);
- else if (var_type == IS_SHORT)
- ui_num = (u_widest_int) (unsigned short) va_arg(ap,
unsigned int);
- else
- ui_num = (u_widest_int) va_arg(ap, unsigned int);
- s = conv_p2(ui_num, 4, *fmt,
+ if (var_type == IS_QUAD) {
+ ui_quad = va_arg(ap, u_widest_int);
+ s = conv_p2_quad(ui_quad, 4, *fmt,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else {
+ if (var_type == IS_LONG)
+ ui_num = (u_wide_int) va_arg(ap, u_wide_int);
+ else if (var_type == IS_SHORT)
+ ui_num = (u_wide_int) (unsigned short) va_arg(ap,
unsigned int);
+ else
+ ui_num = (u_wide_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);
if (alternate_form && i_num != 0) {
*--s = *fmt; /* 'x' or 'X' */
@@ -975,14 +998,22 @@
* 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".
+ * don't handle "%p". Note that depending on the
+ * sizes of the various pointers and u_wide_int
+ * and u_widest_int, gcc will warn about the
+ * assignments, but we are actually OK.
*/
case 'p':
- ui_num = (u_widest_int) va_arg(ap, void *);
-
- if (sizeof(char *) <= sizeof(u_widest_int))
- s = conv_p2(ui_num, 4, 'x',
- &num_buf[NUM_BUF_SIZE], &s_len);
+ if (sizeof(char *) <= sizeof(u_wide_int)) {
+ ui_num = (u_wide_int) va_arg(ap, void *);
+ s = conv_p2(ui_num, 4, 'x',
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else if (sizeof(char *) <= sizeof(u_widest_int)) {
+ ui_quad = (u_widest_int) va_arg(ap, void *);
+ s = conv_p2_quad(ui_quad, 4, 'x',
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
else {
s = "%p";
s_len = 2;