52 RCSID(
"$Id: 4f79a32d64a0ac1388012f7f060347b6d79acddf $")
56 #ifndef HAVE_VSNPRINTF
73 for (i = 1, P = 1., n = -n ; i <= n ; i++) {P *= .1;}
75 for (i = 1, P = 1. ; i <= n ; i++) {P *= 10.0;}
102 while (result >= r) {result *= .1; i++;}
105 while (result <= r) {result *= 10.; i++;}
126 double real_integral = 0.;
145 for (j =
log_10(real); j >= 0; j--) {
147 s = (real - real_integral)/p;
149 while (i + 1. <= s) {i++;}
150 real_integral += i*p;
153 return (real - real_integral);
156 #define PRECISION 1.e-6
165 numtoa(
double number,
int base,
int precision,
char ** fract)
178 static char integral_part[
MAX_INT];
185 integral_part[0] =
'0';
186 integral_part[1] =
'\0';
187 fraction_part[0] =
'0';
188 fraction_part[1] =
'\0';
189 return integral_part;
193 if ((sign = number) < 0.) {
202 integral_part[0] =
'0';
205 for ( i = 0; i < digits && number != 0.; ++i) {
209 integral_part[i] = (ch <= 9) ? ch +
'0' : ch +
'a' - 10;
210 if (! isxdigit(integral_part[i]))
218 for (i = 0; i < digits; ++i)
219 integral_part[i] =
'9';
223 integral_part[i++] =
'-';
225 integral_part[i] =
'\0';
228 for ( i--, j = 0; j < i; j++, i--)
229 SWAP_INT(integral_part[i], integral_part[j]);
232 for (i=0, fp=fraction; precision > 0 && i <
MAX_FRACT ; i++, precision-- ) {
233 fraction_part[i] = (int)((fp +
PRECISION)*10. +
'0');
234 if (! isdigit(fraction_part[i]))
236 fp = (fp*10.0) - (double)(
long)((fp +
PRECISION)*10.);
238 fraction_part[i] =
'\0';
240 if (fract != (
char **)0)
241 *fract = fraction_part;
243 return integral_part;
262 p->width -= strlen(tmp);
286 p->width -= strlen(tmp);
288 if (p->square ==
FOUND)
310 p->width -= strlen(tmp);
312 if (p->square ==
FOUND) {
316 PUT_CHAR((*p->pf ==
'X' ? toupper(*tmp) : *tmp), p);
336 i = (i < p->precision ? i : p->precision);
361 tmp =
dtoa(d, p->precision, &tmp2);
363 p->width = p->width -
364 ((d > 0. && p->justify ==
RIGHT) ? 1:0) -
365 ((p->space ==
FOUND) ? 1:0) -
366 strlen(tmp) - p->precision - 1;
374 if (p->precision != 0 || p->square ==
FOUND)
376 if (*p->pf ==
'g' || *p->pf ==
'G')
377 for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] ==
'0'; i--)
379 for (; *tmp2; tmp2++)
402 tmp =
dtoa(d, p->precision, &tmp2);
406 p->width = p->width -
407 ((d > 0. && p->justify ==
RIGHT) ? 1:0) -
408 ((p->space ==
FOUND) ? 1:0) - p->precision - 7;
416 if (p->precision != 0 || p->square ==
FOUND)
418 if (*p->pf ==
'g' || *p->pf ==
'G')
419 for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] ==
'0'; i--)
421 for (; *tmp2; tmp2++)
424 if (*p->pf ==
'g' || *p->pf ==
'e') {
434 tmp =
itoa((
double)j);
481 case '0': p->
pad =
'0';
break;
482 case '1':
case '2':
case '3':
483 case '4':
case '5':
case '6':
484 case '7':
case '8':
case '9':
485 for (i = 0; isdigit(*s); i++, s++)
490 p->
width = atoi(number);
501 vsnprintf(
char *
string,
size_t length,
char const * format, va_list args)
528 if ( *data.
pf ==
'%' ) {
530 for (state = 1; *data.
pf &&
state;) {
531 switch (*(++data.
pf)) {
541 d = va_arg(args,
double);
552 d = va_arg(args,
double);
571 d = va_arg(args,
double);
580 d = va_arg(args,
unsigned long);
582 d = va_arg(args,
unsigned int);
589 d = va_arg(args, LONG_LONG);
591 d = va_arg(args,
long);
593 d = va_arg(args,
int);
600 d = va_arg(args, LONG_LONG);
602 d = va_arg(args,
long);
604 d = va_arg(args,
int);
612 d = va_arg(args, LONG_LONG);
614 d = va_arg(args,
long);
616 d = va_arg(args,
int);
621 d = va_arg(args,
int);
627 strings(&data, va_arg(args,
char *));
631 *(va_arg(args,
int *)) = data.
counter;
650 case '#':
case ' ':
case '+':
case '*':
651 case '-':
case '.':
case '0':
case '1':
652 case '2':
case '3':
case '4':
case '5':
653 case '6':
case '7':
case '8':
case '9':
657 conv_field[i] = *data.
pf;
658 conv_field[i] =
'\0';
680 #ifndef HAVE_SNPRINTF
684 snprintf(
char *
string,
size_t length,
char const * format, ...)
697 va_start(args, format);
702 rval =
vsnprintf (
string, length, format, args);
730 printf(
"/%%d/, 336\n");
731 snprintf(holder,
sizeof holder,
"/%d/\n", 336);
732 printf(
"/%d/\n", 336);
733 printf(
"%s\n", holder);
735 printf(
"/%%2d/, 336\n");
736 snprintf(holder,
sizeof holder,
"/%2d/\n", 336);
737 printf(
"/%2d/\n", 336);
738 printf(
"%s\n", holder);
740 printf(
"/%%10d/, 336\n");
741 snprintf(holder,
sizeof holder,
"/%10d/\n", 336);
742 printf(
"/%10d/\n", 336);
743 printf(
"%s\n", holder);
745 printf(
"/%%-10d/, 336\n");
746 snprintf(holder,
sizeof holder,
"/%-10d/\n", 336);
747 printf(
"/%-10d/\n", 336);
748 printf(
"%s\n", holder);
752 printf(
"/%%lld/, 336\n");
755 printf(
"%s\n", holder);
757 printf(
"/%%2qd/, 336\n");
760 printf(
"%s\n", holder);
764 printf(
"/%%f/, 1234.56\n");
765 snprintf(holder,
sizeof holder,
"/%f/\n", 1234.56);
766 printf(
"/%f/\n", 1234.56);
767 printf(
"%s\n", holder);
769 printf(
"/%%e/, 1234.56\n");
770 snprintf(holder,
sizeof holder,
"/%e/\n", 1234.56);
771 printf(
"/%e/\n", 1234.56);
772 printf(
"%s\n", holder);
774 printf(
"/%%4.2f/, 1234.56\n");
775 snprintf(holder,
sizeof holder,
"/%4.2f/\n", 1234.56);
776 printf(
"/%4.2f/\n", 1234.56);
777 printf(
"%s\n", holder);
779 printf(
"/%%3.1f/, 1234.56\n");
780 snprintf(holder,
sizeof holder,
"/%3.1f/\n", 1234.56);
781 printf(
"/%3.1f/\n", 1234.56);
782 printf(
"%s\n", holder);
784 printf(
"/%%10.3f/, 1234.56\n");
785 snprintf(holder,
sizeof holder,
"/%10.3f/\n", 1234.56);
786 printf(
"/%10.3f/\n", 1234.56);
787 printf(
"%s\n", holder);
789 printf(
"/%%10.3e/, 1234.56\n");
790 snprintf(holder,
sizeof holder,
"/%10.3e/\n", 1234.56);
791 printf(
"/%10.3e/\n", 1234.56);
792 printf(
"%s\n", holder);
794 printf(
"/%%+4.2f/, 1234.56\n");
795 snprintf(holder,
sizeof holder,
"/%+4.2f/\n", 1234.56);
796 printf(
"/%+4.2f/\n", 1234.56);
797 printf(
"%s\n", holder);
799 printf(
"/%%010.2f/, 1234.56\n");
800 snprintf(holder,
sizeof holder,
"/%010.2f/\n", 1234.56);
801 printf(
"/%010.2f/\n", 1234.56);
802 printf(
"%s\n", holder);
804 #define BLURB "Outstanding acting !"
807 printf(
"/%%2s/, \"%s\"\n", BLURB);
808 snprintf(holder,
sizeof holder,
"/%2s/\n", BLURB);
809 printf(
"/%2s/\n", BLURB);
810 printf(
"%s\n", holder);
812 printf(
"/%%22s/ %s\n", BLURB);
813 snprintf(holder,
sizeof holder,
"/%22s/\n", BLURB);
814 printf(
"/%22s/\n", BLURB);
815 printf(
"%s\n", holder);
817 printf(
"/%%22.5s/ %s\n", BLURB);
818 snprintf(holder,
sizeof holder,
"/%22.5s/\n", BLURB);
819 printf(
"/%22.5s/\n", BLURB);
820 printf(
"%s\n", holder);
822 printf(
"/%%-22.5s/ %s\n", BLURB);
823 snprintf(holder,
sizeof holder,
"/%-22.5s/\n", BLURB);
824 printf(
"/%-22.5s/\n", BLURB);
825 printf(
"%s\n", holder);
829 printf(
"%%x %%X %%#x, 31, 31, 31\n");
830 snprintf(holder,
sizeof holder,
"%x %X %#x\n", 31, 31, 31);
831 printf(
"%x %X %#x\n", 31, 31, 31);
832 printf(
"%s\n", holder);
834 printf(
"**%%d**%% d**%% d**, 42, 42, -42\n");
835 snprintf(holder,
sizeof holder,
"**%d**% d**% d**\n", 42, 42, -42);
836 printf(
"**%d**% d**% d**\n", 42, 42, -42);
837 printf(
"%s\n", holder);
841 printf(
"/%%g/, 31.4\n");
842 snprintf(holder,
sizeof holder,
"/%g/\n", 31.4);
843 printf(
"/%g/\n", 31.4);
844 printf(
"%s\n", holder);
846 printf(
"/%%.6g/, 31.4\n");
847 snprintf(holder,
sizeof holder,
"/%.6g/\n", 31.4);
848 printf(
"/%.6g/\n", 31.4);
849 printf(
"%s\n", holder);
851 printf(
"/%%.1G/, 31.4\n");
852 snprintf(holder,
sizeof holder,
"/%.1G/\n", 31.4);
853 printf(
"/%.1G/\n", 31.4);
854 printf(
"%s\n", holder);
857 printf(
"abc%n", &i); printf(
"%d\n", i);
858 snprintf(holder,
sizeof holder,
"abc%n", &i);
859 printf(
"%s", holder); printf(
"%d\n\n", i);
861 printf(
"%%*.*s --> 10.10\n");
862 snprintf(holder,
sizeof holder,
"%*.*s\n", 10, 10, BLURB);
863 printf(
"%*.*s\n", 10, 10, BLURB);
864 printf(
"%s\n", holder);
866 printf(
"%%%%%%%%\n");
867 snprintf(holder,
sizeof holder,
"%%%%\n");
869 printf(
"%s\n", holder);
871 #define BIG "Hello this is a too big string for the buffer"
873 printf(
"<%%>, %s\n", BIG);
874 i =
snprintf(holder, 10,
"%s\n", BIG);
875 printf(
"<%s>\n", BIG);
876 printf(
"<%s>\n", holder);
PUBLIC int vsnprintf(char *string, size_t length, char *format, va_list args)
PRIVATE void strings(struct DATA *p, char *tmp)
PRIVATE void exponent(struct DATA *p, double d)
PUBLIC int snprintf(char *string, size_t length, char *format, va_alist)
PRIVATE char * numtoa(double number, int base, int precision, char **fract)
PRIVATE void octal(struct DATA *p, double d)
PRIVATE void conv_flag(char *s, struct DATA *p)
PRIVATE void hexa(struct DATA *p, double d)
PRIVATE int log_10(double r)
PRIVATE void decimal(struct DATA *p, double d)
PRIVATE double integral(double real, double *ip)
int main(int argc, char *argv[])
PRIVATE double pow_10(int n)
PRIVATE void floating(struct DATA *p, double d)