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