Mercurial > octave
annotate liboctave/util/oct-string.cc @ 27919:1891570abac8
update Octave Project Developers copyright for the new year
In files that have the "Octave Project Developers" copyright notice,
update for 2020.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 06 Jan 2020 22:29:51 -0500 |
parents | b442ec6dda5c |
children | bd51beb6205e |
rev | line source |
---|---|
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
1 /* |
27919
1891570abac8
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
27918
diff
changeset
|
2 Copyright (C) 2016-2020 The Octave Project Developers |
27918
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27785
diff
changeset
|
3 |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27785
diff
changeset
|
4 See the file COPYRIGHT.md in the top-level directory of this distribution |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27785
diff
changeset
|
5 or <https://octave.org/COPYRIGHT.html/>. |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27785
diff
changeset
|
6 |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
7 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
8 This file is part of Octave. |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
9 |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23732
diff
changeset
|
10 Octave is free software: you can redistribute it and/or modify it |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
11 under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23732
diff
changeset
|
12 the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
13 (at your option) any later version. |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
14 |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
15 Octave is distributed in the hope that it will be useful, but |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
16 WITHOUT ANY WARRANTY; without even the implied warranty of |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
18 GNU General Public License for more details. |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
19 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
20 You should have received a copy of the GNU General Public License |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
21 along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23732
diff
changeset
|
22 <https://www.gnu.org/licenses/>. |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
23 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
24 */ |
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 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
213 #define INSTANTIATE_OCTAVE_STRING(T) \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
214 template bool octave::string::strcmp<T> (const T&, const T&); \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
215 template bool octave::string::strcmp<T> (const T&, \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
216 const typename T::value_type*); \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
217 template bool octave::string::strcmpi<T> (const T&, const T&); \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
218 template bool octave::string::strcmpi<T> (const T&, \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
219 const typename T::value_type*); \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
220 template bool octave::string::strncmp<T> (const T&, const T&, \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
221 const 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
|
222 template bool octave::string::strncmp<T> (const T&, \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
223 const typename T::value_type*, \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
224 const 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
|
225 template bool octave::string::strncmpi<T> (const T&, const T&, \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
226 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
|
227 template bool octave::string::strncmpi<T> (const T&, \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
228 const typename T::value_type*, \ |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
229 const 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
|
230 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
231 // 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
|
232 // useful for anyone? |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
233 INSTANTIATE_OCTAVE_STRING(std::string) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
234 INSTANTIATE_OCTAVE_STRING(Array<char>) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
235 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
236 #undef INSTANTIATE_OCTAVE_STRING |
26110
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
237 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
238 static inline bool |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
239 is_imag_unit (int c) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
240 { return c == 'i' || c == 'j'; } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
241 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
242 static double |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
243 single_num (std::istringstream& is) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
244 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
245 double num = 0.0; |
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 char c = is.peek (); |
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 // Skip spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
250 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
251 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
252 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
253 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
254 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
255 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
256 if (std::toupper (c) == 'I') |
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 // It's infinity. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
259 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
260 char c1 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
261 char c2 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
262 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
|
263 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
264 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
|
265 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
|
266 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
267 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
268 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
|
269 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
270 else if (c == 'N') |
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 // It's NA or NaN |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
273 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
274 char c1 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
275 if (c1 == 'A') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
276 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
277 num = octave_NA; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
278 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
|
279 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
280 else |
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 char c2 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
283 if (c1 == 'a' && c2 == 'N') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
284 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
285 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
|
286 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
|
287 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
288 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
289 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
|
290 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
291 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
292 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
293 is >> num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
294 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
295 return 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 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
298 static std::istringstream& |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
299 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
|
300 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
301 have_sign = imag = false; |
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 char c = is.peek (); |
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 // Skip leading spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
306 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
307 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
308 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
309 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
310 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
311 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
312 bool negative = false; |
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 // Accept leading sign. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
315 if (c == '+' || c == '-') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
316 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
317 have_sign = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
318 negative = c == '-'; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
319 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
320 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
321 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
322 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
323 // Skip spaces after sign. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
324 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
325 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
326 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
327 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
328 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
329 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
330 // 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
|
331 if (c == 'i') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
332 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
333 // possible infinity. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
334 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
335 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
336 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
337 if (is.eof ()) |
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 // 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
|
340 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
341 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
|
342 return is; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
343 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
344 else |
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 if (std::tolower (c) != 'n') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
347 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
348 is.unget (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
349 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
350 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
351 else if (c == 'j') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
352 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
353 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
354 // 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
|
355 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
356 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
357 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
358 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
359 // Skip spaces after imaginary unit. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
360 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
361 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
362 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
363 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
364 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
365 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
366 if (c == '*') |
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 // 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
|
369 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
370 num = single_num (is); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
371 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
372 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
373 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
374 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
375 num = 1.0; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
376 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
377 else |
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 // 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
|
380 num = single_num (is); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
381 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
382 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
383 c = is.peek (); |
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 // Skip spaces after number. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
386 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
387 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
388 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
389 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
390 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
391 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
392 if (c == '*') |
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 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
395 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
396 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
397 // Skip spaces after operator. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
398 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
399 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
400 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
401 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
402 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
403 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
404 if (is_imag_unit (c)) |
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 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
407 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
408 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
409 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
410 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
411 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
|
412 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
413 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
|
414 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
415 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
416 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
417 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
418 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
419 } |
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 if (is.good ()) |
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 // Skip trailing spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
425 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
426 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
427 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
428 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
429 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
430 } |
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 if (negative) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
433 num = -num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
434 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
435 return is; |
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 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
438 static inline void |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
439 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
|
440 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
441 #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
|
442 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
443 c.imag (num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
444 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
445 c.real (num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
446 #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
|
447 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
448 c.imag () = num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
449 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
450 c.real () = 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 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
453 c = Complex (c.real (), num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
454 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
455 c = Complex (num, c.imag ()); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
456 #endif |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
457 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
458 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
459 Complex |
26127
37e3aa267374
Move function str2double inside octave::string namespace (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26111
diff
changeset
|
460 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
|
461 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
462 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
|
463 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
464 std::string str = str_arg; |
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 // 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
|
467 // 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
|
468 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
|
469 std::istringstream is (str); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
470 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
471 double num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
472 bool i1, i2, s1, s2; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
473 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
474 if (is.eof ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
475 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
|
476 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
|
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 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
479 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
480 set_component (val, num, i1); |
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 if (! is.eof ()) |
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 (! 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
|
485 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
|
486 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
487 set_component (val, num, i2); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
488 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
489 } |
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 return val; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
492 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
493 |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
494 std::string |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
495 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
|
496 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
|
497 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
|
498 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
499 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
|
500 (u8_string.c_str ()); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
501 size_t srclen = u8_string.length (); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
502 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
503 size_t length; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
504 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
|
505 srclen, &length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
506 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
507 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
|
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 (errno == ENOSYS) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
510 (*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
|
511 ("%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
|
512 "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
|
513 else |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
514 (*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
|
515 ("%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
|
516 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
|
517 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
518 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
519 octave::unwind_protect frame; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
520 frame.add_fcn (::free, static_cast<void *> (native_str)); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
521 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
522 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
|
523 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
524 return retval; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
525 } |
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 std::string |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
528 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
|
529 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
|
530 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
|
531 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
532 const char *src = native_string.c_str (); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
533 size_t srclen = native_string.length (); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
534 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
535 size_t length; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
536 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
|
537 srclen, &length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
538 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
|
539 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
540 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
|
541 (*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
|
542 ("%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
|
543 "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
|
544 else |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
545 (*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
|
546 ("%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
|
547 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
|
548 } |
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 octave::unwind_protect frame; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
551 frame.add_fcn (::free, static_cast<void *> (utf8_str)); |
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; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
568 const char * const in_end = in_chr + in_str.length (); |
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"; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
588 size_t lengthp; |
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 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
597 octave::unwind_protect frame; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
598 frame.add_fcn (::free, static_cast<void *> (val_utf8)); |
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 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
619 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
|
620 { |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
621 if (val > 0) |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
622 s = "1/0"; |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
623 else |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
624 s = "-1/0"; |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
625 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
626 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
|
627 s = "0/0"; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
628 else if (val < std::numeric_limits<int>::min () |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
629 || val > std::numeric_limits<int>::max () |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
630 || 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
|
631 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
632 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
633 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
634 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
|
635 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
636 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
637 else |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
638 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
639 T lastn = 1; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
640 T lastd = 0; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
641 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
|
642 T d = 1; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
643 T frac = val - n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
644 int m = 0; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
645 |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
646 std::ostringstream init_buf; |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
647 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
|
648 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
|
649 s = init_buf.str (); |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
650 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
651 while (true) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
652 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
653 T flip = 1 / frac; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
654 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
|
655 T nextn = n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
656 T nextd = d; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
657 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
658 // Have we converged to 1/intmax ? |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
659 if (std::abs (flip) > static_cast<T> (std::numeric_limits<int>::max ())) |
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 lastn = n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
662 lastd = d; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
663 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
664 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
665 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
666 frac = flip - step; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
667 n = step * n + lastn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
668 d = step * d + lastd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
669 lastn = nextn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
670 lastd = nextd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
671 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
672 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
673 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
674 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
|
675 << '/' << static_cast<int> (d); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
676 m++; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
677 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
678 if (n < 0 && d < 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
679 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
680 // 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
|
681 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
|
682 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
683 } |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
684 else |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
685 { |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
686 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
|
687 break; |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
688 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
689 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
690 if (std::abs (n) > std::numeric_limits<int>::max () |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
691 || std::abs (d) > std::numeric_limits<int>::max ()) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
692 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
693 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
694 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
695 } |
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 if (lastd < 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
698 { |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
699 // 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
|
700 lastd = - lastd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
701 lastn = - lastn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
702 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
703 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
704 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
|
705 << '/' << static_cast<int> (lastd); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
706 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
707 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
708 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
709 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
710 return s; |
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 |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
713 // instantiate the template for float and double |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
714 template std::string rational_approx <float> (float val, int len); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
715 template std::string rational_approx <double> (double val, int len); |