annotate gsm-fw/sprintf/integer.c @ 485:890ffca53a09

gsm-fw/gpf/conf: started
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 29 Jun 2014 19:49:29 +0000
parents 7e45ada9c365
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
1 /*
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
2 * Embedded [v]sprintf() implementation by Michael Spacefalcon,
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
3 * loosely based on the 4.3BSD-Tahoe version.
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
4 *
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
5 * This module contains the integer conversion functions.
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
6 */
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
7
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
8 #include <sys/types.h>
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
9 #include <ctype.h>
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
10 #include "defs.h"
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
11
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
12 extern u_char * _sprintf_field(u_char *op, int width, int flags, int sign,
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
13 u_char *body, int size, int dprec, int fpprec);
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
14
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
15 static const char lcdigits[] = "0123456789abcdef";
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
16 static const char ucdigits[] = "0123456789ABCDEF";
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
17
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
18 u_char *
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
19 _sprintf_integer(u_char *op, int width, int flags, int sign,
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
20 unsigned number, int base, int prec)
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
21 {
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
22 const char *digits;
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
23 char buf[12];
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
24 char *t, *endp;
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
25
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
26 /*
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
27 * ``... diouXx conversions ... if a precision is
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
28 * specified, the 0 flag will be ignored.''
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
29 * -- ANSI X3J11
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
30 */
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
31 if (prec >= 0)
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
32 flags &= ~ZEROPAD;
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
33
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
34 if (flags & UPPERCASE)
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
35 digits = ucdigits;
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
36 else
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
37 digits = lcdigits;
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
38
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
39 /*
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
40 * ``The result of converting a zero value with an
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
41 * explicit precision of zero is no characters.''
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
42 * -- ANSI X3J11
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
43 */
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
44 t = endp = buf + sizeof(buf);
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
45 if (number != 0 || prec != 0) {
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
46 do {
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
47 *--t = digits[number % base];
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
48 number /= base;
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
49 } while (number);
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
50 if (flags & ALT && base == 8 && *t != '0')
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
51 *--t = '0'; /* octal leading 0 */
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
52 }
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
53 return _sprintf_field(op, width, flags, sign, t, endp - t, prec, 0);
7e45ada9c365 gsm-fw: sprintf overhaul in preparation for adding %f format support
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
54 }