1
|
1 /* |
|
2 |
1884
|
3 Copyright (C) 1996 John W. Eaton |
1
|
4 |
|
5 This file is part of Octave. |
|
6 |
|
7 Octave is free software; you can redistribute it and/or modify it |
|
8 under the terms of the GNU General Public License as published by the |
|
9 Free Software Foundation; either version 2, or (at your option) any |
|
10 later version. |
|
11 |
|
12 Octave is distributed in the hope that it will be useful, but WITHOUT |
|
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
15 for more details. |
|
16 |
|
17 You should have received a copy of the GNU General Public License |
|
18 along with Octave; see the file COPYING. If not, write to the Free |
1315
|
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
1
|
20 |
|
21 */ |
|
22 |
2095
|
23 // Originally written by John C. Campbell <jcc@bevo.che.wisc.edu> |
1230
|
24 // |
2095
|
25 // Thomas Baier <baier@ci.tuwien.ac.at> added the original versions of |
|
26 // the following functions: |
1230
|
27 // |
2095
|
28 // popen |
|
29 // pclose |
|
30 // execute (now popen2.m) |
|
31 // sync_system (now merged with system) |
|
32 // async_system (now merged with system) |
1230
|
33 |
2095
|
34 // Completely rewritten by John W. Eaton <jwe@bevo.che.wisc.edu>, |
|
35 // April 1996. |
1
|
36 |
240
|
37 #ifdef HAVE_CONFIG_H |
1230
|
38 #include <config.h> |
1
|
39 #endif |
|
40 |
2095
|
41 #include <climits> |
1343
|
42 |
2095
|
43 #include <iostream.h> |
1350
|
44 |
|
45 #ifdef HAVE_UNISTD_H |
1230
|
46 #include <sys/types.h> |
1
|
47 #include <unistd.h> |
1343
|
48 #endif |
1350
|
49 |
1352
|
50 #include "defun.h" |
1
|
51 #include "error.h" |
1766
|
52 #include "file-ops.h" |
542
|
53 #include "help.h" |
2095
|
54 #include "oct-fstrm.h" |
|
55 #include "oct-iostrm.h" |
1377
|
56 #include "oct-map.h" |
1750
|
57 #include "oct-obj.h" |
2095
|
58 #include "oct-prcstrm.h" |
|
59 #include "oct-stream.h" |
|
60 #include "oct-strstrm.h" |
1
|
61 #include "pager.h" |
444
|
62 #include "sysdep.h" |
1352
|
63 #include "syswait.h" |
|
64 #include "utils.h" |
1583
|
65 |
1
|
66 void |
164
|
67 initialize_file_io (void) |
1
|
68 { |
2095
|
69 octave_istream *stdin_stream = new octave_istream (&cin, "stdin"); |
|
70 octave_ostream *stdout_stream = new octave_ostream (&cout, "stdout"); |
|
71 octave_ostream *stderr_stream = new octave_ostream (&cerr, "stderr"); |
1
|
72 |
2095
|
73 octave_stream_list::insert (stdin_stream); |
|
74 octave_stream_list::insert (stdout_stream); |
|
75 octave_stream_list::insert (stderr_stream); |
1
|
76 } |
|
77 |
2095
|
78 void |
|
79 close_files (void) |
1
|
80 { |
2095
|
81 octave_stream_list::clear (); |
|
82 } |
636
|
83 |
2095
|
84 static void |
|
85 gripe_invalid_file_id (const char *fcn) |
|
86 { |
|
87 ::error ("%s: invalid file id", fcn); |
1
|
88 } |
|
89 |
2095
|
90 static int |
|
91 fopen_mode_to_ios_mode (const string& mode) |
1
|
92 { |
2095
|
93 int retval = 0; |
896
|
94 |
2095
|
95 if (! mode.empty ()) |
368
|
96 { |
2095
|
97 // Could probably be faster, but does it really matter? |
1766
|
98 |
2095
|
99 if (mode == "r") |
|
100 retval = ios::in; |
|
101 else if (mode == "w") |
|
102 retval = ios::out | ios::trunc; |
|
103 else if (mode == "a") |
|
104 retval = ios::out | ios::app; |
|
105 else if (mode == "r+") |
|
106 retval = ios::in | ios::out; |
|
107 else if (mode == "w+") |
|
108 retval = ios::in | ios::out | ios::trunc; |
|
109 else if (mode == "a+") |
|
110 retval = ios::in | ios::out | ios::app; |
|
111 else if (mode == "rb") |
|
112 retval = ios::in | ios::bin; |
|
113 else if (mode == "wb") |
|
114 retval = ios::out | ios::trunc | ios::bin; |
|
115 else if (mode == "ab") |
|
116 retval = ios::out | ios::app | ios::bin; |
|
117 else if (mode == "r+b") |
|
118 retval = ios::in | ios::out | ios::bin; |
|
119 else if (mode == "w+b") |
|
120 retval = ios::in | ios::out | ios::trunc | ios::bin; |
|
121 else if (mode == "a+b") |
|
122 retval = ios::in | ios::out | ios::app | ios::bin; |
368
|
123 else |
2095
|
124 ::error ("invalid mode specified"); |
1
|
125 } |
|
126 |
|
127 return retval; |
|
128 } |
|
129 |
1957
|
130 DEFUN (fclose, args, , |
2095
|
131 "fclose (FILENAME or FILENUM): close a file") |
529
|
132 { |
2095
|
133 double retval = -1.0; |
529
|
134 |
|
135 int nargin = args.length (); |
|
136 |
2095
|
137 if (nargin == 1) |
|
138 { |
|
139 retval = (double) octave_stream_list::remove (args(0)); |
1
|
140 |
2095
|
141 if (retval < 0) |
|
142 gripe_invalid_file_id ("fclose"); |
1
|
143 } |
|
144 else |
2095
|
145 print_usage ("fclose"); |
1
|
146 |
|
147 return retval; |
|
148 } |
|
149 |
1957
|
150 DEFUN (fflush, args, , |
1181
|
151 "fflush (FILENAME or FILENUM): flush buffered data to output file") |
|
152 { |
2095
|
153 double retval = -1.0; |
1181
|
154 |
|
155 int nargin = args.length (); |
|
156 |
2095
|
157 if (nargin == 1) |
|
158 { |
|
159 octave_stream *os = octave_stream_list::lookup (args(0)); |
|
160 |
|
161 if (os) |
|
162 retval = (double) os->flush (); |
|
163 else |
|
164 gripe_invalid_file_id ("fflush"); |
|
165 } |
|
166 else |
1181
|
167 print_usage ("fflush"); |
|
168 |
|
169 return retval; |
|
170 } |
|
171 |
2095
|
172 DEFUN (fgetl, args, , |
|
173 "STRING = fgetl (FILENAME or FILENUM [, LENGTH])\n\ |
1339
|
174 \n\ |
|
175 read a string from a file") |
|
176 { |
2095
|
177 octave_value retval = -1.0; |
1339
|
178 |
|
179 int nargin = args.length (); |
|
180 |
|
181 if (nargin == 1 || nargin == 2) |
2095
|
182 { |
|
183 octave_stream *os = octave_stream_list::lookup (args(0)); |
|
184 |
|
185 if (os) |
|
186 { |
|
187 octave_value len_arg = (nargin == 2) |
|
188 ? args(1) : octave_value ((double) INT_MAX); |
|
189 |
|
190 bool err = false; |
|
191 |
|
192 string tmp = os->getl (len_arg, err); |
|
193 |
|
194 if (! err) |
|
195 retval = tmp; |
|
196 } |
|
197 else |
|
198 gripe_invalid_file_id ("fgetl"); |
|
199 } |
1339
|
200 else |
|
201 print_usage ("fgetl"); |
|
202 |
|
203 return retval; |
|
204 } |
|
205 |
2095
|
206 DEFUN (fgets, args, , |
|
207 "STRING = fgets (FILENAME or FILENUM [, LENGTH])\n\ |
529
|
208 \n\ |
1181
|
209 read a string from a file") |
529
|
210 { |
2095
|
211 octave_value retval = -1.0; |
529
|
212 |
|
213 int nargin = args.length (); |
|
214 |
1338
|
215 if (nargin == 1 || nargin == 2) |
2095
|
216 { |
|
217 octave_stream *os = octave_stream_list::lookup (args(0)); |
|
218 |
|
219 if (os) |
|
220 { |
|
221 octave_value len_arg = (nargin == 2) |
|
222 ? args(1) : octave_value ((double) INT_MAX); |
|
223 |
|
224 bool err = false; |
|
225 |
|
226 string tmp = os->gets (len_arg, err); |
|
227 |
|
228 if (! err) |
|
229 retval = tmp; |
|
230 } |
|
231 else |
|
232 gripe_invalid_file_id ("fgets"); |
|
233 } |
1338
|
234 else |
1181
|
235 print_usage ("fgets"); |
529
|
236 |
|
237 return retval; |
|
238 } |
|
239 |
2095
|
240 static octave_base_stream * |
|
241 do_stream_open (const string& name, const string& mode, |
|
242 const string& arch, int& fid) |
1
|
243 { |
2095
|
244 octave_base_stream *retval = 0; |
1
|
245 |
2095
|
246 fid = -1; |
1
|
247 |
2095
|
248 int md = fopen_mode_to_ios_mode (mode); |
1
|
249 |
2095
|
250 if (! error_state) |
|
251 { |
|
252 octave_base_stream::arch_type at = octave_stream::string_to_arch (arch); |
1
|
253 |
2095
|
254 if (! error_state) |
|
255 retval = new octave_fstream (name, md, at); |
1
|
256 } |
|
257 |
2095
|
258 return retval; |
|
259 } |
1
|
260 |
2095
|
261 static octave_base_stream * |
|
262 do_stream_open (const octave_value& tc_name, const octave_value& tc_mode, |
|
263 const octave_value& tc_arch, const char *fcn, int& fid) |
|
264 { |
|
265 octave_base_stream *retval = 0; |
|
266 |
|
267 fid = -1; |
|
268 |
|
269 string name = tc_name.string_value (); |
|
270 |
|
271 if (! error_state) |
1
|
272 { |
2095
|
273 string mode = tc_mode.string_value (); |
|
274 |
|
275 if (! error_state) |
|
276 { |
|
277 string arch = tc_arch.string_value (); |
1
|
278 |
2095
|
279 if (! error_state) |
|
280 retval = do_stream_open (name, mode, arch, fid); |
|
281 else |
|
282 ::error ("%s: architecture type must be a string", fcn); |
|
283 } |
|
284 else |
|
285 ::error ("%s: file mode must be a string", fcn); |
1
|
286 } |
2095
|
287 else |
|
288 ::error ("%s: file name must be a string", fcn); |
1
|
289 |
|
290 return retval; |
|
291 } |
|
292 |
1957
|
293 DEFUN (fopen, args, , |
2095
|
294 "FILENUM = fopen (FILENAME, MODE [, ARCH]): open a file\n\ |
1181
|
295 \n\ |
|
296 Valid values for mode include:\n\ |
|
297 \n\ |
2095
|
298 r : open text file for reading\n\ |
|
299 w : open text file for writing; discard previous contents if any\n\ |
|
300 a : append; open or create text file for writing at end of file\n\ |
|
301 r+ : open text file for update (i.e., reading and writing)\n\ |
|
302 w+ : create text file for update; discard previous contents if any\n\ |
|
303 a+ : append; open or create text file for update, writing at end\n\ |
|
304 \n\ |
|
305 Update mode permits reading from and writing to the same file.") |
529
|
306 { |
2095
|
307 octave_value_list retval = -1.0; |
529
|
308 |
|
309 int nargin = args.length (); |
|
310 |
2095
|
311 if (nargin == 1) |
|
312 { |
|
313 if (args(0).is_string () && args(0).string_value () == "all") |
|
314 { |
|
315 return octave_stream_list::open_file_numbers (); |
|
316 } |
|
317 else |
|
318 { |
|
319 string_vector tmp = octave_stream_list::get_info (args(0)); |
529
|
320 |
2095
|
321 if (! error_state) |
|
322 { |
|
323 retval(2) = tmp(2); |
|
324 retval(1) = tmp(1); |
|
325 retval(0) = tmp(0); |
|
326 } |
1
|
327 |
2095
|
328 return retval; |
|
329 } |
1
|
330 } |
|
331 |
2095
|
332 if (nargin > 0 && nargin < 4) |
|
333 { |
|
334 octave_value mode = (nargin == 2 || nargin == 3) |
|
335 ? args(1) : octave_value ("r"); |
|
336 |
|
337 octave_value arch = (nargin == 3) |
|
338 ? args(2) : octave_value ("native"); |
|
339 |
|
340 int fid = -1; |
|
341 |
|
342 octave_base_stream *os |
|
343 = do_stream_open (args(0), mode, arch, "fopen", fid); |
|
344 |
|
345 if (os) |
|
346 { |
|
347 if (os->ok () && ! error_state) |
|
348 { |
|
349 retval(1) = ""; |
|
350 retval(0) = (double) octave_stream_list::insert (os); |
|
351 } |
|
352 else |
|
353 { |
|
354 int errno = 0; |
|
355 retval(1) = os->error (false, errno); |
|
356 retval(0) = -1.0; |
|
357 } |
|
358 } |
|
359 else |
|
360 ::error ("fopen: internal error"); |
|
361 } |
|
362 else |
|
363 print_usage ("fopen"); |
1
|
364 |
|
365 return retval; |
|
366 } |
|
367 |
1957
|
368 DEFUN (freport, args, , |
1181
|
369 "freport (): list open files and their status") |
|
370 { |
2095
|
371 octave_value_list retval; |
1181
|
372 |
|
373 int nargin = args.length (); |
|
374 |
|
375 if (nargin > 0) |
|
376 warning ("freport: ignoring extra arguments"); |
|
377 |
2095
|
378 octave_stdout << octave_stream_list::list_open_files (); |
1181
|
379 |
|
380 return retval; |
|
381 } |
|
382 |
1957
|
383 DEFUN (frewind, args, , |
529
|
384 "frewind (FILENAME or FILENUM): set file position at beginning of file") |
|
385 { |
2095
|
386 double retval = -1.0; |
1
|
387 |
506
|
388 int nargin = args.length (); |
|
389 |
2095
|
390 if (nargin == 1) |
1086
|
391 { |
2095
|
392 octave_stream *os = octave_stream_list::lookup (args(0)); |
636
|
393 |
2095
|
394 if (os) |
|
395 retval = (double) os->rewind (); |
1
|
396 else |
2095
|
397 gripe_invalid_file_id ("frewind"); |
1
|
398 } |
|
399 else |
2095
|
400 print_usage ("frewind"); |
1
|
401 |
|
402 return retval; |
|
403 } |
|
404 |
1957
|
405 DEFUN (fseek, args, , |
1181
|
406 "fseek (FILENAME or FILENUM, OFFSET [, ORIGIN])\n\ |
|
407 \n\ |
|
408 set file position for reading or writing") |
529
|
409 { |
2095
|
410 double retval = -1.0; |
529
|
411 |
|
412 int nargin = args.length (); |
|
413 |
2095
|
414 if (nargin == 2 || nargin == 3) |
|
415 { |
|
416 octave_stream *os = octave_stream_list::lookup (args(0)); |
1181
|
417 |
2095
|
418 if (os) |
|
419 { |
|
420 octave_value origin_arg = (nargin == 3) |
|
421 ? args(2) : octave_value (0.0); |
1
|
422 |
2095
|
423 retval = (double) os->seek (args(1), origin_arg); |
|
424 } |
|
425 else |
|
426 ::error ("fseek: invalid file id"); |
368
|
427 } |
2095
|
428 else |
|
429 print_usage ("fseek"); |
1
|
430 |
|
431 return retval; |
|
432 } |
|
433 |
1957
|
434 DEFUN (ftell, args, , |
1181
|
435 "POSITION = ftell (FILENAME or FILENUM): returns the current file position") |
|
436 { |
2095
|
437 double retval = -1.0; |
1
|
438 |
506
|
439 int nargin = args.length (); |
|
440 |
2095
|
441 if (nargin == 1) |
1
|
442 { |
2095
|
443 octave_stream *os = octave_stream_list::lookup (args(0)); |
1
|
444 |
2095
|
445 if (os) |
|
446 retval = (double) os->tell (); |
|
447 else |
|
448 gripe_invalid_file_id ("ftell"); |
1
|
449 } |
|
450 else |
2095
|
451 print_usage ("ftell"); |
1
|
452 |
|
453 return retval; |
|
454 } |
|
455 |
1957
|
456 DEFUN (fprintf, args, , |
1181
|
457 "fprintf (FILENAME or FILENUM, FORMAT, ...)") |
|
458 { |
2095
|
459 double retval = -1.0; |
1181
|
460 |
|
461 int nargin = args.length (); |
|
462 |
2095
|
463 if (nargin > 1) |
|
464 { |
|
465 octave_stream *os = octave_stream_list::lookup (args(0)); |
|
466 |
|
467 if (os) |
|
468 { |
|
469 if (args(1).is_string ()) |
|
470 { |
|
471 string fmt = args(1).string_value (); |
|
472 |
|
473 octave_value_list tmp_args; |
|
474 |
|
475 if (nargin > 2) |
|
476 { |
|
477 tmp_args.resize (nargin-2, octave_value ()); |
|
478 |
|
479 for (int i = 2; i < nargin; i++) |
|
480 tmp_args(i-2) = args(i); |
|
481 } |
|
482 |
|
483 retval = os->printf (fmt, tmp_args); |
|
484 } |
|
485 else |
|
486 ::error ("fprintf: format must be a string"); |
|
487 } |
|
488 else |
|
489 gripe_invalid_file_id ("fprintf"); |
|
490 } |
|
491 else |
1181
|
492 print_usage ("fprintf"); |
|
493 |
|
494 return retval; |
|
495 } |
|
496 |
2095
|
497 DEFUN (fputs, args, , |
|
498 "fputs (FILENAME or FILENUM, STRING)") |
1181
|
499 { |
2095
|
500 double retval = -1.0; |
1181
|
501 |
|
502 int nargin = args.length (); |
|
503 |
2095
|
504 if (nargin == 2) |
|
505 { |
|
506 octave_stream *os = octave_stream_list::lookup (args(0)); |
1181
|
507 |
2095
|
508 if (os) |
|
509 retval = os->puts (args(1)); |
|
510 else |
|
511 gripe_invalid_file_id ("fputs"); |
|
512 } |
1181
|
513 else |
2095
|
514 print_usage ("fputs"); |
1181
|
515 |
|
516 return retval; |
|
517 } |
|
518 |
2095
|
519 DEFUN (sprintf, args, , |
|
520 "[s, errmsg, status] = sprintf (FORMAT, ...)") |
1
|
521 { |
2095
|
522 octave_value_list retval; |
1
|
523 |
2095
|
524 retval(2) = -1.0; |
|
525 retval(1) = "unknown error"; |
|
526 retval(0) = ""; |
1
|
527 |
2095
|
528 int nargin = args.length (); |
1
|
529 |
2095
|
530 if (nargin > 0) |
1
|
531 { |
2095
|
532 octave_ostrstream ostr; |
1
|
533 |
2095
|
534 octave_stream os (&ostr); |
628
|
535 |
2095
|
536 if (os) |
|
537 { |
|
538 if (args(0).is_string ()) |
|
539 { |
|
540 string fmt = args(0).string_value (); |
628
|
541 |
2095
|
542 octave_value_list tmp_args; |
1
|
543 |
2095
|
544 if (nargin > 1) |
|
545 { |
|
546 tmp_args.resize (nargin-1, octave_value ()); |
1
|
547 |
2095
|
548 for (int i = 1; i < nargin; i++) |
|
549 tmp_args(i-1) = args(i); |
|
550 } |
628
|
551 |
2095
|
552 retval(2) = os.printf (fmt, tmp_args); |
|
553 retval(1) = os.error (); |
|
554 char *tmp = ostr.str (); |
|
555 retval(0) = tmp; |
|
556 delete [] tmp; |
|
557 } |
|
558 else |
|
559 ::error ("sprintf: format must be a string"); |
|
560 } |
|
561 else |
|
562 ::error ("sprintf: unable to create output buffer"); |
1
|
563 } |
|
564 else |
2095
|
565 print_usage ("sprintf"); |
1
|
566 |
|
567 return retval; |
|
568 } |
|
569 |
2095
|
570 DEFUN (fscanf, args, , |
|
571 "[A, B, C, ...] = fscanf (FILENAME or FILENUM, FORMAT, SIZE)") |
1181
|
572 { |
2095
|
573 octave_value_list retval; |
1181
|
574 |
|
575 int nargin = args.length (); |
|
576 |
2095
|
577 if (nargin == 2 || nargin == 3) |
|
578 { |
|
579 octave_stream *os = octave_stream_list::lookup (args(0)); |
1181
|
580 |
2095
|
581 if (os) |
|
582 { |
|
583 if (args(1).is_string ()) |
|
584 { |
|
585 string fmt = args(1).string_value (); |
1181
|
586 |
2095
|
587 int count = 0; |
1181
|
588 |
2095
|
589 // XXX FIXME XXX |
|
590 Array<int> size (2); |
1181
|
591 |
2095
|
592 octave_value tmp = os->scanf (fmt, size, count); |
1181
|
593 |
2095
|
594 retval(1) = (double) count; |
|
595 retval(0) = tmp; |
|
596 } |
|
597 else |
|
598 ::error ("fscanf: format must be a string"); |
|
599 } |
|
600 else |
|
601 gripe_invalid_file_id ("fscanf"); |
|
602 } |
1181
|
603 else |
2095
|
604 print_usage ("fscanf"); |
1181
|
605 |
|
606 return retval; |
|
607 } |
|
608 |
2095
|
609 DEFUN (sscanf, args, , |
|
610 "[A, COUNT, ERRMSG, INDEX] = sscanf (STRING, FORMAT, SIZE)") |
444
|
611 { |
2095
|
612 octave_value_list retval; |
444
|
613 |
2095
|
614 retval(3) = -1.0; |
|
615 retval(2) = "unknown error"; |
|
616 retval(1) = 0.0; |
|
617 retval(0) = Matrix (); |
444
|
618 |
506
|
619 int nargin = args.length (); |
|
620 |
2095
|
621 if (nargin == 2 || nargin == 3) |
|
622 { |
|
623 if (args(0).is_string ()) |
|
624 { |
|
625 string data = args(0).string_value (); |
444
|
626 |
2095
|
627 octave_istrstream istr (data); |
1358
|
628 |
2095
|
629 octave_stream os (&istr); |
636
|
630 |
2095
|
631 if (os) |
|
632 { |
|
633 if (args(1).is_string ()) |
|
634 { |
|
635 string fmt = args(1).string_value (); |
444
|
636 |
2095
|
637 int count = 0; |
471
|
638 |
2095
|
639 // XXX FIXME XXX |
|
640 Array<int> size (2); |
444
|
641 |
2095
|
642 octave_value tmp = os.scanf (fmt, size, count); |
444
|
643 |
2095
|
644 retval(3) = (double) (os.tell () + 1); |
|
645 retval(2) = os.error (); |
|
646 retval(1) = (double) count; |
|
647 retval(0) = tmp; |
|
648 } |
|
649 else |
|
650 ::error ("sscanf: format must be a string"); |
|
651 } |
|
652 else |
|
653 ::error ("sscanf: unable to create temporary input buffer"); |
444
|
654 } |
636
|
655 else |
2095
|
656 ::error ("sscanf: first argument must be a string"); |
444
|
657 } |
|
658 else |
2095
|
659 print_usage ("sscanf"); |
444
|
660 |
|
661 return retval; |
|
662 } |
|
663 |
2095
|
664 DEFUN (fread, , , |
1181
|
665 "[DATA, COUNT] = fread (FILENUM, SIZE, PRECISION)\n\ |
529
|
666 \n\ |
1181
|
667 Reads data in binary form of type PRECISION from a file.\n\ |
529
|
668 \n\ |
|
669 FILENUM : file number from fopen\n\ |
1181
|
670 SIZE : size specification for the Data matrix\n\ |
529
|
671 PRECISION : type of data to read, valid types are\n\ |
|
672 \n\ |
1230
|
673 \"char\" \"schar\" \"short\" \"int\" \"long\" \"float\"\n\ |
|
674 \"double\" \"uchar\" \"ushort\" \"uint\" \"ulong\"\n\ |
529
|
675 \n\ |
1181
|
676 DATA : matrix in which the data is stored\n\ |
|
677 COUNT : number of elements read") |
529
|
678 { |
2095
|
679 octave_value_list retval; |
|
680 // XXX IMPLEMENTME XXX |
529
|
681 return retval; |
|
682 } |
|
683 |
2095
|
684 DEFUN (fwrite, , , |
1181
|
685 "COUNT = fwrite (FILENUM, DATA, PRECISION)\n\ |
|
686 \n\ |
|
687 Writes data to a file in binary form of size PRECISION\n\ |
|
688 \n\ |
|
689 FILENUM : file number from fopen\n\ |
|
690 DATA : matrix of elements to be written\n\ |
|
691 PRECISION : type of data to read, valid types are\n\ |
|
692 \n\ |
1230
|
693 \"char\" \"schar\" \"short\" \"int\" \"long\" \"float\"\n\ |
|
694 \"double\" \"uchar\" \"ushort\" \"uint\" \"ulong\"\n\ |
1181
|
695 \n\ |
|
696 COUNT : number of elements written") |
|
697 { |
2095
|
698 octave_value_list retval; |
|
699 // XXX IMPLEMENTME XXX |
1181
|
700 return retval; |
|
701 } |
|
702 |
1957
|
703 DEFUN (feof, args, , |
529
|
704 "ERROR = feof (FILENAME or FILENUM)\n\ |
|
705 \n\ |
|
706 Returns a non zero value for an end of file condition for the\n\ |
|
707 file specified by FILENAME or FILENUM from fopen") |
|
708 { |
2095
|
709 double retval = -1.0; |
529
|
710 |
|
711 int nargin = args.length (); |
|
712 |
2095
|
713 if (nargin == 1) |
|
714 { |
|
715 octave_stream *os = octave_stream_list::lookup (args(0)); |
444
|
716 |
2095
|
717 if (os) |
|
718 retval = os->eof () ? 1.0 : 0.0; |
|
719 else |
|
720 gripe_invalid_file_id ("feof"); |
|
721 } |
529
|
722 else |
2095
|
723 print_usage ("feof"); |
444
|
724 |
|
725 return retval; |
|
726 } |
|
727 |
2095
|
728 DEFUN (ferror, args, , |
|
729 "ERROR = ferror (FILENAME or FILENUM, [\"clear\"])\n\ |
|
730 \n\ |
|
731 Returns a non zero value for an error condition on the\n\ |
|
732 file specified by FILENAME or FILENUM from fopen") |
1230
|
733 { |
2095
|
734 octave_value_list retval; |
1230
|
735 |
2095
|
736 int nargin = args.length (); |
1230
|
737 |
2095
|
738 if (nargin == 1 || nargin == 2) |
|
739 { |
|
740 octave_stream *os = octave_stream_list::lookup (args(0)); |
1230
|
741 |
2095
|
742 if (os) |
|
743 { |
|
744 bool clear = false; |
1230
|
745 |
2095
|
746 if (nargin == 2) |
|
747 { |
|
748 string opt = args(1).string_value (); |
|
749 |
|
750 if (! error_state) |
|
751 clear = (opt == "clear"); |
|
752 else |
|
753 return retval; |
|
754 } |
1755
|
755 |
2095
|
756 int error_number = 0; |
|
757 |
|
758 string error_message = os->error (clear, error_number); |
1230
|
759 |
2095
|
760 retval(1) = (double) error_number; |
|
761 retval(0) = error_message; |
|
762 } |
|
763 else |
|
764 gripe_invalid_file_id ("ferror"); |
1230
|
765 } |
2095
|
766 else |
|
767 print_usage ("ferror"); |
1230
|
768 |
|
769 return retval; |
|
770 } |
|
771 |
1957
|
772 DEFUN (popen, args, , |
1230
|
773 "FILENUM = popen (FILENAME, MODE)\n\ |
|
774 \n\ |
|
775 start a process and create a pipe. Valid values for mode are:\n\ |
|
776 \n\ |
|
777 \"r\" : connect stdout of process to pipe\n\ |
|
778 \"w\" : connect stdin of process to pipe") |
|
779 { |
2095
|
780 double retval = -1.0; |
1230
|
781 |
|
782 int nargin = args.length (); |
|
783 |
2095
|
784 if (nargin == 2) |
|
785 { |
|
786 string name = args(0).string_value (); |
1230
|
787 |
2095
|
788 if (! error_state) |
|
789 { |
|
790 string mode = args(1).string_value (); |
1230
|
791 |
2095
|
792 if (! error_state) |
|
793 { |
|
794 if (mode == "r") |
|
795 { |
|
796 octave_iprocstream *ips = new octave_iprocstream (name); |
1230
|
797 |
2095
|
798 retval = octave_stream_list::insert (ips); |
|
799 } |
|
800 else if (mode == "w") |
|
801 { |
|
802 octave_oprocstream *ops = new octave_oprocstream (name); |
1230
|
803 |
2095
|
804 retval = octave_stream_list::insert (ops); |
|
805 } |
|
806 else |
|
807 ::error ("popen: invalid mode specified"); |
|
808 } |
|
809 else |
|
810 ::error ("popen: mode must be a string"); |
|
811 } |
|
812 else |
|
813 ::error ("popen: name must be a string"); |
|
814 } |
1230
|
815 else |
2095
|
816 print_usage ("popen"); |
1230
|
817 |
|
818 return retval; |
|
819 } |
|
820 |
1957
|
821 DEFUN (pclose, args, , |
1230
|
822 "pclose (FILENAME or FILENUM)\n\ |
|
823 \n\ |
|
824 Close a pipe and terminate the associated process") |
|
825 { |
2095
|
826 double retval = -1.0; |
1230
|
827 |
|
828 int nargin = args.length (); |
|
829 |
2095
|
830 if (nargin == 1) |
1230
|
831 { |
2095
|
832 retval = (double) octave_stream_list::remove (args(0)); |
1230
|
833 |
2095
|
834 if (retval < 0) |
|
835 gripe_invalid_file_id ("pclose"); |
1377
|
836 } |
|
837 else |
2095
|
838 print_usage ("pclose"); |
1379
|
839 |
|
840 return retval; |
|
841 } |
|
842 |
1957
|
843 DEFUN (octave_tmp_file_name, args, , |
1802
|
844 "octave_tmp_file_name ()") |
|
845 { |
2095
|
846 octave_value retval; |
1802
|
847 |
|
848 if (args.length () == 0) |
|
849 retval = oct_tempnam (); |
|
850 else |
|
851 print_usage ("octave_tmp_file_name"); |
|
852 |
|
853 return retval; |
|
854 } |
|
855 |
1400
|
856 static int |
|
857 convert (int x, int ibase, int obase) |
|
858 { |
|
859 int retval = 0; |
|
860 |
|
861 int tmp = x % obase; |
|
862 |
|
863 if (tmp > ibase - 1) |
2095
|
864 ::error ("umask: invalid digit"); |
1400
|
865 else |
|
866 { |
|
867 retval = tmp; |
|
868 int mult = ibase; |
|
869 while ((x = (x - tmp) / obase)) |
|
870 { |
|
871 tmp = x % obase; |
|
872 if (tmp > ibase - 1) |
|
873 { |
2095
|
874 ::error ("umask: invalid digit"); |
1400
|
875 break; |
|
876 } |
|
877 retval += mult * tmp; |
|
878 mult *= ibase; |
|
879 } |
|
880 } |
|
881 |
|
882 return retval; |
|
883 } |
|
884 |
1957
|
885 DEFUN (umask, args, , |
1400
|
886 "umask (MASK)\n\ |
|
887 \n\ |
|
888 Change the file permission mask for file creation for the current |
|
889 process. MASK is an integer, interpreted as an octal number. If |
|
890 successful, returns the previous value of the mask (as an integer to |
|
891 be interpreted as an octal number); otherwise an error message is |
|
892 printed.") |
|
893 { |
2095
|
894 octave_value_list retval; |
1400
|
895 |
|
896 int status = 0; |
|
897 |
|
898 if (args.length () == 1) |
|
899 { |
|
900 double dmask = args(0).double_value (); |
|
901 |
|
902 if (error_state) |
|
903 { |
|
904 status = -1; |
2095
|
905 ::error ("umask: expecting integer argument"); |
1400
|
906 } |
|
907 else |
|
908 { |
|
909 int mask = NINT (dmask); |
|
910 |
|
911 if ((double) mask != dmask || mask < 0) |
|
912 { |
|
913 status = -1; |
2095
|
914 ::error ("umask: MASK must be a positive integer value"); |
1400
|
915 } |
|
916 else |
|
917 { |
|
918 int oct_mask = convert (mask, 8, 10); |
|
919 |
|
920 if (! error_state) |
1773
|
921 status = convert (oct_umask (oct_mask), 10, 8); |
1400
|
922 } |
|
923 } |
|
924 } |
|
925 else |
|
926 print_usage ("umask"); |
|
927 |
|
928 if (status >= 0) |
|
929 retval(0) = (double) status; |
|
930 |
|
931 return retval; |
|
932 } |
|
933 |
444
|
934 /* |
1
|
935 ;;; Local Variables: *** |
|
936 ;;; mode: C++ *** |
|
937 ;;; End: *** |
|
938 */ |