annotate src/number-gmp.c @ 4901:7504864a986c

Don't use Boyer-Moore if repeated octets & case-insensitive search. 2010-01-30 Aidan Kehoe <kehoea@parhasard.net> * search.c (search_buffer): Don't use Boyer-Moore for case-insensitive search if the search pattern contains repeated Ibytes and the corresponding character has case information (or, equivalently, if one of its case equivalents would contain repeated Ibytes).
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 30 Jan 2010 22:25:39 +0000
parents 2fc0e2f18322
children 16112448d484
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
1 /* Numeric types for XEmacs using the GNU MP library.
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
2 Copyright (C) 2004 Jerry James.
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
3
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
4 This file is part of XEmacs.
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
5
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
6 XEmacs is free software; you can redistribute it and/or modify it
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
7 under the terms of the GNU General Public License as published by the
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
9 later version.
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
10
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
14 for more details.
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
15
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to
4802
2fc0e2f18322 Don't create any bignums before pdumping. Add bignum, ratio, and bigfloat
Jerry James <james@xemacs.org>
parents: 4612
diff changeset
18 the Free Software Foundation, Inc., 51 Franklin St - Fifth Floor,
2fc0e2f18322 Don't create any bignums before pdumping. Add bignum, ratio, and bigfloat
Jerry James <james@xemacs.org>
parents: 4612
diff changeset
19 Boston, MA 02111-1301, USA. */
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
20
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
21 /* Synched up with: Not in FSF. */
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
22
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
23 #include <config.h>
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
24 #include <limits.h>
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
25 #include <math.h>
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
26 #include "lisp.h"
1995
4e6a63799f08 [xemacs-hg @ 2004-04-07 03:48:58 by james]
james
parents: 1983
diff changeset
27 #include "sysproc.h" /* For qxe_getpid */
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
28
4612
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
29 static mp_exp_t float_print_min, float_print_max;
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
30 gmp_randstate_t random_state;
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
31
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
32 CIbyte *
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
33 bigfloat_to_string(mpf_t f, int base)
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
34 {
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
35 mp_exp_t expt;
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
36 CIbyte *str = mpf_get_str (NULL, &expt, base, 0, f);
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
37 const int sign = mpf_sgn (f);
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
38 const int neg = (sign < 0) ? 1 : 0;
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
39 int len = strlen (str) + 1; /* Count the null terminator */
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
40
4612
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
41 if (sign == 0)
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
42 {
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
43 XREALLOC_ARRAY (str, CIbyte, 4);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
44 strncpy (str, "0.0", 4);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
45 }
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
46 else if (float_print_min <= expt && expt <= float_print_max)
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
47 {
4612
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
48 if (expt < 0)
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
49 {
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
50 /* We need room for a radix point and leading zeroes */
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
51 const int space = -expt + 2;
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
52 XREALLOC_ARRAY (str, CIbyte, len + space);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
53 memmove (&str[space + neg], &str[neg], len - neg);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
54 memset (&str[neg], '0', space);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
55 str[neg + 1] = '.';
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
56 }
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
57 else if (len <= expt + neg + 1)
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
58 {
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
59 /* We need room for a radix point and trailing zeroes */
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
60 XREALLOC_ARRAY (str, CIbyte, expt + neg + 3);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
61 memset (&str[len - 1], '0', expt + neg + 3 - len);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
62 str[expt + neg] = '.';
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
63 str[expt + neg + 2] = '\0';
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
64 }
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
65 else
4612
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
66 {
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
67 /* We just need room for a radix point */
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
68 XREALLOC_ARRAY (str, CIbyte, len + 1);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
69 memmove (&str[expt + neg + 1], &str[expt + neg], len - (expt + neg));
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
70 str[expt + neg] = '.';
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
71 }
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
72 }
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
73 else
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
74 {
4612
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
75 /* Computerized scientific notation: We need room for a possible radix
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
76 point, format identifier, and exponent */
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
77 /* GMP's idea of the exponent is 1 greater than scientific notation's */
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
78 expt--;
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
79 const int point = (len == neg + 2) ? 0 : 1;
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
80 const int exponent = (expt < 0)
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
81 ? (int)(log ((double) (-expt)) / log ((double) base)) + 3
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
82 : (int)(log ((double) expt) / log ((double) base)) + 2;
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
83 const int space = point + exponent;
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
84 XREALLOC_ARRAY (str, CIbyte, len + space);
4612
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
85 if (point > 0)
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
86 {
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
87 memmove (&str[neg + 2], &str[neg + 1], len - neg);
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
88 str[neg + 1] = '.';
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
89 }
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
90 sprintf (&str[len + point - 1], "E%ld", expt);
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
91 }
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
92 return str;
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
93 }
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
94
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
95 /* We need the next two functions since GNU MP insists on giving us an extra
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
96 parameter. */
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1995
diff changeset
97 static void *gmp_realloc (void *ptr, size_t UNUSED (old_size), size_t new_size)
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
98 {
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
99 return xrealloc (ptr, new_size);
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
100 }
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
101
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1995
diff changeset
102 static void gmp_free (void *ptr, size_t UNUSED (size))
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
103 {
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
104 xfree (ptr, void *);
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
105 }
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
106
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
107 void
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
108 init_number_gmp ()
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
109 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
110 mp_set_memory_functions ((void *(*) (size_t)) xmalloc, gmp_realloc,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
111 gmp_free);
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
112
4612
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
113 /* Numbers with smaller exponents than this are printed in scientific
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
114 notation. */
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
115 float_print_min = -4;
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
116
4612
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
117 /* Numbers with larger exponents than this are printed in scientific
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
118 notation. */
313c2cc696b9 Fix the broken bigfloat-to-string conversion function.
Jerry James <james@xemacs.org>
parents: 2956
diff changeset
119 float_print_max = 8;
1983
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
120
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
121 /* Prepare the bignum/bigfloat random number generator */
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
122 gmp_randinit_default (random_state);
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
123 gmp_randseed_ui (random_state, qxe_getpid () + time (NULL));
9c872f33ecbe [xemacs-hg @ 2004-04-05 22:49:31 by james]
james
parents:
diff changeset
124 }