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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);