"Fossies" - the Fresh Open Source Software Archive 
Member "mapm_4.9.5a/mapmistr.c" (21 Feb 2010, 3275 Bytes) of package /linux/misc/old/mapm-4.9.5a.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "mapmistr.c" see the
Fossies "Dox" file reference documentation.
1
2 /*
3 * M_APM - mapmistr.c
4 *
5 * Copyright (C) 1999 - 2007 Michael C. Ring
6 *
7 * Permission to use, copy, and distribute this software and its
8 * documentation for any purpose with or without fee is hereby granted,
9 * provided that the above copyright notice appear in all copies and
10 * that both that copyright notice and this permission notice appear
11 * in supporting documentation.
12 *
13 * Permission to modify the software is granted. Permission to distribute
14 * the modified code is granted. Modifications are to be distributed by
15 * using the file 'license.txt' as a template to modify the file header.
16 * 'license.txt' is available in the official MAPM distribution.
17 *
18 * This software is provided "as is" without express or implied warranty.
19 */
20
21 /*
22 * $Id: mapmistr.c,v 1.9 2007/12/03 01:55:27 mike Exp $
23 *
24 * This file contains M_APM -> integer string function
25 *
26 * $Log: mapmistr.c,v $
27 * Revision 1.9 2007/12/03 01:55:27 mike
28 * Update license
29 *
30 * Revision 1.8 2003/07/21 20:37:09 mike
31 * Modify error messages to be in a consistent format.
32 *
33 * Revision 1.7 2003/03/31 21:52:07 mike
34 * call generic error handling function
35 *
36 * Revision 1.6 2002/11/03 22:28:02 mike
37 * Updated function parameters to use the modern style
38 *
39 * Revision 1.5 2001/08/06 16:58:20 mike
40 * improve the new function
41 *
42 * Revision 1.4 2001/08/05 23:18:48 mike
43 * fix function when input is not an integer but the
44 * number is close to rounding upwards (NNN.9999999999....)
45 *
46 * Revision 1.3 2000/02/03 22:48:38 mike
47 * use MAPM_* generic memory function
48 *
49 * Revision 1.2 1999/07/18 01:33:04 mike
50 * minor tweak to code alignment
51 *
52 * Revision 1.1 1999/07/12 02:06:08 mike
53 * Initial revision
54 */
55
56 #include "m_apm_lc.h"
57
58 /****************************************************************************/
59 void m_apm_to_integer_string(char *s, M_APM mtmp)
60 {
61 void *vp;
62 UCHAR *ucp, numdiv, numrem;
63 char *cp, *p, sbuf[128];
64 int ct, dl, numb, ii;
65
66 vp = NULL;
67 ct = mtmp->m_apm_exponent;
68 dl = mtmp->m_apm_datalength;
69
70 /*
71 * if |input| < 1, result is "0"
72 */
73
74 if (ct <= 0 || mtmp->m_apm_sign == 0)
75 {
76 s[0] = '0';
77 s[1] = '\0';
78 return;
79 }
80
81 if (ct > 112)
82 {
83 if ((vp = (void *)MAPM_MALLOC((ct + 32) * sizeof(char))) == NULL)
84 {
85 /* fatal, this does not return */
86
87 M_apm_log_error_msg(M_APM_FATAL,
88 "\'m_apm_to_integer_string\', Out of memory");
89 }
90
91 cp = (char *)vp;
92 }
93 else
94 {
95 cp = sbuf;
96 }
97
98 p = cp;
99 ii = 0;
100
101 /* handle a negative number */
102
103 if (mtmp->m_apm_sign == -1)
104 {
105 ii = 1;
106 *p++ = '-';
107 }
108
109 /* get num-bytes of data (#digits / 2) to use in the string */
110
111 if (ct > dl)
112 numb = (dl + 1) >> 1;
113 else
114 numb = (ct + 1) >> 1;
115
116 ucp = mtmp->m_apm_data;
117
118 while (TRUE)
119 {
120 M_get_div_rem_10((int)(*ucp++), &numdiv, &numrem);
121
122 *p++ = numdiv + '0';
123 *p++ = numrem + '0';
124
125 if (--numb == 0)
126 break;
127 }
128
129 /* pad with trailing zeros if the exponent > datalength */
130
131 if (ct > dl)
132 memset(p, '0', (ct + 1 - dl));
133
134 cp[ct + ii] = '\0';
135 strcpy(s, cp);
136
137 if (vp != NULL)
138 MAPM_FREE(vp);
139 }
140 /****************************************************************************/