Mercurial > octave
annotate liboctave/util/oct-string.cc @ 33658:b1d6e40ac737 stable tip
NEWS.9.md: Fix typo and minor formatting changes.
* etc/NEWS.9.md: Fix typo. Adjust whitespace. Use markdown syntax for code
snippets.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Wed, 05 Jun 2024 11:27:35 +0200 |
parents | 2e484f9f1f18 |
children | 4b601ca024d5 |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 // |
32632
2e484f9f1f18
maint: update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
32590
diff
changeset
|
3 // Copyright (C) 2016-2024 The Octave Project Developers |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
4 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
7 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
8 // This file is part of Octave. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
9 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
13 // (at your option) any later version. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
14 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
18 // GNU General Public License for more details. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
19 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
25 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
26 #if defined (HAVE_CONFIG_H) |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
27 # include "config.h" |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
28 #endif |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
29 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
30 #include "oct-string.h" |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
31 |
26110
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
32 #include <algorithm> |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
33 #include <cctype> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
34 #include <cstring> |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
35 #include <iomanip> |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
36 #include <string> |
32049
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
37 #include <unordered_set> |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
38 |
23462
314d980bee93
maint: Add '#include "XXX.h"' to XXX.cc files.
Rik <rik@octave.org>
parents:
23449
diff
changeset
|
39 #include "Array.h" |
32049
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
40 #include "iconv-wrappers.h" |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
41 #include "lo-ieee.h" |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
42 #include "lo-mappers.h" |
32540
06a541ee4f05
avoid variable-length array declarations
John W. Eaton <jwe@octave.org>
parents:
32513
diff
changeset
|
43 #include "oct-locbuf.h" |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
44 #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
|
45 #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
|
46 #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
|
47 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
48 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
49 static bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
50 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
|
51 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
|
52 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
53 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
|
54 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
|
55 return false; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
56 return true; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
57 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
58 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
59 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
60 static bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
61 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
|
62 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
|
63 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
64 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
|
65 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
|
66 return false; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
67 return true; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
68 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
69 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
70 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
71 // 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
|
72 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
73 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
|
74 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
|
75 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
76 return str.size (); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
77 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
78 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
79 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
80 octave_idx_type |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
81 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
|
82 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
83 return str.numel (); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
84 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
85 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
86 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
87 typename T::size_type |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
88 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
|
89 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
90 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
|
91 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
92 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
93 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
94 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
95 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
|
96 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
97 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
|
98 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
99 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
100 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
101 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
102 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
|
103 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
104 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
|
105 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
106 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
107 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
108 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
109 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
|
110 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
111 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
|
112 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
113 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
114 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
115 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
116 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
|
117 { |
23592
80e3bfb7bd5a
maint: Deprecate is_vector and replace with isvector.
Rik <rik@octave.org>
parents:
23462
diff
changeset
|
118 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
|
119 && 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
|
120 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
121 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
122 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
123 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
124 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
125 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
|
126 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
127 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
|
128 && 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
|
129 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
130 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
131 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
132 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
133 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
|
134 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
135 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
|
136 && 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
|
137 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
138 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
139 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
140 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
141 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
142 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
|
143 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
144 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
|
145 && 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
|
146 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
147 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
148 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
149 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
150 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
|
151 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
152 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
|
153 && 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
|
154 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
155 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
156 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
157 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
158 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
159 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
|
160 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
|
161 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
162 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
|
163 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
|
164 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
|
165 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
|
166 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
167 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
|
168 && 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
|
169 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
170 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
171 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
172 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
173 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
|
174 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
|
175 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
176 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
|
177 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
|
178 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
|
179 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
|
180 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
181 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
|
182 && 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
|
183 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
184 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
185 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
186 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
187 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
188 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
|
189 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
|
190 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
191 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
|
192 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
|
193 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
|
194 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
|
195 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
196 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
|
197 && 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
|
198 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
199 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
200 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
201 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
202 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
|
203 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
|
204 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
205 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
|
206 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
|
207 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
|
208 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
|
209 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
210 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
|
211 && 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
|
212 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
213 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
214 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
215 // Instantiations we need |
29230
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
216 #define INSTANTIATE_OCTAVE_STRING(T, API) \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
217 template API bool octave::string::strcmp<T> (const T&, const T&); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
218 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
219 octave::string::strcmp<T> (const T&, const typename T::value_type*); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
220 template API bool octave::string::strcmpi<T> (const T&, const T&); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
221 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
222 octave::string::strcmpi<T> (const T&, const typename T::value_type*); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
223 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
224 octave::string::strncmp<T> (const T&, const T&, \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
225 const typename T::size_type); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
226 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
227 octave::string::strncmp<T> (const T&, const typename T::value_type*, \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
228 const typename T::size_type); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
229 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
230 octave::string::strncmpi<T> (const T&, const T&, \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
231 const typename T::size_type n); \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
232 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
233 octave::string::strncmpi<T> (const T&, const typename T::value_type*, \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
234 const typename T::size_type); |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
235 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
236 // 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
|
237 // useful for anyone? |
29230
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
238 INSTANTIATE_OCTAVE_STRING(std::string, OCTAVE_API) |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
239 INSTANTIATE_OCTAVE_STRING(Array<char>, OCTAVE_API) |
22280
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
240 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
241 #undef INSTANTIATE_OCTAVE_STRING |
26110
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
242 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
243 static inline bool |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
244 is_imag_unit (int c) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
245 { return c == 'i' || c == 'j'; } |
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 static double |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
248 single_num (std::istringstream& is) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
249 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
250 double num = 0.0; |
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 char c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
253 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
254 // Skip spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
255 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
256 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
257 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
258 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
259 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
260 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
261 if (std::toupper (c) == 'I') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
262 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
263 // It's infinity. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
264 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
265 char c1 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
266 char c2 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
267 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
|
268 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
269 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
|
270 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
|
271 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
272 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
273 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
|
274 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
275 else if (c == 'N') |
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 // It's NA or NaN |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
278 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
279 char c1 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
280 if (c1 == 'A') |
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 num = octave_NA; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
283 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
|
284 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
285 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
286 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
287 char c2 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
288 if (c1 == 'a' && c2 == 'N') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
289 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
290 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
|
291 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
|
292 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
293 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
294 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
|
295 } |
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 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
298 is >> num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
299 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
300 return num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
301 } |
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 static std::istringstream& |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
304 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
|
305 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
306 have_sign = imag = false; |
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 char c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
309 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
310 // Skip leading spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
311 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
312 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
313 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
314 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
315 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
316 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
317 bool negative = false; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
318 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
319 // Accept leading sign. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
320 if (c == '+' || c == '-') |
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 have_sign = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
323 negative = c == '-'; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
324 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
325 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
326 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
327 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
328 // Skip spaces after sign. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
329 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
330 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
331 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
332 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
333 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
334 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
335 // 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
|
336 if (c == 'i') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
337 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
338 // possible infinity. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
339 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
340 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
341 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
342 if (is.eof ()) |
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 // 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
|
345 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
346 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
|
347 return is; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
348 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
349 else |
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 if (std::tolower (c) != 'n') |
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 is.unget (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
354 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
355 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
356 else if (c == 'j') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
357 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
358 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
359 // 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
|
360 if (imag) |
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 // Skip spaces after imaginary unit. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
365 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
366 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
367 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
368 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
369 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
370 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
371 if (c == '*') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
372 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
373 // 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
|
374 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
375 num = single_num (is); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
376 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
377 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
378 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
379 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
380 num = 1.0; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
381 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
382 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
383 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
384 // 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
|
385 num = single_num (is); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
386 if (is.good ()) |
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 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
389 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
390 // Skip spaces after number. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
391 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
392 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
393 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
394 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
395 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
396 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
397 if (c == '*') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
398 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
399 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
400 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
401 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
402 // Skip spaces after operator. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
403 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
404 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
405 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
406 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
407 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
408 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
409 if (is_imag_unit (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
410 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
411 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
412 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
413 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
414 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
415 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
416 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
|
417 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
418 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
|
419 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
420 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
421 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
422 c = is.peek (); |
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 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
425 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
426 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
427 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
428 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
429 // Skip trailing spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
430 while (isspace (c)) |
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 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
433 c = is.peek (); |
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 } |
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 if (negative) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
438 num = -num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
439 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
440 return is; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
441 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
442 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
443 static inline void |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
444 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
|
445 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
446 #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
|
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 #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
|
452 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
453 c.imag () = 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.real () = num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
456 #else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
457 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
458 c = Complex (c.real (), num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
459 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
460 c = Complex (num, c.imag ()); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
461 #endif |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
462 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
463 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
464 Complex |
26127
37e3aa267374
Move function str2double inside octave::string namespace (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26111
diff
changeset
|
465 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
|
466 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
467 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
|
468 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
469 std::string str = str_arg; |
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 // 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
|
472 // 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
|
473 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
|
474 std::istringstream is (str); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
475 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
476 double num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
477 bool i1, i2, s1, s2; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
478 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
479 if (is.eof ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
484 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
485 set_component (val, num, i1); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
486 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
487 if (! is.eof ()) |
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 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
|
490 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
|
491 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
492 set_component (val, num, i2); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
493 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
494 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
495 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
496 return val; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
497 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
498 |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
499 std::string |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
500 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
|
501 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
|
502 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
|
503 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
504 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
|
505 (u8_string.c_str ()); |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
506 std::size_t srclen = u8_string.length (); |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
507 |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
508 std::size_t length; |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
509 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
|
510 srclen, &length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
511 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
512 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
|
513 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
514 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
|
515 (*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
|
516 ("%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
|
517 "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
|
518 else |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
519 (*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
|
520 ("%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
|
521 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
|
522 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
523 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
524 octave::unwind_action free_native_str ([=] () { ::free (native_str); }); |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
525 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
526 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
|
527 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
528 return retval; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
529 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
530 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
531 std::string |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
532 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
|
533 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
|
534 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
|
535 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
536 const char *src = native_string.c_str (); |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
537 std::size_t srclen = native_string.length (); |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
538 |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
539 std::size_t length; |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
540 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
|
541 srclen, &length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
542 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
|
543 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
544 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
|
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: 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
|
547 "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
|
548 else |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
549 (*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
|
550 ("%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
|
551 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
|
552 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
553 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
554 octave::unwind_action free_utf8_str ([=] () { ::free (utf8_str); }); |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
555 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
556 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
|
557 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
558 return retval; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
559 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
560 |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
561 unsigned int |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
562 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
|
563 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
|
564 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
|
565 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
566 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
|
567 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
568 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
|
569 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
|
570 const char *inv_utf8 = in_chr; |
30394
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29655
diff
changeset
|
571 const char *const in_end = in_chr + in_str.length (); |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
572 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
|
573 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
574 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
|
575 (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
|
576 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 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
578 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
|
579 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
|
580 else |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
581 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
582 num_replacements++; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
583 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
|
584 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
|
585 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
586 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
|
587 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
|
588 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
|
589 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
590 std::string fallback = "iso-8859-1"; |
29654
d13d090cb03a
use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents:
29358
diff
changeset
|
591 std::size_t lengthp; |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
592 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
|
593 (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
|
594 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
595 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
|
596 (*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
|
597 ("%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
|
598 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
|
599 |
28824
a98fd0657e35
Replace unwind_protect with more efficient constructs in liboctave (bug #59192).
Rik <rik@octave.org>
parents:
27957
diff
changeset
|
600 octave::unwind_action free_val_utf8 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
601 ([=] () { ::free (val_utf8); }); |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
602 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
603 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
|
604 lengthp); |
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 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
607 } |
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 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
|
610 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
|
611 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
612 |
32021
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
613 std::string |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
614 octave::string::u16_to_encoding (const std::string& who, |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
615 const std::u16string& u16_string, |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
616 const std::string& encoding) |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
617 { |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
618 const uint16_t *src = reinterpret_cast<const uint16_t *> |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
619 (u16_string.c_str ()); |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
620 std::size_t srclen = u16_string.length (); |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
621 |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
622 std::size_t length; |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
623 char *native_str = octave_u16_conv_to_encoding (encoding.c_str (), src, |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
624 srclen, &length); |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
625 |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
626 if (! native_str) |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
627 { |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
628 if (errno == ENOSYS) |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
629 (*current_liboctave_error_handler) |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
630 ("%s: iconv() is not supported. Installing GNU libiconv and then " |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
631 "re-compiling Octave could fix this.", who.c_str ()); |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
632 else |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
633 (*current_liboctave_error_handler) |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
634 ("%s: converting from UTF-16 to codepage '%s' failed: %s", |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
635 who.c_str (), encoding.c_str (), std::strerror (errno)); |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
636 } |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
637 |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
638 octave::unwind_action free_native_str ([=] () { ::free (native_str); }); |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
639 |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
640 std::string retval = std::string (native_str, length); |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
641 |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
642 return retval; |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
643 } |
da2954782945
gui: Use iconv/gnulib to save editor content in non-UTF-8.
Markus Mützel <markus.muetzel@gmx.de>
parents:
31970
diff
changeset
|
644 |
32049
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
645 std::vector<std::string> |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
646 octave::string::get_encoding_list () |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
647 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
648 static std::vector<std::string> encoding_list; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
649 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
650 if (encoding_list.empty ()) |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
651 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
652 #if defined (HAVE_ICONVLIST) |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
653 // get number of supported encodings |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
654 std::size_t count = 0; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
655 octave_iconvlist_wrapper ( |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
656 [] (unsigned int num, const char * const *, void *data) -> int |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
657 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
658 std::size_t *count_ptr = static_cast<std::size_t *> (data); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
659 *count_ptr = num; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
660 return 0; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
661 }, |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
662 &count); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
663 |
32513
1de97b475564
maint: Add space " " between C++ cast and argument.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32049
diff
changeset
|
664 if (count == static_cast<size_t> (-1)) |
32049
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
665 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
666 encoding_list.push_back ("UTF-8"); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
667 return encoding_list; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
668 } |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
669 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
670 # if defined (HAVE_ICONV_CANONICALIZE) |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
671 // use unordered_set to skip canonicalized aliases |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
672 std::unordered_set<std::string> encoding_set; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
673 encoding_set.reserve (count); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
674 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
675 // populate vector with name of encodings |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
676 octave_iconvlist_wrapper ( |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
677 [] (unsigned int num, const char * const *names, void *data) -> int |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
678 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
679 std::unordered_set<std::string> *encoding_set_ptr |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
680 = static_cast<std::unordered_set<std::string> *> (data); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
681 for (std::size_t i = 0; i < num; i++) |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
682 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
683 const char *canonicalized_enc |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
684 = octave_iconv_canonicalize_wrapper (names[i]); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
685 encoding_set_ptr->insert (canonicalized_enc); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
686 } |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
687 return 0; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
688 }, |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
689 &encoding_set); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
690 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
691 encoding_list.assign (encoding_set.begin (), encoding_set.end ()); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
692 # endif |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
693 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
694 #else |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
695 // Use hardcoded list of encodings as a fallback for platforms without |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
696 // iconvlist (or another way of programmatically querrying a list of |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
697 // supported encodings). |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
698 // This list is inspired by the encodings supported by Geany. |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
699 encoding_list |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
700 = {"ISO-8859-1", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
701 "ISO-8859-2", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
702 "ISO-8859-3", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
703 "ISO-8859-4", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
704 "ISO-8859-5", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
705 "ISO-8859-6", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
706 "ISO-8859-7", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
707 "ISO-8859-8", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
708 "ISO-8859-9", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
709 "ISO-8859-10", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
710 "ISO-8859-13", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
711 "ISO-8859-14", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
712 "ISO-8859-15", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
713 "ISO-8859-16", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
714 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
715 "UTF-7", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
716 "UTF-8", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
717 "UTF-16LE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
718 "UTF-16BE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
719 "UTF-32LE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
720 "UTF-32BE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
721 "UCS-2LE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
722 "UCS-2BE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
723 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
724 "ARMSCII-8", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
725 "BIG5", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
726 "BIG5-HKSCS", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
727 "CP866", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
728 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
729 "EUC-JP", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
730 "EUC-KR", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
731 "EUC-TW", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
732 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
733 "GB18030", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
734 "GB_2312-80", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
735 "GBK", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
736 "HZ", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
737 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
738 "IBM850", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
739 "IBM852", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
740 "IBM855", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
741 "IBM857", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
742 "IBM862", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
743 "IBM864", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
744 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
745 "ISO-2022-JP", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
746 "ISO-2022-KR", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
747 "JOHAB", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
748 "KOI8-R", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
749 "KOI8-U", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
750 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
751 "SHIFT_JIS", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
752 "TCVN", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
753 "TIS-620", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
754 "UHC", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
755 "VISCII", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
756 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
757 "CP1250", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
758 "CP1251", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
759 "CP1252", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
760 "CP1253", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
761 "CP1254", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
762 "CP1255", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
763 "CP1256", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
764 "CP1257", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
765 "CP1258", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
766 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
767 "CP932" |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
768 }; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
769 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
770 // FIXME: Should we check whether those are actually valid encoding |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
771 // identifiers? |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
772 #endif |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
773 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
774 // sort list of encodings |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
775 std::sort (encoding_list.begin (), encoding_list.end ()); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
776 } |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
777 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
778 return encoding_list; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
779 } |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
780 |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
781 typedef octave::string::codecvt_u8::InternT InternT; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
782 typedef octave::string::codecvt_u8::ExternT ExternT; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
783 typedef octave::string::codecvt_u8::StateT StateT; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
784 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
785 typename std::codecvt<InternT, ExternT, StateT>::result |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
786 octave::string::codecvt_u8::do_out |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
787 (StateT& /* state */, |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
788 const InternT* from, const InternT* from_end, const InternT*& from_next, |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
789 ExternT* to, ExternT* to_end, ExternT*& to_next) const |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
790 { |
31970
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
791 to_next = to; |
31968
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
792 if (from_end <= from) |
31970
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
793 { |
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
794 from_next = from_end; |
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
795 return std::codecvt<InternT, ExternT, StateT>::noconv; |
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
796 } |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
797 |
31968
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
798 // Check if buffer ends in a complete UTF-8 surrogate. |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
799 // FIXME: If this is the last call before a stream is closed, we should |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
800 // convert trailing bytes even if they look incomplete. |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
801 // How can we detect that? |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
802 std::size_t pop_end = 0; |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
803 if ((*(from_end-1) & 0b10000000) == 0b10000000) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
804 { |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
805 // The last byte is part of a surrogate. Check if it is complete. |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
806 |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
807 // number of bytes of the surrogate in the buffer |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
808 std::size_t num_bytes_in_buf = 1; |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
809 // Find initial byte of surrogate |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
810 while (((*(from_end-num_bytes_in_buf) & 0b11000000) != 0b11000000) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
811 && (num_bytes_in_buf < 4) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
812 && (from_end-num_bytes_in_buf > from)) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
813 num_bytes_in_buf++; |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
814 |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
815 // If the start of the surrogate is not in the buffer, we need to |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
816 // continue with the invalid UTF-8 sequence to avoid an infinite loop. |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
817 // Check if we found an initial byte and if there are enough bytes in the |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
818 // buffer to complete the surrogate. |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
819 if ((((*(from_end-num_bytes_in_buf) & 0b11100000) == 0b11000000) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
820 && (num_bytes_in_buf < 2)) // incomplete 2-byte surrogate |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
821 || (((*(from_end-num_bytes_in_buf) & 0b11110000) == 0b11100000) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
822 && (num_bytes_in_buf < 3)) // incomplete 3-byte surrogate |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
823 || (((*(from_end-num_bytes_in_buf) & 0b11111000) == 0b11110000) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
824 && (num_bytes_in_buf < 4))) // incomplete 4-byte surrogate |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
825 pop_end = num_bytes_in_buf; |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
826 } |
31970
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
827 from_next = from_end - pop_end; |
31968
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
828 |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
829 std::size_t srclen = (from_end-from-pop_end) * sizeof (InternT); |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
830 std::size_t length = (to_end-to) * sizeof (ExternT); |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
831 if (srclen < 1 || length < 1) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
832 return std::codecvt<InternT, ExternT, StateT>::partial; |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
833 |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
834 // Convert from UTF-8 to output encoding |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
835 const uint8_t *u8_str = reinterpret_cast<const uint8_t *> (from); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
836 char *enc_str = octave_u8_conv_to_encoding (m_enc.c_str (), u8_str, srclen, |
31968
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
837 &length); |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
838 |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
839 if (length < 1) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
840 return std::codecvt<InternT, ExternT, StateT>::partial; |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
841 |
31968
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
842 size_t max = (to_end - to) * sizeof (ExternT); |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
843 // FIXME: If the output encoding is a multibyte or variable byte encoding, |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
844 // we should ensure that we don't cut off a "partial" surrogate from |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
845 // the output. |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
846 // Can this ever happen? |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
847 if (length < max) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
848 max = length; |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
849 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
850 // copy conversion result to output |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
851 std::copy_n (enc_str, max, to); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
852 ::free (enc_str); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
853 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
854 from_next = from + srclen; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
855 to_next = to + max; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
856 |
31968
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
857 return ((pop_end > 0 || max < length) |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
858 ? std::codecvt<InternT, ExternT, StateT>::partial |
63038dcbd648
Try to gather complete UTF-8 surrogates when converting encoding (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31706
diff
changeset
|
859 : std::codecvt<InternT, ExternT, StateT>::ok); |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
860 } |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
861 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
862 typename std::codecvt<InternT, ExternT, StateT>::result |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
863 octave::string::codecvt_u8::do_in |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
864 (StateT& /* state */, |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
865 const ExternT* from, const ExternT* from_end, const ExternT*& from_next, |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
866 InternT* to, InternT* to_end, InternT*& to_next) const |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
867 { |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
868 // Convert from input encoding to UTF-8 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
869 std::size_t srclen = (from_end-from) * sizeof (ExternT); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
870 std::size_t lengthp = (to_end-to) * sizeof (InternT); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
871 const char *enc_str = reinterpret_cast<const char *> (from); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
872 uint8_t *u8_str = octave_u8_conv_from_encoding (m_enc.c_str (), |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
873 enc_str, srclen, &lengthp); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
874 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
875 std::size_t max = to_end - to; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
876 if (lengthp < max) |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
877 max = lengthp; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
878 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
879 // copy conversion result to output |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
880 std::copy_n (u8_str, max, to); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
881 ::free (u8_str); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
882 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
883 from_next = from + srclen; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
884 to_next = to + max; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
885 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
886 return std::codecvt<InternT, ExternT, StateT>::ok; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
887 } |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
888 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
889 int octave::string::codecvt_u8::do_length |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
890 (StateT& /* state */, const ExternT *src, const ExternT *end, |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
891 std::size_t max) const |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
892 { |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
893 // return number of external characters that produce MAX internal ones |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
894 std::size_t srclen = end-src; |
32540
06a541ee4f05
avoid variable-length array declarations
John W. Eaton <jwe@octave.org>
parents:
32513
diff
changeset
|
895 OCTAVE_LOCAL_BUFFER (std::size_t, offsets, srclen); |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
896 std::size_t lengthp = max; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
897 octave_u8_conv_from_encoding_offsets (m_enc.c_str (), src, srclen, offsets, |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
898 &lengthp); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
899 std::size_t ext_char; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
900 for (ext_char = 0; ext_char < srclen; ext_char++) |
32590
3c2c585965cc
maint: C++ style check for liboctave/ before 9.1 release.
Rik <rik@octave.org>
parents:
32540
diff
changeset
|
901 { |
3c2c585965cc
maint: C++ style check for liboctave/ before 9.1 release.
Rik <rik@octave.org>
parents:
32540
diff
changeset
|
902 if (offsets[ext_char] != static_cast<size_t> (-1) |
3c2c585965cc
maint: C++ style check for liboctave/ before 9.1 release.
Rik <rik@octave.org>
parents:
32540
diff
changeset
|
903 && offsets[ext_char] >= max) |
3c2c585965cc
maint: C++ style check for liboctave/ before 9.1 release.
Rik <rik@octave.org>
parents:
32540
diff
changeset
|
904 break; |
3c2c585965cc
maint: C++ style check for liboctave/ before 9.1 release.
Rik <rik@octave.org>
parents:
32540
diff
changeset
|
905 } |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
906 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
907 return ext_char; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
908 } |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
909 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
910 |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
911 template <typename T> |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
912 std::string |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
913 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
|
914 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
915 std::string s; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
916 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
917 if (len <= 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
918 len = 10; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
919 |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
920 static const T out_of_range_top |
32513
1de97b475564
maint: Add space " " between C++ cast and argument.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32049
diff
changeset
|
921 = static_cast<T> (std::numeric_limits<int>::max ()) + 1.; |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
922 static const T out_of_range_bottom |
32513
1de97b475564
maint: Add space " " between C++ cast and argument.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32049
diff
changeset
|
923 = static_cast<T> (std::numeric_limits<int>::min ()) - 1.; |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
924 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
|
925 { |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
926 if (val > 0) |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
927 s = "1/0"; |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
928 else |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
929 s = "-1/0"; |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
930 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
931 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
|
932 s = "0/0"; |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
933 else if (val <= out_of_range_bottom || val >= out_of_range_top |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
934 || 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
|
935 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
936 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
937 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
938 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
|
939 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
940 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
941 else |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
942 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
943 T lastn = 1; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
944 T lastd = 0; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
945 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
|
946 T d = 1; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
947 T frac = val - n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
948 |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
949 std::ostringstream init_buf; |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
950 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
|
951 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
|
952 s = init_buf.str (); |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
953 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
954 while (true) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
955 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
956 T flip = 1 / frac; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
957 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
|
958 T nextn = n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
959 T nextd = d; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
960 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
961 // Have we converged to 1/intmax ? |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
962 if (std::abs (flip) > out_of_range_top) |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
963 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
964 lastn = n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
965 lastd = d; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
966 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
967 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
968 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
969 frac = flip - step; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
970 n = step * n + lastn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
971 d = step * d + lastd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
972 lastn = nextn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
973 lastd = nextd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
974 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
975 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
976 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
977 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
|
978 << '/' << static_cast<int> (d); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
979 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
980 if (n < 0 && d < 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
981 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
982 // 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
|
983 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
|
984 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
985 } |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
986 else |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
987 { |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
988 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
|
989 break; |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
990 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
991 |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
992 if (std::abs (n) >= out_of_range_top |
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
993 || std::abs (d) >= out_of_range_top) |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
994 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
995 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
996 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
997 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
998 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
999 if (lastd < 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1000 { |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
1001 // 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
|
1002 lastd = - lastd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1003 lastn = - lastn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1004 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1005 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1006 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
|
1007 << '/' << static_cast<int> (lastd); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1008 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1009 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1010 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1011 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1012 return s; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1013 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1014 |
27956
2310164737b3
fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
1015 // instantiate the template for float and double |
29230
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
1016 template OCTAVE_API std::string rational_approx <float> (float val, int len); |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
1017 template OCTAVE_API std::string rational_approx <double> (double val, int len); |