Annotation of OpenXM_contrib/gmp/printf/doprnti.c, Revision 1.1.1.1
1.1 ohara 1: /* __gmp_doprnt_integer -- integer style formatted output.
2:
3: THE FUNCTIONS IN THIS FILE ARE FOR INTERNAL USE ONLY. THEY'RE ALMOST
4: CERTAIN TO BE SUBJECT TO INCOMPATIBLE CHANGES OR DISAPPEAR COMPLETELY IN
5: FUTURE GNU MP RELEASES.
6:
7: Copyright 2001 Free Software Foundation, Inc.
8:
9: This file is part of the GNU MP Library.
10:
11: The GNU MP Library is free software; you can redistribute it and/or modify
12: it under the terms of the GNU Lesser General Public License as published by
13: the Free Software Foundation; either version 2.1 of the License, or (at your
14: option) any later version.
15:
16: The GNU MP Library is distributed in the hope that it will be useful, but
17: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
19: License for more details.
20:
21: You should have received a copy of the GNU Lesser General Public License
22: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
23: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
24: MA 02111-1307, USA. */
25:
26: #include "config.h"
27:
28: #if HAVE_STDARG
29: #include <stdarg.h> /* for va_list and hence doprnt_funs_t */
30: #else
31: #include <varargs.h>
32: #endif
33:
34: #include <string.h>
35: #include <stdio.h>
36: #include <stdlib.h>
37:
38: #include "gmp.h"
39: #include "gmp-impl.h"
40:
41:
42: int
43: __gmp_doprnt_integer (const struct doprnt_funs_t *funs,
44: void *data,
45: const struct doprnt_params_t *p,
46: const char *s)
47: {
48: int retval = 0;
49: int slen, justlen, showbaselen, sign, signlen, slashlen, zeros;
50: int justify, den_showbaselen;
51: const char *slash, *showbase;
52:
53: /* '+' or ' ' if wanted, and don't already have '-' */
54: sign = p->sign;
55: if (s[0] == '-')
56: {
57: sign = s[0];
58: s++;
59: }
60: signlen = (sign != '\0');
61:
62: /* if the precision was explicitly 0, print nothing for a 0 value */
63: if (*s == '0' && p->prec == 0)
64: s++;
65:
66: slen = strlen (s);
67: slash = strchr (s, '/');
68:
69: showbase = NULL;
70: showbaselen = 0;
71:
72: if (p->showbase != DOPRNT_SHOWBASE_NO)
73: {
74: switch (p->base) {
75: case 16: showbase = "0x"; showbaselen = 2; break;
76: case -16: showbase = "0X"; showbaselen = 2; break;
77: case 8: showbase = "0"; showbaselen = 1; break;
78: }
79: }
80:
81: den_showbaselen = showbaselen;
82: if (slash == NULL
83: || (p->showbase == DOPRNT_SHOWBASE_NONZERO && slash[1] == '0'))
84: den_showbaselen = 0;
85:
86: if (p->showbase == DOPRNT_SHOWBASE_NONZERO && s[0] == '0')
87: showbaselen = 0;
88:
89: /* the influence of p->prec on mpq is currently undefined */
90: zeros = MAX (0, p->prec - slen);
91:
92: /* space left over after actual output length */
93: justlen = p->width
94: - (strlen(s) + signlen + showbaselen + den_showbaselen + zeros);
95:
96: justify = p->justify;
97: if (justlen <= 0) /* no justifying if exceed width */
98: justify = DOPRNT_JUSTIFY_NONE;
99:
100: if (justify == DOPRNT_JUSTIFY_RIGHT) /* pad right */
101: DOPRNT_REPS (p->fill, justlen);
102:
103: DOPRNT_REPS_MAYBE (sign, signlen); /* sign */
104:
105: DOPRNT_MEMORY_MAYBE (showbase, showbaselen); /* base */
106:
107: DOPRNT_REPS_MAYBE ('0', zeros); /* zeros */
108:
109: if (justify == DOPRNT_JUSTIFY_INTERNAL) /* pad internal */
110: DOPRNT_REPS (p->fill, justlen);
111:
112: /* if there's a showbase on the denominator, then print the numerator
113: separately so it can be inserted */
114: if (den_showbaselen != 0)
115: {
116: ASSERT (slash != NULL);
117: slashlen = slash+1 - s;
118: DOPRNT_MEMORY (s, slashlen); /* numerator and slash */
119: slen -= slashlen;
120: s += slashlen;
121: DOPRNT_MEMORY (showbase, den_showbaselen);
122: }
123:
124: DOPRNT_MEMORY (s, slen); /* number, or denominator */
125:
126: if (justify == DOPRNT_JUSTIFY_LEFT) /* pad left */
127: DOPRNT_REPS (p->fill, justlen);
128:
129: done:
130: return retval;
131:
132: error:
133: retval = -1;
134: goto done;
135: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>