Mercurial > octave
annotate libinterp/corefcn/oct-procbuf.cc @ 28223:45763d59cb4f stable
use nullptr instead of NULL or 0 in a few more places
* QWinTerminalImpl.cpp, oct-procbuf.cc, audioread.cc, jit-typeinfo.cc,
lo-sysdep.cc, url-transfer.cc, shared-fcns.h: Replace NULL and 0 with
nullptr where appropriate.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 15 Apr 2020 15:55:32 -0400 |
parents | bd51beb6205e |
children | 0a5b15007766 |
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 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
3 // Copyright (C) 1996-2020 The Octave Project Developers |
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 //////////////////////////////////////////////////////////////////////// |
2094 | 25 |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21609
diff
changeset
|
26 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21200
diff
changeset
|
27 # include "config.h" |
2094 | 28 #endif |
29 | |
30 #include <cerrno> | |
31 | |
25438
cb1606f78f6b
prefer <istream>, <ostream>, or <iosfwd> to <iostream> where possible
John W. Eaton <jwe@octave.org>
parents:
25054
diff
changeset
|
32 #include <iomanip> |
2094 | 33 |
22264
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
34 // FIXME: we would prefer to avoid including these directly in Octave |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
35 // sources, but eliminating them is complicated by the mingling of |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
36 // octave_procbuf_list and the calls to system library functions like |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
37 // execl. |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
38 |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
39 #if defined (HAVE_UNISTD_H) |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
40 # if defined (HAVE_SYS_TYPES_H) |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
41 # include <sys/types.h> |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
42 # endif |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
43 # include <unistd.h> |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
44 #endif |
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
45 |
3174 | 46 #include "lo-mappers.h" |
47 #include "lo-utils.h" | |
2094 | 48 #include "oct-procbuf.h" |
5453 | 49 #include "oct-syscalls.h" |
6726 | 50 #include "sysdep.h" |
21910
4d723ba06b4a
provide wrappers for some unistd.h functions
John W. Eaton <jwe@octave.org>
parents:
21852
diff
changeset
|
51 #include "unistd-wrappers.h" |
3176 | 52 #include "variables.h" |
2094 | 53 |
3174 | 54 #include "defun.h" |
21100
e39e05d90788
Switch gripe_XXX to either err_XXX or warn_XXX naming scheme.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
55 #include "errwarn.h" |
3308 | 56 #include "utils.h" |
3174 | 57 |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21609
diff
changeset
|
58 #if ! defined (SHELL_PATH) |
21200
fcac5dbbf9ed
maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
59 # define SHELL_PATH "/bin/sh" |
15756
ea1a1fb00744
Make the path to the shell interpreter configuable
Mike Miller <mtmiller@ieee.org>
parents:
15195
diff
changeset
|
60 #endif |
ea1a1fb00744
Make the path to the shell interpreter configuable
Mike Miller <mtmiller@ieee.org>
parents:
15195
diff
changeset
|
61 |
2094 | 62 // This class is based on the procbuf class from libg++, written by |
63 // Per Bothner, Copyright (C) 1993 Free Software Foundation. | |
64 | |
24118
f87c9f5c0f43
maint: silence several compiler warnings when building for Windows
Mike Miller <mtmiller@octave.org>
parents:
23795
diff
changeset
|
65 #if (! (defined (__CYGWIN__) || defined (__MINGW32__) || defined (_MSC_VER)) \ |
f87c9f5c0f43
maint: silence several compiler warnings when building for Windows
Mike Miller <mtmiller@octave.org>
parents:
23795
diff
changeset
|
66 && defined (HAVE_UNISTD_H)) |
f87c9f5c0f43
maint: silence several compiler warnings when building for Windows
Mike Miller <mtmiller@octave.org>
parents:
23795
diff
changeset
|
67 |
23457
21baad6b35c4
maint: Use C++11 nullptr rather than 0 or NULL when possible.
Rik <rik@octave.org>
parents:
23450
diff
changeset
|
68 static octave_procbuf *octave_procbuf_list = nullptr; |
2094 | 69 |
24118
f87c9f5c0f43
maint: silence several compiler warnings when building for Windows
Mike Miller <mtmiller@octave.org>
parents:
23795
diff
changeset
|
70 #endif |
f87c9f5c0f43
maint: silence several compiler warnings when building for Windows
Mike Miller <mtmiller@octave.org>
parents:
23795
diff
changeset
|
71 |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21609
diff
changeset
|
72 #if ! defined (BUFSIZ) |
21200
fcac5dbbf9ed
maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents:
21100
diff
changeset
|
73 # define BUFSIZ 1024 |
6094 | 74 #endif |
75 | |
2094 | 76 octave_procbuf * |
77 octave_procbuf::open (const char *command, int mode) | |
78 { | |
6096 | 79 #if defined (__CYGWIN__) || defined (__MINGW32__) || defined (_MSC_VER) |
4472 | 80 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
81 if (is_open ()) |
4472 | 82 return 0; |
83 | |
25655
be7ba25bb5bf
Fix Windows cross-build after 85c3e315bd43.
Markus Mützel <markus.muetzel@gmx.de>
parents:
25438
diff
changeset
|
84 f = (octave::popen (command, (mode & std::ios::in) ? "r" : "w")); |
4472 | 85 |
86 if (! f) | |
87 return 0; | |
88 | |
89 // Oops... popen doesn't return the associated pid, so fake it for now | |
90 | |
91 proc_pid = 1; | |
92 | |
93 open_p = true; | |
94 | |
95 if (mode & std::ios::out) | |
28223
45763d59cb4f
use nullptr instead of NULL or 0 in a few more places
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
96 ::setvbuf (f, nullptr, _IOLBF, BUFSIZ); |
4472 | 97 |
98 return this; | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
99 |
22264
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
100 #elif defined (HAVE_UNISTD_H) |
2094 | 101 |
102 int pipe_fds[2]; | |
103 | |
3544 | 104 volatile int child_std_end = (mode & std::ios::in) ? 1 : 0; |
3156 | 105 |
3147 | 106 volatile int parent_end, child_end; |
2094 | 107 |
108 if (is_open ()) | |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23457
diff
changeset
|
109 return nullptr; |
2094 | 110 |
21727
e0da98857c19
rename octave::syscalls namespace to octave::sys
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
111 if (octave::sys::pipe (pipe_fds) < 0) |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23457
diff
changeset
|
112 return nullptr; |
2094 | 113 |
3544 | 114 if (mode & std::ios::in) |
2094 | 115 { |
116 parent_end = pipe_fds[0]; | |
117 child_end = pipe_fds[1]; | |
118 } | |
119 else | |
120 { | |
121 parent_end = pipe_fds[1]; | |
122 child_end = pipe_fds[0]; | |
123 } | |
124 | |
3156 | 125 proc_pid = ::fork (); |
2094 | 126 |
127 if (proc_pid == 0) | |
128 { | |
21910
4d723ba06b4a
provide wrappers for some unistd.h functions
John W. Eaton <jwe@octave.org>
parents:
21852
diff
changeset
|
129 octave_close_wrapper (parent_end); |
2094 | 130 |
131 if (child_end != child_std_end) | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
132 { |
21910
4d723ba06b4a
provide wrappers for some unistd.h functions
John W. Eaton <jwe@octave.org>
parents:
21852
diff
changeset
|
133 octave_dup2_wrapper (child_end, child_std_end); |
4d723ba06b4a
provide wrappers for some unistd.h functions
John W. Eaton <jwe@octave.org>
parents:
21852
diff
changeset
|
134 octave_close_wrapper (child_end); |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
135 } |
2094 | 136 |
137 while (octave_procbuf_list) | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
138 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
139 FILE *fp = octave_procbuf_list->f; |
3644 | 140 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
141 if (fp) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
142 { |
21942
aab79a1885cc
limit gnulib headers to liboctave/wrappers directory
John W. Eaton <jwe@octave.org>
parents:
21910
diff
changeset
|
143 std::fclose (fp); |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23457
diff
changeset
|
144 fp = nullptr; |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
145 } |
3644 | 146 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
147 octave_procbuf_list = octave_procbuf_list->next; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
148 } |
2094 | 149 |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23457
diff
changeset
|
150 execl (SHELL_PATH, "sh", "-c", command, static_cast<void *> (nullptr)); |
2094 | 151 |
152 exit (127); | |
153 } | |
154 | |
21910
4d723ba06b4a
provide wrappers for some unistd.h functions
John W. Eaton <jwe@octave.org>
parents:
21852
diff
changeset
|
155 octave_close_wrapper (child_end); |
2094 | 156 |
157 if (proc_pid < 0) | |
158 { | |
21910
4d723ba06b4a
provide wrappers for some unistd.h functions
John W. Eaton <jwe@octave.org>
parents:
21852
diff
changeset
|
159 octave_close_wrapper (parent_end); |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23457
diff
changeset
|
160 return nullptr; |
2094 | 161 } |
162 | |
23450
855122b993da
maint: Wrap tertiary operator in parentheses "(COND ? x : y)".
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
163 f = (::fdopen (parent_end, (mode & std::ios::in) ? "r" : "w")); |
3631 | 164 |
3649 | 165 if (mode & std::ios::out) |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23457
diff
changeset
|
166 ::setvbuf (f, nullptr, _IOLBF, BUFSIZ); |
3649 | 167 |
3631 | 168 open_p = true; |
2094 | 169 |
170 next = octave_procbuf_list; | |
171 octave_procbuf_list = this; | |
172 | |
173 return this; | |
174 | |
175 #else | |
176 | |
177 return 0; | |
178 | |
179 #endif | |
180 } | |
181 | |
3631 | 182 octave_procbuf * |
183 octave_procbuf::close (void) | |
2094 | 184 { |
6096 | 185 #if defined (__CYGWIN__) || defined (__MINGW32__) || defined (_MSC_VER) |
4472 | 186 |
187 if (f) | |
188 { | |
25655
be7ba25bb5bf
Fix Windows cross-build after 85c3e315bd43.
Markus Mützel <markus.muetzel@gmx.de>
parents:
25438
diff
changeset
|
189 wstatus = octave::pclose (f); |
4472 | 190 f = 0; |
191 } | |
192 | |
193 open_p = false; | |
194 | |
195 return this; | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
196 |
22264
9b78fda78300
fix build failure for --without-z (bug #48757)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
197 #elif defined (HAVE_UNISTD_H) |
2094 | 198 |
3644 | 199 if (f) |
200 { | |
201 pid_t wait_pid; | |
2094 | 202 |
3644 | 203 int status = -1; |
204 | |
205 for (octave_procbuf **ptr = &octave_procbuf_list; | |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23457
diff
changeset
|
206 *ptr != nullptr; |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
207 ptr = &(*ptr)->next) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
208 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
209 if (*ptr == this) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
210 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
211 *ptr = (*ptr)->next; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
212 status = 0; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
213 break; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
214 } |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
215 } |
2094 | 216 |
21942
aab79a1885cc
limit gnulib headers to liboctave/wrappers directory
John W. Eaton <jwe@octave.org>
parents:
21910
diff
changeset
|
217 if (status == 0 && std::fclose (f) == 0) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
218 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
219 using namespace std; |
3531 | 220 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
221 do |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
222 { |
21727
e0da98857c19
rename octave::syscalls namespace to octave::sys
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
223 wait_pid = octave::sys::waitpid (proc_pid, &wstatus, 0); |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
224 } |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
225 while (wait_pid == -1 && errno == EINTR); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
226 } |
3644 | 227 |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23457
diff
changeset
|
228 f = nullptr; |
3631 | 229 } |
2094 | 230 |
3631 | 231 open_p = false; |
2094 | 232 |
3631 | 233 return this; |
2094 | 234 |
235 #else | |
236 | |
3631 | 237 return 0; |
2094 | 238 |
239 #endif | |
240 } |