1
2/*
3 *  M_APM  -  m_apm_lc.h
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 *      This is the local header file needed to build the library
23 *
24 *      $Log: m_apm_lc.h,v $
25 *      Revision 1.45  2007/12/04 01:26:02  mike
26 *      add support for Digital Mars compiler
27 *
28 *      Revision 1.44  2007/12/03 01:23:54  mike
29 *      Update license
30 *
31 *      Revision 1.43  2004/05/28 19:30:16  mike
32 *      add new prototype
33 *
34 *      Revision 1.42  2003/10/25 22:36:01  mike
35 *      add support for National Instruments CVI
36 *
37 *      Revision 1.41  2003/07/21 19:42:50  mike
38 *      rename M_APM_EXIT to M_APM_FATAL
39 *      change M_APM_RETURN to 0, set M_APM_FATAL to 1
40 *
41 *      Revision 1.40  2003/07/21 19:14:29  mike
42 *      add new prototype
43 *
44 *      Revision 1.39  2003/05/04 20:09:10  mike
45 *      add support for Open Watcom 1.0
46 *
47 *      Revision 1.38  2003/05/01 21:54:04  mike
48 *      add math.h, add new prototype
49 *
50 *      Revision 1.37  2003/04/01 23:19:01  mike
51 *      add new log constants and prototypes
52 *
53 *      Revision 1.36  2003/03/30 23:02:49  mike
54 *      add new log constants and new prototypes
55 *
56 *      Revision 1.35  2002/11/03 23:21:28  mike
57 *      add new prototype, M_set_to_zero
58 *
59 *      Revision 1.34  2002/05/18 15:38:52  mike
60 *      add MINGW compiler #define
61 *
62 *      Revision 1.33  2002/02/14 19:42:59  mike
63 *      add conditional compiler stuff for Metrowerks Codewarrior compiler
64 *
65 *      Revision 1.32  2001/08/25 16:45:40  mike
66 *      add new prototype
67 *
68 *      Revision 1.31  2001/07/24 18:13:31  mike
69 *      add new prototype
70 *
71 *      Revision 1.30  2001/07/16 18:38:04  mike
72 *      add 'free_all' prototypes
73 *
74 *      Revision 1.29  2001/02/07 19:13:27  mike
75 *      eliminate MM_skip_limit_PI_check
76 *
77 *      Revision 1.28  2001/01/23 21:10:24  mike
78 *      add new prototype for M_long_2_ascii
79 *
80 *      Revision 1.27  2000/12/10 14:30:52  mike
81 *      added ifdef for LCC-WIN32 compiler
82 *
83 *      Revision 1.26  2000/12/02 19:41:45  mike
84 *      add arc functions near 0
85 *
86 *      Revision 1.25  2000/11/14 22:48:29  mike
87 *      add BORLANDC to pre-processor stuff
88 *
89 *      Revision 1.24  2000/10/22 21:17:56  mike
90 *      add _MSC_VER check for VC++ compilers
91 *
92 *      Revision 1.23  2000/10/18 23:09:27  mike
93 *      add new prototype
94 *
95 *      Revision 1.22  2000/09/23 18:55:30  mike
96 *      add new prototype fpr M_apm_sdivide
97 *
98 *      Revision 1.21  2000/08/01 22:21:55  mike
99 *      add prototype
100 *
101 *      Revision 1.20  2000/07/19 17:21:26  mike
102 *      add ifdef for older Borland compilers
103 *
104 *      Revision 1.19  2000/07/11 20:09:30  mike
105 *      add new prototype
106 *
107 *      Revision 1.18  2000/05/19 17:09:57  mike
108 *      add local copies for PI variables
109 *
110 *      Revision 1.17  2000/05/04 23:21:56  mike
111 *      change/add new global internal MAPM values
112 *
113 *      Revision 1.16  2000/04/11 18:44:43  mike
114 *      no longer need the constant 'Fifteen'
115 *
116 *      Revision 1.15  2000/04/03 17:27:08  mike
117 *      added cbrt prototype
118 *
119 *      Revision 1.14  2000/02/03 22:41:34  mike
120 *      add MAPM_* memory function defines
121 *
122 *      Revision 1.13  1999/07/09 22:46:10  mike
123 *      add skip limit integer
124 *
125 *      Revision 1.12  1999/07/08 23:35:20  mike
126 *      change constant
127 *
128 *      Revision 1.11  1999/07/08 22:55:38  mike
129 *      add new constant
130 *
131 *      Revision 1.10  1999/06/23 01:08:11  mike
132 *      added constant '15'
133 *
134 *      Revision 1.9  1999/06/20 23:38:11  mike
135 *      updated for new prototypes
136 *
137 *      Revision 1.8  1999/06/20 23:30:03  mike
138 *      added new constants
139 *
140 *      Revision 1.7  1999/06/20 19:23:12  mike
141 *      delete constants no longer needed
142 *
143 *      Revision 1.6  1999/06/20 18:50:21  mike
144 *      added more constants
145 *
146 *      Revision 1.5  1999/06/19 20:37:30  mike
147 *      add stack prototypes
148 *
149 *      Revision 1.4  1999/05/31 23:01:38  mike
150 *      delete some unneeded constants
151 *
152 *      Revision 1.3  1999/05/15 02:23:28  mike
153 *      fix define for M_COS
154 *
155 *      Revision 1.2  1999/05/15 02:16:56  mike
156 *      add check for number of decimal places
157 *
158 *      Revision 1.1  1999/05/12 20:51:22  mike
159 *      Initial revision
160 *
161 *      $Id: m_apm_lc.h,v 1.45 2007/12/04 01:26:02 mike Exp $
162 */
163
164#ifndef M__APM_LOCAL_INC
165#define M__APM_LOCAL_INC
166
167#include <stdio.h>
168#include <stdlib.h>
169#include <string.h>
170#include <math.h>
171#include "m_apm.h"
172
173/*
174 *   this supports older (and maybe newer?) Borland compilers.
175 *   these Borland compilers define __MSDOS__
176 */
177
178#ifndef MSDOS
179#ifdef __MSDOS__
180#define MSDOS
181#endif
182#endif
183
184/*
185 *   this supports some newer Borland compilers (i.e., v5.5).
186 */
187
188#ifndef MSDOS
189#ifdef __BORLANDC__
190#define MSDOS
191#endif
192#endif
193
194/*
195 *   this supports the LCC-WIN32 compiler
196 */
197
198#ifndef MSDOS
199#ifdef __LCC__
200#define MSDOS
201#endif
202#endif
203
204/*
205 *   this supports Micro$oft Visual C++ and also possibly older
206 *   straight C compilers as well.
207 */
208
209#ifndef MSDOS
210#ifdef _MSC_VER
211#define MSDOS
212#endif
213#endif
214
215/*
216 *   this supports the Metrowerks CodeWarrior 7.0 compiler (I think...)
217 */
218
219#ifndef MSDOS
220#ifdef __MWERKS__
221#define MSDOS
222#endif
223#endif
224
225/*
226 *   this supports the MINGW 32 compiler
227 */
228
229#ifndef MSDOS
230#ifdef __MINGW_H
231#define MSDOS
232#endif
233#endif
234
235/*
236 *   this supports the Open Watcom 1.0 compiler
237 */
238
239#ifndef MSDOS
240#ifdef __WATCOMC__
241#define MSDOS
242#endif
243#endif
244
245/*
246 *   this supports the Digital Mars compiler
247 */
248
249#ifndef MSDOS
250#ifdef __DMC__
251#define MSDOS
252#endif
253#endif
254
255/*
256 *   this supports National Instruments LabWindows CVI
257 */
258
259#ifndef _HAVE_NI_LABWIN_CVI_
260#ifdef _CVI_
261#define _HAVE_NI_LABWIN_CVI_
262#endif
263#endif
264
265/*
266 *  If for some reason (RAM limitations, slow floating point, whatever)
267 *  you do NOT want to use the FFT multiply algorithm, un-comment the
268 *  #define below, delete mapm_fft.c and remove mapm_fft from the build.
269 */
270
271/*  #define NO_FFT_MULTIPLY  */
272
273/*
274 *      use your own memory management functions if desired.
275 *      re-define MAPM_* below to point to your functions.
276 *      an example is shown below.
277 */
278
279/*
280extern   void   *memory_allocate(unsigned int);
281extern   void   *memory_reallocate(void *, unsigned int);
282extern   void   memory_free(void *);
283
284#define  MAPM_MALLOC memory_allocate
285#define  MAPM_REALLOC memory_reallocate
286#define  MAPM_FREE memory_free
287*/
288
289/* default: use the standard C library memory functions ... */
290
291#define  MAPM_MALLOC malloc
292#define  MAPM_REALLOC realloc
293#define  MAPM_FREE free
294
295#ifndef TRUE
296#define TRUE 1
297#endif
298
299#ifndef FALSE
300#define FALSE 0
301#endif
302
303#define	M_APM_IDENT 0x6BCC9AE5
304#define	M_APM_RETURN 0
305#define	M_APM_FATAL 1
306
307/* number of digits in the global constants, PI, E, etc */
308
309#define	VALID_DECIMAL_PLACES 128
310
311extern  int     MM_lc_PI_digits;
312extern  int     MM_lc_log_digits;
313
314/*
315 *   constants not in m_apm.h
316 */
317
318extern	M_APM	MM_0_5;
319extern	M_APM	MM_0_85;
320extern	M_APM	MM_5x_125R;
321extern	M_APM	MM_5x_64R;
322extern	M_APM	MM_5x_256R;
323extern	M_APM	MM_5x_Eight;
324extern	M_APM	MM_5x_Sixteen;
325extern	M_APM	MM_5x_Twenty;
326extern	M_APM	MM_lc_PI;
327extern	M_APM	MM_lc_HALF_PI;
328extern	M_APM	MM_lc_2_PI;
329extern	M_APM	MM_lc_log2;
330extern	M_APM	MM_lc_log10;
331extern	M_APM	MM_lc_log10R;
332
333/*
334 *   prototypes for internal functions
335 */
336
337#ifndef NO_FFT_MULTIPLY
338extern	void	M_free_all_fft(void);
339#endif
340
341extern	void	M_init_trig_globals(void);
342extern	void	M_free_all_add(void);
343extern	void	M_free_all_div(void);
344extern	void	M_free_all_exp(void);
345extern	void	M_free_all_pow(void);
346extern	void	M_free_all_rnd(void);
347extern	void	M_free_all_set(void);
348extern	void	M_free_all_cnst(void);
349extern	void	M_free_all_fmul(void);
350extern	void	M_free_all_stck(void);
351extern	void	M_free_all_util(void);
352
353extern	int 	M_exp_compute_nn(int *, M_APM, M_APM);
354extern	void	M_raw_exp(M_APM, int, M_APM);
355extern	void	M_raw_sin(M_APM, int, M_APM);
356extern	void	M_raw_cos(M_APM, int, M_APM);
357extern	void	M_5x_sin(M_APM, int, M_APM);
358extern	void	M_4x_cos(M_APM, int, M_APM);
359extern	void	M_5x_do_it(M_APM, int, M_APM);
360extern	void	M_4x_do_it(M_APM, int, M_APM);
361
362extern	M_APM	M_get_stack_var(void);
363extern	void	M_restore_stack(int);
364extern	int 	M_get_sizeof_int(void);
365
366extern	void	M_apm_sdivide(M_APM, int, M_APM, M_APM);
367extern	void	M_cos_to_sin(M_APM, int, M_APM);
368extern	void	M_limit_angle_to_pi(M_APM, int, M_APM);
369extern	void	M_log_near_1(M_APM, int, M_APM);
370extern	void	M_get_sqrt_guess(M_APM, M_APM);
371extern	void	M_get_cbrt_guess(M_APM, M_APM);
372extern	void	M_get_log_guess(M_APM, M_APM);
373extern	void	M_get_asin_guess(M_APM, M_APM);
374extern	void	M_get_acos_guess(M_APM, M_APM);
375extern	void	M_arcsin_near_0(M_APM, int, M_APM);
376extern	void	M_arccos_near_0(M_APM, int, M_APM);
377extern	void	M_arctan_near_0(M_APM, int, M_APM);
378extern	void	M_arctan_large_input(M_APM, int, M_APM);
379extern	void	M_log_basic_iteration(M_APM, int, M_APM);
380extern  void    M_log_solve_cubic(M_APM, int, M_APM);
381extern	void	M_check_log_places(int);
382extern	void	M_log_AGM_R_func(M_APM, int, M_APM, M_APM);
383extern	void	M_init_util_data(void);
384extern	void	M_get_div_rem_addr(UCHAR **, UCHAR **);
385extern	void	M_get_div_rem(int,UCHAR *, UCHAR *);
386extern	void	M_get_div_rem_10(int, UCHAR *, UCHAR *);
387extern	void	M_apm_normalize(M_APM);
388extern	void	M_apm_scale(M_APM, int);
389extern	void	M_apm_pad(M_APM, int);
390extern  void    M_long_2_ascii(char *, long);
391extern	void	M_check_PI_places(int);
392extern  void    M_calculate_PI_AGM(M_APM, int);
393extern  void    M_set_to_zero(M_APM);
394extern	int	M_strposition(char *, char *);
395extern	char	*M_lowercase(char *);
396extern  void    M_apm_log_error_msg(int, char *);
397extern  void	M_apm_round_fixpt(M_APM, int, M_APM);
398
399#endif
400
401