Mercurial > hg > octave-lyh
annotate src/defaults.cc @ 10671:f5f9bc8e83fc
svds.m: Overhaul code while fixing bug #29721.
Return smallest singular values if sigma == 0 (Bug #29721).
Avoid calculating U and V matrices unless requested.
Correctly handle zero matrix input
Improve documentation string.
author | Rik <octave@nomad.inbox5.com> |
---|---|
date | Sun, 30 May 2010 13:45:50 -0700 |
parents | 57a59eae83cc |
children | 89f4d7e294cc |
rev | line source |
---|---|
2203 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, |
8920 | 4 2006, 2007, 2008, 2009 John W. Eaton |
2203 | 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. | |
2203 | 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/>. | |
2203 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
28 #include <cstdlib> | |
29 | |
6114 | 30 #include <algorithm> |
3503 | 31 #include <iostream> |
2203 | 32 #include <string> |
33 | |
34 #include <sys/types.h> | |
35 #include <unistd.h> | |
36 | |
5814 | 37 #include "dir-ops.h" |
2926 | 38 #include "oct-env.h" |
4217 | 39 #include "file-stat.h" |
3174 | 40 #include "pathsearch.h" |
4217 | 41 #include "str-vec.h" |
2926 | 42 |
2492 | 43 #include <defaults.h> |
2203 | 44 #include "defun.h" |
45 #include "error.h" | |
3040 | 46 #include "file-ops.h" |
2203 | 47 #include "gripes.h" |
48 #include "help.h" | |
5395 | 49 #include "input.h" |
5832 | 50 #include "load-path.h" |
3185 | 51 #include "oct-obj.h" |
2390 | 52 #include "ov.h" |
4217 | 53 #include "parse.h" |
2203 | 54 #include "toplev.h" |
4217 | 55 #include "unwind-prot.h" |
2203 | 56 #include "variables.h" |
2492 | 57 #include <version.h> |
2203 | 58 |
3523 | 59 std::string Voctave_home; |
2203 | 60 |
3523 | 61 std::string Vbin_dir; |
62 std::string Vinfo_dir; | |
63 std::string Vdata_dir; | |
64 std::string Vlibexec_dir; | |
65 std::string Varch_lib_dir; | |
66 std::string Vlocal_arch_lib_dir; | |
5909 | 67 std::string Vlocal_api_arch_lib_dir; |
3597 | 68 std::string Vlocal_ver_arch_lib_dir; |
5814 | 69 |
70 std::string Vlocal_ver_oct_file_dir; | |
71 std::string Vlocal_api_oct_file_dir; | |
72 std::string Vlocal_oct_file_dir; | |
2203 | 73 |
5814 | 74 std::string Vlocal_ver_fcn_file_dir; |
75 std::string Vlocal_api_fcn_file_dir; | |
76 std::string Vlocal_fcn_file_dir; | |
77 | |
78 std::string Voct_file_dir; | |
79 std::string Vfcn_file_dir; | |
80 | |
81 std::string Vimage_dir; | |
4447 | 82 |
2203 | 83 // The path that will be searched for programs that we execute. |
84 // (--exec-path path) | |
5794 | 85 static std::string VEXEC_PATH; |
2203 | 86 |
87 // Name of the editor to be invoked by the edit_history command. | |
5794 | 88 std::string VEDITOR; |
2203 | 89 |
5814 | 90 static std::string VIMAGE_PATH; |
2203 | 91 |
3523 | 92 std::string Vlocal_site_defaults_file; |
93 std::string Vsite_defaults_file; | |
2203 | 94 |
6274 | 95 std::string |
3523 | 96 subst_octave_home (const std::string& s) |
2203 | 97 { |
3523 | 98 std::string retval; |
2203 | 99 |
3523 | 100 std::string prefix = OCTAVE_PREFIX; |
2203 | 101 |
102 retval = s; | |
103 | |
104 if (Voctave_home != prefix) | |
105 { | |
5275 | 106 octave_idx_type len = prefix.length (); |
6276 | 107 |
108 if (s.substr (0, len) == prefix) | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
109 retval.replace (0, len, Voctave_home); |
2203 | 110 } |
111 | |
8007
a2ab20ba78f7
make file_ops a proper singleton class
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
112 if (file_ops::dir_sep_char () != '/') |
a2ab20ba78f7
make file_ops a proper singleton class
John W. Eaton <jwe@octave.org>
parents:
7017
diff
changeset
|
113 std::replace (retval.begin (), retval.end (), '/', |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10182
diff
changeset
|
114 file_ops::dir_sep_char ()); |
6114 | 115 |
2203 | 116 return retval; |
117 } | |
118 | |
119 static void | |
120 set_octave_home (void) | |
121 { | |
3523 | 122 std::string oh = octave_env::getenv ("OCTAVE_HOME"); |
2203 | 123 |
3523 | 124 Voctave_home = oh.empty () ? std::string (OCTAVE_PREFIX) : oh; |
2203 | 125 } |
126 | |
127 static void | |
128 set_default_info_dir (void) | |
129 { | |
130 Vinfo_dir = subst_octave_home (OCTAVE_INFODIR); | |
131 } | |
132 | |
133 static void | |
3141 | 134 set_default_data_dir (void) |
135 { | |
136 Vdata_dir = subst_octave_home (OCTAVE_DATADIR); | |
137 } | |
138 | |
139 static void | |
140 set_default_libexec_dir (void) | |
141 { | |
142 Vlibexec_dir = subst_octave_home (OCTAVE_LIBEXECDIR); | |
143 } | |
144 | |
145 static void | |
2203 | 146 set_default_arch_lib_dir (void) |
147 { | |
148 Varch_lib_dir = subst_octave_home (OCTAVE_ARCHLIBDIR); | |
149 } | |
150 | |
151 static void | |
2439 | 152 set_default_local_arch_lib_dir (void) |
153 { | |
154 Vlocal_arch_lib_dir = subst_octave_home (OCTAVE_LOCALARCHLIBDIR); | |
155 } | |
156 | |
157 static void | |
5909 | 158 set_default_local_api_arch_lib_dir (void) |
159 { | |
160 Vlocal_api_arch_lib_dir = subst_octave_home (OCTAVE_LOCALAPIARCHLIBDIR); | |
161 } | |
162 | |
163 static void | |
3597 | 164 set_default_local_ver_arch_lib_dir (void) |
165 { | |
166 Vlocal_ver_arch_lib_dir = subst_octave_home (OCTAVE_LOCALVERARCHLIBDIR); | |
167 } | |
168 | |
169 static void | |
5814 | 170 set_default_local_ver_oct_file_dir (void) |
171 { | |
172 Vlocal_ver_oct_file_dir = subst_octave_home (OCTAVE_LOCALVEROCTFILEDIR); | |
173 } | |
174 | |
175 static void | |
176 set_default_local_api_oct_file_dir (void) | |
177 { | |
178 Vlocal_api_oct_file_dir = subst_octave_home (OCTAVE_LOCALAPIOCTFILEDIR); | |
179 } | |
180 | |
181 static void | |
182 set_default_local_oct_file_dir (void) | |
183 { | |
184 Vlocal_oct_file_dir = subst_octave_home (OCTAVE_LOCALOCTFILEDIR); | |
185 } | |
186 | |
187 static void | |
188 set_default_local_ver_fcn_file_dir (void) | |
189 { | |
190 Vlocal_ver_fcn_file_dir = subst_octave_home (OCTAVE_LOCALVERFCNFILEDIR); | |
191 } | |
192 | |
193 static void | |
194 set_default_local_api_fcn_file_dir (void) | |
195 { | |
196 Vlocal_api_fcn_file_dir = subst_octave_home (OCTAVE_LOCALAPIFCNFILEDIR); | |
197 } | |
198 | |
199 static void | |
200 set_default_local_fcn_file_dir (void) | |
201 { | |
202 Vlocal_fcn_file_dir = subst_octave_home (OCTAVE_LOCALFCNFILEDIR); | |
203 } | |
204 | |
205 static void | |
2203 | 206 set_default_fcn_file_dir (void) |
207 { | |
208 Vfcn_file_dir = subst_octave_home (OCTAVE_FCNFILEDIR); | |
209 } | |
210 | |
211 static void | |
5814 | 212 set_default_image_dir (void) |
213 { | |
214 Vimage_dir = subst_octave_home (OCTAVE_IMAGEDIR); | |
215 } | |
216 | |
217 static void | |
5397 | 218 set_default_oct_file_dir (void) |
219 { | |
220 Voct_file_dir = subst_octave_home (OCTAVE_OCTFILEDIR); | |
221 } | |
222 | |
223 static void | |
2203 | 224 set_default_bin_dir (void) |
225 { | |
226 Vbin_dir = subst_octave_home (OCTAVE_BINDIR); | |
227 } | |
228 | |
5814 | 229 void |
230 set_exec_path (const std::string& path) | |
4447 | 231 { |
8008
4d13a7a2f6ab
dir_path: use singleton class for static data members
John W. Eaton <jwe@octave.org>
parents:
8007
diff
changeset
|
232 VEXEC_PATH = Vlocal_ver_arch_lib_dir + dir_path::path_sep_str () |
4d13a7a2f6ab
dir_path: use singleton class for static data members
John W. Eaton <jwe@octave.org>
parents:
8007
diff
changeset
|
233 + Vlocal_api_arch_lib_dir + dir_path::path_sep_str () |
4d13a7a2f6ab
dir_path: use singleton class for static data members
John W. Eaton <jwe@octave.org>
parents:
8007
diff
changeset
|
234 + Vlocal_arch_lib_dir + dir_path::path_sep_str () |
4d13a7a2f6ab
dir_path: use singleton class for static data members
John W. Eaton <jwe@octave.org>
parents:
8007
diff
changeset
|
235 + Varch_lib_dir + dir_path::path_sep_str () |
4447 | 236 + Vbin_dir; |
5814 | 237 |
238 // This is static so that even if set_exec_path is called more than | |
239 // once, shell_path is the original PATH from the environment, | |
240 // before we start modifying it. | |
241 static std::string shell_path = octave_env::getenv ("PATH"); | |
242 | |
243 if (! shell_path.empty ()) | |
8008
4d13a7a2f6ab
dir_path: use singleton class for static data members
John W. Eaton <jwe@octave.org>
parents:
8007
diff
changeset
|
244 VEXEC_PATH += dir_path::path_sep_str () + shell_path; |
5814 | 245 |
246 std::string tpath = path; | |
247 | |
248 if (tpath.empty ()) | |
249 tpath = octave_env::getenv ("OCTAVE_EXEC_PATH"); | |
250 | |
251 if (! tpath.empty ()) | |
8008
4d13a7a2f6ab
dir_path: use singleton class for static data members
John W. Eaton <jwe@octave.org>
parents:
8007
diff
changeset
|
252 VEXEC_PATH = tpath + dir_path::path_sep_str () + VEXEC_PATH; |
5814 | 253 |
254 octave_env::putenv ("PATH", VEXEC_PATH); | |
255 } | |
256 | |
257 void | |
258 set_image_path (const std::string& path) | |
259 { | |
260 VIMAGE_PATH = "."; | |
261 | |
262 std::string tpath = path; | |
263 | |
264 if (tpath.empty ()) | |
265 tpath = octave_env::getenv ("OCTAVE_IMAGE_PATH"); | |
266 | |
267 if (! tpath.empty ()) | |
8008
4d13a7a2f6ab
dir_path: use singleton class for static data members
John W. Eaton <jwe@octave.org>
parents:
8007
diff
changeset
|
268 VIMAGE_PATH += dir_path::path_sep_str () + tpath; |
5814 | 269 |
5832 | 270 tpath = genpath (Vimage_dir, ""); |
271 | |
272 if (! tpath.empty ()) | |
8008
4d13a7a2f6ab
dir_path: use singleton class for static data members
John W. Eaton <jwe@octave.org>
parents:
8007
diff
changeset
|
273 VIMAGE_PATH += dir_path::path_sep_str () + tpath; |
5814 | 274 } |
275 | |
2203 | 276 static void |
8865
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
277 set_default_doc_cache_file (void) |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
278 { |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
279 std::string def_file = subst_octave_home (OCTAVE_DOC_CACHE_FILE); |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
280 |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
281 std::string env_file = octave_env::getenv ("OCTAVE_DOC_CACHE_FILE"); |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
282 |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
283 Vdoc_cache_file = env_file.empty () ? def_file : env_file; |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
284 } |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
285 |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
286 static void |
2203 | 287 set_default_info_file (void) |
288 { | |
3523 | 289 std::string std_info_file = subst_octave_home (OCTAVE_INFOFILE); |
2512 | 290 |
3523 | 291 std::string oct_info_file = octave_env::getenv ("OCTAVE_INFO_FILE"); |
2203 | 292 |
2926 | 293 Vinfo_file = oct_info_file.empty () ? std_info_file : oct_info_file; |
2203 | 294 } |
295 | |
296 static void | |
297 set_default_info_prog (void) | |
298 { | |
3523 | 299 std::string oct_info_prog = octave_env::getenv ("OCTAVE_INFO_PROGRAM"); |
2203 | 300 |
2926 | 301 if (oct_info_prog.empty ()) |
5794 | 302 Vinfo_program = "info"; |
2926 | 303 else |
5794 | 304 Vinfo_program = std::string (oct_info_prog); |
2203 | 305 } |
306 | |
4773 | 307 static void |
2203 | 308 set_default_editor (void) |
309 { | |
5794 | 310 VEDITOR = "emacs"; |
2203 | 311 |
3523 | 312 std::string env_editor = octave_env::getenv ("EDITOR"); |
2203 | 313 |
2926 | 314 if (! env_editor.empty ()) |
5794 | 315 VEDITOR = env_editor; |
2203 | 316 } |
317 | |
318 static void | |
319 set_local_site_defaults_file (void) | |
320 { | |
9132
eb1747dbd360
Update help strings for command line options
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
321 std::string lsf = octave_env::getenv ("OCTAVE_SITE_INITFILE"); |
5781 | 322 |
323 if (lsf.empty ()) | |
324 { | |
325 Vlocal_site_defaults_file = subst_octave_home (OCTAVE_LOCALSTARTUPFILEDIR); | |
326 Vlocal_site_defaults_file.append ("/octaverc"); | |
327 } | |
328 else | |
329 Vlocal_site_defaults_file = lsf; | |
2203 | 330 } |
331 | |
332 static void | |
333 set_site_defaults_file (void) | |
334 { | |
9132
eb1747dbd360
Update help strings for command line options
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
335 std::string sf = octave_env::getenv ("OCTAVE_VERSION_INITFILE"); |
5781 | 336 |
337 if (sf.empty ()) | |
338 { | |
339 Vsite_defaults_file = subst_octave_home (OCTAVE_STARTUPFILEDIR); | |
340 Vsite_defaults_file.append ("/octaverc"); | |
341 } | |
342 else | |
343 Vsite_defaults_file = sf; | |
2203 | 344 } |
345 | |
346 void | |
347 install_defaults (void) | |
348 { | |
349 // OCTAVE_HOME must be set first! | |
350 | |
351 set_octave_home (); | |
352 | |
353 set_default_info_dir (); | |
354 | |
3141 | 355 set_default_data_dir (); |
356 | |
357 set_default_libexec_dir (); | |
358 | |
2203 | 359 set_default_arch_lib_dir (); |
360 | |
5909 | 361 set_default_local_ver_arch_lib_dir (); |
362 set_default_local_api_arch_lib_dir (); | |
2439 | 363 set_default_local_arch_lib_dir (); |
364 | |
5814 | 365 set_default_local_ver_oct_file_dir (); |
366 set_default_local_api_oct_file_dir (); | |
367 set_default_local_oct_file_dir (); | |
2203 | 368 |
5814 | 369 set_default_local_ver_fcn_file_dir (); |
370 set_default_local_api_fcn_file_dir (); | |
371 set_default_local_fcn_file_dir (); | |
372 | |
373 set_default_fcn_file_dir (); | |
5397 | 374 set_default_oct_file_dir (); |
375 | |
5814 | 376 set_default_image_dir (); |
377 | |
2203 | 378 set_default_bin_dir (); |
379 | |
5814 | 380 set_exec_path (); |
4447 | 381 |
5814 | 382 set_image_path (); |
2203 | 383 |
8865
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
384 set_default_doc_cache_file (); |
eace5649a8b5
set default value for doc_cache_file variable
John W. Eaton <jwe@octave.org>
parents:
8008
diff
changeset
|
385 |
2203 | 386 set_default_info_file (); |
387 | |
388 set_default_info_prog (); | |
389 | |
390 set_default_editor (); | |
391 | |
392 set_local_site_defaults_file (); | |
393 | |
394 set_site_defaults_file (); | |
395 } | |
396 | |
5794 | 397 DEFUN (EDITOR, args, nargout, |
398 "-*- texinfo -*-\n\ | |
399 @deftypefn {Built-in Function} {@var{val} =} EDITOR ()\n\ | |
400 @deftypefnx {Built-in Function} {@var{old_val} =} EDITOR (@var{new_val})\n\ | |
401 Query or set the internal variable that specifies the editor to\n\ | |
9134
a3739e27b017
Update section 2.4 of basics.txi
Rik <rdrider0-list@yahoo.com>
parents:
9132
diff
changeset
|
402 use with the @code{edit_history} command. The default value is taken from\n\ |
9142
b38c45d1fc08
Remove trailing space from two doc strings to eliminate compile warning
Rik <rdrider0-list@yahoo.com>
parents:
9135
diff
changeset
|
403 the environment variable @w{@code{EDITOR}} when Octave starts. If the\n\ |
9135
b04f95fabbf9
Update sections 2.5, 2.6, 2.7 of basics.txi
Rik <rdrider0-list@yahoo.com>
parents:
9134
diff
changeset
|
404 environment variable is not initialized, @w{@code{EDITOR}} will be set to\n\ |
5794 | 405 @code{\"emacs\"}.\n\ |
406 @seealso{edit_history}\n\ | |
407 @end deftypefn") | |
2203 | 408 { |
5794 | 409 return SET_NONEMPTY_INTERNAL_STRING_VARIABLE (EDITOR); |
2203 | 410 } |
411 | |
5794 | 412 DEFUN (EXEC_PATH, args, nargout, |
413 "-*- texinfo -*-\n\ | |
414 @deftypefn {Built-in Function} {@var{val} =} EXEC_PATH ()\n\ | |
415 @deftypefnx {Built-in Function} {@var{old_val} =} EXEC_PATH (@var{new_val})\n\ | |
416 Query or set the internal variable that specifies a colon separated\n\ | |
417 list of directories to search when executing external programs.\n\ | |
418 Its initial value is taken from the environment variable\n\ | |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9142
diff
changeset
|
419 @w{@code{OCTAVE_EXEC_PATH}} (if it exists) or @code{PATH}, but that\n\ |
5794 | 420 value can be overridden by the command line argument\n\ |
5814 | 421 @code{--exec-path PATH}. At startup, an additional set of\n\ |
422 directories (including the shell PATH) is appended to the path\n\ | |
423 specified in the environment or on the command line. If you use\n\ | |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9142
diff
changeset
|
424 the @w{@code{EXEC_PATH}} function to modify the path, you should take\n\ |
5814 | 425 care to preserve these additional directories.\n\ |
5794 | 426 @end deftypefn") |
4217 | 427 { |
5794 | 428 std::string saved_exec_path = VEXEC_PATH; |
4217 | 429 |
5794 | 430 octave_value retval = SET_NONEMPTY_INTERNAL_STRING_VARIABLE (EXEC_PATH); |
4217 | 431 |
5794 | 432 if (VEXEC_PATH != saved_exec_path) |
5814 | 433 octave_env::putenv ("PATH", VEXEC_PATH); |
2203 | 434 |
5794 | 435 return retval; |
2203 | 436 } |
437 | |
5814 | 438 DEFUN (IMAGE_PATH, args, nargout, |
5794 | 439 "-*- texinfo -*-\n\ |
5814 | 440 @deftypefn {Built-in Function} {@var{val} =} IMAGE_PATH ()\n\ |
441 @deftypefnx {Built-in Function} {@var{old_val} =} IMAGE_PATH (@var{new_val})\n\ | |
5794 | 442 Query or set the internal variable that specifies a colon separated\n\ |
443 list of directories in which to search for image files.\n\ | |
444 @end deftypefn") | |
445 { | |
5814 | 446 return SET_NONEMPTY_INTERNAL_STRING_VARIABLE (IMAGE_PATH); |
5794 | 447 } |
448 | |
5780 | 449 DEFUN (OCTAVE_HOME, args, , |
450 "-*- texinfo -*-\n\ | |
451 @deftypefn {Built-in Function} {} OCTAVE_HOME ()\n\ | |
452 Return the name of the top-level Octave installation directory.\n\ | |
453 @end deftypefn") | |
454 { | |
455 octave_value retval; | |
2831 | 456 |
5780 | 457 if (args.length () == 0) |
458 retval = Voctave_home; | |
459 else | |
5823 | 460 print_usage (); |
5780 | 461 |
462 return retval; | |
5749 | 463 } |
3446 | 464 |
5749 | 465 DEFUNX ("OCTAVE_VERSION", FOCTAVE_VERSION, args, , |
466 "-*- texinfo -*-\n\ | |
467 @deftypefn {Built-in Function} {} OCTAVE_VERSION ()\n\ | |
468 Return the version number of Octave, as a string.\n\ | |
469 @end deftypefn") | |
470 { | |
471 octave_value retval; | |
472 | |
473 int nargin = args.length (); | |
474 | |
475 if (nargin == 0) | |
476 retval = OCTAVE_VERSION; | |
477 else | |
5823 | 478 print_usage (); |
5749 | 479 |
480 return retval; | |
2203 | 481 } |