~ubuntu-branches/ubuntu/gutsy/bc/gutsy

« back to all changes in this revision

Viewing changes to h/number.h

  • Committer: Bazaar Package Importer
  • Author(s): Dirk Eddelbuettel
  • Date: 2002-04-13 11:33:49 UTC
  • Revision ID: james.westby@ubuntu.com-20020413113349-hl2r1t730b91ov68
Tags: upstream-1.06
ImportĀ upstreamĀ versionĀ 1.06

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* number.h: Arbitrary precision numbers header file. */
 
2
/*
 
3
    Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc.
 
4
 
 
5
    This program is free software; you can redistribute it and/or modify
 
6
    it under the terms of the GNU General Public License as published by
 
7
    the Free Software Foundation; either version 2 of the License , or
 
8
    (at your option) any later version.
 
9
 
 
10
    This program is distributed in the hope that it will be useful,
 
11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
    GNU General Public License for more details.
 
14
 
 
15
    You should have received a copy of the GNU General Public License
 
16
    along with this program; see the file COPYING.  If not, write to:
 
17
 
 
18
      The Free Software Foundation, Inc.
 
19
      59 Temple Place, Suite 330
 
20
      Boston, MA 02111-1307 USA.
 
21
 
 
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
#ifndef _NUMBER_H_
 
33
#define _NUMBER_H_
 
34
 
 
35
typedef enum {PLUS, MINUS} sign;
 
36
 
 
37
typedef struct bc_struct *bc_num;
 
38
 
 
39
typedef struct bc_struct
 
40
    {
 
41
      sign  n_sign;
 
42
      int   n_len;      /* The number of digits before the decimal point. */
 
43
      int   n_scale;    /* The number of digits after the decimal point. */
 
44
      int   n_refs;     /* The number of pointers to this number. */
 
45
      bc_num n_next;    /* Linked list for available list. */
 
46
      char *n_ptr;      /* The pointer to the actual storage.
 
47
                           If NULL, n_value points to the inside of
 
48
                           another number (bc_multiply...) and should
 
49
                           not be "freed." */
 
50
      char *n_value;    /* The number. Not zero char terminated.
 
51
                           May not point to the same place as n_ptr as
 
52
                           in the case of leading zeros generated. */
 
53
    } bc_struct;
 
54
 
 
55
 
 
56
/* The base used in storing the numbers in n_value above.
 
57
   Currently this MUST be 10. */
 
58
 
 
59
#define BASE 10
 
60
 
 
61
/*  Some useful macros and constants. */
 
62
 
 
63
#define CH_VAL(c)     (c - '0')
 
64
#define BCD_CHAR(d)   (d + '0')
 
65
 
 
66
#ifdef MIN
 
67
#undef MIN
 
68
#undef MAX
 
69
#endif
 
70
#define MAX(a,b)      ((a)>(b)?(a):(b))
 
71
#define MIN(a,b)      ((a)>(b)?(b):(a))
 
72
#define ODD(a)        ((a)&1)
 
73
 
 
74
#ifndef TRUE
 
75
#define TRUE 1
 
76
#define FALSE 0
 
77
#endif
 
78
 
 
79
#ifndef LONG_MAX
 
80
#define LONG_MAX 0x7ffffff
 
81
#endif
 
82
 
 
83
 
 
84
/* Global numbers. */
 
85
extern bc_num _zero_;
 
86
extern bc_num _one_;
 
87
extern bc_num _two_;
 
88
 
 
89
 
 
90
/* Function Prototypes */
 
91
 
 
92
/* Define the _PROTOTYPE macro if it is needed. */
 
93
 
 
94
#ifndef _PROTOTYPE
 
95
#ifdef __STDC__
 
96
#define _PROTOTYPE(func, args) func args
 
97
#else
 
98
#define _PROTOTYPE(func, args) func()
 
99
#endif
 
100
#endif
 
101
 
 
102
_PROTOTYPE(void bc_init_numbers, (void));
 
103
 
 
104
_PROTOTYPE(bc_num bc_new_num, (int length, int scale));
 
105
 
 
106
_PROTOTYPE(void bc_free_num, (bc_num *num));
 
107
 
 
108
_PROTOTYPE(bc_num bc_copy_num, (bc_num num));
 
109
 
 
110
_PROTOTYPE(void bc_init_num, (bc_num *num));
 
111
 
 
112
_PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale));
 
113
 
 
114
_PROTOTYPE(char *bc_num2str, (bc_num num));
 
115
 
 
116
_PROTOTYPE(void bc_int2num, (bc_num *num, int val));
 
117
 
 
118
_PROTOTYPE(long bc_num2long, (bc_num num));
 
119
 
 
120
_PROTOTYPE(int bc_compare, (bc_num n1, bc_num n2));
 
121
 
 
122
_PROTOTYPE(char bc_is_zero, (bc_num num));
 
123
 
 
124
_PROTOTYPE(char bc_is_near_zero, (bc_num num, int scale));
 
125
 
 
126
_PROTOTYPE(char bc_is_neg, (bc_num num));
 
127
 
 
128
_PROTOTYPE(void bc_add, (bc_num n1, bc_num n2, bc_num *result, int scale_min));
 
129
 
 
130
_PROTOTYPE(void bc_sub, (bc_num n1, bc_num n2, bc_num *result, int scale_min));
 
131
 
 
132
_PROTOTYPE(void bc_multiply, (bc_num n1, bc_num n2, bc_num *prod, int scale));
 
133
 
 
134
_PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale));
 
135
 
 
136
_PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result,
 
137
                           int scale));
 
138
 
 
139
_PROTOTYPE(int bc_divmod, (bc_num num1, bc_num num2, bc_num *quot,
 
140
                           bc_num *rem, int scale));
 
141
 
 
142
_PROTOTYPE(int bc_raisemod, (bc_num base, bc_num expo, bc_num mod,
 
143
                             bc_num *result, int scale));
 
144
 
 
145
_PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result,
 
146
                           int scale));
 
147
 
 
148
_PROTOTYPE(int bc_sqrt, (bc_num *num, int scale));
 
149
 
 
150
_PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int),
 
151
                             int leading_zero));
 
152
 
 
153
#endif