Mercurial > hg > octave-nkf
annotate src/variables.cc @ 9240:f27a8c07f0b2
clear -classes and support.
* ov-class.h (octave_class::clear_exemplar_map): New function.
* ov-class.cc (octave_class::clear_exemplar_map): New function.
* symtab.h (symbol_record::clear_objects): New function
* symtab.h (symbol_record::do_clear_objects): New function
* variables.cc (do_matlab_compatible_clear, clear): Added classes option
author | Robert T. Short <octave@phaselockedsystems.com> |
---|---|
date | Thu, 21 May 2009 14:26:47 -0700 |
parents | 2669527e0ce5 |
children | 80c299c84796 |
rev | line source |
---|---|
1 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, |
8920 | 4 2003, 2004, 2005, 2006, 2007, 2008, 2009 John W. Eaton |
1 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
1 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
1 | 21 |
22 */ | |
23 | |
240 | 24 #ifdef HAVE_CONFIG_H |
1192 | 25 #include <config.h> |
1 | 26 #endif |
27 | |
1468 | 28 #include <cstdio> |
1343 | 29 #include <cstring> |
605 | 30 |
7336 | 31 #include <iomanip> |
4207 | 32 #include <set> |
1728 | 33 #include <string> |
34 | |
2926 | 35 #include "file-stat.h" |
36 #include "oct-env.h" | |
4604 | 37 #include "file-ops.h" |
2926 | 38 #include "glob-match.h" |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
39 #include "regex-match.h" |
1755 | 40 #include "str-vec.h" |
41 | |
2492 | 42 #include <defaults.h> |
4435 | 43 #include "Cell.h" |
1352 | 44 #include "defun.h" |
45 #include "dirfns.h" | |
46 #include "error.h" | |
2205 | 47 #include "gripes.h" |
1352 | 48 #include "help.h" |
3165 | 49 #include "input.h" |
1352 | 50 #include "lex.h" |
5832 | 51 #include "load-path.h" |
2926 | 52 #include "oct-map.h" |
53 #include "oct-obj.h" | |
54 #include "ov.h" | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
55 #include "ov-class.h" |
3933 | 56 #include "ov-usr-fcn.h" |
605 | 57 #include "pager.h" |
1352 | 58 #include "parse.h" |
2926 | 59 #include "symtab.h" |
2205 | 60 #include "toplev.h" |
1352 | 61 #include "unwind-prot.h" |
1 | 62 #include "utils.h" |
1352 | 63 #include "variables.h" |
2205 | 64 |
7336 | 65 // Defines layout for the whos/who -long command |
66 static std::string Vwhos_line_format | |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
67 = " %a:4; %ln:6; %cs:16:6:1; %rb:12; %lc:-1;\n"; |
195 | 68 |
6068 | 69 void |
6072 | 70 clear_mex_functions (void) |
6068 | 71 { |
7336 | 72 symbol_table::clear_mex_functions (); |
73 } | |
74 | |
75 void | |
76 clear_function (const std::string& nm) | |
77 { | |
78 symbol_table::clear_function (nm); | |
79 } | |
80 | |
81 void | |
82 clear_variable (const std::string& nm) | |
83 { | |
84 symbol_table::clear_variable (nm); | |
85 } | |
86 | |
87 void | |
88 clear_symbol (const std::string& nm) | |
89 { | |
90 symbol_table::clear_symbol (nm); | |
6068 | 91 } |
92 | |
593 | 93 // Attributes of variables and functions. |
94 | |
2086 | 95 // Is this octave_value a valid function? |
593 | 96 |
2975 | 97 octave_function * |
4345 | 98 is_valid_function (const std::string& fcn_name, |
99 const std::string& warn_for, bool warn) | |
593 | 100 { |
2975 | 101 octave_function *ans = 0; |
593 | 102 |
1755 | 103 if (! fcn_name.empty ()) |
3618 | 104 { |
7336 | 105 octave_value val = symbol_table::find_function (fcn_name); |
106 | |
107 if (val.is_defined ()) | |
108 ans = val.function_value (true); | |
3618 | 109 } |
593 | 110 |
7336 | 111 if (! ans && warn) |
112 error ("%s: the symbol `%s' is not valid as a function", | |
113 warn_for.c_str (), fcn_name.c_str ()); | |
593 | 114 |
115 return ans; | |
116 } | |
117 | |
2975 | 118 octave_function * |
4345 | 119 is_valid_function (const octave_value& arg, |
120 const std::string& warn_for, bool warn) | |
3178 | 121 { |
122 octave_function *ans = 0; | |
123 | |
3523 | 124 std::string fcn_name; |
3178 | 125 |
126 if (arg.is_string ()) | |
4700 | 127 { |
128 fcn_name = arg.string_value (); | |
3178 | 129 |
4700 | 130 if (! error_state) |
131 ans = is_valid_function (fcn_name, warn_for, warn); | |
132 else if (warn) | |
133 error ("%s: expecting function name as argument", warn_for.c_str ()); | |
134 } | |
3178 | 135 else if (warn) |
136 error ("%s: expecting function name as argument", warn_for.c_str ()); | |
137 | |
138 return ans; | |
139 } | |
140 | |
141 octave_function * | |
3523 | 142 extract_function (const octave_value& arg, const std::string& warn_for, |
143 const std::string& fname, const std::string& header, | |
144 const std::string& trailer) | |
2796 | 145 { |
2975 | 146 octave_function *retval = 0; |
2796 | 147 |
148 retval = is_valid_function (arg, warn_for, 0); | |
149 | |
150 if (! retval) | |
151 { | |
3523 | 152 std::string s = arg.string_value (); |
2796 | 153 |
3523 | 154 std::string cmd = header; |
2796 | 155 cmd.append (s); |
156 cmd.append (trailer); | |
157 | |
158 if (! error_state) | |
159 { | |
160 int parse_status; | |
161 | |
2898 | 162 eval_string (cmd, true, parse_status); |
2796 | 163 |
164 if (parse_status == 0) | |
165 { | |
166 retval = is_valid_function (fname, warn_for, 0); | |
167 | |
168 if (! retval) | |
169 { | |
170 error ("%s: `%s' is not valid as a function", | |
171 warn_for.c_str (), fname.c_str ()); | |
172 return retval; | |
173 } | |
174 } | |
175 else | |
176 error ("%s: `%s' is not valid as a function", | |
177 warn_for.c_str (), fname.c_str ()); | |
178 } | |
179 else | |
180 error ("%s: expecting first argument to be a string", | |
181 warn_for.c_str ()); | |
182 } | |
183 | |
184 return retval; | |
185 } | |
186 | |
2921 | 187 string_vector |
3523 | 188 get_struct_elts (const std::string& text) |
2921 | 189 { |
190 int n = 1; | |
191 | |
192 size_t pos = 0; | |
193 | |
194 size_t len = text.length (); | |
195 | |
8021 | 196 while ((pos = text.find ('.', pos)) != std::string::npos) |
2921 | 197 { |
198 if (++pos == len) | |
199 break; | |
200 | |
201 n++; | |
202 } | |
203 | |
204 string_vector retval (n); | |
205 | |
206 pos = 0; | |
207 | |
208 for (int i = 0; i < n; i++) | |
209 { | |
4587 | 210 len = text.find ('.', pos); |
2921 | 211 |
8021 | 212 if (len != std::string::npos) |
2921 | 213 len -= pos; |
214 | |
215 retval[i] = text.substr (pos, len); | |
216 | |
8021 | 217 if (len != std::string::npos) |
2921 | 218 pos += len + 1; |
219 } | |
220 | |
221 return retval; | |
222 } | |
223 | |
4179 | 224 static inline bool |
225 is_variable (const std::string& name) | |
226 { | |
227 bool retval = false; | |
228 | |
229 if (! name.empty ()) | |
230 { | |
7336 | 231 octave_value val = symbol_table::varval (name); |
232 | |
233 retval = val.is_defined (); | |
4179 | 234 } |
235 | |
236 return retval; | |
237 } | |
238 | |
2921 | 239 string_vector |
3933 | 240 generate_struct_completions (const std::string& text, |
241 std::string& prefix, std::string& hint) | |
2921 | 242 { |
243 string_vector names; | |
244 | |
245 size_t pos = text.rfind ('.'); | |
246 | |
8021 | 247 if (pos != std::string::npos) |
2921 | 248 { |
249 if (pos == text.length ()) | |
250 hint = ""; | |
251 else | |
252 hint = text.substr (pos+1); | |
253 | |
254 prefix = text.substr (0, pos); | |
255 | |
4179 | 256 std::string base_name = prefix; |
257 | |
258 pos = base_name.find_first_of ("{(."); | |
2921 | 259 |
8021 | 260 if (pos != std::string::npos) |
4179 | 261 base_name = base_name.substr (0, pos); |
4143 | 262 |
4179 | 263 if (is_variable (base_name)) |
264 { | |
265 int parse_status; | |
266 | |
267 unwind_protect::begin_frame ("generate_struct_completions"); | |
3935 | 268 |
4452 | 269 unwind_protect_int (error_state); |
270 unwind_protect_int (warning_state); | |
271 | |
4179 | 272 unwind_protect_bool (discard_error_messages); |
4452 | 273 unwind_protect_bool (discard_warning_messages); |
3935 | 274 |
4179 | 275 discard_error_messages = true; |
4452 | 276 discard_warning_messages = true; |
2921 | 277 |
4179 | 278 octave_value tmp = eval_string (prefix, true, parse_status); |
279 | |
280 unwind_protect::run_frame ("generate_struct_completions"); | |
3935 | 281 |
4179 | 282 if (tmp.is_defined () && tmp.is_map ()) |
283 names = tmp.map_keys (); | |
284 } | |
285 } | |
2921 | 286 |
287 return names; | |
288 } | |
289 | |
5775 | 290 // FIXME -- this will have to be much smarter to work |
4179 | 291 // "correctly". |
292 | |
2921 | 293 bool |
3523 | 294 looks_like_struct (const std::string& text) |
2921 | 295 { |
4604 | 296 bool retval = (! text.empty () |
297 && text != "." | |
8021 | 298 && text.find_first_of (file_ops::dir_sep_chars ()) == std::string::npos |
299 && text.find ("..") == std::string::npos | |
300 && text.rfind ('.') != std::string::npos); | |
3968 | 301 |
4179 | 302 #if 0 |
3968 | 303 symbol_record *sr = curr_sym_tab->lookup (text); |
2963 | 304 |
3968 | 305 if (sr && ! sr->is_function ()) |
306 { | |
307 int parse_status; | |
2921 | 308 |
4143 | 309 unwind_protect::begin_frame ("looks_like_struct"); |
310 | |
311 unwind_protect_bool (discard_error_messages); | |
312 unwind_protect_int (error_state); | |
313 | |
314 discard_error_messages = true; | |
315 | |
3968 | 316 octave_value tmp = eval_string (text, true, parse_status); |
317 | |
4143 | 318 unwind_protect::run_frame ("looks_like_struct"); |
319 | |
3968 | 320 retval = (tmp.is_defined () && tmp.is_map ()); |
321 } | |
4179 | 322 #endif |
3968 | 323 |
324 return retval; | |
2921 | 325 } |
2796 | 326 |
5930 | 327 static octave_value |
328 do_isglobal (const octave_value_list& args) | |
593 | 329 { |
4233 | 330 octave_value retval = false; |
593 | 331 |
712 | 332 int nargin = args.length (); |
333 | |
334 if (nargin != 1) | |
593 | 335 { |
5823 | 336 print_usage (); |
593 | 337 return retval; |
338 } | |
339 | |
3523 | 340 std::string name = args(0).string_value (); |
593 | 341 |
636 | 342 if (error_state) |
343 { | |
4028 | 344 error ("isglobal: expecting std::string argument"); |
636 | 345 return retval; |
346 } | |
347 | |
7336 | 348 return symbol_table::is_global (name); |
593 | 349 } |
350 | |
5930 | 351 DEFUN (isglobal, args, , |
352 "-*- texinfo -*-\n\ | |
353 @deftypefn {Built-in Function} {} isglobal (@var{name})\n\ | |
354 Return 1 if @var{name} is globally visible. Otherwise, return 0. For\n\ | |
355 example,\n\ | |
356 \n\ | |
357 @example\n\ | |
358 @group\n\ | |
359 global x\n\ | |
360 isglobal (\"x\")\n\ | |
361 @result{} 1\n\ | |
362 @end group\n\ | |
363 @end example\n\ | |
364 @end deftypefn") | |
365 { | |
366 return do_isglobal (args); | |
367 } | |
368 | |
369 DEFUN (is_global, args, , | |
370 "-*- texinfo -*-\n\ | |
371 @deftypefn {Built-in Function} {} isglobal (@var{name})\n\ | |
372 This function has been deprecated. Use isglobal instead.\n\ | |
373 @end deftypefn") | |
374 { | |
375 return do_isglobal (args); | |
376 } | |
377 | |
4016 | 378 int |
379 symbol_exist (const std::string& name, const std::string& type) | |
593 | 380 { |
4016 | 381 int retval = 0; |
636 | 382 |
3523 | 383 std::string struct_elts; |
384 std::string symbol_name = name; | |
1755 | 385 |
386 size_t pos = name.find ('.'); | |
387 | |
8021 | 388 if (pos != std::string::npos && pos > 0) |
1277 | 389 { |
1755 | 390 struct_elts = name.substr (pos+1); |
2790 | 391 symbol_name = name.substr (0, pos); |
1277 | 392 } |
393 | |
4009 | 394 // We shouldn't need to look in the global symbol table, since any |
395 // name that is visible in the current scope will be in the local | |
396 // symbol table. | |
397 | |
7336 | 398 octave_value_list evaluated_args; |
7753
e76a4a6e3c47
initialize args_evaluated; delete useless statement
John W. Eaton <jwe@octave.org>
parents:
7752
diff
changeset
|
399 bool args_evaluated = false; |
7336 | 400 |
401 octave_value val = symbol_table::find (symbol_name, 0, string_vector (), | |
402 evaluated_args, args_evaluated); | |
403 | |
404 if (val.is_defined ()) | |
1277 | 405 { |
4357 | 406 bool not_a_struct = struct_elts.empty (); |
7336 | 407 bool var_ok = not_a_struct /* || val.is_map_element (struct_elts) */; |
4357 | 408 |
4016 | 409 if (! retval |
4357 | 410 && var_ok |
4016 | 411 && (type == "any" || type == "var") |
9147
5579998f8acf
Update to OOP facilities.
rtshort@bristlecone.phaselocked.com
parents:
9144
diff
changeset
|
412 && (val.is_constant () || val.is_object ())) |
4009 | 413 { |
4016 | 414 retval = 1; |
4009 | 415 } |
4016 | 416 |
417 if (! retval | |
418 && (type == "any" || type == "builtin")) | |
4009 | 419 { |
7336 | 420 if (not_a_struct && val.is_builtin_function ()) |
4016 | 421 { |
422 retval = 5; | |
423 } | |
4009 | 424 } |
4016 | 425 |
426 if (! retval | |
4357 | 427 && not_a_struct |
4016 | 428 && (type == "any" || type == "file") |
7336 | 429 && (val.is_user_function () || val.is_dld_function ())) |
4009 | 430 { |
7336 | 431 octave_function *f = val.function_value (true); |
4016 | 432 std::string s = f ? f->fcn_file_name () : std::string (); |
433 | |
7336 | 434 retval = s.empty () ? 103 : (val.is_user_function () ? 2 : 3); |
4009 | 435 } |
1421 | 436 } |
4016 | 437 |
5140 | 438 if (! (type == "var" || type == "builtin")) |
593 | 439 { |
5140 | 440 if (! retval) |
593 | 441 { |
5484 | 442 std::string file_name = lookup_autoload (name); |
443 | |
444 if (file_name.empty ()) | |
5832 | 445 file_name = load_path::find_fcn (name); |
5140 | 446 |
447 size_t len = file_name.length (); | |
448 | |
5832 | 449 if (len > 0) |
4437 | 450 { |
5140 | 451 if (type == "any" || type == "file") |
452 { | |
5864 | 453 if (len > 4 && (file_name.substr (len-4) == ".oct" |
454 || file_name.substr (len-4) == ".mex")) | |
5140 | 455 retval = 3; |
456 else | |
457 retval = 2; | |
458 } | |
4437 | 459 } |
593 | 460 } |
5140 | 461 |
462 if (! retval) | |
593 | 463 { |
5140 | 464 std::string file_name = file_in_path (name, ""); |
465 | |
466 if (file_name.empty ()) | |
467 file_name = name; | |
468 | |
469 file_stat fs (file_name); | |
470 | |
471 if (fs) | |
1421 | 472 { |
5140 | 473 if ((type == "any" || type == "file") |
474 && fs.is_reg ()) | |
475 { | |
476 retval = 2; | |
477 } | |
478 else if ((type == "any" || type == "dir") | |
479 && fs.is_dir ()) | |
480 { | |
481 retval = 7; | |
482 } | |
1421 | 483 } |
593 | 484 } |
485 } | |
486 | |
487 return retval; | |
488 } | |
489 | |
4962 | 490 #define GET_IDX(LEN) \ |
491 static_cast<int> ((LEN-1) * static_cast<double> (rand ()) / RAND_MAX) | |
492 | |
4954 | 493 std::string |
494 unique_symbol_name (const std::string& basename) | |
495 { | |
4962 | 496 static const std::string alpha |
497 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; | |
498 | |
499 static size_t len = alpha.length (); | |
500 | |
501 std::string nm = basename + alpha[GET_IDX (len)]; | |
502 | |
503 size_t pos = nm.length (); | |
504 | |
505 if (nm.substr (0, 2) == "__") | |
506 nm.append ("__"); | |
507 | |
508 while (symbol_exist (nm, "any")) | |
509 nm.insert (pos++, 1, alpha[GET_IDX (len)]); | |
510 | |
511 return nm; | |
4954 | 512 } |
513 | |
4016 | 514 DEFUN (exist, args, , |
515 "-*- texinfo -*-\n\ | |
516 @deftypefn {Built-in Function} {} exist (@var{name}, @var{type})\n\ | |
7626
ec78d83a7fde
variables.cc (exist): Clarify help.
Ben Abbott <bpabbott@mac.com>
parents:
7586
diff
changeset
|
517 Return 1 if the name exists as a variable, 2 if the name is an\n\ |
ec78d83a7fde
variables.cc (exist): Clarify help.
Ben Abbott <bpabbott@mac.com>
parents:
7586
diff
changeset
|
518 absolute file name, an ordinary file in Octave's @code{path}, or (after\n\ |
ec78d83a7fde
variables.cc (exist): Clarify help.
Ben Abbott <bpabbott@mac.com>
parents:
7586
diff
changeset
|
519 appending @samp{.m}) a function file in Octave's @code{path}, 3 if the\n\ |
5864 | 520 name is a @samp{.oct} or @samp{.mex} file in Octave's @code{path},\n\ |
521 5 if the name is a built-in function, 7 if the name is a directory, or 103\n\ | |
4016 | 522 if the name is a function not associated with a file (entered on\n\ |
523 the command line).\n\ | |
524 \n\ | |
525 Otherwise, return 0.\n\ | |
526 \n\ | |
527 This function also returns 2 if a regular file called @var{name}\n\ | |
5814 | 528 exists in Octave's search path. If you want information about\n\ |
4016 | 529 other types of files, you should use some combination of the functions\n\ |
530 @code{file_in_path} and @code{stat} instead.\n\ | |
531 \n\ | |
532 If the optional argument @var{type} is supplied, check only for\n\ | |
533 symbols of the specified type. Valid types are\n\ | |
534 \n\ | |
535 @table @samp\n\ | |
536 @item \"var\"\n\ | |
537 Check only for variables.\n\ | |
538 @item \"builtin\"\n\ | |
539 Check only for built-in functions.\n\ | |
540 @item \"file\"\n\ | |
541 Check only for files.\n\ | |
542 @item \"dir\"\n\ | |
543 Check only for directories.\n\ | |
544 @end table\n\ | |
545 @end deftypefn") | |
546 { | |
4233 | 547 octave_value retval = false; |
4016 | 548 |
549 int nargin = args.length (); | |
550 | |
551 if (nargin == 1 || nargin == 2) | |
552 { | |
553 std::string name = args(0).string_value (); | |
554 | |
555 if (! error_state) | |
556 { | |
557 std::string type | |
558 = (nargin == 2) ? args(1).string_value () : std::string ("any"); | |
559 | |
560 if (! error_state) | |
4233 | 561 retval = symbol_exist (name, type); |
4016 | 562 else |
563 error ("exist: expecting second argument to be a string"); | |
564 } | |
565 else | |
566 error ("exist: expecting first argument to be a string"); | |
567 } | |
568 else | |
5823 | 569 print_usage (); |
4016 | 570 |
571 return retval; | |
572 } | |
573 | |
2849 | 574 octave_value |
4988 | 575 lookup_function_handle (const std::string& nm) |
576 { | |
7336 | 577 octave_value val = symbol_table::varval (nm); |
578 | |
579 return val.is_function_handle () ? val : octave_value (); | |
4988 | 580 } |
581 | |
582 octave_value | |
5027 | 583 get_global_value (const std::string& nm, bool silent) |
2849 | 584 { |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
585 octave_value val = symbol_table::global_varval (nm); |
7336 | 586 |
587 if (val.is_undefined () && ! silent) | |
588 error ("get_global_by_name: undefined symbol `%s'", nm.c_str ()); | |
589 | |
590 return val; | |
2849 | 591 } |
592 | |
593 void | |
3523 | 594 set_global_value (const std::string& nm, const octave_value& val) |
2849 | 595 { |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
596 symbol_table::global_varref (nm) = val; |
2849 | 597 } |
598 | |
593 | 599 // Variable values. |
195 | 600 |
5791 | 601 octave_value |
602 set_internal_variable (bool& var, const octave_value_list& args, | |
5794 | 603 int nargout, const char *nm) |
5791 | 604 { |
5794 | 605 octave_value retval; |
606 | |
5800 | 607 int nargin = args.length (); |
608 | |
609 if (nargout > 0 || nargin == 0) | |
5794 | 610 retval = var; |
5791 | 611 |
612 if (nargin == 1) | |
613 { | |
614 bool bval = args(0).bool_value (); | |
615 | |
616 if (! error_state) | |
617 var = bval; | |
618 else | |
619 error ("%s: expecting arg to be a logical value", nm); | |
620 } | |
621 else if (nargin > 1) | |
5823 | 622 print_usage (); |
5791 | 623 |
624 return retval; | |
625 } | |
626 | |
627 octave_value | |
5794 | 628 set_internal_variable (char& var, const octave_value_list& args, |
629 int nargout, const char *nm) | |
5791 | 630 { |
5794 | 631 octave_value retval; |
632 | |
5800 | 633 int nargin = args.length (); |
634 | |
635 if (nargout > 0 || nargin == 0) | |
5794 | 636 retval = var; |
5791 | 637 |
638 if (nargin == 1) | |
639 { | |
640 std::string sval = args(0).string_value (); | |
641 | |
642 if (! error_state) | |
5794 | 643 { |
644 switch (sval.length ()) | |
645 { | |
646 case 1: | |
647 var = sval[0]; | |
648 break; | |
649 | |
650 case 0: | |
651 var = '\0'; | |
652 break; | |
653 | |
654 default: | |
655 error ("%s: argument must be a single character", nm); | |
656 break; | |
657 } | |
658 } | |
659 else | |
660 error ("%s: argument must be a single character", nm); | |
661 } | |
662 else if (nargin > 1) | |
5823 | 663 print_usage (); |
5794 | 664 |
665 return retval; | |
666 } | |
667 | |
668 octave_value | |
669 set_internal_variable (int& var, const octave_value_list& args, | |
670 int nargout, const char *nm, | |
671 int minval, int maxval) | |
672 { | |
673 octave_value retval; | |
674 | |
5800 | 675 int nargin = args.length (); |
676 | |
677 if (nargout > 0 || nargin == 0) | |
5794 | 678 retval = var; |
679 | |
680 if (nargin == 1) | |
681 { | |
682 int ival = args(0).int_value (); | |
683 | |
684 if (! error_state) | |
685 { | |
686 if (ival < minval) | |
9180
2669527e0ce5
variables.cc (set_internal_variable): Pass NM in call to error
John W. Eaton <jwe@octave.org>
parents:
9153
diff
changeset
|
687 error ("%s: expecting arg to be greater than %d", nm, minval); |
5794 | 688 else if (ival > maxval) |
9180
2669527e0ce5
variables.cc (set_internal_variable): Pass NM in call to error
John W. Eaton <jwe@octave.org>
parents:
9153
diff
changeset
|
689 error ("%s: expecting arg to be less than or equal to %d", |
2669527e0ce5
variables.cc (set_internal_variable): Pass NM in call to error
John W. Eaton <jwe@octave.org>
parents:
9153
diff
changeset
|
690 nm, maxval); |
5794 | 691 else |
692 var = ival; | |
693 } | |
694 else | |
695 error ("%s: expecting arg to be an integer value", nm); | |
696 } | |
697 else if (nargin > 1) | |
5823 | 698 print_usage (); |
5794 | 699 |
700 return retval; | |
701 } | |
702 | |
703 octave_value | |
704 set_internal_variable (double& var, const octave_value_list& args, | |
705 int nargout, const char *nm, | |
706 double minval, double maxval) | |
707 { | |
708 octave_value retval; | |
709 | |
5800 | 710 int nargin = args.length (); |
711 | |
712 if (nargout > 0 || nargin == 0) | |
5794 | 713 retval = var; |
714 | |
715 if (nargin == 1) | |
716 { | |
717 double dval = args(0).scalar_value (); | |
718 | |
719 if (! error_state) | |
720 { | |
721 if (dval < minval) | |
722 error ("%s: expecting arg to be greater than %g", minval); | |
723 else if (dval > maxval) | |
724 error ("%s: expecting arg to be less than or equal to %g", maxval); | |
725 else | |
726 var = dval; | |
727 } | |
728 else | |
729 error ("%s: expecting arg to be a scalar value", nm); | |
730 } | |
731 else if (nargin > 1) | |
5823 | 732 print_usage (); |
5794 | 733 |
734 return retval; | |
735 } | |
736 | |
737 octave_value | |
738 set_internal_variable (std::string& var, const octave_value_list& args, | |
739 int nargout, const char *nm, bool empty_ok) | |
740 { | |
741 octave_value retval; | |
742 | |
5800 | 743 int nargin = args.length (); |
744 | |
745 if (nargout > 0 || nargin == 0) | |
5794 | 746 retval = var; |
747 | |
748 if (nargin == 1) | |
749 { | |
750 std::string sval = args(0).string_value (); | |
751 | |
752 if (! error_state) | |
753 { | |
754 if (empty_ok || ! sval.empty ()) | |
755 var = sval; | |
756 else | |
757 error ("%s: value must not be empty", nm); | |
758 } | |
5791 | 759 else |
760 error ("%s: expecting arg to be a character string", nm); | |
761 } | |
762 else if (nargin > 1) | |
5823 | 763 print_usage (); |
1 | 764 |
765 return retval; | |
766 } | |
767 | |
7336 | 768 struct |
769 whos_parameter | |
195 | 770 { |
7336 | 771 char command; |
772 char modifier; | |
773 int parameter_length; | |
774 int first_parameter_length; | |
775 int balance; | |
776 std::string text; | |
777 std::string line; | |
778 }; | |
779 | |
780 static void | |
781 print_descriptor (std::ostream& os, std::list<whos_parameter> params) | |
782 { | |
783 // This method prints a line of information on a given symbol | |
784 std::list<whos_parameter>::iterator i = params.begin (); | |
785 std::ostringstream param_buf; | |
786 | |
787 while (i != params.end ()) | |
195 | 788 { |
7336 | 789 whos_parameter param = *i; |
790 | |
791 if (param.command != '\0') | |
792 { | |
793 // Do the actual printing | |
794 switch (param.modifier) | |
795 { | |
796 case 'l': | |
797 os << std::setiosflags (std::ios::left) << std::setw (param.parameter_length); | |
798 param_buf << std::setiosflags (std::ios::left) << std::setw (param.parameter_length); | |
799 break; | |
800 | |
801 case 'r': | |
802 os << std::setiosflags (std::ios::right) << std::setw (param.parameter_length); | |
803 param_buf << std::setiosflags (std::ios::right) << std::setw (param.parameter_length); | |
804 break; | |
805 | |
806 case 'c': | |
807 if (param.command != 's') | |
808 { | |
809 os << std::setiosflags (std::ios::left) | |
810 << std::setw (param.parameter_length); | |
811 param_buf << std::setiosflags (std::ios::left) | |
812 << std::setw (param.parameter_length); | |
813 } | |
814 break; | |
815 | |
816 default: | |
817 os << std::setiosflags (std::ios::left) << std::setw (param.parameter_length); | |
818 param_buf << std::setiosflags (std::ios::left) << std::setw (param.parameter_length); | |
819 } | |
820 | |
821 if (param.command == 's' && param.modifier == 'c') | |
822 { | |
823 int a, b; | |
824 | |
825 if (param.modifier == 'c') | |
826 { | |
827 a = param.first_parameter_length - param.balance; | |
828 a = (a < 0 ? 0 : a); | |
829 b = param.parameter_length - a - param.text . length (); | |
830 b = (b < 0 ? 0 : b); | |
831 os << std::setiosflags (std::ios::left) << std::setw (a) | |
832 << "" << std::resetiosflags (std::ios::left) << param.text | |
833 << std::setiosflags (std::ios::left) | |
834 << std::setw (b) << "" | |
835 << std::resetiosflags (std::ios::left); | |
836 param_buf << std::setiosflags (std::ios::left) << std::setw (a) | |
837 << "" << std::resetiosflags (std::ios::left) << param.line | |
838 << std::setiosflags (std::ios::left) | |
839 << std::setw (b) << "" | |
840 << std::resetiosflags (std::ios::left); | |
841 } | |
842 } | |
843 else | |
844 { | |
845 os << param.text; | |
846 param_buf << param.line; | |
847 } | |
848 os << std::resetiosflags (std::ios::left) | |
849 << std::resetiosflags (std::ios::right); | |
850 param_buf << std::resetiosflags (std::ios::left) | |
851 << std::resetiosflags (std::ios::right); | |
852 i++; | |
853 } | |
854 else | |
2975 | 855 { |
7336 | 856 os << param.text; |
857 param_buf << param.line; | |
858 i++; | |
2975 | 859 } |
195 | 860 } |
7336 | 861 |
862 os << param_buf.str (); | |
195 | 863 } |
864 | |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
865 class |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
866 symbol_info_list |
593 | 867 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
868 private: |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
869 struct symbol_info |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
870 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
871 symbol_info (const symbol_table::symbol_record& sr, |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
872 const std::string& expr_str = std::string (), |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
873 const octave_value& expr_val = octave_value ()) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
874 : name (expr_str.empty () ? sr.name () : expr_str), |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
875 is_automatic (sr.is_automatic ()), |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
876 is_formal (sr.is_formal ()), |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
877 is_global (sr.is_global ()), |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
878 is_persistent (sr.is_persistent ()), |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
879 varval (expr_val.is_undefined () ? sr.varval () : expr_val) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
880 { } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
881 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
882 void display_line (std::ostream& os, |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
883 const std::list<whos_parameter>& params) const |
593 | 884 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
885 dim_vector dims = varval.dims (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
886 std::string dims_str = dims.str (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
887 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
888 std::list<whos_parameter>::const_iterator i = params.begin (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
889 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
890 while (i != params.end ()) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
891 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
892 whos_parameter param = *i; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
893 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
894 if (param.command != '\0') |
2294 | 895 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
896 // Do the actual printing. |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
897 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
898 switch (param.modifier) |
2294 | 899 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
900 case 'l': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
901 os << std::setiosflags (std::ios::left) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
902 << std::setw (param.parameter_length); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
903 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
904 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
905 case 'r': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
906 os << std::setiosflags (std::ios::right) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
907 << std::setw (param.parameter_length); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
908 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
909 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
910 case 'c': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
911 if (param.command == 's') |
7336 | 912 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
913 int front = param.first_parameter_length |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
914 - dims_str.find ('x'); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
915 int back = param.parameter_length |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
916 - dims_str.length () |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
917 - front; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
918 front = (front > 0) ? front : 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
919 back = (back > 0) ? back : 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
920 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
921 os << std::setiosflags (std::ios::left) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
922 << std::setw (front) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
923 << "" |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
924 << std::resetiosflags (std::ios::left) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
925 << dims_str |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
926 << std::setiosflags (std::ios::left) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
927 << std::setw (back) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
928 << "" |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
929 << std::resetiosflags (std::ios::left); |
7336 | 930 } |
2294 | 931 else |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
932 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
933 os << std::setiosflags (std::ios::left) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
934 << std::setw (param.parameter_length); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
935 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
936 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
937 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
938 default: |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
939 error ("whos_line_format: modifier `%c' unknown", |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
940 param.modifier); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
941 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
942 os << std::setiosflags (std::ios::right) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
943 << std::setw (param.parameter_length); |
2294 | 944 } |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
945 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
946 switch (param.command) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
947 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
948 case 'a': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
949 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
950 char tmp[5]; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
951 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
952 tmp[0] = (is_automatic ? 'a' : ' '); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
953 tmp[1] = (is_formal ? 'f' : ' '); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
954 tmp[2] = (is_global ? 'g' : ' '); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
955 tmp[3] = (is_persistent ? 'p' : ' '); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
956 tmp[4] = 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
957 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
958 os << tmp; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
959 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
960 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
961 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
962 case 'b': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
963 os << varval.byte_size (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
964 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
965 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
966 case 'c': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
967 os << varval.class_name (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
968 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
969 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
970 case 'e': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
971 os << varval.capacity (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
972 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
973 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
974 case 'n': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
975 os << name; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
976 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
977 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
978 case 's': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
979 if (param.modifier != 'c') |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
980 os << dims_str; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
981 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
982 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
983 case 't': |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
984 os << varval.type_name (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
985 break; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
986 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
987 default: |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
988 error ("whos_line_format: command `%c' unknown", |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
989 param.command); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
990 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
991 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
992 os << std::resetiosflags (std::ios::left) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
993 << std::resetiosflags (std::ios::right); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
994 i++; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
995 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
996 else |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
997 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
998 os << param.text; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
999 i++; |
2294 | 1000 } |
593 | 1001 } |
1002 } | |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1003 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1004 std::string name; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1005 bool is_automatic; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1006 bool is_formal; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1007 bool is_global; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1008 bool is_persistent; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1009 octave_value varval; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1010 }; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1011 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1012 public: |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1013 symbol_info_list (void) : lst () { } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1014 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1015 symbol_info_list (const symbol_info_list& sil) : lst (sil.lst) { } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1016 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1017 symbol_info_list& operator = (const symbol_info_list& sil) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1018 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1019 if (this != &sil) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1020 lst = sil.lst; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1021 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1022 return *this; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1023 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1024 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1025 ~symbol_info_list (void) { } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1026 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1027 void append (const symbol_table::symbol_record& sr) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1028 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1029 lst.push_back (symbol_info (sr)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1030 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1031 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1032 void append (const symbol_table::symbol_record& sr, |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1033 const std::string& expr_str, |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1034 const octave_value& expr_val) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1035 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1036 lst.push_back (symbol_info (sr, expr_str, expr_val)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1037 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1038 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1039 size_t size (void) const { return lst.size (); } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1040 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1041 bool empty (void) const { return lst.empty (); } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1042 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1043 Octave_map |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1044 map_value (const std::string& caller_function_name, int nesting_level) const |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1045 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1046 size_t len = lst.size (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1047 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1048 Array<octave_value> name_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1049 Array<octave_value> size_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1050 Array<octave_value> bytes_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1051 Array<octave_value> class_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1052 Array<octave_value> global_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1053 Array<octave_value> sparse_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1054 Array<octave_value> complex_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1055 Array<octave_value> nesting_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1056 Array<octave_value> persistent_info (len, 1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1057 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1058 std::list<symbol_info>::const_iterator p = lst.begin (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1059 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1060 for (size_t j = 0; j < len; j++) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1061 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1062 const symbol_info& si = *p++; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1063 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1064 Octave_map ni; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1065 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1066 ni.assign ("function", caller_function_name); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1067 ni.assign ("level", nesting_level); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1068 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1069 name_info(j) = si.name; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1070 global_info(j) = si.is_global; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1071 persistent_info(j) = si.is_persistent; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1072 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1073 octave_value val = si.varval; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1074 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1075 size_info(j) = val.size (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1076 bytes_info(j) = val.byte_size (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1077 class_info(j) = val.class_name (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1078 sparse_info(j) = val.is_sparse_type (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1079 complex_info(j) = val.is_complex_type (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1080 nesting_info(j) = ni; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1081 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1082 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1083 Octave_map info; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1084 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1085 info.assign ("name", name_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1086 info.assign ("size", size_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1087 info.assign ("bytes", bytes_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1088 info.assign ("class", class_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1089 info.assign ("global", global_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1090 info.assign ("sparse", sparse_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1091 info.assign ("complex", complex_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1092 info.assign ("nesting", nesting_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1093 info.assign ("persistent", persistent_info); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1094 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1095 return info; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1096 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1097 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1098 void display (std::ostream& os) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1099 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1100 if (! lst.empty ()) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1101 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1102 size_t bytes = 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1103 size_t elements = 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1104 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1105 std::list<whos_parameter> params = parse_whos_line_format (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1106 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1107 print_descriptor (os, params); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1108 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1109 octave_stdout << "\n"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1110 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1111 for (std::list<symbol_info>::const_iterator p = lst.begin (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1112 p != lst.end (); p++) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1113 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1114 p->display_line (os, params); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1115 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1116 octave_value val = p->varval; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1117 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1118 elements += val.capacity (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1119 bytes += val.byte_size (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1120 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1121 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1122 os << "\nTotal is " << elements |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1123 << (elements == 1 ? " element" : " elements") |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1124 << " using " << bytes << (bytes == 1 ? " byte" : " bytes") |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1125 << "\n"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1126 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1127 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1128 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1129 // Parse the string whos_line_format, and return a parameter list, |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1130 // containing all information needed to print the given |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1131 // attributtes of the symbols. |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1132 std::list<whos_parameter> parse_whos_line_format (void) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1133 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1134 int idx; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1135 size_t format_len = Vwhos_line_format.length (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1136 char garbage; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1137 std::list<whos_parameter> params; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1138 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1139 size_t bytes1; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1140 int elements1; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1141 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1142 std::string param_string = "abcenst"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1143 Array<int> param_length (dim_vector (param_string.length (), 1)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1144 Array<std::string> param_names (dim_vector (param_string.length (), 1)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1145 size_t pos_a, pos_b, pos_c, pos_e, pos_n, pos_s, pos_t; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1146 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1147 pos_a = param_string.find ('a'); // Attributes |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1148 pos_b = param_string.find ('b'); // Bytes |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1149 pos_c = param_string.find ('c'); // Class |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1150 pos_e = param_string.find ('e'); // Elements |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1151 pos_n = param_string.find ('n'); // Name |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1152 pos_s = param_string.find ('s'); // Size |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1153 pos_t = param_string.find ('t'); // Type |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1154 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1155 param_names(pos_a) = "Attr"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1156 param_names(pos_b) = "Bytes"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1157 param_names(pos_c) = "Class"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1158 param_names(pos_e) = "Elements"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1159 param_names(pos_n) = "Name"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1160 param_names(pos_s) = "Size"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1161 param_names(pos_t) = "Type"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1162 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1163 for (size_t i = 0; i < param_string.length (); i++) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1164 param_length(i) = param_names(i) . length (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1165 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1166 // Calculating necessary spacing for name column, |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1167 // bytes column, elements column and class column |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1168 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1169 for (std::list<symbol_info>::const_iterator p = lst.begin (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1170 p != lst.end (); p++) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1171 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1172 std::stringstream ss1, ss2; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1173 std::string str; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1174 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1175 str = p->name; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1176 param_length(pos_n) = ((str.length () |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1177 > static_cast<size_t> (param_length(pos_n))) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1178 ? str.length () : param_length(pos_n)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1179 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1180 octave_value val = p->varval; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1181 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1182 str = val.type_name (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1183 param_length(pos_t) = ((str.length () |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1184 > static_cast<size_t> (param_length(pos_t))) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1185 ? str.length () : param_length(pos_t)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1186 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1187 elements1 = val.capacity (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1188 ss1 << elements1; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1189 str = ss1.str (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1190 param_length(pos_e) = ((str.length () |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1191 > static_cast<size_t> (param_length(pos_e))) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1192 ? str.length () : param_length(pos_e)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1193 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1194 bytes1 = val.byte_size (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1195 ss2 << bytes1; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1196 str = ss2.str (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1197 param_length(pos_b) = ((str.length () |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1198 > static_cast<size_t> (param_length(pos_b))) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1199 ? str.length () : param_length (pos_b)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1200 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1201 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1202 idx = 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1203 while (static_cast<size_t> (idx) < format_len) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1204 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1205 whos_parameter param; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1206 param.command = '\0'; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1207 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1208 if (Vwhos_line_format[idx] == '%') |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1209 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1210 bool error_encountered = false; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1211 param.modifier = 'r'; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1212 param.parameter_length = 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1213 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1214 int a = 0, b = -1, balance = 1; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1215 unsigned int items; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1216 size_t pos; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1217 std::string cmd; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1218 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1219 // Parse one command from whos_line_format |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1220 cmd = Vwhos_line_format.substr (idx, Vwhos_line_format.length ()); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1221 pos = cmd.find (';'); |
8021 | 1222 if (pos != std::string::npos) |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1223 cmd = cmd.substr (0, pos+1); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1224 else |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1225 error ("parameter without ; in whos_line_format"); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1226 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1227 idx += cmd.length (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1228 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1229 // FIXME -- use iostream functions instead of sscanf! |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1230 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1231 if (cmd.find_first_of ("crl") != 1) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1232 items = sscanf (cmd.c_str (), "%c%c:%d:%d:%d;", |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1233 &garbage, ¶m.command, &a, &b, &balance); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1234 else |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1235 items = sscanf (cmd.c_str (), "%c%c%c:%d:%d:%d;", |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1236 &garbage, ¶m.modifier, ¶m.command, |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1237 &a, &b, &balance) - 1; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1238 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1239 if (items < 2) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1240 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1241 error ("whos_line_format: parameter structure without command in whos_line_format"); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1242 error_encountered = true; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1243 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1244 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1245 // Insert data into parameter |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1246 param.first_parameter_length = 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1247 pos = param_string.find (param.command); |
8021 | 1248 if (pos != std::string::npos) |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1249 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1250 param.parameter_length = param_length(pos); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1251 param.text = param_names(pos); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1252 param.line.assign (param_names(pos).length (), '='); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1253 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1254 param.parameter_length = (a > param.parameter_length |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1255 ? a : param.parameter_length); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1256 if (param.command == 's' && param.modifier == 'c' && b > 0) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1257 param.first_parameter_length = b; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1258 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1259 else |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1260 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1261 error ("whos_line_format: '%c' is not a command", |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1262 param.command); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1263 error_encountered = true; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1264 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1265 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1266 if (param.command == 's') |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1267 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1268 // Have to calculate space needed for printing |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1269 // matrix dimensions Space needed for Size column is |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1270 // hard to determine in prior, because it depends on |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1271 // dimensions to be shown. That is why it is |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1272 // recalculated for each Size-command int first, |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1273 // rest = 0, total; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1274 int rest = 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1275 int first = param.first_parameter_length; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1276 int total = param.parameter_length; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1277 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1278 for (std::list<symbol_info>::const_iterator p = lst.begin (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1279 p != lst.end (); p++) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1280 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1281 octave_value val = p->varval; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1282 dim_vector dims = val.dims (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1283 std::string dims_str = dims.str (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1284 int first1 = dims_str.find ('x'); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1285 int total1 = dims_str.length (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1286 int rest1 = total1 - first1; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1287 rest = (rest1 > rest ? rest1 : rest); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1288 first = (first1 > first ? first1 : first); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1289 total = (total1 > total ? total1 : total); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1290 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1291 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1292 if (param.modifier == 'c') |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1293 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1294 if (first < balance) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1295 first += balance - first; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1296 if (rest + balance < param.parameter_length) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1297 rest += param.parameter_length - rest - balance; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1298 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1299 param.parameter_length = first + rest; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1300 param.first_parameter_length = first; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1301 param.balance = balance; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1302 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1303 else |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1304 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1305 param.parameter_length = total; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1306 param.first_parameter_length = 0; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1307 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1308 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1309 else if (param.modifier == 'c') |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1310 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1311 error ("whos_line_format: modifier 'c' not available for command '%c'", |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1312 param.command); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1313 error_encountered = true; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1314 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1315 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1316 // What happens if whos_line_format contains negative numbers |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1317 // at param_length positions? |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1318 param.balance = (b < 0 ? 0 : param.balance); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1319 param.first_parameter_length = (b < 0 ? 0 : |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1320 param.first_parameter_length); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1321 param.parameter_length = (a < 0 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1322 ? 0 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1323 : (param.parameter_length |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1324 < param_length(pos_s) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1325 ? param_length(pos_s) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1326 : param.parameter_length)); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1327 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1328 // Parameter will not be pushed into parameter list if ... |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1329 if (! error_encountered) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1330 params.push_back (param); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1331 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1332 else |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1333 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1334 // Text string, to be printed as it is ... |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1335 std::string text; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1336 size_t pos; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1337 text = Vwhos_line_format.substr (idx, Vwhos_line_format.length ()); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1338 pos = text.find ('%'); |
8021 | 1339 if (pos != std::string::npos) |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1340 text = text.substr (0, pos); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1341 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1342 // Push parameter into list ... |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1343 idx += text.length (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1344 param.text=text; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1345 param.line.assign (text.length(), ' '); |
7336 | 1346 params.push_back (param); |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1347 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1348 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1349 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1350 return params; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1351 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1352 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1353 private: |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1354 std::list<symbol_info> lst; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1355 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1356 }; |
5659 | 1357 |
4435 | 1358 static octave_value |
7336 | 1359 do_who (int argc, const string_vector& argv, bool return_list, |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1360 bool verbose = false, std::string msg = std::string ()) |
529 | 1361 { |
4435 | 1362 octave_value retval; |
529 | 1363 |
3523 | 1364 std::string my_name = argv[0]; |
584 | 1365 |
7336 | 1366 bool global_only = false; |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1367 bool have_regexp = false; |
7336 | 1368 |
1857 | 1369 int i; |
1370 for (i = 1; i < argc; i++) | |
529 | 1371 { |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1372 if (argv[i] == "-file") |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1373 { |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1374 // FIXME. This is an inefficient manner to implement this as the |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1375 // variables are loaded in to a temporary context and then treated. |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1376 // It would be better to refecat symbol_info_list to not store the |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1377 // symbol records and then use it in load-save.cc (do_load) to |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1378 // implement this option there so that the variables are never |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1379 // stored at all. |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1380 if (i == argc - 1) |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1381 error ("whos: -file argument must be followed by a file name"); |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1382 else |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1383 { |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1384 std::string nm = argv [i + 1]; |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1385 |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1386 unwind_protect::begin_frame ("do_who_file"); |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1387 |
9144
c6463412aebb
eliminate symbol_table::scope_stack; fix scoping issue with evalin
John W. Eaton <jwe@octave.org>
parents:
9037
diff
changeset
|
1388 // Set up temporary scope. |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1389 |
9144
c6463412aebb
eliminate symbol_table::scope_stack; fix scoping issue with evalin
John W. Eaton <jwe@octave.org>
parents:
9037
diff
changeset
|
1390 symbol_table::scope_id tmp_scope = symbol_table::alloc_scope (); |
c6463412aebb
eliminate symbol_table::scope_stack; fix scoping issue with evalin
John W. Eaton <jwe@octave.org>
parents:
9037
diff
changeset
|
1391 unwind_protect::add (symbol_table::erase_scope, &tmp_scope); |
c6463412aebb
eliminate symbol_table::scope_stack; fix scoping issue with evalin
John W. Eaton <jwe@octave.org>
parents:
9037
diff
changeset
|
1392 |
c6463412aebb
eliminate symbol_table::scope_stack; fix scoping issue with evalin
John W. Eaton <jwe@octave.org>
parents:
9037
diff
changeset
|
1393 symbol_table::set_scope (tmp_scope); |
c6463412aebb
eliminate symbol_table::scope_stack; fix scoping issue with evalin
John W. Eaton <jwe@octave.org>
parents:
9037
diff
changeset
|
1394 |
c6463412aebb
eliminate symbol_table::scope_stack; fix scoping issue with evalin
John W. Eaton <jwe@octave.org>
parents:
9037
diff
changeset
|
1395 octave_call_stack::push (tmp_scope, 0); |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1396 unwind_protect::add (octave_call_stack::unwind_pop, 0); |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1397 |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1398 unwind_protect::add (symbol_table::clear_variables); |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1399 |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1400 feval ("load", octave_value (nm), 0); |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1401 |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1402 if (! error_state) |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1403 { |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1404 std::string newmsg = std::string ("Variables in the file ") + |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1405 nm + ":\n\n"; |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1406 |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1407 retval = do_who (i, argv, return_list, verbose, newmsg); |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1408 } |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1409 |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1410 unwind_protect::run_frame ("do_who_file"); |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1411 } |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1412 |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1413 return retval; |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1414 } |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1415 else if (argv[i] == "-regexp") |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1416 have_regexp = true; |
7336 | 1417 else if (argv[i] == "global") |
1418 global_only = true; | |
1755 | 1419 else if (argv[i][0] == '-') |
1420 warning ("%s: unrecognized option `%s'", my_name.c_str (), | |
1421 argv[i].c_str ()); | |
529 | 1422 else |
867 | 1423 break; |
529 | 1424 } |
1425 | |
7336 | 1426 int npats = argc - i; |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1427 string_vector pats; |
7336 | 1428 if (npats > 0) |
3248 | 1429 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1430 pats.resize (npats); |
7336 | 1431 for (int j = 0; j < npats; j++) |
1432 pats[j] = argv[i+j]; | |
3248 | 1433 } |
7336 | 1434 else |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1435 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1436 pats.resize (++npats); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1437 pats[0] = "*"; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1438 } |
7336 | 1439 |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1440 symbol_info_list symbol_stats; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1441 std::list<std::string> symbol_names; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1442 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1443 for (int j = 0; j < npats; j++) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1444 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1445 std::string pat = pats[j]; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1446 |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1447 if (have_regexp) |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1448 { |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1449 std::list<symbol_table::symbol_record> tmp = global_only |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1450 ? symbol_table::regexp_global_variables (pat) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1451 : symbol_table::regexp_variables (pat); |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1452 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1453 for (std::list<symbol_table::symbol_record>::const_iterator p = tmp.begin (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1454 p != tmp.end (); p++) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1455 { |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1456 if (verbose) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1457 symbol_stats.append (*p); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1458 else |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1459 symbol_names.push_back (p->name ()); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1460 } |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1461 } |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1462 else |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1463 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1464 size_t pos = pat.find_first_of (".({"); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1465 |
8021 | 1466 if (pos != std::string::npos && pos > 0) |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1467 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1468 if (verbose) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1469 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1470 // NOTE: we can only display information for |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1471 // expressions based on global values if the variable is |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1472 // global in the current scope because we currently have |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1473 // no way of looking up the base value in the global |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1474 // scope and then evaluating the arguments in the |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1475 // current scope. |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1476 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1477 std::string base_name = pat.substr (0, pos); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1478 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1479 if (symbol_table::is_variable (base_name)) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1480 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1481 symbol_table::symbol_record sr |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1482 = symbol_table::find_symbol (base_name); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1483 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1484 if (! global_only || sr.is_global ()) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1485 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1486 int parse_status; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1487 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1488 octave_value expr_val |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1489 = eval_string (pat, true, parse_status); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1490 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1491 if (! error_state) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1492 symbol_stats.append (sr, pat, expr_val); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1493 else |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1494 return retval; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1495 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1496 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1497 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1498 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1499 else |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1500 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1501 std::list<symbol_table::symbol_record> tmp = global_only |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1502 ? symbol_table::glob_global_variables (pat) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1503 : symbol_table::glob_variables (pat); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1504 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1505 for (std::list<symbol_table::symbol_record>::const_iterator p = tmp.begin (); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1506 p != tmp.end (); p++) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1507 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1508 if (verbose) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1509 symbol_stats.append (*p); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1510 else |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1511 symbol_names.push_back (p->name ()); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1512 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1513 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1514 } |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1515 } |
529 | 1516 |
4435 | 1517 if (return_list) |
529 | 1518 { |
7336 | 1519 if (verbose) |
4435 | 1520 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1521 std::string caller_function_name; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1522 octave_function *caller = octave_call_stack::caller (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1523 if (caller) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1524 caller_function_name = caller->name (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1525 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1526 retval = symbol_stats.map_value (caller_function_name, 1); |
4435 | 1527 } |
1528 else | |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1529 retval = Cell (string_vector (symbol_names)); |
529 | 1530 } |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1531 else if (! (symbol_stats.empty () && symbol_names.empty ())) |
529 | 1532 { |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1533 if (msg.length () == 0) |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1534 if (global_only) |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1535 octave_stdout << "Global variables:\n\n"; |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1536 else |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1537 octave_stdout << "Variables in the current scope:\n\n"; |
7336 | 1538 else |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1539 octave_stdout << msg; |
7336 | 1540 |
1541 if (verbose) | |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1542 symbol_stats.display (octave_stdout); |
7336 | 1543 else |
4435 | 1544 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1545 string_vector names (symbol_names); |
7336 | 1546 |
1547 names.list_in_columns (octave_stdout); | |
4435 | 1548 } |
1549 | |
7336 | 1550 octave_stdout << "\n"; |
529 | 1551 } |
1552 | |
581 | 1553 return retval; |
1554 } | |
1555 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1556 DEFUN (who, args, nargout, |
3361 | 1557 "-*- texinfo -*-\n\ |
1558 @deffn {Command} who options pattern @dots{}\n\ | |
1559 @deffnx {Command} whos options pattern @dots{}\n\ | |
1560 List currently defined symbols matching the given patterns. The\n\ | |
1561 following are valid options. They may be shortened to one character but\n\ | |
1562 may not be combined.\n\ | |
1563 \n\ | |
1564 @table @code\n\ | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1565 @item global\n\ |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1566 List the variables in the global scope rather than the current scope.\n\ |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1567 @item -regexp\n\ |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1568 The patterns are considered as regular expressions and will be used\n\ |
9037
4cb9f994dcec
Documentation cleanup of var.texi, expr.texi, eval.texi
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
1569 for matching the variables to display. The same pattern syntax as for\n\ |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1570 the @code{regexp} function is used.\n\ |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1571 @item -file\n\ |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1572 The following argument is treated as a filename, and the variables that\n\ |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1573 are found within this file are listed.\n\ |
3361 | 1574 @end table\n\ |
1575 \n\ | |
1576 Valid patterns are the same as described for the @code{clear} command\n\ | |
1577 above. If no patterns are supplied, all symbols from the given category\n\ | |
1578 are listed. By default, only user defined functions and variables\n\ | |
1579 visible in the local scope are displayed.\n\ | |
1580 \n\ | |
1581 The command @kbd{whos} is equivalent to @kbd{who -long}.\n\ | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1582 @seealso{regexp}\n\ |
3361 | 1583 @end deffn") |
581 | 1584 { |
4435 | 1585 octave_value retval; |
581 | 1586 |
4435 | 1587 if (nargout < 2) |
1588 { | |
1589 int argc = args.length () + 1; | |
1590 | |
1591 string_vector argv = args.make_argv ("who"); | |
1755 | 1592 |
7336 | 1593 if (! error_state) |
1594 retval = do_who (argc, argv, nargout == 1); | |
4435 | 1595 } |
1596 else | |
5823 | 1597 print_usage (); |
581 | 1598 |
529 | 1599 return retval; |
1600 } | |
1601 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1602 DEFUN (whos, args, nargout, |
3458 | 1603 "-*- texinfo -*-\n\ |
1604 @deffn {Command} whos options pattern @dots{}\n\ | |
1605 See who.\n\ | |
1606 @end deffn") | |
581 | 1607 { |
4435 | 1608 octave_value retval; |
712 | 1609 |
4435 | 1610 if (nargout < 2) |
1611 { | |
7336 | 1612 int argc = args.length () + 1; |
1613 | |
1614 string_vector argv = args.make_argv ("whos"); | |
1615 | |
1616 if (! error_state) | |
1617 retval = do_who (argc, argv, nargout == 1, true); | |
4435 | 1618 } |
1619 else | |
5823 | 1620 print_usage (); |
581 | 1621 |
1622 return retval; | |
1623 } | |
1624 | |
593 | 1625 // Defining variables. |
1626 | |
1162 | 1627 void |
2856 | 1628 bind_ans (const octave_value& val, bool print) |
1162 | 1629 { |
7336 | 1630 static std::string ans = "ans"; |
1162 | 1631 |
2978 | 1632 if (val.is_defined ()) |
1633 { | |
7531
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1634 if (val.is_cs_list ()) |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1635 { |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1636 octave_value_list lst = val.list_value (); |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1637 |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1638 for (octave_idx_type i = 0; i < lst.length (); i++) |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1639 bind_ans (lst(i), print); |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1640 } |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1641 else |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1642 { |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1643 symbol_table::varref (ans) = val; |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1644 |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1645 if (print) |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1646 val.print_with_name (octave_stdout, ans); |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1647 } |
2978 | 1648 } |
1162 | 1649 } |
1650 | |
593 | 1651 void |
5794 | 1652 bind_internal_variable (const std::string& fname, const octave_value& val) |
593 | 1653 { |
5794 | 1654 octave_value_list args; |
1655 | |
1656 args(0) = val; | |
1657 | |
1658 feval (fname, args, 0); | |
529 | 1659 } |
1660 | |
4319 | 1661 void |
7336 | 1662 mlock (void) |
4319 | 1663 { |
8083
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1664 octave_function *fcn = octave_call_stack::current (); |
7336 | 1665 |
1666 if (fcn) | |
1667 fcn->lock (); | |
1668 else | |
1669 error ("mlock: invalid use outside a function"); | |
4319 | 1670 } |
1671 | |
1672 void | |
1673 munlock (const std::string& nm) | |
1674 { | |
7336 | 1675 octave_value val = symbol_table::find_function (nm); |
1676 | |
1677 if (val.is_defined ()) | |
1678 { | |
1679 octave_function *fcn = val.function_value (); | |
1680 | |
1681 if (fcn) | |
1682 fcn->unlock (); | |
1683 } | |
4319 | 1684 } |
1685 | |
1686 bool | |
1687 mislocked (const std::string& nm) | |
1688 { | |
7336 | 1689 bool retval = false; |
1690 | |
1691 octave_value val = symbol_table::find_function (nm); | |
1692 | |
1693 if (val.is_defined ()) | |
1694 { | |
1695 octave_function *fcn = val.function_value (); | |
1696 | |
1697 if (fcn) | |
1698 retval = fcn->islocked (); | |
1699 } | |
1700 | |
1701 return retval; | |
4319 | 1702 } |
1703 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1704 DEFUN (mlock, args, , |
4319 | 1705 "-*- texinfo -*-\n\ |
7875 | 1706 @deftypefn {Built-in Function} {} mlock ()\n\ |
7336 | 1707 Lock the current function into memory so that it can't be cleared.\n\ |
5642 | 1708 @seealso{munlock, mislocked, persistent}\n\ |
1709 @end deftypefn") | |
4319 | 1710 { |
1711 octave_value_list retval; | |
1712 | |
7336 | 1713 if (args.length () == 0) |
8083
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1714 { |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1715 octave_function *fcn = octave_call_stack::caller (); |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1716 |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1717 if (fcn) |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1718 fcn->lock (); |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1719 else |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1720 error ("mlock: invalid use outside a function"); |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1721 } |
4319 | 1722 else |
5823 | 1723 print_usage (); |
4319 | 1724 |
1725 return retval; | |
1726 } | |
1727 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1728 DEFUN (munlock, args, , |
4319 | 1729 "-*- texinfo -*-\n\ |
1730 @deftypefn {Built-in Function} {} munlock (@var{fcn})\n\ | |
1731 Unlock the named function. If no function is named\n\ | |
1732 then unlock the current function.\n\ | |
5642 | 1733 @seealso{mlock, mislocked, persistent}\n\ |
1734 @end deftypefn") | |
4319 | 1735 { |
1736 octave_value_list retval; | |
1737 | |
1738 if (args.length() == 1) | |
1739 { | |
1740 std::string name = args(0).string_value (); | |
1741 | |
1742 if (! error_state) | |
1743 munlock (name); | |
1744 else | |
1745 error ("munlock: expecting argument to be a function name"); | |
1746 } | |
1747 else if (args.length () == 0) | |
1748 { | |
7336 | 1749 octave_function *fcn = octave_call_stack::caller (); |
5743 | 1750 |
1751 if (fcn) | |
7336 | 1752 fcn->unlock (); |
4319 | 1753 else |
1754 error ("munlock: invalid use outside a function"); | |
1755 } | |
1756 else | |
5823 | 1757 print_usage (); |
4319 | 1758 |
1759 return retval; | |
1760 } | |
1761 | |
1762 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1763 DEFUN (mislocked, args, , |
4319 | 1764 "-*- texinfo -*-\n\ |
1765 @deftypefn {Built-in Function} {} mislocked (@var{fcn})\n\ | |
1766 Return true if the named function is locked. If no function is named\n\ | |
1767 then return true if the current function is locked.\n\ | |
5642 | 1768 @seealso{mlock, munlock, persistent}\n\ |
1769 @end deftypefn") | |
4319 | 1770 { |
1771 octave_value retval; | |
1772 | |
1773 if (args.length() == 1) | |
1774 { | |
1775 std::string name = args(0).string_value (); | |
1776 | |
1777 if (! error_state) | |
1778 retval = mislocked (name); | |
1779 else | |
1780 error ("mislocked: expecting argument to be a function name"); | |
1781 } | |
1782 else if (args.length () == 0) | |
1783 { | |
7336 | 1784 octave_function *fcn = octave_call_stack::caller (); |
5743 | 1785 |
1786 if (fcn) | |
7336 | 1787 retval = fcn->islocked (); |
4319 | 1788 else |
1789 error ("mislocked: invalid use outside a function"); | |
1790 } | |
1791 else | |
5823 | 1792 print_usage (); |
4319 | 1793 |
1794 return retval; | |
1795 } | |
1796 | |
593 | 1797 // Deleting names from the symbol tables. |
1798 | |
3681 | 1799 static inline bool |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1800 name_matches_any_pattern (const std::string& nm, const string_vector& argv, |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1801 int argc, int idx, bool have_regexp = false) |
3681 | 1802 { |
1803 bool retval = false; | |
1804 | |
1805 for (int k = idx; k < argc; k++) | |
1806 { | |
1807 std::string patstr = argv[k]; | |
1808 if (! patstr.empty ()) | |
1809 { | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1810 if (have_regexp) |
3681 | 1811 { |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1812 regex_match pattern (patstr); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1813 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1814 if (pattern.match (nm)) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1815 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1816 retval = true; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1817 break; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1818 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1819 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1820 else |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1821 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1822 glob_match pattern (patstr); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1823 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1824 if (pattern.match (nm)) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1825 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1826 retval = true; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1827 break; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1828 } |
3681 | 1829 } |
1830 } | |
1831 } | |
1832 | |
1833 return retval; | |
1834 } | |
1835 | |
4009 | 1836 static inline void |
1837 maybe_warn_exclusive (bool exclusive) | |
1838 { | |
1839 if (exclusive) | |
1840 warning ("clear: ignoring --exclusive option"); | |
1841 } | |
1842 | |
7336 | 1843 static void |
4009 | 1844 do_clear_functions (const string_vector& argv, int argc, int idx, |
1845 bool exclusive = false) | |
1846 { | |
1847 if (idx == argc) | |
7336 | 1848 symbol_table::clear_functions (); |
4009 | 1849 else |
1850 { | |
1851 if (exclusive) | |
1852 { | |
7336 | 1853 string_vector fcns = symbol_table::user_function_names (); |
4009 | 1854 |
1855 int fcount = fcns.length (); | |
1856 | |
1857 for (int i = 0; i < fcount; i++) | |
1858 { | |
1859 std::string nm = fcns[i]; | |
1860 | |
1861 if (! name_matches_any_pattern (nm, argv, argc, idx)) | |
7336 | 1862 symbol_table::clear_function (nm); |
4009 | 1863 } |
1864 } | |
1865 else | |
1866 { | |
1867 while (idx < argc) | |
7336 | 1868 symbol_table::clear_function_pattern (argv[idx++]); |
4009 | 1869 } |
1870 } | |
1871 } | |
1872 | |
7336 | 1873 static void |
4009 | 1874 do_clear_globals (const string_vector& argv, int argc, int idx, |
1875 bool exclusive = false) | |
1876 { | |
1877 if (idx == argc) | |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1878 { |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1879 string_vector gvars = symbol_table::global_variable_names (); |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1880 |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1881 int gcount = gvars.length (); |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1882 |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1883 for (int i = 0; i < gcount; i++) |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1884 symbol_table::clear_global (gvars[i]); |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1885 } |
4009 | 1886 else |
1887 { | |
1888 if (exclusive) | |
1889 { | |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1890 string_vector gvars = symbol_table::global_variable_names (); |
4009 | 1891 |
1892 int gcount = gvars.length (); | |
1893 | |
1894 for (int i = 0; i < gcount; i++) | |
1895 { | |
1896 std::string nm = gvars[i]; | |
1897 | |
1898 if (! name_matches_any_pattern (nm, argv, argc, idx)) | |
7336 | 1899 symbol_table::clear_global (nm); |
4009 | 1900 } |
1901 } | |
1902 else | |
1903 { | |
1904 while (idx < argc) | |
7336 | 1905 symbol_table::clear_global_pattern (argv[idx++]); |
4009 | 1906 } |
1907 } | |
1908 } | |
1909 | |
7336 | 1910 static void |
4009 | 1911 do_clear_variables (const string_vector& argv, int argc, int idx, |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1912 bool exclusive = false, bool have_regexp = false) |
4009 | 1913 { |
1914 if (idx == argc) | |
7336 | 1915 symbol_table::clear_variables (); |
4009 | 1916 else |
1917 { | |
1918 if (exclusive) | |
1919 { | |
7336 | 1920 string_vector lvars = symbol_table::variable_names (); |
4009 | 1921 |
1922 int lcount = lvars.length (); | |
1923 | |
1924 for (int i = 0; i < lcount; i++) | |
1925 { | |
1926 std::string nm = lvars[i]; | |
1927 | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1928 if (! name_matches_any_pattern (nm, argv, argc, idx, have_regexp)) |
7336 | 1929 symbol_table::clear_variable (nm); |
4009 | 1930 } |
1931 } | |
1932 else | |
1933 { | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1934 if (have_regexp) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1935 while (idx < argc) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1936 symbol_table::clear_variable_regexp (argv[idx++]); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1937 else |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1938 while (idx < argc) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1939 symbol_table::clear_variable_pattern (argv[idx++]); |
4009 | 1940 } |
1941 } | |
1942 } | |
1943 | |
7336 | 1944 static void |
4009 | 1945 do_clear_symbols (const string_vector& argv, int argc, int idx, |
1946 bool exclusive = false) | |
1947 { | |
1948 if (idx == argc) | |
7336 | 1949 symbol_table::clear_variables (); |
4009 | 1950 else |
1951 { | |
1952 if (exclusive) | |
1953 { | |
5775 | 1954 // FIXME -- is this really what we want, or do we |
4009 | 1955 // somehow want to only clear the functions that are not |
1956 // shadowed by local variables? It seems that would be a | |
1957 // bit harder to do. | |
1958 | |
1959 do_clear_variables (argv, argc, idx, exclusive); | |
1960 do_clear_functions (argv, argc, idx, exclusive); | |
1961 } | |
1962 else | |
1963 { | |
1964 while (idx < argc) | |
7336 | 1965 symbol_table::clear_symbol_pattern (argv[idx++]); |
4009 | 1966 } |
1967 } | |
1968 } | |
1969 | |
1970 static void | |
1971 do_matlab_compatible_clear (const string_vector& argv, int argc, int idx) | |
1972 { | |
1973 // This is supposed to be mostly Matlab compatible. | |
1974 | |
1975 for (; idx < argc; idx++) | |
1976 { | |
7336 | 1977 if (argv[idx] == "all" |
1978 && ! symbol_table::is_local_variable ("all")) | |
4009 | 1979 { |
7336 | 1980 symbol_table::clear_all (); |
4009 | 1981 } |
7336 | 1982 else if (argv[idx] == "functions" |
1983 && ! symbol_table::is_local_variable ("functions")) | |
4009 | 1984 { |
1985 do_clear_functions (argv, argc, ++idx); | |
1986 } | |
7336 | 1987 else if (argv[idx] == "global" |
1988 && ! symbol_table::is_local_variable ("global")) | |
4009 | 1989 { |
1990 do_clear_globals (argv, argc, ++idx); | |
1991 } | |
7336 | 1992 else if (argv[idx] == "variables" |
1993 && ! symbol_table::is_local_variable ("variables")) | |
4009 | 1994 { |
7336 | 1995 symbol_table::clear_variables (); |
4009 | 1996 } |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
1997 else if (argv[idx] == "classes" |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
1998 && ! symbol_table::is_local_variable ("classes")) |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
1999 { |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2000 symbol_table::clear_objects (); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2001 octave_class::clear_exemplar_map (); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2002 } |
4009 | 2003 else |
2004 { | |
7336 | 2005 symbol_table::clear_symbol_pattern (argv[idx]); |
4009 | 2006 } |
2007 } | |
2008 } | |
2009 | |
2010 #define CLEAR_OPTION_ERROR(cond) \ | |
2011 do \ | |
2012 { \ | |
2013 if (cond) \ | |
2014 { \ | |
5823 | 2015 print_usage (); \ |
4009 | 2016 return retval; \ |
2017 } \ | |
2018 } \ | |
2019 while (0) | |
2020 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
2021 DEFUN (clear, args, , |
3361 | 2022 "-*- texinfo -*-\n\ |
7347 | 2023 @deffn {Command} clear [options] pattern @dots{}\n\ |
3361 | 2024 Delete the names matching the given patterns from the symbol table. The\n\ |
2025 pattern may contain the following special characters:\n\ | |
4016 | 2026 \n\ |
3361 | 2027 @table @code\n\ |
2028 @item ?\n\ | |
2029 Match any single character.\n\ | |
668 | 2030 \n\ |
3361 | 2031 @item *\n\ |
2032 Match zero or more characters.\n\ | |
2033 \n\ | |
2034 @item [ @var{list} ]\n\ | |
2035 Match the list of characters specified by @var{list}. If the first\n\ | |
2036 character is @code{!} or @code{^}, match all characters except those\n\ | |
2037 specified by @var{list}. For example, the pattern @samp{[a-zA-Z]} will\n\ | |
2038 match all lower and upper case alphabetic characters.\n\ | |
2039 @end table\n\ | |
2040 \n\ | |
2041 For example, the command\n\ | |
593 | 2042 \n\ |
3361 | 2043 @example\n\ |
2044 clear foo b*r\n\ | |
2045 @end example\n\ | |
2046 \n\ | |
2047 @noindent\n\ | |
2048 clears the name @code{foo} and all names that begin with the letter\n\ | |
2049 @code{b} and end with the letter @code{r}.\n\ | |
668 | 2050 \n\ |
3361 | 2051 If @code{clear} is called without any arguments, all user-defined\n\ |
2052 variables (local and global) are cleared from the symbol table. If\n\ | |
2053 @code{clear} is called with at least one argument, only the visible\n\ | |
2054 names matching the arguments are cleared. For example, suppose you have\n\ | |
2055 defined a function @code{foo}, and then hidden it by performing the\n\ | |
2056 assignment @code{foo = 2}. Executing the command @kbd{clear foo} once\n\ | |
2057 will clear the variable definition and restore the definition of\n\ | |
2058 @code{foo} as a function. Executing @kbd{clear foo} a second time will\n\ | |
2059 clear the function definition.\n\ | |
2060 \n\ | |
7347 | 2061 The following options are available in both long and short form\n\ |
2062 @table @code\n\ | |
2063 @item -all, -a\n\ | |
2064 Clears all local and global user-defined variables and all functions\n\ | |
2065 from the symbol table.\n\ | |
2066 \n\ | |
2067 @item -exclusive, -x\n\ | |
2068 Clears the variables that don't match the following pattern.\n\ | |
2069 \n\ | |
2070 @item -functions, -f\n\ | |
2071 Clears the function names and the built-in symbols names.\n\ | |
2072 @item -global, -g\n\ | |
2073 Clears the global symbol names.\n\ | |
2074 @item -variables, -v\n\ | |
2075 Clears the local variable names.\n\ | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2076 @item -classes, -c\n\ |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2077 Clears the class structure table and clears all objects.\n\ |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2078 @item -regexp, -r\n\ |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2079 The arguments are treated as regular expressions as any variables that\n\ |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2080 match will be cleared.\n\ |
7347 | 2081 @end table\n\ |
8325
b93ac0586e4b
spelling corrections
Brian Gough<bjg@network-theory.co.uk>
parents:
8131
diff
changeset
|
2082 With the exception of @code{exclusive}, all long options can be used \n\ |
7347 | 2083 without the dash as well.\n\ |
3361 | 2084 @end deffn") |
529 | 2085 { |
2086 | 2086 octave_value_list retval; |
593 | 2087 |
1755 | 2088 int argc = args.length () + 1; |
593 | 2089 |
1968 | 2090 string_vector argv = args.make_argv ("clear"); |
1755 | 2091 |
4009 | 2092 if (! error_state) |
529 | 2093 { |
4009 | 2094 if (argc == 1) |
593 | 2095 { |
7336 | 2096 symbol_table::clear_variables (); |
3681 | 2097 } |
2098 else | |
2099 { | |
4009 | 2100 int idx = 0; |
2101 | |
2102 bool clear_all = false; | |
2103 bool clear_functions = false; | |
2104 bool clear_globals = false; | |
2105 bool clear_variables = false; | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2106 bool clear_objects = false; |
4009 | 2107 bool exclusive = false; |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2108 bool have_regexp = false; |
4009 | 2109 bool have_dash_option = false; |
3681 | 2110 |
4009 | 2111 while (++idx < argc) |
2112 { | |
4010 | 2113 if (argv[idx] == "-all" || argv[idx] == "-a") |
593 | 2114 { |
4009 | 2115 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); |
3681 | 2116 |
4009 | 2117 have_dash_option = true; |
2118 clear_all = true; | |
2119 } | |
4010 | 2120 else if (argv[idx] == "-exclusive" || argv[idx] == "-x") |
4009 | 2121 { |
2122 have_dash_option = true; | |
2123 exclusive = true; | |
2124 } | |
4010 | 2125 else if (argv[idx] == "-functions" || argv[idx] == "-f") |
4009 | 2126 { |
2127 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); | |
3681 | 2128 |
4009 | 2129 have_dash_option = true; |
2130 clear_functions = true; | |
2131 } | |
4010 | 2132 else if (argv[idx] == "-global" || argv[idx] == "-g") |
4009 | 2133 { |
2134 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); | |
2135 | |
2136 have_dash_option = true; | |
2137 clear_globals = true; | |
2138 } | |
4010 | 2139 else if (argv[idx] == "-variables" || argv[idx] == "-v") |
4009 | 2140 { |
2141 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); | |
3681 | 2142 |
4009 | 2143 have_dash_option = true; |
2144 clear_variables = true; | |
2145 } | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2146 else if (argv[idx] == "-classes" || argv[idx] == "-c") |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2147 { |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2148 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2149 |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2150 have_dash_option = true; |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2151 clear_objects = true; |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2152 } |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2153 else if (argv[idx] == "-regexp" || argv[idx] == "-r") |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2154 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2155 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2156 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2157 have_dash_option = true; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2158 have_regexp = true; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2159 } |
4009 | 2160 else |
2161 break; | |
2162 } | |
3681 | 2163 |
4224 | 2164 if (idx <= argc) |
4009 | 2165 { |
2166 if (! have_dash_option) | |
2167 { | |
2168 do_matlab_compatible_clear (argv, argc, idx); | |
2169 } | |
2170 else | |
2171 { | |
2172 if (clear_all) | |
3681 | 2173 { |
4009 | 2174 maybe_warn_exclusive (exclusive); |
3681 | 2175 |
4009 | 2176 if (++idx < argc) |
2177 warning | |
4010 | 2178 ("clear: ignoring extra arguments after -all"); |
3681 | 2179 |
7336 | 2180 symbol_table::clear_all (); |
4009 | 2181 } |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2182 else if (have_regexp) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2183 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2184 do_clear_variables (argv, argc, idx, exclusive, true); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2185 } |
4009 | 2186 else if (clear_functions) |
2187 { | |
2188 do_clear_functions (argv, argc, idx, exclusive); | |
2189 } | |
2190 else if (clear_globals) | |
593 | 2191 { |
4009 | 2192 do_clear_globals (argv, argc, idx, exclusive); |
2193 } | |
2194 else if (clear_variables) | |
2195 { | |
2196 do_clear_variables (argv, argc, idx, exclusive); | |
2197 } | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2198 else if (clear_objects) |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2199 { |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2200 symbol_table::clear_objects (); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2201 octave_class::clear_exemplar_map (); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2202 } |
4009 | 2203 else |
2204 { | |
2205 do_clear_symbols (argv, argc, idx, exclusive); | |
593 | 2206 } |
2207 } | |
2208 } | |
2209 } | |
2210 } | |
2211 | |
2212 return retval; | |
529 | 2213 } |
2214 | |
7336 | 2215 DEFUN (whos_line_format, args, nargout, |
2216 "-*- texinfo -*-\n\ | |
2217 @deftypefn {Built-in Function} {@var{val} =} whos_line_format ()\n\ | |
2218 @deftypefnx {Built-in Function} {@var{old_val} =} whos_line_format (@var{new_val})\n\ | |
2219 Query or set the format string used by the @code{whos}.\n\ | |
2220 \n\ | |
2221 The following escape sequences may be used in the format:\n\ | |
2222 @table @code\n\ | |
2223 @item %a\n\ | |
2224 Prints attributes of variables (g=global, p=persistent,\n\ | |
2225 f=formal parameter, a=automatic variable).\n\ | |
2226 @item %b\n\ | |
2227 Prints number of bytes occupied by variables.\n\ | |
2228 @item %c\n\ | |
2229 Prints class names of variables.\n\ | |
2230 @item %e\n\ | |
2231 Prints elements held by variables.\n\ | |
2232 @item %n\n\ | |
2233 Prints variable names.\n\ | |
2234 @item %s\n\ | |
2235 Prints dimensions of variables.\n\ | |
2236 @item %t\n\ | |
2237 Prints type names of variables.\n\ | |
2238 @end table\n\ | |
2239 \n\ | |
2240 Every command may also have a modifier:\n\ | |
2241 @table @code\n\ | |
2242 @item l\n\ | |
2243 Left alignment.\n\ | |
2244 @item r\n\ | |
2245 Right alignment (this is the default).\n\ | |
2246 @item c\n\ | |
2247 Centered (may only be applied to command %s).\n\ | |
2248 @end table\n\ | |
2249 \n\ | |
2250 A command is composed like this:\n\ | |
2251 \n\ | |
9153
5247e89688e1
Eliminate most overfull errors when running texi2pdf for generating pdf documentation
Rik <rdrider0-list@yahoo.com>
parents:
9147
diff
changeset
|
2252 @c Set example in small font to prevent overfull line\n\ |
8516 | 2253 @smallexample\n\ |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
2254 %[modifier]<command>[:size_of_parameter[:center-specific[:balance]]];\n\ |
8516 | 2255 @end smallexample\n\ |
7336 | 2256 \n\ |
8516 | 2257 Command and modifier is already explained. The @code{size_of_parameter}\n\ |
2258 parameter tells how many columns the parameter will need for printing.\n\ | |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
2259 The @code{center-specific} parameter may only be applied to command\n\ |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
2260 @samp{%s}.\n\ |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
2261 The @code{balance} parameter specifies the offset for printing\n\ |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
2262 the dimensions string.\n\ |
7336 | 2263 \n\ |
8516 | 2264 The default format is\n\ |
2265 @code{\" %a:4; %ln:6; %cs:16:6:1; %rb:12; %lc:-1;\\n\"}.\n\ | |
5794 | 2266 @end deftypefn") |
2267 { | |
7336 | 2268 return SET_INTERNAL_VARIABLE (whos_line_format); |
3016 | 2269 } |
2270 | |
1 | 2271 /* |
2272 ;;; Local Variables: *** | |
2273 ;;; mode: C++ *** | |
2274 ;;; End: *** | |
2275 */ |