1 : /* num2str.c: bcmath library file. */
2 : /*
3 : Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
4 : Copyright (C) 2000 Philip A. Nelson
5 :
6 : This library is free software; you can redistribute it and/or
7 : modify it under the terms of the GNU Lesser General Public
8 : License as published by the Free Software Foundation; either
9 : version 2 of the License, or (at your option) any later version.
10 :
11 : This library is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : Lesser General Public License for more details. (COPYING.LIB)
15 :
16 : You should have received a copy of the GNU Lesser General Public
17 : License along with this library; if not, write to:
18 :
19 : The Free Software Foundation, Inc.
20 : 59 Temple Place, Suite 330
21 : Boston, MA 02111-1307 USA.
22 :
23 : You may contact the author by:
24 : e-mail: philnelson@acm.org
25 : us-mail: Philip A. Nelson
26 : Computer Science Department, 9062
27 : Western Washington University
28 : Bellingham, WA 98226-9062
29 :
30 : *************************************************************************/
31 :
32 : #include <config.h>
33 : #include <stdio.h>
34 : #include <assert.h>
35 : #include <stdlib.h>
36 : #include <ctype.h>
37 : #include <stdarg.h>
38 : #include "bcmath.h"
39 : #include "private.h"
40 :
41 : /* Convert a numbers to a string. Base 10 only.*/
42 :
43 : char
44 : *bc_num2str (num)
45 : bc_num num;
46 26 : {
47 : char *str, *sptr;
48 : char *nptr;
49 : int index, signch;
50 :
51 : /* Allocate the string memory. */
52 26 : signch = ( num->n_sign == PLUS ? 0 : 1 ); /* Number of sign chars. */
53 26 : if (num->n_scale > 0)
54 11 : str = (char *) safe_emalloc (1, num->n_len + num->n_scale, 2 + signch);
55 : else
56 15 : str = (char *) safe_emalloc (1, num->n_len, 1 + signch);
57 26 : if (str == NULL) bc_out_of_memory();
58 :
59 : /* The negative sign if needed. */
60 26 : sptr = str;
61 26 : if (signch) *sptr++ = '-';
62 :
63 : /* Load the whole number. */
64 26 : nptr = num->n_value;
65 192 : for (index=num->n_len; index>0; index--)
66 166 : *sptr++ = BCD_CHAR(*nptr++);
67 :
68 : /* Now the fraction. */
69 26 : if (num->n_scale > 0)
70 : {
71 11 : *sptr++ = '.';
72 50 : for (index=0; index<num->n_scale; index++)
73 39 : *sptr++ = BCD_CHAR(*nptr++);
74 : }
75 :
76 : /* Terminate the string and return it! */
77 26 : *sptr = '\0';
78 26 : return (str);
79 : }
|