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