Mercurial > octave
annotate liboctave/util/oct-string.cc @ 32049:1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
* liboctave/wrappers/iconv-wrappers.h, liboctave/wrappers/iconv-wrappers.c
(octave_iconvlist_wrapper, octave_iconv_canonicalize_wrapper): Add wrappers for
libiconv functions.
* liboctave/util/oct-string.h, liboctave/util/oct-string.cc
(octave::string::get_encoding_list): Add new function that returns an ordered
list of canonicalized encoding names that are available from libiconv. Use list
of encoding identifiers as fallback on platforms without the required funcions.
* libgui/src/gui-settings.cc, libgui/src/gui-settings.h
(octave::gui_settings::get_codecs): Remove function.
(octave::gui_settings::combo_encoding): Show list of encoding names that are
actually available to the interpreter instead of a list of encodings available
in Qt.
* libgui/src/qt-interpreter-events.cc
(octave::qt_interpreter_events::gui_preference_adjust): Remove logic for mapping
between Qt encoding names and iconv encoding names.
* libgui/src/settings-dialog.cc: Remove unused header.
* m4/acinclude.m4 (OCTAVE_CHECK_ICONVLIST, OCTAVE_CHECK_ICONV_CANONICALIZE):
Add checks for functions from libiconv that are not available on all platforms.
* configure.ac: Call new functions.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Sat, 22 Apr 2023 19:01:35 +0200 |
parents | 8d30584b7525 |
children | 1de97b475564 |
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 // |
31706
597f3ee61a48
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
31364
diff
changeset
|
3 // Copyright (C) 2016-2023 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" |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
43 #include "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
|
44 #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
|
45 #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
|
46 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
47 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
48 static bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
49 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
|
50 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
|
51 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
52 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
|
53 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
|
54 return false; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
55 return true; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
56 } |
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 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
59 static bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
60 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
|
61 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
|
62 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
63 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
|
64 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
|
65 return false; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
66 return true; |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
67 } |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
68 |
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 // 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
|
71 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
72 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
|
73 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
|
74 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
75 return str.size (); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
76 } |
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 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
79 octave_idx_type |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
80 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
|
81 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
82 return str.numel (); |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
83 } |
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 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
86 typename T::size_type |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
87 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
|
88 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
89 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
|
90 } |
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 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
93 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
94 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
|
95 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
96 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
|
97 } |
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 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
100 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
101 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
|
102 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
103 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
|
104 } |
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 template <typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
107 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
108 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
|
109 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
110 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
|
111 } |
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 template <> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
114 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
115 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
|
116 { |
23592
80e3bfb7bd5a
maint: Deprecate is_vector and replace with isvector.
Rik <rik@octave.org>
parents:
23462
diff
changeset
|
117 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
|
118 && 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
|
119 } |
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 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
123 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
124 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
|
125 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
126 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
|
127 && 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
|
128 } |
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 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
131 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
132 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
|
133 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
134 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
|
135 && 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
|
136 } |
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 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
140 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
141 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
|
142 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
143 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
|
144 && 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
|
145 } |
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 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
148 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
149 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
|
150 { |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
151 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
|
152 && 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
|
153 } |
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 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
157 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
158 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
|
159 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
|
160 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
161 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
|
162 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
|
163 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
|
164 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
|
165 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
166 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
|
167 && 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
|
168 } |
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 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
171 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
172 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
|
173 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
|
174 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
175 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
|
176 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
|
177 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
|
178 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
|
179 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
180 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
|
181 && 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
|
182 } |
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 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
186 bool |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
187 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
|
188 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
|
189 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
190 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
|
191 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
|
192 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
|
193 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
|
194 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
195 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
|
196 && 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
|
197 } |
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 template<typename T> |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
200 bool |
23449
c763214a8260
maint: Use convention 'int *x' for naming pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
201 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
|
202 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
|
203 { |
25698
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
204 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
|
205 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
|
206 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
|
207 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
|
208 |
ac386820f2b6
Return true when strncmp matches, but number of characters exceeds strlen (bug #54373)
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
209 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
|
210 && 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
|
211 } |
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 // 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
|
215 #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
|
216 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
|
217 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
|
218 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
|
219 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
|
220 template API bool \ |
6b3faa844395
Set API tags in files in liboctave/util (patch #8919).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28851
diff
changeset
|
221 octave::string::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
|
222 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
|
223 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
|
224 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
|
225 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
|
226 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
|
227 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
|
228 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
|
229 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
|
230 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
|
231 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
|
232 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
|
233 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
|
234 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
235 // 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
|
236 // 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
|
237 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
|
238 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
|
239 |
26109cce022e
New string utility functions to replace caseless_str for liboctave (bug #48726)
Carnë Draug <carandraug@octave.org>
parents:
diff
changeset
|
240 #undef INSTANTIATE_OCTAVE_STRING |
26110
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
241 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
242 static inline bool |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
243 is_imag_unit (int c) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
244 { return c == 'i' || c == 'j'; } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
245 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
246 static double |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
247 single_num (std::istringstream& is) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
248 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
249 double num = 0.0; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
250 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
251 char c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
252 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
253 // Skip spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
254 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
255 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
256 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
257 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
258 } |
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 if (std::toupper (c) == 'I') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
261 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
262 // It's infinity. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
263 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
264 char c1 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
265 char c2 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
266 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
|
267 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
268 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
|
269 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
|
270 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
271 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
272 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
|
273 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
274 else if (c == 'N') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
275 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
276 // It's NA or NaN |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
277 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
278 char c1 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
279 if (c1 == 'A') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
280 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
281 num = octave_NA; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
282 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
|
283 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
284 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
285 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
286 char c2 = is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
287 if (c1 == 'a' && c2 == 'N') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
288 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
289 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
|
290 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
|
291 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
292 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
293 is.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
|
294 } |
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 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
297 is >> num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
298 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
299 return num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
300 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
301 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
302 static std::istringstream& |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
303 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
|
304 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
305 have_sign = imag = false; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
306 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
307 char c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
308 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
309 // Skip leading spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
310 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
311 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
312 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
313 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
314 } |
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 bool negative = false; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
317 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
318 // Accept leading sign. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
319 if (c == '+' || c == '-') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
320 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
321 have_sign = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
322 negative = c == '-'; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
323 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
324 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
325 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
326 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
327 // Skip spaces after sign. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
328 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
329 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
330 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
331 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
332 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
333 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
334 // 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
|
335 if (c == 'i') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
336 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
337 // possible infinity. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
338 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
339 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
340 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
341 if (is.eof ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
342 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
343 // 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
|
344 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
345 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
|
346 return is; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
347 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
348 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
349 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
350 if (std::tolower (c) != 'n') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
351 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
352 is.unget (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
353 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
354 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
355 else if (c == 'j') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
356 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
357 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
358 // 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
|
359 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
360 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
361 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
362 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
363 // Skip spaces after imaginary unit. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
364 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
365 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
366 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
367 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
368 } |
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 if (c == '*') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
371 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
372 // 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
|
373 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
374 num = single_num (is); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
375 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
376 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
377 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
378 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
379 num = 1.0; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
380 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
381 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
382 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
383 // 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
|
384 num = single_num (is); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
385 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
386 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
387 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
388 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
389 // Skip spaces after number. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
390 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
391 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
392 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
393 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
394 } |
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 if (c == '*') |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
397 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
398 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
399 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
400 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
401 // Skip spaces after operator. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
402 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
403 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
404 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
405 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
406 } |
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 if (is_imag_unit (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
409 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
410 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
411 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
412 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
413 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
414 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
415 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
|
416 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
417 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
|
418 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
419 imag = true; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
420 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
421 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
422 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
423 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
424 } |
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 if (is.good ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
427 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
428 // Skip trailing spaces. |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
429 while (isspace (c)) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
430 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
431 is.get (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
432 c = is.peek (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
433 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
434 } |
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 if (negative) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
437 num = -num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
438 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
439 return is; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
440 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
441 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
442 static inline void |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
443 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
|
444 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
445 #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
|
446 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
447 c.imag (num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
448 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
449 c.real (num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
450 #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
|
451 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
452 c.imag () = num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
453 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
454 c.real () = num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
455 #else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
456 if (imag) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
457 c = Complex (c.real (), num); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
458 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
459 c = Complex (num, c.imag ()); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
460 #endif |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
461 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
462 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
463 Complex |
26127
37e3aa267374
Move function str2double inside octave::string namespace (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26111
diff
changeset
|
464 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
|
465 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
466 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
|
467 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
468 std::string str = str_arg; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
469 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
470 // 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
|
471 // 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
|
472 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
|
473 std::istringstream is (str); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
474 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
475 double num; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
476 bool i1, i2, s1, s2; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
477 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
478 if (is.eof ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
479 val = octave::numeric_limits<double>::NaN (); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
480 else 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
|
481 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
|
482 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
483 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
484 set_component (val, num, i1); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
485 |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
486 if (! is.eof ()) |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
487 { |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
488 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
|
489 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
|
490 else |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
491 set_component (val, num, i2); |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
492 } |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
493 } |
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 return val; |
b543cf12c63f
Move octave_str2double to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25828
diff
changeset
|
496 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
497 |
26702
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
498 std::string |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
499 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
|
500 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
|
501 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
|
502 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
503 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
|
504 (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
|
505 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
|
506 |
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
|
507 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
|
508 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
|
509 srclen, &length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
510 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
511 if (! native_str) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
512 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
513 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
|
514 (*current_liboctave_error_handler) |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
515 ("%s: 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
|
516 "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
|
517 else |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
518 (*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
|
519 ("%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
|
520 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
|
521 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
522 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
523 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
|
524 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
525 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
|
526 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
527 return retval; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
528 } |
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 std::string |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
531 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
|
532 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
|
533 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
|
534 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
535 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
|
536 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
|
537 |
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
|
538 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
|
539 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
|
540 srclen, &length); |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
541 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
|
542 { |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
543 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
|
544 (*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
|
545 ("%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
|
546 "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
|
547 else |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
548 (*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
|
549 ("%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
|
550 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
|
551 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
552 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
553 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
|
554 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
555 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
|
556 |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
557 return retval; |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
558 } |
2dc190401eeb
Add C++ functions to convert encoding of strings (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
559 |
27785
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
560 unsigned int |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
561 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
|
562 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
|
563 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
|
564 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
565 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
|
566 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
567 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
|
568 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
|
569 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
|
570 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
|
571 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
|
572 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
573 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
|
574 (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
|
575 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
|
576 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
577 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
|
578 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
|
579 else |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
580 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
581 num_replacements++; |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
582 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
|
583 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
|
584 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
585 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
|
586 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
|
587 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
|
588 { |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
589 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
|
590 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
|
591 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
|
592 (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
|
593 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
594 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
|
595 (*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
|
596 ("%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
|
597 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
|
598 |
28824
a98fd0657e35
Replace unwind_protect with more efficient constructs in liboctave (bug #59192).
Rik <rik@octave.org>
parents:
27957
diff
changeset
|
599 octave::unwind_action free_val_utf8 |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
600 ([=] () { ::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
|
601 |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
602 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
|
603 lengthp); |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
604 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
605 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
606 } |
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 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
|
609 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
|
610 } |
3f5026fd8da8
Create valid UTF-8 from .m file content (bug #57341).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27473
diff
changeset
|
611 |
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
|
612 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
|
613 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
|
614 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
|
615 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
|
616 { |
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 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
|
618 (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
|
619 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
|
620 |
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 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
|
622 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
|
623 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
|
624 |
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 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
|
626 { |
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 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
|
628 (*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
|
629 ("%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
|
630 "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
|
631 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
|
632 (*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
|
633 ("%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
|
634 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
|
635 } |
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 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
|
638 |
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 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
|
640 |
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 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
|
642 } |
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 |
32049
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
644 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
|
645 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
|
646 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
647 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
|
648 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
649 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
|
650 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
651 #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
|
652 // 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
|
653 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
|
654 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
|
655 [] (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
|
656 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
657 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
|
658 *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
|
659 return 0; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
660 }, |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
661 &count); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
662 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
663 if (count == static_cast<size_t>(-1)) |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
664 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
665 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
|
666 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
|
667 } |
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 # 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
|
670 // 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
|
671 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
|
672 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
|
673 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
674 // 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
|
675 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
|
676 [] (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
|
677 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
678 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
|
679 = 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
|
680 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
|
681 { |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
682 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
|
683 = 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
|
684 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
|
685 } |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
686 return 0; |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
687 }, |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
688 &encoding_set); |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
689 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
690 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
|
691 # endif |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
692 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
693 #else |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
694 // 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
|
695 // 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
|
696 // supported encodings). |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
697 // 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
|
698 encoding_list |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
699 = {"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
|
700 "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
|
701 "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
|
702 "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
|
703 "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
|
704 "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
|
705 "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
|
706 "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
|
707 "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
|
708 "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
|
709 "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
|
710 "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
|
711 "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
|
712 "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
|
713 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
714 "UTF-7", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
715 "UTF-8", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
716 "UTF-16LE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
717 "UTF-16BE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
718 "UTF-32LE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
719 "UTF-32BE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
720 "UCS-2LE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
721 "UCS-2BE", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
722 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
723 "ARMSCII-8", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
724 "BIG5", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
725 "BIG5-HKSCS", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
726 "CP866", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
727 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
728 "EUC-JP", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
729 "EUC-KR", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
730 "EUC-TW", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
731 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
732 "GB18030", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
733 "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
|
734 "GBK", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
735 "HZ", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
736 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
737 "IBM850", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
738 "IBM852", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
739 "IBM855", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
740 "IBM857", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
741 "IBM862", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
742 "IBM864", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
743 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
744 "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
|
745 "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
|
746 "JOHAB", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
747 "KOI8-R", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
748 "KOI8-U", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
749 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
750 "SHIFT_JIS", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
751 "TCVN", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
752 "TIS-620", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
753 "UHC", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
754 "VISCII", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
755 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
756 "CP1250", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
757 "CP1251", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
758 "CP1252", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
759 "CP1253", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
760 "CP1254", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
761 "CP1255", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
762 "CP1256", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
763 "CP1257", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
764 "CP1258", |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
765 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
766 "CP932" |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
767 }; |
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 // 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
|
770 // identifiers? |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
771 #endif |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
772 |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
773 // 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
|
774 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
|
775 } |
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 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
|
778 } |
1c99c8f020f7
gui: Show encodings available with iconv in file editor preferences.
Markus Mützel <markus.muetzel@gmx.de>
parents:
32029
diff
changeset
|
779 |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
780 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
|
781 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
|
782 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
|
783 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
784 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
|
785 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
|
786 (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
|
787 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
|
788 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
|
789 { |
31970
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
790 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
|
791 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
|
792 { |
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
793 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
|
794 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
|
795 } |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
796 |
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
|
797 // 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
|
798 // 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
|
799 // 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
|
800 // 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
|
801 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
|
802 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
|
803 { |
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 // 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
|
805 |
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 // 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
|
807 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
|
808 // 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
|
809 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
|
810 && (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
|
811 && (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
|
812 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
|
813 |
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 // 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
|
815 // 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
|
816 // 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
|
817 // 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
|
818 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
|
819 && (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
|
820 || (((*(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
|
821 && (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
|
822 || (((*(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
|
823 && (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
|
824 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
|
825 } |
31970
701fbdfb3bc0
codecvt_u8: Avoid random segmentation faults with libc++ (bug #63930).
Markus Mützel <markus.muetzel@gmx.de>
parents:
31968
diff
changeset
|
826 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
|
827 |
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 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
|
829 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
|
830 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
|
831 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
|
832 |
30822
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
833 // 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
|
834 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
|
835 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
|
836 &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
|
837 |
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 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
|
839 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
|
840 |
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
|
841 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
|
842 // 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
|
843 // 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
|
844 // 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
|
845 // 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
|
846 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
|
847 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
|
848 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
849 // 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
|
850 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
|
851 ::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
|
852 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
853 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
|
854 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
|
855 |
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
|
856 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
|
857 ? 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
|
858 : 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
|
859 } |
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 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
|
862 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
|
863 (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
|
864 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
|
865 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
|
866 { |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
867 // 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
|
868 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
|
869 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
|
870 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
|
871 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
|
872 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
|
873 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
874 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
|
875 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
|
876 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
|
877 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
878 // 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
|
879 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
|
880 ::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
|
881 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
882 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
|
883 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
|
884 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
885 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
|
886 } |
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 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
|
889 (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
|
890 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
|
891 { |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
892 // 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
|
893 std::size_t srclen = end-src; |
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 offsets[srclen]; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
895 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
|
896 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
|
897 &lengthp); |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
898 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
|
899 for (ext_char = 0; ext_char < srclen; 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 { |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
901 if (offsets[ext_char] != static_cast<size_t> (-1) |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
902 && offsets[ext_char] >= max) |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
903 break; |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
904 } |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
905 |
0826c503f294
Encoding facet based on gnulib uniconv for STL iostreams (bug #61839).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
906 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
|
907 } |
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 |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
910 template <typename T> |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
911 std::string |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
912 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
|
913 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
914 std::string s; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
915 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
916 if (len <= 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
917 len = 10; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
918 |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
919 static const T out_of_range_top |
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
920 = static_cast<T>(std::numeric_limits<int>::max ()) + 1.; |
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
921 static const T out_of_range_bottom |
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
922 = 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
|
923 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
|
924 { |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
925 if (val > 0) |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
926 s = "1/0"; |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
927 else |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
928 s = "-1/0"; |
6c482f11f9ad
Return "-1/0" for rational approximation of -Inf instead of "1/0".
Rik <rik@octave.org>
parents:
26127
diff
changeset
|
929 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
930 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
|
931 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
|
932 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
|
933 || 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
|
934 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
935 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
936 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
937 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
|
938 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
939 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
940 else |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
941 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
942 T lastn = 1; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
943 T lastd = 0; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
944 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
|
945 T d = 1; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
946 T frac = val - n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
947 |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
948 std::ostringstream init_buf; |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
949 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
|
950 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
|
951 s = init_buf.str (); |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
952 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
953 while (true) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
954 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
955 T flip = 1 / frac; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
956 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
|
957 T nextn = n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
958 T nextd = d; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
959 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
960 // 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
|
961 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
|
962 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
963 lastn = n; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
964 lastd = d; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
965 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
966 } |
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 frac = flip - step; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
969 n = step * n + lastn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
970 d = step * d + lastd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
971 lastn = nextn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
972 lastd = nextd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
973 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
974 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
975 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
976 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
|
977 << '/' << static_cast<int> (d); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
978 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
979 if (n < 0 && d < 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
980 { |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
981 // 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
|
982 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
|
983 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
984 } |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
985 else |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
986 { |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
987 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
|
988 break; |
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
989 } |
26111
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
990 |
30867
014030798d5e
Avoid issues when converting large integers to floating point (bug #62212).
Markus Mützel <markus.muetzel@gmx.de>
parents:
30564
diff
changeset
|
991 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
|
992 || 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
|
993 break; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
994 |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
995 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
996 } |
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 if (lastd < 0) |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
999 { |
27473
d503426130bf
Display '*' rather than '0' for small rational approximations (bug #56941)
Rik <rik@octave.org>
parents:
26702
diff
changeset
|
1000 // 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
|
1001 lastd = - lastd; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1002 lastn = - lastn; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1003 std::ostringstream buf; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1004 buf.flags (std::ios::fixed); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1005 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
|
1006 << '/' << static_cast<int> (lastd); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1007 s = buf.str (); |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1008 } |
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 return s; |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1012 } |
3e44ed9d50b6
Move rational_approx to liboctave (patch #9084).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26110
diff
changeset
|
1013 |
27956
2310164737b3
fix many spelling errors (bug #57613)
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
1014 // 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
|
1015 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
|
1016 template OCTAVE_API std::string rational_approx <double> (double val, int len); |