Mercurial > octave
annotate liboctave/util/oct-string.cc @ 30867:014030798d5e stable
Avoid issues when converting large integers to floating point (bug #62212).
* libinterp/corefcn/oct-stream.cc (get_size),
libinterp/corefcn/xpow.cc (xisint),
libinterp/octave-value/ov-base.cc (INT_CONV_METHOD),
libinterp/octave-value/ov.cc (check_colon_operand, range_numel (T, double, T)),
liboctave/numeric/lo-mappers.cc (nint_big, nint),
liboctave/util/oct-inttypes.cc (emulate_mop,
operator - (const double, const octave_uint64)),
liboctave/util/oct-string.cc (rational_approx): Take into account that the
maximum value of (signed or unsigned) integers might change its value if
converted to floating point. In comparisons, check against the first value
*outside* the range of the integer type instead of the last value *inside* its
range.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Mon, 28 Mar 2022 19:27:35 +0200 |
parents | 796f54d4ddbf |
children | 79edd49a5a97 |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 // |
30564
796f54d4ddbf
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
30394
diff
changeset
|
3 // Copyright (C) 2016-2022 The Octave Project Developers |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
4 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
7 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
8 // This file is part of Octave. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
9 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
13 // (at your option) any later version. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
14 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
18 // GNU General Public License for more details. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
19 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
25 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
26 #if defined (HAVE_CONFIG_H) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
27 # include "config.h" |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
28 #endif |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
29 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
30 #include "oct-string.h" |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
31 |
26110
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
32 #include <algorithm> |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
33 #include <cctype> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
34 #include <cstring> |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
35 #include <iomanip> |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
36 #include <string> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
37 |
23462
314d980bee93
maint: Add '#include "XXX.h"' to XXX.cc files.
Rik <rik@octave.org>
parents:
23449
diff
changeset
|
38 #include "Array.h" |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
39 #include "lo-ieee.h" |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
40 #include "lo-mappers.h" |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
41 #include "uniconv-wrappers.h" |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
42 #include "unistr-wrappers.h" |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
43 #include "unwind-prot.h" |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
44 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
45 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
46 static bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
47 str_data_cmp (const typename T::value_type *a, const typename T::value_type *b, |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
48 const typename T::size_type n) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
49 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
50 for (typename T::size_type i = 0; i < n; ++i) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
51 if (a[i] != b[i]) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
52 return false; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
53 return true; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
54 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
55 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
56 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
57 static bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
58 str_data_cmpi (const typename T::value_type *a, const typename T::value_type *b, |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
59 const typename T::size_type n) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
60 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
61 for (typename T::size_type i = 0; i < n; ++i) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
62 if (std::tolower (a[i]) != std::tolower (b[i])) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
63 return false; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
64 return true; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
65 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
66 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
67 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
68 // Templates to handle std::basic_string, std::vector, Array, and char*. |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
69 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
70 typename T::size_type |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
71 numel (const T& str) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
72 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
73 return str.size (); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
74 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
75 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
76 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
77 octave_idx_type |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
78 numel (const Array<char>& str) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
79 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
80 return str.numel (); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
81 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
82 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
83 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
84 typename T::size_type |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
85 strlen (const typename T::value_type *str) |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
86 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
87 return std::strlen (str); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
88 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
89 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
90 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
91 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
92 sizes_cmp (const T& str_a, const T& str_b) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
93 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
94 return str_a.size () == str_b.size (); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
95 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
96 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
97 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
98 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
99 sizes_cmp (const Array<char>& str_a, const Array<char>& str_b) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
100 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
101 return str_a.dims () == str_b.dims (); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
102 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
103 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
104 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
105 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
106 sizes_cmp (const T& str_a, const typename T::value_type *str_b) |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
107 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
108 return str_a.size () == strlen<T> (str_b); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
109 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
110 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
111 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
112 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
113 sizes_cmp (const Array<char>& str_a, const char *str_b) |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
114 { |
23592
80e3bfb7bd5a
maint: Deprecate is_vector and replace with isvector.
Rik <rik@octave.org>
parents:
23462
diff
changeset
|
115 return (str_a.isvector () && str_a.rows () == 1 |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
116 && str_a.numel () == strlen<Array<char>> (str_b)); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
117 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
118 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
119 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
120 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
121 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
122 octave::string::strcmp (const T& str_a, const T& str_b) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
123 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
124 return (sizes_cmp (str_a, str_b) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
125 && str_data_cmp<T> (str_a.data (), str_b.data (), numel (str_a))); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
126 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
127 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
128 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
129 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
130 octave::string::strcmp (const T& str_a, const typename T::value_type *str_b) |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
131 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
132 return (sizes_cmp (str_a, str_b) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
133 && str_data_cmp<T> (str_a.data (), str_b, numel (str_a))); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
134 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
135 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
136 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
137 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
138 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
139 octave::string::strcmpi (const T& str_a, const T& str_b) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
140 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
141 return (sizes_cmp (str_a, str_b) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
142 && str_data_cmpi<T> (str_a.data (), str_b.data (), numel (str_a))); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
143 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
144 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
145 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
146 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
147 octave::string::strcmpi (const T& str_a, const typename T::value_type *str_b) |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
148 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
149 return (sizes_cmp (str_a, str_b) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
150 && str_data_cmpi<T> (str_a.data (), str_b, numel (str_a))); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
151 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
152 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
153 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
154 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
155 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
156 octave::string::strncmp (const T& str_a, const T& str_b, |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
157 const typename T::size_type n) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
158 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
159 typename T::size_type neff; |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
160 auto len_a = numel (str_a); |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
161 auto len_b = numel (str_b); |
25828
8b548f2f8086
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
25698
diff
changeset
|
162 neff = std::min (std::max (len_a, len_b), n); |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
163 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
164 return (len_a >= neff && len_b >= neff |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
165 && str_data_cmp<T> (str_a.data (), str_b.data (), neff)); |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
166 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
167 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
168 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
169 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
170 octave::string::strncmp (const T& str_a, const typename T::value_type *str_b, |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
171 const typename T::size_type n) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
172 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
173 typename T::size_type neff; |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
174 auto len_a = numel (str_a); |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
175 auto len_b = strlen<T> (str_b); |
25828
8b548f2f8086
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
25698
diff
changeset
|
176 neff = std::min (std::max (len_a, len_b), n); |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
177 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
178 return (len_a >= neff && len_b >= neff |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
179 && str_data_cmp<T> (str_a.data (), str_b, neff)); |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
180 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
181 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
182 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
183 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
184 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
185 octave::string::strncmpi (const T& str_a, const T& str_b, |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
186 const typename T::size_type n) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
187 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
188 typename T::size_type neff; |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
189 auto len_a = numel (str_a); |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
190 auto len_b = numel (str_b); |
25828
8b548f2f8086
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
25698
diff
changeset
|
191 neff = std::min (std::max (len_a, len_b), n); |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
192 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
193 return (len_a >= neff && len_b >= neff |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
194 && str_data_cmpi<T> (str_a.data (), str_b.data (), neff)); |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
195 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
196 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
197 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
198 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
199 octave::string::strncmpi (const T& str_a, const typename T::value_type *str_b, |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
200 const typename T::size_type n) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
201 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
202 typename T::size_type neff; |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
203 auto len_a = numel (str_a); |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
204 auto len_b = strlen<T> (str_b); |
25828
8b548f2f8086
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
25698
diff
changeset
|
205 neff = std::min (std::max (len_a, len_b), n); |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
206 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
207 return (len_a >= neff && len_b >= neff |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
208 && str_data_cmpi<T> (str_a.data (), str_b, neff)); |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
209 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
210 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
211 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
212 // Instantiations we need |
29230
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
213 #define INSTANTIATE_OCTAVE_STRING(T, API) \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
214 template API bool octave::string::strcmp<T> (const T&, const T&); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
215 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
216 octave::string::strcmp<T> (const T&, const typename T::value_type*); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
217 template API bool octave::string::strcmpi<T> (const T&, const T&); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
218 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
219 octave::string::strcmpi<T> (const T&, const typename T::value_type*); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
220 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
221 octave::string::strncmp<T> (const T&, const T&, \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
222 const typename T::size_type); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
223 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
224 octave::string::strncmp<T> (const T&, const typename T::value_type*, \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
225 const typename T::size_type); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
226 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
227 octave::string::strncmpi<T> (const T&, const T&, \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
228 const typename T::size_type n); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
229 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
230 octave::string::strncmpi<T> (const T&, const typename T::value_type*, \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
231 const typename T::size_type); |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
232 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
233 // We could also instantiate std::vector<char> but would it be |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
234 // useful for anyone? |
29230
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
235 INSTANTIATE_OCTAVE_STRING(std::string, OCTAVE_API) |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
236 INSTANTIATE_OCTAVE_STRING(Array<char>, OCTAVE_API) |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
237 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
238 #undef INSTANTIATE_OCTAVE_STRING |
26110
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
239 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
240 static inline bool |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
241 is_imag_unit (int c) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
242 { return c == 'i' || c == 'j'; } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
243 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
244 static double |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
245 single_num (std::istringstream& is) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
246 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
247 double num = 0.0; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
248 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
249 char c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
250 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
251 // Skip spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
252 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
253 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
254 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
255 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
256 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
257 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
258 if (std::toupper (c) == 'I') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
259 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
260 // It's infinity. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
261 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
262 char c1 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
263 char c2 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
264 if (std::tolower (c1) == 'n' && std::tolower (c2) == 'f') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
265 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
266 num = octave::numeric_limits<double>::Inf (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
267 is.peek (); // May set EOF bit. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
268 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
269 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
270 is.setstate (std::ios::failbit); // indicate that read has failed. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
271 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
272 else if (c == 'N') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
273 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
274 // It's NA or NaN |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
275 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
276 char c1 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
277 if (c1 == 'A') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
278 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
279 num = octave_NA; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
280 is.peek (); // May set EOF bit. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
281 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
282 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
283 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
284 char c2 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
285 if (c1 == 'a' && c2 == 'N') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
286 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
287 num = octave::numeric_limits<double>::NaN (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
288 is.peek (); // May set EOF bit. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
289 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
290 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
291 is.setstate (std::ios::failbit); // indicate that read has failed. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
292 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
293 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
294 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
295 is >> num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
296 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
297 return num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
298 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
299 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
300 static std::istringstream& |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
301 extract_num (std::istringstream& is, double& num, bool& imag, bool& have_sign) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
302 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
303 have_sign = imag = false; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
304 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
305 char c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
306 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
307 // Skip leading spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
308 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
309 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
310 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
311 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
312 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
313 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
314 bool negative = false; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
315 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
316 // Accept leading sign. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
317 if (c == '+' || c == '-') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
318 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
319 have_sign = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
320 negative = c == '-'; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
321 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
322 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
323 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
324 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
325 // Skip spaces after sign. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
326 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
327 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
328 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
329 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
330 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
331 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
332 // Imaginary number (i*num or just i), or maybe 'inf'. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
333 if (c == 'i') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
334 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
335 // possible infinity. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
336 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
337 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
338 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
339 if (is.eof ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
340 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
341 // just 'i' and string is finished. Return immediately. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
342 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
343 num = (negative ? -1.0 : 1.0); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
344 return is; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
345 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
346 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
347 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
348 if (std::tolower (c) != 'n') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
349 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
350 is.unget (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
351 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
352 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
353 else if (c == 'j') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
354 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
355 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
356 // It's i*num or just i |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
357 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
358 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
359 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
360 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
361 // Skip spaces after imaginary unit. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
362 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
363 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
364 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
365 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
366 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
367 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
368 if (c == '*') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
369 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
370 // Multiplier follows, we extract it as a number. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
371 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
372 num = single_num (is); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
373 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
374 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
375 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
376 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
377 num = 1.0; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
378 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
379 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
380 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
381 // It's num, num*i, or numi. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
382 num = single_num (is); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
383 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
384 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
385 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
386 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
387 // Skip spaces after number. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
388 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
389 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
390 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
391 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
392 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
393 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
394 if (c == '*') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
395 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
396 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
397 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
398 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
399 // Skip spaces after operator. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
400 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
401 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
402 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
403 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
404 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
405 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
406 if (is_imag_unit (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
407 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
408 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
409 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
410 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
411 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
412 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
413 is.setstate (std::ios::failbit); // indicate read has failed. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
414 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
415 else if (is_imag_unit (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
416 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
417 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
418 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
419 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
420 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
421 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
422 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
423 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
424 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
425 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
426 // Skip trailing spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
427 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
428 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
429 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
430 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
431 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
432 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
433 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
434 if (negative) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
435 num = -num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
436 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
437 return is; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
438 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
439 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
440 static inline void |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
441 set_component (Complex& c, double num, bool imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
442 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
443 #if defined (HAVE_CXX_COMPLEX_SETTERS) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
444 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
445 c.imag (num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
446 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
447 c.real (num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
448 #elif defined (HAVE_CXX_COMPLEX_REFERENCE_ACCESSORS) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
449 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
450 c.imag () = num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
451 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
452 c.real () = num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
453 #else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
454 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
455 c = Complex (c.real (), num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
456 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
457 c = Complex (num, c.imag ()); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
458 #endif |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
459 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
460 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
461 Complex |
26127
37e3aa267374
Move function str2double inside octave::string namespace (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26111
diff
changeset
|
462 octave::string::str2double (const std::string& str_arg) |
26110
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
463 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
464 Complex val (0.0, 0.0); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
465 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
466 std::string str = str_arg; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
467 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
468 // FIXME: removing all commas doesn't allow actual parsing. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
469 // Example: "1,23.45" is wrong, but passes Octave. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
470 str.erase (std::remove (str.begin (), str.end(), ','), str.end ()); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
471 std::istringstream is (str); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
472 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
473 double num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
474 bool i1, i2, s1, s2; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
475 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
476 if (is.eof ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
477 val = octave::numeric_limits<double>::NaN (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
478 else if (! extract_num (is, num, i1, s1)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
479 val = octave::numeric_limits<double>::NaN (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
480 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
481 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
482 set_component (val, num, i1); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
483 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
484 if (! is.eof ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
485 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
486 if (! extract_num (is, num, i2, s2) || i1 == i2 || ! s2) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
487 val = octave::numeric_limits<double>::NaN (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
488 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
489 set_component (val, num, i2); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
490 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
491 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
492 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
493 return val; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
494 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
495 |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
496 std::string |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
497 octave::string::u8_to_encoding (const std::string& who, |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
498 const std::string& u8_string, |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
499 const std::string& encoding) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
500 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
501 const uint8_t *src = reinterpret_cast<const uint8_t *> |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
502 (u8_string.c_str ()); |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
503 std::size_t srclen = u8_string.length (); |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
504 |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
505 std::size_t length; |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
506 char *native_str = octave_u8_conv_to_encoding (encoding.c_str (), src, |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
507 srclen, &length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
508 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
509 if (! native_str) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
510 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
511 if (errno == ENOSYS) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
512 (*current_liboctave_error_handler) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
513 ("%s: iconv() is not supported. Installing GNU libiconv and then " |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
514 "re-compiling Octave could fix this.", who.c_str ()); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
515 else |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
516 (*current_liboctave_error_handler) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
517 ("%s: converting from UTF-8 to codepage '%s' failed: %s", |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
518 who.c_str (), encoding.c_str (), std::strerror (errno)); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
519 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
520 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
521 octave::unwind_action free_native_str ([=] () { ::free (native_str); }); |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
522 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
523 std::string retval = std::string (native_str, length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
524 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
525 return retval; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
526 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
527 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
528 std::string |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
529 octave::string::u8_from_encoding (const std::string& who, |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
530 const std::string& native_string, |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
531 const std::string& encoding) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
532 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
533 const char *src = native_string.c_str (); |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
534 std::size_t srclen = native_string.length (); |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
535 |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
536 std::size_t length; |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
537 uint8_t *utf8_str = octave_u8_conv_from_encoding (encoding.c_str (), src, |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
538 srclen, &length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
539 if (! utf8_str) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
540 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
541 if (errno == ENOSYS) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
542 (*current_liboctave_error_handler) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
543 ("%s: iconv() is not supported. Installing GNU libiconv and then " |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
544 "re-compiling Octave could fix this.", who.c_str ()); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
545 else |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
546 (*current_liboctave_error_handler) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
547 ("%s: converting from codepage '%s' to UTF-8 failed: %s", |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
548 who.c_str (), encoding.c_str (), std::strerror (errno)); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
549 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
550 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
551 octave::unwind_action free_utf8_str ([=] () { ::free (utf8_str); }); |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
552 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
553 std::string retval = std::string (reinterpret_cast<char *> (utf8_str), length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
554 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
555 return retval; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
556 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
557 |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
558 unsigned int |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
559 octave::string::u8_validate (const std::string& who, |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
560 std::string& in_str, |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
561 const octave::string::u8_fallback_type type) |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
562 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
563 std::string out_str; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
564 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
565 unsigned int num_replacements = 0; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
566 const char *in_chr = in_str.c_str (); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
567 const char *inv_utf8 = in_chr; |
30394
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29655
diff
changeset
|
568 const char *const in_end = in_chr + in_str.length (); |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
569 while (inv_utf8 && in_chr < in_end) |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
570 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
571 inv_utf8 = reinterpret_cast<const char *> |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
572 (octave_u8_check_wrapper (reinterpret_cast<const uint8_t *> (in_chr), |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
573 in_end - in_chr)); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
574 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
575 if (inv_utf8 == nullptr) |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
576 out_str.append (in_chr, in_end - in_chr); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
577 else |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
578 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
579 num_replacements++; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
580 out_str.append (in_chr, inv_utf8 - in_chr); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
581 in_chr = inv_utf8 + 1; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
582 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
583 if (type == U8_REPLACEMENT_CHAR) |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
584 out_str.append ("\xef\xbf\xbd"); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
585 else if (type == U8_ISO_8859_1) |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
586 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
587 std::string fallback = "iso-8859-1"; |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
588 std::size_t lengthp; |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
589 uint8_t *val_utf8 = octave_u8_conv_from_encoding |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
590 (fallback.c_str (), inv_utf8, 1, &lengthp); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
591 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
592 if (! val_utf8) |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
593 (*current_liboctave_error_handler) |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
594 ("%s: converting from codepage '%s' to UTF-8 failed: %s", |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
595 who.c_str (), fallback.c_str (), std::strerror (errno)); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
596 |
28824
a98fd0657e35
Replace unwind_protect with more efficient constructs in liboctave (bug #59192).
Rik <rik@octave.org>
parents:
27957
diff
changeset
|
597 octave::unwind_action free_val_utf8 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
598 ([=] () { ::free (val_utf8); }); |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
599 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
600 out_str.append (reinterpret_cast<const char *> (val_utf8), |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
601 lengthp); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
602 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
603 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
604 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
605 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
606 in_str = out_str; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
607 return num_replacements; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
608 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
609 |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
610 template <typename T> |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
611 std::string |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
612 rational_approx (T val, int len) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
613 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
614 std::string s; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
615 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
616 if (len <= 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
617 len = 10; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
618 |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
619 static const T out_of_range_top |
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
620 = static_cast<T>(std::numeric_limits<int>::max ()) + 1.; |
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
621 static const T out_of_range_bottom |
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
622 = static_cast<T>(std::numeric_limits<int>::min ()) - 1.; |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
623 if (octave::math::isinf (val)) |
26192
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
624 { |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
625 if (val > 0) |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
626 s = "1/0"; |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
627 else |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
628 s = "-1/0"; |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
629 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
630 else if (octave::math::isnan (val)) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
631 s = "0/0"; |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
632 else if (val <= out_of_range_bottom || val >= out_of_range_top |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
633 || octave::math::x_nint (val) == val) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
634 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
635 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
636 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
637 buf << std::setprecision (0) << octave::math::round (val); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
638 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
639 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
640 else |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
641 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
642 T lastn = 1; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
643 T lastd = 0; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
644 T n = octave::math::round (val); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
645 T d = 1; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
646 T frac = val - n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
647 int m = 0; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
648 |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
649 std::ostringstream init_buf; |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
650 init_buf.flags (std::ios::fixed); |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
651 init_buf << std::setprecision (0) << static_cast<int> (n); |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
652 s = init_buf.str (); |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
653 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
654 while (true) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
655 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
656 T flip = 1 / frac; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
657 T step = octave::math::round (flip); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
658 T nextn = n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
659 T nextd = d; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
660 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
661 // Have we converged to 1/intmax ? |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
662 if (std::abs (flip) > out_of_range_top) |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
663 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
664 lastn = n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
665 lastd = d; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
666 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
667 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
668 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
669 frac = flip - step; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
670 n = step * n + lastn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
671 d = step * d + lastd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
672 lastn = nextn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
673 lastd = nextd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
674 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
675 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
676 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
677 buf << std::setprecision (0) << static_cast<int> (n) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
678 << '/' << static_cast<int> (d); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
679 m++; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
680 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
681 if (n < 0 && d < 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
682 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
683 // Double negative, string can be two characters longer. |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
684 if (buf.str ().length () > static_cast<unsigned int> (len + 2)) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
685 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
686 } |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
687 else |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
688 { |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
689 if (buf.str ().length () > static_cast<unsigned int> (len)) |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
690 break; |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
691 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
692 |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
693 if (std::abs (n) >= out_of_range_top |
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
694 || std::abs (d) >= out_of_range_top) |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
695 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
696 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
697 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
698 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
699 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
700 if (lastd < 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
701 { |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
702 // Move negative sign from denominator to numerator |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
703 lastd = - lastd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
704 lastn = - lastn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
705 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
706 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
707 buf << std::setprecision (0) << static_cast<int> (lastn) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
708 << '/' << static_cast<int> (lastd); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
709 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
710 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
711 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
712 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
713 return s; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
714 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
715 |
27956
2310164737b3
fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
716 // instantiate the template for float and double |
29230
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
717 template OCTAVE_API std::string rational_approx <float> (float val, int len); |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
718 template OCTAVE_API std::string rational_approx <double> (double val, int len); |