Mercurial > octave
annotate libinterp/corefcn/oct-stream.h @ 27447:396996f1dad0
use std::atomic to implement refcount class
* oct-atomic.h, oct-atomic.c: New files.
* liboctave/util/module.mk: Update.
* dim-vector.h (dim_vector::increment_count,
dim_vector::decrement_count): New functions. Use them instead of
OCTAVE_ATOMIC_INCREMENT and OCTAVE_ATOMIC_DECREMENT macros.
* Array.h (Array<T>::jit_ref_count): Return int, not pointer. Change
all uses.
* jit-typeinfo.h, jit-typeinfo.cc (jit_array::m_ref_count): Store
integer, not pointer. Change all uses.
* oct-refcount.h (OCTAVE_ATOMIC_INCREMENT, OCTAVE_ATOMIC_DECREMENT,
OCTAVE_ATOMIC_POST_INCREMENT, OCTAVE_ATOMIC_POST_DECREMENT):
Delete macros.
(refcount::m_count): Now std::atomic<T> instead of T.
(refcount::operator++, refcount::operator--): Define using std::atomic
operators instead of increment macros.
(refcount::get): Delete.
(class refcount): Explicitly delete assignment operator and copy
constructor. Explicitly use default destructor. Eliminate all uses
of assignment as directly setting the reference count value apart from
initialization should not be needed.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 25 Sep 2019 17:57:08 -0400 |
parents | 1c8b20731af4 |
children | 8600f5ea1ec1 |
rev | line source |
---|---|
2117 | 1 /* |
2 | |
26376
00f796120a6d
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
3 Copyright (C) 1996-2019 John W. Eaton |
2117 | 4 |
5 This file is part of Octave. | |
6 | |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23795
diff
changeset
|
7 Octave is free software: you can redistribute it and/or modify it |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
8 under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23795
diff
changeset
|
9 the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
10 (at your option) any later version. |
2117 | 11 |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
12 Octave is distributed in the hope that it will be useful, but |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
13 WITHOUT ANY WARRANTY; without even the implied warranty of |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
15 GNU General Public License for more details. |
2117 | 16 |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23795
diff
changeset
|
19 <https://www.gnu.org/licenses/>. |
2117 | 20 |
21 */ | |
22 | |
20791
f7084eae3318
maint: Use Octave coding conventions for #if statements.
Rik <rik@octave.org>
parents:
20465
diff
changeset
|
23 #if ! defined (octave_oct_stream_h) |
17822
ebb3ef964372
maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents:
17787
diff
changeset
|
24 #define octave_oct_stream_h 1 |
2117 | 25 |
21244
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21139
diff
changeset
|
26 #include "octave-config.h" |
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21139
diff
changeset
|
27 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
28 #include <ios> |
8950
d865363208d6
include <iosfwd> instead of <iostream> in header files
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
29 #include <iosfwd> |
21475
4f3e63d75f33
use std::deque instead of Array to hold scanf and printf format elements
John W. Eaton <jwe@octave.org>
parents:
21244
diff
changeset
|
30 #include <list> |
4f3e63d75f33
use std::deque instead of Array to hold scanf and printf format elements
John W. Eaton <jwe@octave.org>
parents:
21244
diff
changeset
|
31 #include <map> |
2877 | 32 #include <string> |
2117 | 33 |
21477
4fc04d04dd9c
make printf and scanf format element and list objects private
John W. Eaton <jwe@octave.org>
parents:
21475
diff
changeset
|
34 // These only appear as reference arguments or return values. |
4fc04d04dd9c
make printf and scanf format element and list objects private
John W. Eaton <jwe@octave.org>
parents:
21475
diff
changeset
|
35 |
4fc04d04dd9c
make printf and scanf format element and list objects private
John W. Eaton <jwe@octave.org>
parents:
21475
diff
changeset
|
36 template <typename T> class Array; |
21503
20bf0ec536e2
integrate textscan more completely with octave_stream class
John W. Eaton <jwe@octave.org>
parents:
21502
diff
changeset
|
37 class Cell; |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
38 class octave_value; |
21502
7a19c5678f91
move textscan class to oct-stream.cc and textscan function to file-io.cc
John W. Eaton <jwe@octave.org>
parents:
21477
diff
changeset
|
39 class octave_value_list; |
21477
4fc04d04dd9c
make printf and scanf format element and list objects private
John W. Eaton <jwe@octave.org>
parents:
21475
diff
changeset
|
40 class string_vector; |
4fc04d04dd9c
make printf and scanf format element and list objects private
John W. Eaton <jwe@octave.org>
parents:
21475
diff
changeset
|
41 |
2317 | 42 #include "data-conv.h" |
43 #include "mach-info.h" | |
13985
43cc49c7abd1
Use thread-safe atomic reference counting (GCC and MSVC).
Michael Goffioul <michael.goffioul@gmail.com>
parents:
13983
diff
changeset
|
44 #include "oct-refcount.h" |
2117 | 45 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
46 namespace octave |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
47 { |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
48 class interpreter; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
49 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
50 // These are only needed as arguments to private functions, so they |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
51 // are also treated as private. |
2117 | 52 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
53 class scanf_format_elt; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
54 class scanf_format_list; |
2117 | 55 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
56 class printf_format_elt; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
57 class printf_format_list; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
58 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
59 // Provide an interface for Octave streams. |
2117 | 60 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
61 class |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
62 OCTINTERP_API |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
63 base_stream |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
64 { |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
65 friend class stream; |
2117 | 66 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
67 public: |
2117 | 68 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
69 base_stream (std::ios::openmode arg_md = std::ios::in | std::ios::out, |
26703
29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26377
diff
changeset
|
70 mach_info::float_format ff = mach_info::native_float_format (), |
29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26377
diff
changeset
|
71 const std::string& encoding = "utf-8") |
27447
396996f1dad0
use std::atomic to implement refcount class
John W. Eaton <jwe@octave.org>
parents:
27279
diff
changeset
|
72 : m_count (1), m_mode (arg_md), m_flt_fmt (ff), m_encoding (encoding), |
27172 | 73 m_fail (false), m_open_state (true), m_errmsg () |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
74 { } |
2117 | 75 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
76 // No copying! |
2117 | 77 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
78 base_stream (const base_stream&) = delete; |
2117 | 79 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
80 base_stream& operator = (const base_stream&) = delete; |
2117 | 81 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
82 virtual ~base_stream (void) = default; |
2117 | 83 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
84 // The remaining functions are not specific to input or output only, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
85 // and must be provided by the derived classes. |
2117 | 86 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
87 // Position a stream at OFFSET relative to ORIGIN. |
2117 | 88 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
89 virtual int seek (off_t offset, int origin) = 0; |
2117 | 90 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
91 // Return current stream position. |
2117 | 92 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
93 virtual off_t tell (void) = 0; |
2117 | 94 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
95 // Return TRUE if EOF has been reached on this stream. |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
96 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
97 virtual bool eof (void) const = 0; |
2117 | 98 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
99 // The name of the file. |
2117 | 100 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
101 virtual std::string name (void) const = 0; |
2117 | 102 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
103 // If the derived class provides this function and it returns a |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
104 // pointer to a valid istream, scanf(), read(), getl(), and gets() |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
105 // will automatically work for this stream. |
2117 | 106 |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23738
diff
changeset
|
107 virtual std::istream * input_stream (void) { return nullptr; } |
3340 | 108 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
109 // If the derived class provides this function and it returns a |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
110 // pointer to a valid ostream, flush(), write(), and printf() will |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
111 // automatically work for this stream. |
3340 | 112 |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23738
diff
changeset
|
113 virtual std::ostream * output_stream (void) { return nullptr; } |
3652 | 114 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
115 // Return TRUE if this stream is open. |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
116 |
27172 | 117 bool is_open (void) const { return m_open_state; } |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
118 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
119 virtual void do_close (void) { } |
3340 | 120 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
121 void close (void) |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
122 { |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
123 if (is_open ()) |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
124 { |
27172 | 125 m_open_state = false; |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
126 do_close (); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
127 } |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
128 } |
11007
ffe58182db89
src/oct-stream.h (octave_base_stream::file_number): return 0, 1, and 2 for stdin, stdout, and stderr, -1 otherwise
John W. Eaton <jwe@octave.org>
parents:
11004
diff
changeset
|
129 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
130 virtual int file_number (void) const |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
131 { |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
132 // Kluge alert! |
3145 | 133 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
134 if (name () == "stdin") |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
135 return 0; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
136 else if (name () == "stdout") |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
137 return 1; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
138 else if (name () == "stderr") |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
139 return 2; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
140 else |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
141 return -1; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
142 } |
2117 | 143 |
27172 | 144 bool ok (void) const { return ! m_fail; } |
2117 | 145 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
146 // Return current error message for this stream. |
2117 | 147 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
148 std::string error (bool clear, int& err_num); |
2117 | 149 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
150 protected: |
2117 | 151 |
27172 | 152 int mode (void) const { return m_mode; } |
2117 | 153 |
27172 | 154 mach_info::float_format float_format (void) const { return m_flt_fmt; } |
2117 | 155 |
27172 | 156 std::string encoding (void) const { return m_encoding; } |
26703
29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26377
diff
changeset
|
157 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
158 // Set current error state and set fail to TRUE. |
4889 | 159 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
160 void error (const std::string& msg); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
161 void error (const std::string& who, const std::string& msg); |
2117 | 162 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
163 // Clear any error message and set fail to FALSE. |
3340 | 164 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
165 void clear (void); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
166 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
167 // Clear stream state. |
2117 | 168 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
169 void clearerr (void); |
2117 | 170 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
171 private: |
2117 | 172 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
173 // A reference count. |
27172 | 174 refcount<octave_idx_type> m_count; |
3340 | 175 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
176 // The permission bits for the file. Should be some combination of |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
177 // std::ios::open_mode bits. |
27172 | 178 int m_mode; |
2117 | 179 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
180 // Data format. |
27172 | 181 mach_info::float_format m_flt_fmt; |
2117 | 182 |
26703
29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26377
diff
changeset
|
183 // Code page |
27172 | 184 std::string m_encoding; |
26703
29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26377
diff
changeset
|
185 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
186 // TRUE if an error has occurred. |
27172 | 187 bool m_fail; |
2117 | 188 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
189 // TRUE if this stream is open. |
27172 | 190 bool m_open_state; |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
191 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
192 // Should contain error message if fail is TRUE. |
27172 | 193 std::string m_errmsg; |
2117 | 194 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
195 // Functions that are defined for all input streams (input streams |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
196 // are those that define is). |
2117 | 197 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
198 std::string do_gets (octave_idx_type max_len, bool& err, bool strip_newline, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
199 const std::string& who /* = "gets" */); |
2117 | 200 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
201 std::string getl (octave_idx_type max_len, bool& err, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
202 const std::string& who /* = "getl" */); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
203 std::string gets (octave_idx_type max_len, bool& err, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
204 const std::string& who /* = "gets" */); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
205 off_t skipl (off_t count, bool& err, const std::string& who /* = "skipl" */); |
2117 | 206 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
207 octave_value do_scanf (scanf_format_list& fmt_list, octave_idx_type nr, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
208 octave_idx_type nc, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
209 bool one_elt_size_spec, octave_idx_type& count, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
210 const std::string& who /* = "scanf" */); |
2117 | 211 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
212 octave_value scanf (const std::string& fmt, const Array<double>& size, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
213 octave_idx_type& count, const std::string& who /* = "scanf" */); |
2215 | 214 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
215 bool do_oscanf (const scanf_format_elt *elt, octave_value&, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
216 const std::string& who /* = "scanf" */); |
21503
20bf0ec536e2
integrate textscan more completely with octave_stream class
John W. Eaton <jwe@octave.org>
parents:
21502
diff
changeset
|
217 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
218 octave_value_list oscanf (const std::string& fmt, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
219 const std::string& who /* = "scanf" */); |
2117 | 220 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
221 octave_value do_textscan (const std::string& fmt, octave_idx_type ntimes, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
222 const octave_value_list& options, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
223 const std::string& who, octave_idx_type& count); |
18650
491b0adfec95
compatibility fixes for printf integer format specifiers
John W. Eaton <jwe@octave.org>
parents:
17822
diff
changeset
|
224 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
225 // Functions that are defined for all output streams (output streams |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
226 // are those that define os). |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
227 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
228 int flush (void); |
2117 | 229 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
230 int do_numeric_printf_conv (std::ostream& os, const printf_format_elt *elt, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
231 int nsa, int sa_1, int sa_2, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
232 const octave_value& val, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
233 const std::string& who); |
2117 | 234 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
235 int do_printf (printf_format_list& fmt_list, const octave_value_list& args, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
236 const std::string& who /* = "printf" */); |
2117 | 237 |
27279
1c8b20731af4
Convert encoding just before writing to stream (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27172
diff
changeset
|
238 int printf (const std::string& fmt, const octave_value_list& args, |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
239 const std::string& who /* = "printf" */); |
2117 | 240 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
241 int puts (const std::string& s, const std::string& who /* = "puts" */); |
2117 | 242 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
243 // We can always do this in terms of seek(), so the derived class |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
244 // only has to provide that. |
2117 | 245 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
246 void invalid_operation (const std::string& who, const char *rw); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
247 }; |
2117 | 248 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
249 class |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
250 OCTINTERP_API |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
251 stream |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
252 { |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
253 public: |
2117 | 254 |
23457
21baad6b35c4
maint: Use C++11 nullptr rather than 0 or NULL when possible.
Rik <rik@octave.org>
parents:
23446
diff
changeset
|
255 stream (base_stream *bs = nullptr); |
3340 | 256 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
257 ~stream (void); |
2117 | 258 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
259 stream (const stream&); |
3340 | 260 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
261 stream& operator = (const stream&); |
2117 | 262 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
263 int flush (void); |
2117 | 264 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
265 std::string getl (octave_idx_type max_len, bool& err, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
266 const std::string& who /* = "getl" */); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
267 std::string getl (const octave_value& max_len, bool& err, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
268 const std::string& who /* = "getl" */); |
2117 | 269 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
270 std::string gets (octave_idx_type max_len, bool& err, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
271 const std::string& who /* = "gets" */); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
272 std::string gets (const octave_value& max_len, bool& err, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
273 const std::string& who /* = "gets" */); |
2117 | 274 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
275 off_t skipl (off_t count, bool& err, const std::string& who /* = "skipl" */); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
276 off_t skipl (const octave_value& count, bool& err, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
277 const std::string& who /* = "skipl" */); |
9701 | 278 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
279 int seek (off_t offset, int origin); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
280 int seek (const octave_value& offset, const octave_value& origin); |
2117 | 281 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
282 off_t tell (void); |
2117 | 283 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
284 int rewind (void); |
2117 | 285 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
286 bool is_open (void) const; |
3340 | 287 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
288 void close (void); |
3340 | 289 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
290 octave_value read (const Array<double>& size, octave_idx_type block_size, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
291 oct_data_conv::data_type input_type, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
292 oct_data_conv::data_type output_type, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
293 octave_idx_type skip, mach_info::float_format flt_fmt, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
294 octave_idx_type& count); |
2117 | 295 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
296 octave_idx_type write (const octave_value& data, octave_idx_type block_size, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
297 oct_data_conv::data_type output_type, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
298 octave_idx_type skip, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
299 mach_info::float_format flt_fmt); |
17416
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
16892
diff
changeset
|
300 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
301 bool write_bytes (const void *data, size_t n_elts); |
17416
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
16892
diff
changeset
|
302 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
303 bool skip_bytes (size_t n_elts); |
4944 | 304 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
305 template <typename T> |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
306 octave_idx_type write (const Array<T>& data, octave_idx_type block_size, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
307 oct_data_conv::data_type output_type, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
308 octave_idx_type skip, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
309 mach_info::float_format flt_fmt); |
2117 | 310 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
311 octave_value scanf (const std::string& fmt, const Array<double>& size, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
312 octave_idx_type& count, const std::string& who /* = "scanf" */); |
2117 | 313 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
314 octave_value scanf (const octave_value& fmt, const Array<double>& size, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
315 octave_idx_type& count, const std::string& who /* = "scanf" */); |
5279 | 316 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
317 octave_value_list oscanf (const std::string& fmt, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
318 const std::string& who /* = "scanf" */); |
2215 | 319 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
320 octave_value_list oscanf (const octave_value& fmt, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
321 const std::string& who /* = "scanf" */); |
5279 | 322 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
323 octave_value textscan (const std::string& fmt, octave_idx_type ntimes, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
324 const octave_value_list& options, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
325 const std::string& who, octave_idx_type& count); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
326 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
327 int printf (const std::string& fmt, const octave_value_list& args, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
328 const std::string& who /* = "printf" */); |
21503
20bf0ec536e2
integrate textscan more completely with octave_stream class
John W. Eaton <jwe@octave.org>
parents:
21502
diff
changeset
|
329 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
330 int printf (const octave_value& fmt, const octave_value_list& args, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
331 const std::string& who /* = "printf" */); |
5279 | 332 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
333 int puts (const std::string& s, const std::string& who /* = "puts" */); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
334 int puts (const octave_value& s, const std::string& who /* = "puts" */); |
2117 | 335 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
336 bool eof (void) const; |
2117 | 337 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
338 std::string error (bool clear, int& err_num); |
2117 | 339 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
340 std::string error (bool clear = false) |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
341 { |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
342 int err_num; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
343 return error (clear, err_num); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
344 } |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
345 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
346 // Set the error message and state. |
2117 | 347 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
348 void error (const std::string& msg) |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
349 { |
27172 | 350 if (m_rep) |
351 m_rep->error (msg); | |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
352 } |
4799 | 353 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
354 void error (const char *msg) { error (std::string (msg)); } |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
355 |
27172 | 356 int file_number (void) { return m_rep ? m_rep->file_number () : -1; } |
4799 | 357 |
27172 | 358 bool is_valid (void) const { return (m_rep != nullptr); } |
4799 | 359 |
27172 | 360 bool ok (void) const { return m_rep && m_rep->ok (); } |
3145 | 361 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
362 operator bool () const { return ok (); } |
3340 | 363 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
364 std::string name (void) const; |
2117 | 365 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
366 int mode (void) const; |
2117 | 367 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
368 mach_info::float_format float_format (void) const; |
2117 | 369 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
370 static std::string mode_as_string (int mode); |
26995
ab5bfee22d18
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
26703
diff
changeset
|
371 |
26703
29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26377
diff
changeset
|
372 std::string encoding (void) |
29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26377
diff
changeset
|
373 { |
27172 | 374 return m_rep ? m_rep->encoding () : std::string (); |
26703
29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
Markus Mützel <markus.muetzel@gmx.de>
parents:
26377
diff
changeset
|
375 } |
2117 | 376 |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
377 std::istream * input_stream (void) |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
378 { |
27172 | 379 return m_rep ? m_rep->input_stream () : nullptr; |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
380 } |
2117 | 381 |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
382 std::ostream * output_stream (void) |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
383 { |
27172 | 384 return m_rep ? m_rep->output_stream () : nullptr; |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
385 } |
2902 | 386 |
27172 | 387 void clearerr (void) { if (m_rep) m_rep->clearerr (); } |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
388 |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
389 private: |
16099
4b6c44096862
Backout changeset 238e499c5fea (locale support in scanf)
Rik <rik@octave.org>
parents:
16011
diff
changeset
|
390 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
391 // The actual representation of this stream. |
27172 | 392 base_stream *m_rep; |
4889 | 393 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
394 bool stream_ok (bool clear = true) const |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
395 { |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
396 bool retval = true; |
2117 | 397 |
27172 | 398 if (m_rep) |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
399 { |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
400 if (clear) |
27172 | 401 m_rep->clear (); |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
402 } |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
403 else |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
404 retval = false; |
2117 | 405 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
406 return retval; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
407 } |
5659 | 408 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
409 void invalid_operation (const std::string& who, const char *rw) |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
410 { |
27172 | 411 if (m_rep) |
412 m_rep->invalid_operation (who, rw); | |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
413 } |
5659 | 414 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
415 octave_value |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
416 finalize_read (std::list<void *>& input_buf_list, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
417 octave_idx_type input_buf_elts, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
418 octave_idx_type elts_read, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
419 octave_idx_type nr, octave_idx_type nc, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
420 oct_data_conv::data_type input_type, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
421 oct_data_conv::data_type output_type, |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
422 mach_info::float_format ffmt); |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
423 }; |
4944 | 424 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
425 class |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
426 OCTINTERP_API |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
427 stream_list |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
428 { |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
429 public: |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
430 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
431 stream_list (interpreter& interp); |
2117 | 432 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
433 stream_list (const stream_list&) = delete; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
434 stream_list& operator = (const stream_list&) = delete; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
435 |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
436 ~stream_list (void); |
2117 | 437 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
438 int insert (stream& os); |
2117 | 439 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
440 stream lookup (int fid, const std::string& who = "") const; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
441 stream lookup (const octave_value& fid, const std::string& who = "") const; |
2117 | 442 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
443 int remove (int fid, const std::string& who = ""); |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
444 int remove (const octave_value& fid, const std::string& who = ""); |
2117 | 445 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
446 void clear (bool flush = true); |
4468 | 447 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
448 string_vector get_info (int fid) const; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
449 string_vector get_info (const octave_value& fid) const; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
450 |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
451 std::string list_open_files (void) const; |
2117 | 452 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
453 octave_value open_file_numbers (void) const; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
454 |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
455 int get_file_number (const octave_value& fid) const; |
2117 | 456 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
457 octave_value stdin_file (void) const; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
458 octave_value stdout_file (void) const; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
459 octave_value stderr_file (void) const; |
2117 | 460 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
461 private: |
2117 | 462 |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
463 typedef std::map<int, stream> ostrl_map; |
2117 | 464 |
27172 | 465 ostrl_map m_list; |
2117 | 466 |
27172 | 467 mutable ostrl_map::const_iterator m_lookup_cache; |
2609 | 468 |
23738
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
469 int m_stdin_file; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
470 int m_stdout_file; |
8acd390d16c9
don't use singleton for stream_list object
John W. Eaton <jwe@octave.org>
parents:
23615
diff
changeset
|
471 int m_stderr_file; |
23059
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
472 }; |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
473 } |
b98ebcd7f11c
move some octave stream classes into octave namespace
John W. Eaton <jwe@octave.org>
parents:
23012
diff
changeset
|
474 |
2117 | 475 #endif |