Mercurial > octave-nkf
annotate src/variables.cc @ 9250:80c299c84796
don't print undefined symbols in who
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Mon, 25 May 2009 07:35:19 +0200 |
parents | f27a8c07f0b2 |
children | 9c2349a51218 |
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 { |
9250
80c299c84796
don't print undefined symbols in who
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
1508 if (p->is_defined ()) |
80c299c84796
don't print undefined symbols in who
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
1509 { |
80c299c84796
don't print undefined symbols in who
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
1510 if (verbose) |
80c299c84796
don't print undefined symbols in who
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
1511 symbol_stats.append (*p); |
80c299c84796
don't print undefined symbols in who
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
1512 else |
80c299c84796
don't print undefined symbols in who
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
1513 symbol_names.push_back (p->name ()); |
80c299c84796
don't print undefined symbols in who
Jaroslav Hajek <highegg@gmail.com>
parents:
9240
diff
changeset
|
1514 } |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1515 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1516 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1517 } |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1518 } |
529 | 1519 |
4435 | 1520 if (return_list) |
529 | 1521 { |
7336 | 1522 if (verbose) |
4435 | 1523 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1524 std::string caller_function_name; |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1525 octave_function *caller = octave_call_stack::caller (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1526 if (caller) |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1527 caller_function_name = caller->name (); |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1528 |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1529 retval = symbol_stats.map_value (caller_function_name, 1); |
4435 | 1530 } |
1531 else | |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1532 retval = Cell (string_vector (symbol_names)); |
529 | 1533 } |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1534 else if (! (symbol_stats.empty () && symbol_names.empty ())) |
529 | 1535 { |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1536 if (msg.length () == 0) |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1537 if (global_only) |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1538 octave_stdout << "Global variables:\n\n"; |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1539 else |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1540 octave_stdout << "Variables in the current scope:\n\n"; |
7336 | 1541 else |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1542 octave_stdout << msg; |
7336 | 1543 |
1544 if (verbose) | |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1545 symbol_stats.display (octave_stdout); |
7336 | 1546 else |
4435 | 1547 { |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
1548 string_vector names (symbol_names); |
7336 | 1549 |
1550 names.list_in_columns (octave_stdout); | |
4435 | 1551 } |
1552 | |
7336 | 1553 octave_stdout << "\n"; |
529 | 1554 } |
1555 | |
581 | 1556 return retval; |
1557 } | |
1558 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1559 DEFUN (who, args, nargout, |
3361 | 1560 "-*- texinfo -*-\n\ |
1561 @deffn {Command} who options pattern @dots{}\n\ | |
1562 @deffnx {Command} whos options pattern @dots{}\n\ | |
1563 List currently defined symbols matching the given patterns. The\n\ | |
1564 following are valid options. They may be shortened to one character but\n\ | |
1565 may not be combined.\n\ | |
1566 \n\ | |
1567 @table @code\n\ | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1568 @item global\n\ |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1569 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
|
1570 @item -regexp\n\ |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1571 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
|
1572 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
|
1573 the @code{regexp} function is used.\n\ |
8131
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1574 @item -file\n\ |
10b63c4fd413
Add -file option to who/whos
David Bateman <dbateman@free.fr>
parents:
8083
diff
changeset
|
1575 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
|
1576 are found within this file are listed.\n\ |
3361 | 1577 @end table\n\ |
1578 \n\ | |
1579 Valid patterns are the same as described for the @code{clear} command\n\ | |
1580 above. If no patterns are supplied, all symbols from the given category\n\ | |
1581 are listed. By default, only user defined functions and variables\n\ | |
1582 visible in the local scope are displayed.\n\ | |
1583 \n\ | |
1584 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
|
1585 @seealso{regexp}\n\ |
3361 | 1586 @end deffn") |
581 | 1587 { |
4435 | 1588 octave_value retval; |
581 | 1589 |
4435 | 1590 if (nargout < 2) |
1591 { | |
1592 int argc = args.length () + 1; | |
1593 | |
1594 string_vector argv = args.make_argv ("who"); | |
1755 | 1595 |
7336 | 1596 if (! error_state) |
1597 retval = do_who (argc, argv, nargout == 1); | |
4435 | 1598 } |
1599 else | |
5823 | 1600 print_usage (); |
581 | 1601 |
529 | 1602 return retval; |
1603 } | |
1604 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1605 DEFUN (whos, args, nargout, |
3458 | 1606 "-*- texinfo -*-\n\ |
1607 @deffn {Command} whos options pattern @dots{}\n\ | |
1608 See who.\n\ | |
1609 @end deffn") | |
581 | 1610 { |
4435 | 1611 octave_value retval; |
712 | 1612 |
4435 | 1613 if (nargout < 2) |
1614 { | |
7336 | 1615 int argc = args.length () + 1; |
1616 | |
1617 string_vector argv = args.make_argv ("whos"); | |
1618 | |
1619 if (! error_state) | |
1620 retval = do_who (argc, argv, nargout == 1, true); | |
4435 | 1621 } |
1622 else | |
5823 | 1623 print_usage (); |
581 | 1624 |
1625 return retval; | |
1626 } | |
1627 | |
593 | 1628 // Defining variables. |
1629 | |
1162 | 1630 void |
2856 | 1631 bind_ans (const octave_value& val, bool print) |
1162 | 1632 { |
7336 | 1633 static std::string ans = "ans"; |
1162 | 1634 |
2978 | 1635 if (val.is_defined ()) |
1636 { | |
7531
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1637 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
|
1638 { |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1639 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
|
1640 |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1641 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
|
1642 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
|
1643 } |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1644 else |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1645 { |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1646 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
|
1647 |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1648 if (print) |
c9a476b1e664
correctly set ans for cs-lists and simplify printing them
John W. Eaton <jwe@octave.org>
parents:
7347
diff
changeset
|
1649 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
|
1650 } |
2978 | 1651 } |
1162 | 1652 } |
1653 | |
593 | 1654 void |
5794 | 1655 bind_internal_variable (const std::string& fname, const octave_value& val) |
593 | 1656 { |
5794 | 1657 octave_value_list args; |
1658 | |
1659 args(0) = val; | |
1660 | |
1661 feval (fname, args, 0); | |
529 | 1662 } |
1663 | |
4319 | 1664 void |
7336 | 1665 mlock (void) |
4319 | 1666 { |
8083
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1667 octave_function *fcn = octave_call_stack::current (); |
7336 | 1668 |
1669 if (fcn) | |
1670 fcn->lock (); | |
1671 else | |
1672 error ("mlock: invalid use outside a function"); | |
4319 | 1673 } |
1674 | |
1675 void | |
1676 munlock (const std::string& nm) | |
1677 { | |
7336 | 1678 octave_value val = symbol_table::find_function (nm); |
1679 | |
1680 if (val.is_defined ()) | |
1681 { | |
1682 octave_function *fcn = val.function_value (); | |
1683 | |
1684 if (fcn) | |
1685 fcn->unlock (); | |
1686 } | |
4319 | 1687 } |
1688 | |
1689 bool | |
1690 mislocked (const std::string& nm) | |
1691 { | |
7336 | 1692 bool retval = false; |
1693 | |
1694 octave_value val = symbol_table::find_function (nm); | |
1695 | |
1696 if (val.is_defined ()) | |
1697 { | |
1698 octave_function *fcn = val.function_value (); | |
1699 | |
1700 if (fcn) | |
1701 retval = fcn->islocked (); | |
1702 } | |
1703 | |
1704 return retval; | |
4319 | 1705 } |
1706 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1707 DEFUN (mlock, args, , |
4319 | 1708 "-*- texinfo -*-\n\ |
7875 | 1709 @deftypefn {Built-in Function} {} mlock ()\n\ |
7336 | 1710 Lock the current function into memory so that it can't be cleared.\n\ |
5642 | 1711 @seealso{munlock, mislocked, persistent}\n\ |
1712 @end deftypefn") | |
4319 | 1713 { |
1714 octave_value_list retval; | |
1715 | |
7336 | 1716 if (args.length () == 0) |
8083
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1717 { |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1718 octave_function *fcn = octave_call_stack::caller (); |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1719 |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1720 if (fcn) |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1721 fcn->lock (); |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1722 else |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1723 error ("mlock: invalid use outside a function"); |
16ab78b816bc
variables.cc (mlock): lock current function
John W. Eaton <jwe@octave.org>
parents:
8021
diff
changeset
|
1724 } |
4319 | 1725 else |
5823 | 1726 print_usage (); |
4319 | 1727 |
1728 return retval; | |
1729 } | |
1730 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1731 DEFUN (munlock, args, , |
4319 | 1732 "-*- texinfo -*-\n\ |
1733 @deftypefn {Built-in Function} {} munlock (@var{fcn})\n\ | |
1734 Unlock the named function. If no function is named\n\ | |
1735 then unlock the current function.\n\ | |
5642 | 1736 @seealso{mlock, mislocked, persistent}\n\ |
1737 @end deftypefn") | |
4319 | 1738 { |
1739 octave_value_list retval; | |
1740 | |
1741 if (args.length() == 1) | |
1742 { | |
1743 std::string name = args(0).string_value (); | |
1744 | |
1745 if (! error_state) | |
1746 munlock (name); | |
1747 else | |
1748 error ("munlock: expecting argument to be a function name"); | |
1749 } | |
1750 else if (args.length () == 0) | |
1751 { | |
7336 | 1752 octave_function *fcn = octave_call_stack::caller (); |
5743 | 1753 |
1754 if (fcn) | |
7336 | 1755 fcn->unlock (); |
4319 | 1756 else |
1757 error ("munlock: invalid use outside a function"); | |
1758 } | |
1759 else | |
5823 | 1760 print_usage (); |
4319 | 1761 |
1762 return retval; | |
1763 } | |
1764 | |
1765 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
1766 DEFUN (mislocked, args, , |
4319 | 1767 "-*- texinfo -*-\n\ |
1768 @deftypefn {Built-in Function} {} mislocked (@var{fcn})\n\ | |
1769 Return true if the named function is locked. If no function is named\n\ | |
1770 then return true if the current function is locked.\n\ | |
5642 | 1771 @seealso{mlock, munlock, persistent}\n\ |
1772 @end deftypefn") | |
4319 | 1773 { |
1774 octave_value retval; | |
1775 | |
1776 if (args.length() == 1) | |
1777 { | |
1778 std::string name = args(0).string_value (); | |
1779 | |
1780 if (! error_state) | |
1781 retval = mislocked (name); | |
1782 else | |
1783 error ("mislocked: expecting argument to be a function name"); | |
1784 } | |
1785 else if (args.length () == 0) | |
1786 { | |
7336 | 1787 octave_function *fcn = octave_call_stack::caller (); |
5743 | 1788 |
1789 if (fcn) | |
7336 | 1790 retval = fcn->islocked (); |
4319 | 1791 else |
1792 error ("mislocked: invalid use outside a function"); | |
1793 } | |
1794 else | |
5823 | 1795 print_usage (); |
4319 | 1796 |
1797 return retval; | |
1798 } | |
1799 | |
593 | 1800 // Deleting names from the symbol tables. |
1801 | |
3681 | 1802 static inline bool |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1803 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
|
1804 int argc, int idx, bool have_regexp = false) |
3681 | 1805 { |
1806 bool retval = false; | |
1807 | |
1808 for (int k = idx; k < argc; k++) | |
1809 { | |
1810 std::string patstr = argv[k]; | |
1811 if (! patstr.empty ()) | |
1812 { | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1813 if (have_regexp) |
3681 | 1814 { |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1815 regex_match pattern (patstr); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1816 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1817 if (pattern.match (nm)) |
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 retval = true; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1820 break; |
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 } |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1823 else |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1824 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1825 glob_match pattern (patstr); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1826 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1827 if (pattern.match (nm)) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1828 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1829 retval = true; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1830 break; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1831 } |
3681 | 1832 } |
1833 } | |
1834 } | |
1835 | |
1836 return retval; | |
1837 } | |
1838 | |
4009 | 1839 static inline void |
1840 maybe_warn_exclusive (bool exclusive) | |
1841 { | |
1842 if (exclusive) | |
1843 warning ("clear: ignoring --exclusive option"); | |
1844 } | |
1845 | |
7336 | 1846 static void |
4009 | 1847 do_clear_functions (const string_vector& argv, int argc, int idx, |
1848 bool exclusive = false) | |
1849 { | |
1850 if (idx == argc) | |
7336 | 1851 symbol_table::clear_functions (); |
4009 | 1852 else |
1853 { | |
1854 if (exclusive) | |
1855 { | |
7336 | 1856 string_vector fcns = symbol_table::user_function_names (); |
4009 | 1857 |
1858 int fcount = fcns.length (); | |
1859 | |
1860 for (int i = 0; i < fcount; i++) | |
1861 { | |
1862 std::string nm = fcns[i]; | |
1863 | |
1864 if (! name_matches_any_pattern (nm, argv, argc, idx)) | |
7336 | 1865 symbol_table::clear_function (nm); |
4009 | 1866 } |
1867 } | |
1868 else | |
1869 { | |
1870 while (idx < argc) | |
7336 | 1871 symbol_table::clear_function_pattern (argv[idx++]); |
4009 | 1872 } |
1873 } | |
1874 } | |
1875 | |
7336 | 1876 static void |
4009 | 1877 do_clear_globals (const string_vector& argv, int argc, int idx, |
1878 bool exclusive = false) | |
1879 { | |
1880 if (idx == argc) | |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1881 { |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1882 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
|
1883 |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1884 int gcount = gvars.length (); |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1885 |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1886 for (int i = 0; i < gcount; i++) |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1887 symbol_table::clear_global (gvars[i]); |
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1888 } |
4009 | 1889 else |
1890 { | |
1891 if (exclusive) | |
1892 { | |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7626
diff
changeset
|
1893 string_vector gvars = symbol_table::global_variable_names (); |
4009 | 1894 |
1895 int gcount = gvars.length (); | |
1896 | |
1897 for (int i = 0; i < gcount; i++) | |
1898 { | |
1899 std::string nm = gvars[i]; | |
1900 | |
1901 if (! name_matches_any_pattern (nm, argv, argc, idx)) | |
7336 | 1902 symbol_table::clear_global (nm); |
4009 | 1903 } |
1904 } | |
1905 else | |
1906 { | |
1907 while (idx < argc) | |
7336 | 1908 symbol_table::clear_global_pattern (argv[idx++]); |
4009 | 1909 } |
1910 } | |
1911 } | |
1912 | |
7336 | 1913 static void |
4009 | 1914 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
|
1915 bool exclusive = false, bool have_regexp = false) |
4009 | 1916 { |
1917 if (idx == argc) | |
7336 | 1918 symbol_table::clear_variables (); |
4009 | 1919 else |
1920 { | |
1921 if (exclusive) | |
1922 { | |
7336 | 1923 string_vector lvars = symbol_table::variable_names (); |
4009 | 1924 |
1925 int lcount = lvars.length (); | |
1926 | |
1927 for (int i = 0; i < lcount; i++) | |
1928 { | |
1929 std::string nm = lvars[i]; | |
1930 | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1931 if (! name_matches_any_pattern (nm, argv, argc, idx, have_regexp)) |
7336 | 1932 symbol_table::clear_variable (nm); |
4009 | 1933 } |
1934 } | |
1935 else | |
1936 { | |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1937 if (have_regexp) |
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_regexp (argv[idx++]); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1940 else |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1941 while (idx < argc) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
1942 symbol_table::clear_variable_pattern (argv[idx++]); |
4009 | 1943 } |
1944 } | |
1945 } | |
1946 | |
7336 | 1947 static void |
4009 | 1948 do_clear_symbols (const string_vector& argv, int argc, int idx, |
1949 bool exclusive = false) | |
1950 { | |
1951 if (idx == argc) | |
7336 | 1952 symbol_table::clear_variables (); |
4009 | 1953 else |
1954 { | |
1955 if (exclusive) | |
1956 { | |
5775 | 1957 // FIXME -- is this really what we want, or do we |
4009 | 1958 // somehow want to only clear the functions that are not |
1959 // shadowed by local variables? It seems that would be a | |
1960 // bit harder to do. | |
1961 | |
1962 do_clear_variables (argv, argc, idx, exclusive); | |
1963 do_clear_functions (argv, argc, idx, exclusive); | |
1964 } | |
1965 else | |
1966 { | |
1967 while (idx < argc) | |
7336 | 1968 symbol_table::clear_symbol_pattern (argv[idx++]); |
4009 | 1969 } |
1970 } | |
1971 } | |
1972 | |
1973 static void | |
1974 do_matlab_compatible_clear (const string_vector& argv, int argc, int idx) | |
1975 { | |
1976 // This is supposed to be mostly Matlab compatible. | |
1977 | |
1978 for (; idx < argc; idx++) | |
1979 { | |
7336 | 1980 if (argv[idx] == "all" |
1981 && ! symbol_table::is_local_variable ("all")) | |
4009 | 1982 { |
7336 | 1983 symbol_table::clear_all (); |
4009 | 1984 } |
7336 | 1985 else if (argv[idx] == "functions" |
1986 && ! symbol_table::is_local_variable ("functions")) | |
4009 | 1987 { |
1988 do_clear_functions (argv, argc, ++idx); | |
1989 } | |
7336 | 1990 else if (argv[idx] == "global" |
1991 && ! symbol_table::is_local_variable ("global")) | |
4009 | 1992 { |
1993 do_clear_globals (argv, argc, ++idx); | |
1994 } | |
7336 | 1995 else if (argv[idx] == "variables" |
1996 && ! symbol_table::is_local_variable ("variables")) | |
4009 | 1997 { |
7336 | 1998 symbol_table::clear_variables (); |
4009 | 1999 } |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2000 else if (argv[idx] == "classes" |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2001 && ! symbol_table::is_local_variable ("classes")) |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2002 { |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2003 symbol_table::clear_objects (); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2004 octave_class::clear_exemplar_map (); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2005 } |
4009 | 2006 else |
2007 { | |
7336 | 2008 symbol_table::clear_symbol_pattern (argv[idx]); |
4009 | 2009 } |
2010 } | |
2011 } | |
2012 | |
2013 #define CLEAR_OPTION_ERROR(cond) \ | |
2014 do \ | |
2015 { \ | |
2016 if (cond) \ | |
2017 { \ | |
5823 | 2018 print_usage (); \ |
4009 | 2019 return retval; \ |
2020 } \ | |
2021 } \ | |
2022 while (0) | |
2023 | |
8746
5dd06f19e9be
handle commands in the lexer
John W. Eaton <jwe@octave.org>
parents:
8677
diff
changeset
|
2024 DEFUN (clear, args, , |
3361 | 2025 "-*- texinfo -*-\n\ |
7347 | 2026 @deffn {Command} clear [options] pattern @dots{}\n\ |
3361 | 2027 Delete the names matching the given patterns from the symbol table. The\n\ |
2028 pattern may contain the following special characters:\n\ | |
4016 | 2029 \n\ |
3361 | 2030 @table @code\n\ |
2031 @item ?\n\ | |
2032 Match any single character.\n\ | |
668 | 2033 \n\ |
3361 | 2034 @item *\n\ |
2035 Match zero or more characters.\n\ | |
2036 \n\ | |
2037 @item [ @var{list} ]\n\ | |
2038 Match the list of characters specified by @var{list}. If the first\n\ | |
2039 character is @code{!} or @code{^}, match all characters except those\n\ | |
2040 specified by @var{list}. For example, the pattern @samp{[a-zA-Z]} will\n\ | |
2041 match all lower and upper case alphabetic characters.\n\ | |
2042 @end table\n\ | |
2043 \n\ | |
2044 For example, the command\n\ | |
593 | 2045 \n\ |
3361 | 2046 @example\n\ |
2047 clear foo b*r\n\ | |
2048 @end example\n\ | |
2049 \n\ | |
2050 @noindent\n\ | |
2051 clears the name @code{foo} and all names that begin with the letter\n\ | |
2052 @code{b} and end with the letter @code{r}.\n\ | |
668 | 2053 \n\ |
3361 | 2054 If @code{clear} is called without any arguments, all user-defined\n\ |
2055 variables (local and global) are cleared from the symbol table. If\n\ | |
2056 @code{clear} is called with at least one argument, only the visible\n\ | |
2057 names matching the arguments are cleared. For example, suppose you have\n\ | |
2058 defined a function @code{foo}, and then hidden it by performing the\n\ | |
2059 assignment @code{foo = 2}. Executing the command @kbd{clear foo} once\n\ | |
2060 will clear the variable definition and restore the definition of\n\ | |
2061 @code{foo} as a function. Executing @kbd{clear foo} a second time will\n\ | |
2062 clear the function definition.\n\ | |
2063 \n\ | |
7347 | 2064 The following options are available in both long and short form\n\ |
2065 @table @code\n\ | |
2066 @item -all, -a\n\ | |
2067 Clears all local and global user-defined variables and all functions\n\ | |
2068 from the symbol table.\n\ | |
2069 \n\ | |
2070 @item -exclusive, -x\n\ | |
2071 Clears the variables that don't match the following pattern.\n\ | |
2072 \n\ | |
2073 @item -functions, -f\n\ | |
2074 Clears the function names and the built-in symbols names.\n\ | |
2075 @item -global, -g\n\ | |
2076 Clears the global symbol names.\n\ | |
2077 @item -variables, -v\n\ | |
2078 Clears the local variable names.\n\ | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2079 @item -classes, -c\n\ |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2080 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
|
2081 @item -regexp, -r\n\ |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2082 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
|
2083 match will be cleared.\n\ |
7347 | 2084 @end table\n\ |
8325
b93ac0586e4b
spelling corrections
Brian Gough<bjg@network-theory.co.uk>
parents:
8131
diff
changeset
|
2085 With the exception of @code{exclusive}, all long options can be used \n\ |
7347 | 2086 without the dash as well.\n\ |
3361 | 2087 @end deffn") |
529 | 2088 { |
2086 | 2089 octave_value_list retval; |
593 | 2090 |
1755 | 2091 int argc = args.length () + 1; |
593 | 2092 |
1968 | 2093 string_vector argv = args.make_argv ("clear"); |
1755 | 2094 |
4009 | 2095 if (! error_state) |
529 | 2096 { |
4009 | 2097 if (argc == 1) |
593 | 2098 { |
7336 | 2099 symbol_table::clear_variables (); |
3681 | 2100 } |
2101 else | |
2102 { | |
4009 | 2103 int idx = 0; |
2104 | |
2105 bool clear_all = false; | |
2106 bool clear_functions = false; | |
2107 bool clear_globals = false; | |
2108 bool clear_variables = false; | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2109 bool clear_objects = false; |
4009 | 2110 bool exclusive = false; |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2111 bool have_regexp = false; |
4009 | 2112 bool have_dash_option = false; |
3681 | 2113 |
4009 | 2114 while (++idx < argc) |
2115 { | |
4010 | 2116 if (argv[idx] == "-all" || argv[idx] == "-a") |
593 | 2117 { |
4009 | 2118 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); |
3681 | 2119 |
4009 | 2120 have_dash_option = true; |
2121 clear_all = true; | |
2122 } | |
4010 | 2123 else if (argv[idx] == "-exclusive" || argv[idx] == "-x") |
4009 | 2124 { |
2125 have_dash_option = true; | |
2126 exclusive = true; | |
2127 } | |
4010 | 2128 else if (argv[idx] == "-functions" || argv[idx] == "-f") |
4009 | 2129 { |
2130 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); | |
3681 | 2131 |
4009 | 2132 have_dash_option = true; |
2133 clear_functions = true; | |
2134 } | |
4010 | 2135 else if (argv[idx] == "-global" || argv[idx] == "-g") |
4009 | 2136 { |
2137 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); | |
2138 | |
2139 have_dash_option = true; | |
2140 clear_globals = true; | |
2141 } | |
4010 | 2142 else if (argv[idx] == "-variables" || argv[idx] == "-v") |
4009 | 2143 { |
2144 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); | |
3681 | 2145 |
4009 | 2146 have_dash_option = true; |
2147 clear_variables = true; | |
2148 } | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2149 else if (argv[idx] == "-classes" || argv[idx] == "-c") |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2150 { |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2151 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2152 |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2153 have_dash_option = true; |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2154 clear_objects = true; |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2155 } |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2156 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
|
2157 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2158 CLEAR_OPTION_ERROR (have_dash_option && ! exclusive); |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2159 |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2160 have_dash_option = true; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2161 have_regexp = true; |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2162 } |
4009 | 2163 else |
2164 break; | |
2165 } | |
3681 | 2166 |
4224 | 2167 if (idx <= argc) |
4009 | 2168 { |
2169 if (! have_dash_option) | |
2170 { | |
2171 do_matlab_compatible_clear (argv, argc, idx); | |
2172 } | |
2173 else | |
2174 { | |
2175 if (clear_all) | |
3681 | 2176 { |
4009 | 2177 maybe_warn_exclusive (exclusive); |
3681 | 2178 |
4009 | 2179 if (++idx < argc) |
2180 warning | |
4010 | 2181 ("clear: ignoring extra arguments after -all"); |
3681 | 2182 |
7336 | 2183 symbol_table::clear_all (); |
4009 | 2184 } |
7779
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2185 else if (have_regexp) |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2186 { |
791231dac333
Add regexp matching to Fwho and Fclear
David Bateman <dbateman@free.fr>
parents:
7761
diff
changeset
|
2187 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
|
2188 } |
4009 | 2189 else if (clear_functions) |
2190 { | |
2191 do_clear_functions (argv, argc, idx, exclusive); | |
2192 } | |
2193 else if (clear_globals) | |
593 | 2194 { |
4009 | 2195 do_clear_globals (argv, argc, idx, exclusive); |
2196 } | |
2197 else if (clear_variables) | |
2198 { | |
2199 do_clear_variables (argv, argc, idx, exclusive); | |
2200 } | |
9240
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2201 else if (clear_objects) |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2202 { |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2203 symbol_table::clear_objects (); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2204 octave_class::clear_exemplar_map (); |
f27a8c07f0b2
clear -classes and support.
Robert T. Short <octave@phaselockedsystems.com>
parents:
9180
diff
changeset
|
2205 } |
4009 | 2206 else |
2207 { | |
2208 do_clear_symbols (argv, argc, idx, exclusive); | |
593 | 2209 } |
2210 } | |
2211 } | |
2212 } | |
2213 } | |
2214 | |
2215 return retval; | |
529 | 2216 } |
2217 | |
7336 | 2218 DEFUN (whos_line_format, args, nargout, |
2219 "-*- texinfo -*-\n\ | |
2220 @deftypefn {Built-in Function} {@var{val} =} whos_line_format ()\n\ | |
2221 @deftypefnx {Built-in Function} {@var{old_val} =} whos_line_format (@var{new_val})\n\ | |
2222 Query or set the format string used by the @code{whos}.\n\ | |
2223 \n\ | |
2224 The following escape sequences may be used in the format:\n\ | |
2225 @table @code\n\ | |
2226 @item %a\n\ | |
2227 Prints attributes of variables (g=global, p=persistent,\n\ | |
2228 f=formal parameter, a=automatic variable).\n\ | |
2229 @item %b\n\ | |
2230 Prints number of bytes occupied by variables.\n\ | |
2231 @item %c\n\ | |
2232 Prints class names of variables.\n\ | |
2233 @item %e\n\ | |
2234 Prints elements held by variables.\n\ | |
2235 @item %n\n\ | |
2236 Prints variable names.\n\ | |
2237 @item %s\n\ | |
2238 Prints dimensions of variables.\n\ | |
2239 @item %t\n\ | |
2240 Prints type names of variables.\n\ | |
2241 @end table\n\ | |
2242 \n\ | |
2243 Every command may also have a modifier:\n\ | |
2244 @table @code\n\ | |
2245 @item l\n\ | |
2246 Left alignment.\n\ | |
2247 @item r\n\ | |
2248 Right alignment (this is the default).\n\ | |
2249 @item c\n\ | |
2250 Centered (may only be applied to command %s).\n\ | |
2251 @end table\n\ | |
2252 \n\ | |
2253 A command is composed like this:\n\ | |
2254 \n\ | |
9153
5247e89688e1
Eliminate most overfull errors when running texi2pdf for generating pdf documentation
Rik <rdrider0-list@yahoo.com>
parents:
9147
diff
changeset
|
2255 @c Set example in small font to prevent overfull line\n\ |
8516 | 2256 @smallexample\n\ |
7586
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
2257 %[modifier]<command>[:size_of_parameter[:center-specific[:balance]]];\n\ |
8516 | 2258 @end smallexample\n\ |
7336 | 2259 \n\ |
8516 | 2260 Command and modifier is already explained. The @code{size_of_parameter}\n\ |
2261 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
|
2262 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
|
2263 @samp{%s}.\n\ |
84122fb29c75
whos: handle index expressions
John W. Eaton <jwe@octave.org>
parents:
7531
diff
changeset
|
2264 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
|
2265 the dimensions string.\n\ |
7336 | 2266 \n\ |
8516 | 2267 The default format is\n\ |
2268 @code{\" %a:4; %ln:6; %cs:16:6:1; %rb:12; %lc:-1;\\n\"}.\n\ | |
5794 | 2269 @end deftypefn") |
2270 { | |
7336 | 2271 return SET_INTERNAL_VARIABLE (whos_line_format); |
3016 | 2272 } |
2273 | |
1 | 2274 /* |
2275 ;;; Local Variables: *** | |
2276 ;;; mode: C++ *** | |
2277 ;;; End: *** | |
2278 */ |