1
|
1 // g-builtins.cc -*- C++ -*- |
|
2 /* |
|
3 |
272
|
4 Copyright (C) 1992, 1993, 1994 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 |
|
10 Free Software Foundation; either version 2, or (at your option) any |
|
11 later version. |
|
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 |
|
19 along with Octave; see the file COPYING. If not, write to the Free |
|
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
|
21 |
|
22 */ |
|
23 |
|
24 /* |
|
25 |
|
26 The function builtin_pwd adapted from a similar function from GNU |
|
27 Bash, the Bourne Again SHell, copyright (C) 1987, 1989, 1991 Free |
|
28 Software Foundation, Inc. |
|
29 |
|
30 */ |
|
31 |
240
|
32 #ifdef HAVE_CONFIG_H |
|
33 #include "config.h" |
1
|
34 #endif |
|
35 |
|
36 #include <sys/types.h> |
|
37 #ifdef HAVE_UNISTD_H |
|
38 #include <unistd.h> |
|
39 #endif |
|
40 #include <strstream.h> |
|
41 #include <iostream.h> |
|
42 #include <fstream.h> |
|
43 #include <stdio.h> |
|
44 #include <sys/wait.h> |
|
45 #include <sys/param.h> |
|
46 #include <signal.h> |
|
47 #include <math.h> |
|
48 |
35
|
49 #include "f-balance.h" |
181
|
50 #include "f-chol.h" |
9
|
51 #include "f-colloc.h" |
|
52 #include "f-dassl.h" |
|
53 #include "f-det.h" |
|
54 #include "f-eig.h" |
51
|
55 #include "f-expm.h" |
9
|
56 #include "f-fft.h" |
|
57 #include "f-fsolve.h" |
|
58 #include "f-fsqp.h" |
35
|
59 #include "f-givens.h" |
9
|
60 #include "f-hess.h" |
|
61 #include "f-ifft.h" |
|
62 #include "f-inv.h" |
|
63 #include "f-lpsolve.h" |
|
64 #include "f-lsode.h" |
|
65 #include "f-lu.h" |
|
66 #include "f-npsol.h" |
|
67 #include "f-qpsol.h" |
|
68 #include "f-qr.h" |
|
69 #include "f-quad.h" |
46
|
70 #include "f-qzval.h" |
9
|
71 #include "f-rand.h" |
|
72 #include "f-schur.h" |
|
73 #include "f-svd.h" |
38
|
74 #include "f-syl.h" |
9
|
75 |
290
|
76 #include "sighandlers.h" |
1
|
77 #include "procstream.h" |
|
78 #include "error.h" |
|
79 #include "variables.h" |
|
80 #include "builtins.h" |
|
81 #include "g-builtins.h" |
|
82 #include "user-prefs.h" |
|
83 #include "utils.h" |
|
84 #include "tree.h" |
9
|
85 #include "tree-const.h" |
1
|
86 #include "input.h" |
|
87 #include "pager.h" |
|
88 #include "octave.h" |
|
89 #include "version.h" |
|
90 #include "file-io.h" |
|
91 |
|
92 extern "C" |
|
93 { |
|
94 #include <readline/readline.h> |
359
|
95 |
|
96 extern char *term_clrpag; |
|
97 extern void _rl_output_character_function (); |
1
|
98 } |
|
99 |
|
100 #ifndef MAXPATHLEN |
|
101 #define MAXPATHLEN 1024 |
|
102 #endif |
|
103 |
|
104 #ifdef WITH_DLD |
|
105 #include "dynamic-ld.h" |
|
106 #define Q_STR(name) #name |
|
107 #define DLD_FCN(name) Q_STR (builtin_##name##_2) |
|
108 #define DLD_OBJ(name) Q_STR (tc-##name##.o) |
|
109 #define DLD_BUILTIN(args,n_in,n_out,name,code) \ |
|
110 return octave_dld_tc2_and_go (args, n_in, n_out, Q_STR (name), \ |
|
111 DLD_FCN (name), DLD_OBJ (name)); |
|
112 |
|
113 #else |
|
114 #define DLD_BUILTIN(name,args,n_in,n_out,code) code |
|
115 #endif |
|
116 |
|
117 // Non-zero means that pwd always give verbatim directory, regardless |
|
118 // of symbolic link following. |
|
119 static int verbatim_pwd = 1; |
|
120 |
|
121 /* |
|
122 * Are all elements of a constant nonzero? |
|
123 */ |
|
124 tree_constant * |
164
|
125 builtin_all (const tree_constant *args, int nargin, int nargout) |
1
|
126 { |
|
127 tree_constant *retval = NULL_TREE_CONST; |
181
|
128 |
1
|
129 if (nargin != 2) |
181
|
130 print_usage ("all"); |
1
|
131 else |
|
132 { |
|
133 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
134 { |
|
135 retval = new tree_constant [2]; |
|
136 retval[0] = args[1].all (); |
|
137 } |
|
138 } |
181
|
139 |
1
|
140 return retval; |
|
141 } |
|
142 |
|
143 /* |
|
144 * Are any elements of a constant nonzero? |
|
145 */ |
|
146 tree_constant * |
164
|
147 builtin_any (const tree_constant *args, int nargin, int nargout) |
1
|
148 { |
|
149 tree_constant *retval = NULL_TREE_CONST; |
181
|
150 |
1
|
151 if (nargin != 2) |
181
|
152 print_usage ("any"); |
1
|
153 else |
|
154 { |
|
155 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
156 { |
|
157 retval = new tree_constant [2]; |
|
158 retval[0] = args[1].any (); |
|
159 } |
|
160 } |
181
|
161 |
1
|
162 return retval; |
|
163 } |
|
164 |
|
165 /* |
18
|
166 * Balancing for eigenvalue problems |
|
167 */ |
|
168 tree_constant * |
164
|
169 builtin_balance (const tree_constant *args, int nargin, int nargout) |
18
|
170 { |
|
171 tree_constant *retval = NULL_TREE_CONST; |
181
|
172 |
18
|
173 if (nargin <= 1 || nargin > 4 || nargout < 1 || nargout > 4) |
181
|
174 print_usage ("balance"); |
18
|
175 else |
|
176 { |
|
177 DLD_BUILTIN (args, nargin, nargout, balance, |
|
178 retval = balance (args, nargin, nargout)); |
|
179 } |
181
|
180 |
|
181 return retval; |
|
182 } |
|
183 |
|
184 /* |
|
185 * Cholesky factorization. |
|
186 */ |
|
187 tree_constant * |
|
188 builtin_chol (const tree_constant *args, int nargin, int nargout) |
|
189 { |
|
190 tree_constant *retval = NULL_TREE_CONST; |
|
191 |
|
192 if (nargin == 2 && nargout == 1) |
|
193 DLD_BUILTIN (args, nargin, nargout, chol, |
|
194 retval = chol (args, nargin, nargout);) |
|
195 else |
|
196 usage ("R = chol(A) \n"); |
|
197 |
18
|
198 return retval; |
|
199 } |
|
200 |
|
201 /* |
1
|
202 * Clear the screen? |
|
203 */ |
|
204 tree_constant * |
164
|
205 builtin_clc (const tree_constant *args, int nargin, int nargout) |
1
|
206 { |
|
207 rl_beg_of_line (); |
|
208 rl_kill_line (1); |
359
|
209 |
|
210 #if ! defined (_GO32_) |
|
211 if (term_clrpag) |
|
212 tputs (term_clrpag, 1, _rl_output_character_function); |
|
213 else |
|
214 crlf (); |
|
215 #else |
|
216 crlf (); |
|
217 #endif |
|
218 |
|
219 fflush (rl_outstream); |
|
220 |
1
|
221 return NULL_TREE_CONST; |
|
222 } |
|
223 |
|
224 /* |
|
225 * Time in a vector. |
|
226 */ |
|
227 tree_constant * |
164
|
228 builtin_clock (const tree_constant *args, int nargin, int nargout) |
1
|
229 { |
|
230 tree_constant *retval = NULL_TREE_CONST; |
|
231 |
|
232 time_t now; |
|
233 struct tm *tm; |
|
234 |
|
235 time (&now); |
|
236 tm = localtime (&now); |
|
237 |
|
238 Matrix m (1, 6); |
|
239 m.elem (0, 0) = tm->tm_year + 1900; |
|
240 m.elem (0, 1) = tm->tm_mon + 1; |
|
241 m.elem (0, 2) = tm->tm_mday; |
|
242 m.elem (0, 3) = tm->tm_hour; |
|
243 m.elem (0, 4) = tm->tm_min; |
|
244 m.elem (0, 5) = tm->tm_sec; |
|
245 |
|
246 retval = new tree_constant [2]; |
|
247 retval[0] = tree_constant (m); |
|
248 |
|
249 return retval; |
|
250 } |
|
251 |
|
252 /* |
|
253 * Close the stream to the plotter. |
|
254 */ |
|
255 tree_constant * |
164
|
256 builtin_closeplot (const tree_constant *args, int nargin, int nargout) |
1
|
257 { |
|
258 tree_constant *retval = NULL_TREE_CONST; |
|
259 close_plot_stream (); |
|
260 return retval; |
|
261 } |
|
262 |
|
263 /* |
|
264 * Collocation roots and weights. |
|
265 */ |
|
266 tree_constant * |
164
|
267 builtin_colloc (const tree_constant *args, int nargin, int nargout) |
1
|
268 { |
|
269 tree_constant *retval = NULL_TREE_CONST; |
|
270 |
|
271 if (nargin < 2 || nargin > 4) |
181
|
272 print_usage ("colloc"); |
1
|
273 else |
|
274 DLD_BUILTIN (args, nargin, nargout, colloc, |
|
275 retval = collocation_weights (args, nargin);) |
|
276 |
|
277 return retval; |
|
278 } |
|
279 |
|
280 /* |
|
281 * Cumulative sums and products. |
|
282 */ |
|
283 tree_constant * |
164
|
284 builtin_cumprod (const tree_constant *args, int nargin, int nargout) |
1
|
285 { |
|
286 tree_constant *retval = NULL_TREE_CONST; |
181
|
287 |
1
|
288 if (nargin != 2) |
181
|
289 print_usage ("cumprod"); |
1
|
290 else |
|
291 { |
|
292 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
293 { |
|
294 retval = new tree_constant [2]; |
|
295 retval[0] = args[1].cumprod (); |
|
296 } |
|
297 } |
181
|
298 |
1
|
299 return retval; |
|
300 } |
|
301 |
|
302 tree_constant * |
164
|
303 builtin_cumsum (const tree_constant *args, int nargin, int nargout) |
1
|
304 { |
|
305 tree_constant *retval = NULL_TREE_CONST; |
181
|
306 |
1
|
307 if (nargin != 2) |
181
|
308 print_usage ("cumsum"); |
1
|
309 else |
|
310 { |
|
311 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
312 { |
|
313 retval = new tree_constant [2]; |
|
314 retval[0] = args[1].cumsum (); |
|
315 } |
|
316 } |
181
|
317 |
1
|
318 return retval; |
|
319 } |
|
320 |
|
321 /* |
|
322 * DAEs. |
|
323 */ |
|
324 tree_constant * |
164
|
325 builtin_dassl (const tree_constant *args, int nargin, int nargout) |
1
|
326 { |
|
327 tree_constant *retval = new tree_constant [2]; |
|
328 |
|
329 if ((nargin == 5 || nargin == 6) && nargout > 0) |
|
330 DLD_BUILTIN (args, nargin, nargout, dassl, |
|
331 retval = dassl (args, nargin, nargout);) |
|
332 else |
181
|
333 print_usage ("dassl"); |
1
|
334 |
|
335 return retval; |
|
336 } |
|
337 |
272
|
338 tree_constant * |
|
339 builtin_dassl_options (const tree_constant *args, int nargin, int nargout) |
|
340 { |
|
341 tree_constant *retval = NULL_TREE_CONST; |
|
342 |
289
|
343 DLD_BUILTIN (args, nargin, nargout, dassl_options, |
|
344 retval = dassl_options (args, nargin, nargout);) |
272
|
345 |
|
346 return retval; |
|
347 } |
|
348 |
1
|
349 /* |
|
350 * Time in a string. |
|
351 */ |
|
352 tree_constant * |
164
|
353 builtin_date (const tree_constant *args, int nargin, int nargout) |
1
|
354 { |
|
355 tree_constant *retval = NULL_TREE_CONST; |
|
356 |
|
357 time_t now; |
|
358 struct tm *tm; |
|
359 |
|
360 time (&now); |
|
361 tm = localtime (&now); |
|
362 char date[32]; |
|
363 int len = strftime (date, 31, "%d-%b-%y", tm); |
|
364 if (len > 0) |
|
365 { |
|
366 retval = new tree_constant [2]; |
|
367 retval[0] = tree_constant (date); |
|
368 } |
|
369 |
|
370 return retval; |
|
371 } |
|
372 |
|
373 /* |
|
374 * Determinant of a matrix. |
|
375 */ |
|
376 tree_constant * |
164
|
377 builtin_det (const tree_constant *args, int nargin, int nargout) |
1
|
378 { |
|
379 tree_constant *retval = NULL_TREE_CONST; |
|
380 |
|
381 if (nargin == 2) |
|
382 DLD_BUILTIN (args, nargin, nargout, det, |
|
383 { |
|
384 retval = new tree_constant [2]; |
|
385 retval[0] = determinant (args[1]); |
|
386 }) |
|
387 else |
181
|
388 print_usage ("det"); |
1
|
389 |
|
390 return retval; |
|
391 } |
|
392 |
|
393 /* |
|
394 * Diagonal elements of a matrix. |
|
395 */ |
|
396 tree_constant * |
164
|
397 builtin_diag (const tree_constant *args, int nargin, int nargout) |
1
|
398 { |
|
399 tree_constant *retval = NULL_TREE_CONST; |
|
400 |
|
401 if (nargin == 2) |
|
402 { |
|
403 retval = new tree_constant [2]; |
|
404 retval[0] = args[1].diag (); |
|
405 } |
|
406 else if (nargin == 3) |
|
407 { |
|
408 retval = new tree_constant [2]; |
|
409 retval[0] = args[1].diag (args[2]); |
|
410 } |
|
411 else |
181
|
412 print_usage ("diag"); |
1
|
413 |
|
414 return retval; |
|
415 } |
|
416 |
|
417 /* |
|
418 * Display value without trimmings. |
|
419 */ |
|
420 tree_constant * |
|
421 builtin_disp (tree_constant *args, int nargin, int nargout) |
|
422 { |
|
423 tree_constant *retval = NULL_TREE_CONST; |
|
424 |
|
425 if (nargin == 2) |
|
426 args[1].eval (1); |
|
427 else |
181
|
428 print_usage ("disp"); |
1
|
429 |
|
430 return retval; |
|
431 } |
|
432 |
|
433 /* |
|
434 * Compute eigenvalues and eigenvectors. |
|
435 */ |
|
436 tree_constant * |
164
|
437 builtin_eig (const tree_constant *args, int nargin, int nargout) |
1
|
438 { |
|
439 tree_constant *retval = NULL_TREE_CONST; |
|
440 |
|
441 if (nargin == 2 && (nargout == 1 || nargout == 2)) |
|
442 DLD_BUILTIN (args, nargin, nargout, eig, |
|
443 retval = eig (args, nargin, nargout);) |
|
444 else |
181
|
445 print_usage ("eig"); |
1
|
446 |
|
447 return retval; |
|
448 } |
|
449 |
|
450 /* |
191
|
451 * Print error message and set the error state. This should |
|
452 * eventually take us up to the top level, possibly printing traceback |
|
453 * messages as we go. |
1
|
454 */ |
|
455 tree_constant * |
|
456 builtin_error (tree_constant *args, int nargin, int nargout) |
|
457 { |
|
458 tree_constant *retval = NULL_TREE_CONST; |
|
459 |
191
|
460 char *msg = "unspecified_error"; |
1
|
461 |
390
|
462 if (nargin == 2 && args != NULL_TREE_CONST && args[1].is_defined ()) |
191
|
463 { |
390
|
464 if (args[1].is_string_type ()) |
|
465 { |
|
466 msg = args[1].string_value (); |
|
467 |
|
468 if (msg == (char *) NULL || *msg == '\0') |
|
469 return retval; |
|
470 } |
|
471 else if (args[1].is_empty ()) |
|
472 { |
|
473 return retval; |
|
474 } |
191
|
475 } |
|
476 |
|
477 error (msg); |
1
|
478 |
|
479 return retval; |
|
480 } |
|
481 |
|
482 /* |
|
483 * Evaluate text argument as octave source. |
|
484 */ |
|
485 tree_constant * |
164
|
486 builtin_eval (const tree_constant *args, int nargin, int nargout) |
1
|
487 { |
|
488 tree_constant *retval = NULL_TREE_CONST; |
181
|
489 |
1
|
490 if (nargin == 2) |
|
491 { |
|
492 int parse_status = 0; |
|
493 retval = new tree_constant [2]; |
|
494 retval[0] = eval_string (args[1], parse_status); |
|
495 } |
|
496 else |
181
|
497 print_usage ("eval"); |
|
498 |
1
|
499 return retval; |
|
500 } |
|
501 |
|
502 /* |
|
503 * Check if variable or file exists. |
|
504 */ |
|
505 tree_constant * |
164
|
506 builtin_exist (const tree_constant *args, int nargin, int nargout) |
1
|
507 { |
|
508 tree_constant *retval = NULL_TREE_CONST; |
181
|
509 |
1
|
510 if (nargin == 2 && args[1].is_string_type ()) |
|
511 { |
|
512 int status = identifier_exists (args[1].string_value ()); |
|
513 retval = new tree_constant [2]; |
|
514 retval[0] = tree_constant ((double) status); |
|
515 } |
|
516 else |
181
|
517 print_usage ("exist"); |
|
518 |
1
|
519 return retval; |
|
520 } |
|
521 |
|
522 /* |
|
523 * Matrix exponential. |
|
524 */ |
|
525 tree_constant * |
164
|
526 builtin_expm (const tree_constant *args, int nargin, int nargout) |
1
|
527 { |
|
528 tree_constant *retval = NULL_TREE_CONST; |
|
529 |
|
530 if (nargin == 2) |
51
|
531 DLD_BUILTIN (args, nargin, nargout, matrix_exp, |
|
532 { |
|
533 retval = new tree_constant [2]; |
|
534 retval[0] = matrix_exp (args[1]); |
|
535 }) |
1
|
536 else |
181
|
537 print_usage ("expm"); |
1
|
538 |
|
539 return retval; |
|
540 } |
|
541 |
|
542 /* |
|
543 * Identity matrix. |
|
544 */ |
|
545 tree_constant * |
164
|
546 builtin_eye (const tree_constant *args, int nargin, int nargout) |
1
|
547 { |
|
548 tree_constant *retval = NULL_TREE_CONST; |
|
549 |
|
550 switch (nargin) |
|
551 { |
|
552 case 2: |
|
553 retval = new tree_constant [2]; |
|
554 retval[0] = identity_matrix (args[1]); |
|
555 break; |
|
556 case 3: |
|
557 retval = new tree_constant [2]; |
|
558 retval[0] = identity_matrix (args[1], args[2]); |
|
559 break; |
|
560 default: |
181
|
561 print_usage ("eye"); |
1
|
562 break; |
|
563 } |
181
|
564 |
1
|
565 return retval; |
|
566 } |
|
567 |
|
568 /* |
|
569 * Closing a file |
|
570 */ |
|
571 tree_constant * |
164
|
572 builtin_fclose (const tree_constant *args, int nargin, int nargout) |
1
|
573 { |
|
574 tree_constant *retval = NULL_TREE_CONST; |
181
|
575 |
1
|
576 if (nargin != 2) |
181
|
577 print_usage ("fclose"); |
1
|
578 else |
|
579 retval = fclose_internal (args); |
181
|
580 |
1
|
581 return retval; |
|
582 } |
|
583 |
|
584 /* |
444
|
585 * Check file for EOF condition. |
|
586 */ |
|
587 tree_constant * |
|
588 builtin_feof (const tree_constant *args, int nargin, int nargout) |
|
589 { |
|
590 tree_constant *retval = NULL_TREE_CONST; |
|
591 |
|
592 if (nargin < 1) |
|
593 print_usage ("feof"); |
|
594 else |
|
595 retval = feof_internal (args, nargin, nargout); |
|
596 |
|
597 return retval; |
|
598 } |
|
599 |
|
600 /* |
|
601 * Check file for error condition. |
|
602 */ |
|
603 tree_constant * |
|
604 builtin_ferror (const tree_constant *args, int nargin, int nargout) |
|
605 { |
|
606 tree_constant *retval = NULL_TREE_CONST; |
|
607 |
|
608 if (nargin < 1) |
|
609 print_usage ("ferror"); |
|
610 else |
|
611 retval = ferror_internal (args, nargin, nargout); |
|
612 |
|
613 return retval; |
|
614 } |
|
615 |
|
616 /* |
1
|
617 * Evaluate first argument as a function. |
|
618 */ |
|
619 tree_constant * |
164
|
620 builtin_feval (const tree_constant *args, int nargin, int nargout) |
1
|
621 { |
|
622 tree_constant *retval = NULL_TREE_CONST; |
181
|
623 |
1
|
624 if (nargin > 1) |
|
625 retval = feval (args, nargin, nargout); |
|
626 else |
181
|
627 print_usage ("feval"); |
|
628 |
1
|
629 return retval; |
|
630 } |
|
631 |
|
632 /* |
444
|
633 * Flushing output to a file. |
1
|
634 */ |
|
635 tree_constant * |
164
|
636 builtin_fflush (const tree_constant *args, int nargin, int nargout) |
1
|
637 { |
|
638 tree_constant *retval = NULL_TREE_CONST; |
181
|
639 |
1
|
640 if (nargin != 2) |
181
|
641 print_usage ("fflush"); |
1
|
642 else |
|
643 retval = fflush_internal (args); |
181
|
644 |
1
|
645 return retval; |
|
646 } |
|
647 |
|
648 /* |
444
|
649 * Fast Fourier Transform. |
1
|
650 */ |
|
651 tree_constant * |
164
|
652 builtin_fft (const tree_constant *args, int nargin, int nargout) |
1
|
653 { |
|
654 tree_constant *retval = NULL_TREE_CONST; |
|
655 |
|
656 if (nargin == 2) |
|
657 DLD_BUILTIN (args, nargin, nargout, fft, |
|
658 { |
|
659 retval = new tree_constant [2]; |
|
660 retval[0] = fft (args[1]); |
|
661 }) |
|
662 else |
181
|
663 print_usage ("fft"); |
1
|
664 |
|
665 return retval; |
|
666 } |
|
667 |
|
668 /* |
444
|
669 * Get a string from a file. |
1
|
670 */ |
|
671 tree_constant * |
164
|
672 builtin_fgets (const tree_constant *args, int nargin, int nargout) |
1
|
673 { |
|
674 tree_constant *retval = NULL_TREE_CONST; |
181
|
675 |
1
|
676 if (nargin != 3 && nargout < 3) |
181
|
677 print_usage ("fgets"); |
1
|
678 else |
|
679 retval = fgets_internal (args, nargout); |
181
|
680 |
1
|
681 return retval; |
|
682 } |
|
683 |
|
684 /* |
|
685 * Find nonzero elements. This should probably only work if |
|
686 * do_fortran_indexing is true... |
|
687 */ |
|
688 tree_constant * |
164
|
689 builtin_find (const tree_constant *args, int nargin, int nargout) |
1
|
690 { |
|
691 tree_constant *retval = NULL_TREE_CONST; |
181
|
692 |
1
|
693 if (nargin == 2) |
|
694 { |
|
695 retval = new tree_constant [2]; |
|
696 retval[0] = find_nonzero_elem_idx (args[1]); |
|
697 } |
|
698 else |
181
|
699 print_usage ("find"); |
|
700 |
1
|
701 return retval; |
|
702 } |
|
703 |
|
704 /* |
|
705 * Don\'t really count floating point operations. |
|
706 */ |
|
707 tree_constant * |
164
|
708 builtin_flops (const tree_constant *args, int nargin, int nargout) |
1
|
709 { |
|
710 tree_constant *retval = NULL_TREE_CONST; |
181
|
711 |
1
|
712 if (nargin > 2) |
181
|
713 print_usage ("flops"); |
1
|
714 |
|
715 warning ("flops always returns zero"); |
181
|
716 |
1
|
717 retval = new tree_constant [2]; |
|
718 retval[0] = tree_constant (0.0); |
181
|
719 |
1
|
720 return retval; |
|
721 } |
|
722 |
|
723 /* |
|
724 * Opening a file. |
|
725 */ |
|
726 tree_constant * |
164
|
727 builtin_fopen (const tree_constant *args, int nargin, int nargout) |
1
|
728 { |
|
729 tree_constant *retval = NULL_TREE_CONST; |
181
|
730 |
1
|
731 if (nargin != 3) |
181
|
732 print_usage ("fopen"); |
1
|
733 else |
|
734 retval = fopen_internal (args); |
181
|
735 |
1
|
736 return retval; |
|
737 } |
|
738 |
|
739 /* |
|
740 * Formatted printing to a file. |
|
741 */ |
|
742 tree_constant * |
164
|
743 builtin_fprintf (const tree_constant *args, int nargin, int nargout) |
1
|
744 { |
|
745 tree_constant *retval = NULL_TREE_CONST; |
181
|
746 |
1
|
747 if (nargin < 3) |
181
|
748 print_usage ("fprintf"); |
1
|
749 else |
|
750 retval = do_printf ("fprintf", args, nargin, nargout); |
181
|
751 |
1
|
752 return retval; |
|
753 } |
|
754 |
|
755 /* |
444
|
756 * Read binary data from a file. |
|
757 */ |
|
758 tree_constant * |
|
759 builtin_fread (const tree_constant *args, int nargin, int nargout) |
|
760 { |
|
761 tree_constant *retval = NULL_TREE_CONST; |
|
762 |
|
763 if (nargin < 2) |
|
764 print_usage ("fread"); |
|
765 else |
|
766 retval = fread_internal (args, nargin, nargout); |
|
767 |
|
768 return retval; |
|
769 } |
|
770 |
|
771 /* |
|
772 * Rewind a file. |
1
|
773 */ |
|
774 tree_constant * |
164
|
775 builtin_frewind (const tree_constant *args, int nargin, int nargout) |
1
|
776 { |
|
777 tree_constant *retval = NULL_TREE_CONST; |
181
|
778 |
1
|
779 if (nargin != 2) |
181
|
780 print_usage ("frewind"); |
1
|
781 else |
|
782 retval = frewind_internal (args); |
181
|
783 |
1
|
784 return retval; |
|
785 } |
|
786 |
|
787 /* |
444
|
788 * Report on open files. |
1
|
789 */ |
|
790 tree_constant * |
164
|
791 builtin_freport (const tree_constant *args, int nargin, int nargout) |
1
|
792 { |
|
793 tree_constant *retval = NULL_TREE_CONST; |
181
|
794 |
1
|
795 if (nargin > 1) |
181
|
796 warning ("freport: ignoring extra arguments"); |
|
797 |
1
|
798 retval = freport_internal (); |
181
|
799 |
1
|
800 return retval; |
|
801 } |
|
802 |
|
803 /* |
|
804 * Formatted reading from a file. |
|
805 */ |
|
806 tree_constant * |
164
|
807 builtin_fscanf (const tree_constant *args, int nargin, int nargout) |
1
|
808 { |
|
809 tree_constant *retval = NULL_TREE_CONST; |
181
|
810 |
1
|
811 if (nargin != 2 && nargin != 3) |
181
|
812 print_usage ("fscanf"); |
1
|
813 else |
|
814 retval = do_scanf ("fscanf", args, nargin, nargout); |
181
|
815 |
1
|
816 return retval; |
|
817 } |
|
818 |
|
819 /* |
444
|
820 * Seek a point in a file for reading and/or writing. |
1
|
821 */ |
|
822 tree_constant * |
164
|
823 builtin_fseek (const tree_constant *args, int nargin, int nargout) |
1
|
824 { |
|
825 tree_constant *retval = NULL_TREE_CONST; |
181
|
826 |
1
|
827 if (nargin != 3 && nargin != 4) |
181
|
828 print_usage ("fseek"); |
1
|
829 else |
|
830 retval = fseek_internal (args, nargin); |
181
|
831 |
1
|
832 return retval; |
|
833 } |
|
834 |
|
835 /* |
|
836 * Nonlinear algebraic equations. |
|
837 */ |
|
838 tree_constant * |
164
|
839 builtin_fsolve (const tree_constant *args, int nargin, int nargout) |
1
|
840 { |
|
841 tree_constant *retval = NULL_TREE_CONST; |
|
842 |
|
843 if (nargin >= 3 && nargin <= 7 && nargout >= 1 && nargout <= 3) |
|
844 DLD_BUILTIN (args, nargin, nargout, fsolve, |
|
845 retval = fsolve (args, nargin, nargout);) |
|
846 else |
181
|
847 print_usage ("fsolve"); |
1
|
848 |
|
849 return retval; |
|
850 } |
|
851 |
272
|
852 tree_constant * |
|
853 builtin_fsolve_options (const tree_constant *args, int nargin, int nargout) |
|
854 { |
|
855 tree_constant *retval = NULL_TREE_CONST; |
|
856 |
289
|
857 DLD_BUILTIN (args, nargin, nargout, fsolve_options, |
|
858 retval = fsolve_options (args, nargin, nargout);) |
272
|
859 |
|
860 return retval; |
|
861 } |
|
862 |
1
|
863 /* |
|
864 * NLPs. |
|
865 */ |
|
866 tree_constant * |
164
|
867 builtin_fsqp (const tree_constant *args, int nargin, int nargout) |
1
|
868 { |
|
869 tree_constant *retval = NULL_TREE_CONST; |
|
870 |
|
871 #if defined (FSQP_MISSING) |
282
|
872 print_usage ("fsqp"); |
1
|
873 #else |
|
874 if ((nargin == 3 || nargin == 5 || nargin == 6 || nargin == 8 |
|
875 || nargin == 9 || nargin == 11) |
|
876 && (nargout >= 1 && nargout <= 3)) |
|
877 DLD_BUILTIN (args, nargin, nargout, fsqp, |
|
878 retval = fsqp (args, nargin, nargout);) |
|
879 else |
181
|
880 print_usage ("fsolve"); |
1
|
881 #endif |
|
882 |
|
883 return retval; |
|
884 } |
|
885 |
272
|
886 tree_constant * |
|
887 builtin_fsqp_options (const tree_constant *args, int nargin, int nargout) |
|
888 { |
|
889 tree_constant *retval = NULL_TREE_CONST; |
|
890 |
282
|
891 #if defined (FSQP_MISSING) |
|
892 print_usage ("fsqp_options"); |
|
893 #else |
|
894 DLD_BUILTIN (args, nargin, nargout, fsqp_options, |
|
895 retval = fsqp_options (args, nargin, nargout);) |
|
896 #endif |
272
|
897 |
|
898 return retval; |
|
899 } |
|
900 |
1
|
901 /* |
444
|
902 * Tell current position of file. |
1
|
903 */ |
|
904 tree_constant * |
164
|
905 builtin_ftell (const tree_constant *args, int nargin, int nargout) |
1
|
906 { |
|
907 tree_constant *retval = NULL_TREE_CONST; |
181
|
908 |
1
|
909 if (nargin != 2) |
181
|
910 print_usage ("ftell"); |
1
|
911 else |
|
912 retval = ftell_internal (args); |
181
|
913 |
1
|
914 return retval; |
|
915 } |
|
916 |
|
917 /* |
444
|
918 * Write binary data to a file. |
|
919 */ |
|
920 tree_constant * |
|
921 builtin_fwrite (const tree_constant *args, int nargin, int nargout) |
|
922 { |
|
923 tree_constant *retval = NULL_TREE_CONST; |
|
924 |
|
925 if (nargin < 3) |
|
926 print_usage ("fwrite"); |
|
927 else |
|
928 retval = fwrite_internal (args, nargin, nargout); |
|
929 |
|
930 return retval; |
|
931 } |
|
932 |
|
933 /* |
1
|
934 * Get the value of an environment variable. |
|
935 */ |
|
936 tree_constant * |
164
|
937 builtin_getenv (const tree_constant *args, int nargin, int nargout) |
1
|
938 { |
|
939 tree_constant *retval = NULL_TREE_CONST; |
181
|
940 |
1
|
941 if (nargin == 2 && args[1].is_string_type ()) |
|
942 { |
|
943 retval = new tree_constant [2]; |
|
944 char *value = getenv (args[1].string_value ()); |
|
945 if (value != (char *) NULL) |
|
946 retval[0] = tree_constant (value); |
|
947 else |
|
948 retval[0] = tree_constant (""); |
|
949 } |
|
950 else |
181
|
951 print_usage ("getenv"); |
|
952 |
1
|
953 return retval; |
|
954 } |
|
955 |
|
956 /* |
444
|
957 * Inverse Fast Fourier Transform. |
1
|
958 */ |
|
959 tree_constant * |
164
|
960 builtin_ifft (const tree_constant *args, int nargin, int nargout) |
1
|
961 { |
|
962 tree_constant *retval = NULL_TREE_CONST; |
|
963 |
|
964 if (nargin == 2) |
|
965 DLD_BUILTIN (args, nargin, nargout, ifft, |
|
966 { |
|
967 retval = new tree_constant [2]; |
|
968 retval[0] = ifft (args[1]); |
|
969 }) |
|
970 else |
181
|
971 print_usage ("ifft"); |
1
|
972 |
|
973 return retval; |
|
974 } |
|
975 |
|
976 /* |
|
977 * Inverse of a square matrix. |
|
978 */ |
|
979 tree_constant * |
164
|
980 builtin_inv (const tree_constant *args, int nargin, int nargout) |
1
|
981 { |
|
982 tree_constant *retval = NULL_TREE_CONST; |
|
983 |
|
984 if (nargin == 2) |
|
985 DLD_BUILTIN (args, nargin, nargout, inv, |
|
986 { |
|
987 retval = new tree_constant [2]; |
|
988 retval[0] = inverse (args[1]); |
|
989 }) |
|
990 else |
181
|
991 print_usage ("inv"); |
1
|
992 |
|
993 return retval; |
|
994 } |
|
995 |
|
996 /* |
|
997 * Prompt user for input. |
|
998 */ |
|
999 tree_constant * |
164
|
1000 builtin_input (const tree_constant *args, int nargin, int nargout) |
1
|
1001 { |
|
1002 tree_constant *retval = NULL_TREE_CONST; |
|
1003 |
|
1004 if (nargin == 2 || nargin == 3) |
|
1005 { |
|
1006 retval = new tree_constant [2]; |
|
1007 retval[0] = get_user_input (args, nargin, nargout); |
|
1008 } |
|
1009 else |
181
|
1010 print_usage ("input"); |
1
|
1011 |
|
1012 return retval; |
|
1013 } |
|
1014 |
|
1015 /* |
195
|
1016 * Does the given string name a global variable? |
|
1017 */ |
|
1018 tree_constant * |
|
1019 builtin_is_global (const tree_constant *args, int nargin, int nargout) |
|
1020 { |
|
1021 tree_constant *retval = new tree_constant [2]; |
|
1022 retval[0] = tree_constant (0.0); |
|
1023 |
|
1024 if (nargin == 2 && args[1].is_string_type ()) |
|
1025 { |
|
1026 char *name = args[1].string_value (); |
|
1027 if (is_globally_visible (name)) |
|
1028 retval[0] = tree_constant (1.0); |
|
1029 } |
|
1030 else |
|
1031 print_usage ("is_global"); |
|
1032 |
|
1033 return retval; |
|
1034 } |
|
1035 |
|
1036 /* |
1
|
1037 * Is the argument a string? |
|
1038 */ |
|
1039 tree_constant * |
164
|
1040 builtin_isstr (const tree_constant *args, int nargin, int nargout) |
1
|
1041 { |
|
1042 tree_constant *retval = NULL_TREE_CONST; |
181
|
1043 |
1
|
1044 if (nargin != 2) |
181
|
1045 print_usage ("isstr"); |
1
|
1046 else |
|
1047 { |
|
1048 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
1049 { |
|
1050 retval = new tree_constant [2]; |
|
1051 retval[0] = args[1].isstr (); |
|
1052 } |
|
1053 } |
181
|
1054 |
1
|
1055 return retval; |
|
1056 } |
|
1057 |
|
1058 /* |
|
1059 * Maybe help in debugging. |
|
1060 */ |
|
1061 tree_constant * |
164
|
1062 builtin_keyboard (const tree_constant *args, int nargin, int nargout) |
1
|
1063 { |
|
1064 tree_constant *retval = NULL_TREE_CONST; |
|
1065 |
|
1066 if (nargin == 1 || nargin == 2) |
|
1067 { |
|
1068 retval = new tree_constant [2]; |
|
1069 retval[0] = get_user_input (args, nargin, nargout, 1); |
|
1070 } |
|
1071 else |
181
|
1072 print_usage ("keyboard"); |
1
|
1073 |
|
1074 return retval; |
|
1075 } |
|
1076 |
|
1077 /* |
|
1078 * Matrix logarithm. |
|
1079 */ |
|
1080 tree_constant * |
164
|
1081 builtin_logm (const tree_constant *args, int nargin, int nargout) |
1
|
1082 { |
|
1083 tree_constant *retval = NULL_TREE_CONST; |
|
1084 |
|
1085 if (nargin == 2) |
|
1086 retval = matrix_log (args[1]); |
|
1087 else |
181
|
1088 print_usage ("logm"); |
1
|
1089 |
|
1090 return retval; |
|
1091 } |
|
1092 |
|
1093 /* |
|
1094 * LPs. |
|
1095 */ |
|
1096 tree_constant * |
164
|
1097 builtin_lpsolve (const tree_constant *args, int nargin, int nargout) |
1
|
1098 { |
|
1099 tree_constant *retval = NULL_TREE_CONST; |
|
1100 |
|
1101 // Force a bad value of inform, and empty matrices for x and phi. |
|
1102 retval = new tree_constant [4]; |
|
1103 Matrix m; |
|
1104 retval[0] = tree_constant (m); |
|
1105 retval[1] = tree_constant (m); |
|
1106 retval[2] = tree_constant (-1.0); |
|
1107 |
|
1108 if (nargin == 0) |
|
1109 DLD_BUILTIN (args, nargin, nargout, lpsolve, |
|
1110 retval = lpsolve (args, nargin, nargout);) |
|
1111 else |
181
|
1112 print_usage ("lp_solve"); |
1
|
1113 |
|
1114 return retval; |
|
1115 } |
|
1116 |
272
|
1117 tree_constant * |
|
1118 builtin_lpsolve_options (const tree_constant *args, int nargin, int nargout) |
|
1119 { |
|
1120 tree_constant *retval = NULL_TREE_CONST; |
|
1121 |
289
|
1122 DLD_BUILTIN (args, nargin, nargout, lpsolve_options, |
|
1123 retval = lpsolve_options (args, nargin, nargout);) |
272
|
1124 |
|
1125 return retval; |
|
1126 } |
|
1127 |
1
|
1128 /* |
|
1129 * ODEs. |
|
1130 */ |
|
1131 tree_constant * |
164
|
1132 builtin_lsode (const tree_constant *args, int nargin, int nargout) |
1
|
1133 { |
|
1134 tree_constant *retval = NULL_TREE_CONST; |
|
1135 |
|
1136 if ((nargin == 4 || nargin == 5) && nargout == 1) |
|
1137 DLD_BUILTIN (args, nargin, nargout, lsode, |
|
1138 retval = lsode (args, nargin, nargout);) |
|
1139 else |
181
|
1140 print_usage ("lsode"); |
1
|
1141 |
|
1142 return retval; |
|
1143 } |
|
1144 |
272
|
1145 tree_constant * |
|
1146 builtin_lsode_options (const tree_constant *args, int nargin, int nargout) |
|
1147 { |
|
1148 tree_constant *retval = NULL_TREE_CONST; |
|
1149 |
289
|
1150 DLD_BUILTIN (args, nargin, nargout, lsode_options, |
|
1151 retval = lsode_options (args, nargin, nargout);) |
272
|
1152 |
|
1153 return retval; |
|
1154 } |
|
1155 |
1
|
1156 /* |
|
1157 * LU factorization. |
|
1158 */ |
|
1159 tree_constant * |
164
|
1160 builtin_lu (const tree_constant *args, int nargin, int nargout) |
1
|
1161 { |
|
1162 tree_constant *retval = NULL_TREE_CONST; |
|
1163 |
|
1164 if (nargin == 2 && nargout < 4) |
|
1165 DLD_BUILTIN (args, nargin, nargout, lu, |
|
1166 retval = lu (args[1], nargout);) |
|
1167 else |
181
|
1168 print_usage ("lu"); |
1
|
1169 |
|
1170 return retval; |
|
1171 } |
|
1172 |
|
1173 /* |
|
1174 * Max values. |
|
1175 */ |
|
1176 tree_constant * |
164
|
1177 builtin_max (const tree_constant *args, int nargin, int nargout) |
1
|
1178 { |
|
1179 tree_constant *retval = NULL_TREE_CONST; |
|
1180 |
|
1181 if ((nargin == 2 && (nargout == 1 || nargout == 2)) |
|
1182 || (nargin == 3 && nargout == 1)) |
|
1183 retval = column_max (args, nargin, nargout); |
|
1184 else |
181
|
1185 print_usage ("max"); |
1
|
1186 |
|
1187 return retval; |
|
1188 } |
|
1189 |
|
1190 /* |
|
1191 * Min values. |
|
1192 */ |
|
1193 tree_constant * |
164
|
1194 builtin_min (const tree_constant *args, int nargin, int nargout) |
1
|
1195 { |
|
1196 tree_constant *retval = NULL_TREE_CONST; |
|
1197 |
|
1198 if ((nargin == 2 && (nargout == 1 || nargout == 2)) |
|
1199 || (nargin == 3 && nargout == 1)) |
|
1200 retval = column_min (args, nargin, nargout); |
|
1201 else |
181
|
1202 print_usage ("min"); |
1
|
1203 |
|
1204 return retval; |
|
1205 } |
|
1206 |
|
1207 /* |
|
1208 * NLPs. |
|
1209 */ |
|
1210 tree_constant * |
164
|
1211 builtin_npsol (const tree_constant *args, int nargin, int nargout) |
1
|
1212 { |
|
1213 tree_constant *retval = NULL_TREE_CONST; |
|
1214 |
|
1215 #if defined (NPSOL_MISSING) |
|
1216 // Force a bad value of inform, and empty matrices for x, phi, and lambda. |
|
1217 retval = new tree_constant [4]; |
|
1218 Matrix m; |
|
1219 retval[0] = tree_constant (m); |
|
1220 retval[1] = tree_constant (m); |
|
1221 retval[2] = tree_constant (-1.0); |
|
1222 retval[3] = tree_constant (m); |
181
|
1223 print_usage ("npsol"); |
1
|
1224 #else |
|
1225 if ((nargin == 3 || nargin == 5 || nargin == 6 || nargin == 8 |
|
1226 || nargin == 9 || nargin == 11) |
|
1227 && (nargout >= 1 && nargout <= 4)) |
|
1228 DLD_BUILTIN (args, nargin, nargout, npsol, |
|
1229 retval = npsol (args, nargin, nargout);) |
|
1230 else |
181
|
1231 print_usage ("npsol"); |
1
|
1232 #endif |
|
1233 |
|
1234 return retval; |
|
1235 } |
|
1236 |
272
|
1237 tree_constant * |
|
1238 builtin_npsol_options (const tree_constant *args, int nargin, int nargout) |
|
1239 { |
|
1240 tree_constant *retval = NULL_TREE_CONST; |
|
1241 |
282
|
1242 #if defined (NPSOL_MISSING) |
|
1243 print_usage ("npsol_options"); |
|
1244 #else |
|
1245 DLD_BUILTIN (args, nargin, nargout, npsol_options, |
|
1246 retval = npsol_options (args, nargin, nargout);) |
|
1247 #endif |
272
|
1248 |
|
1249 return retval; |
|
1250 } |
|
1251 |
1
|
1252 /* |
|
1253 * A matrix of ones. |
|
1254 */ |
|
1255 tree_constant * |
164
|
1256 builtin_ones (const tree_constant *args, int nargin, int nargout) |
1
|
1257 { |
|
1258 tree_constant *retval = NULL_TREE_CONST; |
|
1259 |
|
1260 switch (nargin) |
|
1261 { |
|
1262 case 2: |
|
1263 retval = new tree_constant [2]; |
|
1264 retval[0] = fill_matrix (args[1], 1.0, "ones"); |
|
1265 break; |
|
1266 case 3: |
|
1267 retval = new tree_constant [2]; |
|
1268 retval[0] = fill_matrix (args[1], args[2], 1.0, "ones"); |
|
1269 break; |
|
1270 default: |
181
|
1271 print_usage ("ones"); |
1
|
1272 break; |
|
1273 } |
181
|
1274 |
1
|
1275 return retval; |
|
1276 } |
|
1277 |
|
1278 /* |
|
1279 * You guessed it. |
|
1280 */ |
|
1281 tree_constant * |
164
|
1282 builtin_pause (const tree_constant *args, int nargin, int nargout) |
1
|
1283 { |
|
1284 if (! (nargin == 1 || nargin == 2)) |
|
1285 { |
181
|
1286 print_usage ("pause"); |
1
|
1287 return NULL_TREE_CONST; |
|
1288 } |
|
1289 |
|
1290 if (interactive) |
|
1291 { |
|
1292 if (nargin == 2) |
|
1293 sleep (NINT (args[1].double_value ())); |
|
1294 else if (kbhit () == EOF) |
|
1295 clean_up_and_exit (0); |
|
1296 } |
181
|
1297 |
1
|
1298 return NULL_TREE_CONST; |
|
1299 } |
|
1300 |
|
1301 /* |
|
1302 * Delete turds from /tmp. |
|
1303 */ |
|
1304 tree_constant * |
164
|
1305 builtin_purge_tmp_files (const tree_constant *, int, int) |
1
|
1306 { |
|
1307 cleanup_tmp_files (); |
|
1308 return NULL_TREE_CONST; |
|
1309 } |
|
1310 |
|
1311 /* |
|
1312 * Formatted printing. |
|
1313 */ |
|
1314 tree_constant * |
164
|
1315 builtin_printf (const tree_constant *args, int nargin, int nargout) |
1
|
1316 { |
|
1317 tree_constant *retval = NULL_TREE_CONST; |
181
|
1318 |
1
|
1319 if (nargin < 2) |
181
|
1320 print_usage ("printf"); |
1
|
1321 else |
|
1322 retval = do_printf ("printf", args, nargin, nargout); |
181
|
1323 |
1
|
1324 return retval; |
|
1325 } |
|
1326 |
|
1327 /* |
|
1328 * Product. |
|
1329 */ |
|
1330 tree_constant * |
164
|
1331 builtin_prod (const tree_constant *args, int nargin, int nargout) |
1
|
1332 { |
|
1333 tree_constant *retval = NULL_TREE_CONST; |
181
|
1334 |
1
|
1335 if (nargin != 2) |
181
|
1336 print_usage ("prod"); |
1
|
1337 else |
|
1338 { |
|
1339 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
1340 { |
|
1341 retval = new tree_constant [2]; |
|
1342 retval[0] = args[1].prod (); |
|
1343 } |
|
1344 } |
181
|
1345 |
1
|
1346 return retval; |
|
1347 } |
|
1348 |
|
1349 /* |
|
1350 * Print name of current working directory. |
|
1351 */ |
|
1352 tree_constant * |
164
|
1353 builtin_pwd (const tree_constant *args, int nargin, int nargout) |
1
|
1354 { |
|
1355 tree_constant *retval = NULL_TREE_CONST; |
|
1356 char *directory; |
|
1357 |
|
1358 if (verbatim_pwd) |
|
1359 { |
|
1360 char *buffer = new char [MAXPATHLEN]; |
|
1361 directory = getcwd (buffer, MAXPATHLEN); |
|
1362 |
|
1363 if (!directory) |
|
1364 { |
217
|
1365 warning ("pwd: can't find working directory!"); |
1
|
1366 delete buffer; |
|
1367 } |
|
1368 } |
|
1369 else |
|
1370 { |
|
1371 directory = get_working_directory ("pwd"); |
|
1372 } |
|
1373 |
|
1374 if (directory) |
|
1375 { |
|
1376 char *s = strconcat (directory, "\n"); |
|
1377 retval = new tree_constant [2]; |
|
1378 retval[0] = tree_constant (s); |
|
1379 delete [] s; |
|
1380 } |
|
1381 return retval; |
|
1382 } |
|
1383 |
|
1384 /* |
|
1385 * QPs. |
|
1386 */ |
|
1387 tree_constant * |
164
|
1388 builtin_qpsol (const tree_constant *args, int nargin, int nargout) |
1
|
1389 { |
|
1390 tree_constant *retval = NULL_TREE_CONST; |
|
1391 |
|
1392 #if defined (QPSOL_MISSING) |
|
1393 // Force a bad value of inform, and empty matrices for x, phi, and lambda. |
|
1394 retval = new tree_constant [5]; |
|
1395 Matrix m; |
|
1396 retval[0] = tree_constant (m); |
|
1397 retval[1] = tree_constant (m); |
|
1398 retval[2] = tree_constant (-1.0); |
|
1399 retval[3] = tree_constant (m); |
181
|
1400 print_usage ("qpsol"); |
1
|
1401 #else |
|
1402 if ((nargin == 4 || nargin == 6 || nargin == 7 || nargin == 9) |
|
1403 && (nargout >= 1 && nargout <= 4)) |
|
1404 DLD_BUILTIN (args, nargin, nargout, qpsol, |
|
1405 retval = qpsol (args, nargin, nargout);) |
|
1406 else |
181
|
1407 print_usage ("qpsol"); |
1
|
1408 #endif |
|
1409 |
|
1410 return retval; |
|
1411 } |
|
1412 |
272
|
1413 tree_constant * |
|
1414 builtin_qpsol_options (const tree_constant *args, int nargin, int nargout) |
|
1415 { |
|
1416 tree_constant *retval = NULL_TREE_CONST; |
|
1417 |
282
|
1418 #if defined (QPSOL_MISSING) |
|
1419 print_usage ("qpsol"); |
|
1420 #else |
|
1421 DLD_BUILTIN (args, nargin, nargout, qpsol_options, |
|
1422 retval = qpsol_options (args, nargin, nargout);) |
|
1423 #endif |
272
|
1424 |
|
1425 return retval; |
|
1426 } |
|
1427 |
1
|
1428 /* |
|
1429 * QR factorization. |
|
1430 */ |
|
1431 tree_constant * |
164
|
1432 builtin_qr (const tree_constant *args, int nargin, int nargout) |
1
|
1433 { |
|
1434 tree_constant *retval = NULL_TREE_CONST; |
|
1435 |
|
1436 if (nargin == 2 && nargout < 3) |
|
1437 DLD_BUILTIN (args, nargin, nargout, qr, |
|
1438 retval = qr (args[1], nargout);) |
|
1439 else |
181
|
1440 print_usage ("qr"); |
1
|
1441 |
|
1442 return retval; |
|
1443 } |
|
1444 |
|
1445 /* |
45
|
1446 * generalized eigenvalues via qz |
|
1447 */ |
|
1448 tree_constant * |
164
|
1449 builtin_qzval (const tree_constant *args, int nargin, int nargout) |
45
|
1450 { |
|
1451 tree_constant *retval = NULL_TREE_CONST; |
|
1452 |
|
1453 if (nargin == 3 && nargout < 2) |
|
1454 DLD_BUILTIN (args, nargin, nargout, qzvalue, |
|
1455 retval = qzvalue (args, nargin, nargout);) |
|
1456 else |
181
|
1457 print_usage ("qzval"); |
45
|
1458 |
|
1459 return retval; |
|
1460 } |
|
1461 |
|
1462 /* |
1
|
1463 * Random numbers. |
|
1464 */ |
|
1465 tree_constant * |
164
|
1466 builtin_quad (const tree_constant *args, int nargin, int nargout) |
1
|
1467 { |
|
1468 tree_constant *retval = NULL_TREE_CONST; |
|
1469 |
|
1470 if ((nargin > 3 && nargin < 7) && (nargout > 0 && nargout < 5)) |
|
1471 DLD_BUILTIN (args, nargin, nargout, quad, |
|
1472 retval = do_quad (args, nargin, nargout);) |
|
1473 else |
181
|
1474 print_usage ("quad"); |
1
|
1475 |
|
1476 return retval; |
|
1477 } |
|
1478 |
272
|
1479 tree_constant * |
|
1480 builtin_quad_options (const tree_constant *args, int nargin, int nargout) |
|
1481 { |
|
1482 tree_constant *retval = NULL_TREE_CONST; |
|
1483 |
289
|
1484 DLD_BUILTIN (args, nargin, nargout, quad_options, |
|
1485 retval = quad_options (args, nargin, nargout);) |
272
|
1486 |
|
1487 return retval; |
|
1488 } |
|
1489 |
1
|
1490 /* |
|
1491 * I'm outta here. |
|
1492 */ |
|
1493 tree_constant * |
164
|
1494 builtin_quit (const tree_constant *args, int nargin, int nargout) |
1
|
1495 { |
|
1496 quitting_gracefully = 1; |
|
1497 clean_up_and_exit (0); |
|
1498 return NULL_TREE_CONST; |
|
1499 } |
|
1500 |
|
1501 /* |
|
1502 * Random numbers. |
|
1503 */ |
|
1504 tree_constant * |
164
|
1505 builtin_rand (const tree_constant *args, int nargin, int nargout) |
1
|
1506 { |
|
1507 tree_constant *retval = NULL_TREE_CONST; |
|
1508 |
|
1509 if ((nargin > 0 && nargin < 4) && nargout == 1) |
|
1510 DLD_BUILTIN (args, nargin, nargout, rand, |
|
1511 retval = rand_internal (args, nargin, nargout);) |
|
1512 else |
181
|
1513 print_usage ("rand"); |
1
|
1514 |
|
1515 return retval; |
|
1516 } |
|
1517 |
|
1518 /* |
|
1519 * Replot current plot. |
|
1520 */ |
|
1521 tree_constant * |
164
|
1522 builtin_replot (const tree_constant *args, int nargin, int nargout) |
1
|
1523 { |
|
1524 tree_constant *retval = NULL_TREE_CONST; |
|
1525 |
|
1526 if (nargin > 1) |
|
1527 warning ("replot: ignoring extra arguments"); |
|
1528 |
|
1529 send_to_plot_stream ("replot\n"); |
|
1530 |
|
1531 return retval; |
|
1532 } |
|
1533 |
|
1534 /* |
|
1535 * Formatted reading. |
|
1536 */ |
|
1537 tree_constant * |
164
|
1538 builtin_scanf (const tree_constant *args, int nargin, int nargout) |
1
|
1539 { |
|
1540 tree_constant *retval = NULL_TREE_CONST; |
181
|
1541 |
1
|
1542 if (nargin != 2) |
181
|
1543 print_usage ("scanf"); |
1
|
1544 else |
|
1545 retval = do_scanf ("scanf", args, nargin, nargout); |
181
|
1546 |
1
|
1547 return retval; |
|
1548 } |
|
1549 |
|
1550 /* |
|
1551 * Convert a vector to a string. |
|
1552 */ |
|
1553 tree_constant * |
|
1554 builtin_setstr (tree_constant *args, int nargin, int nargout) |
|
1555 { |
|
1556 tree_constant *retval = NULL_TREE_CONST; |
|
1557 |
|
1558 if (nargin == 2) |
|
1559 { |
|
1560 retval = new tree_constant [2]; |
|
1561 retval[0] = args[1].convert_to_str (); |
|
1562 } |
|
1563 else |
181
|
1564 print_usage ("setstr"); |
1
|
1565 |
|
1566 return retval; |
|
1567 } |
|
1568 |
|
1569 /* |
|
1570 * Execute a shell command. |
|
1571 */ |
|
1572 tree_constant * |
164
|
1573 builtin_shell_command (const tree_constant *args, int nargin, int nargout) |
1
|
1574 { |
|
1575 tree_constant *retval = NULL_TREE_CONST; |
|
1576 |
|
1577 if (nargin == 2 || nargin == 3) |
|
1578 { |
|
1579 if (args[1].is_string_type ()) |
|
1580 { |
|
1581 iprocstream cmd (args[1].string_value ()); |
|
1582 char ch; |
|
1583 ostrstream output_buf; |
|
1584 while (cmd.get (ch)) |
|
1585 output_buf.put (ch); |
|
1586 |
|
1587 output_buf << ends; |
|
1588 if (nargin == 2) |
|
1589 { |
|
1590 maybe_page_output (output_buf); |
|
1591 } |
|
1592 else |
|
1593 { |
|
1594 retval = new tree_constant [2]; |
|
1595 retval[0] = tree_constant (output_buf.str ()); |
|
1596 } |
|
1597 } |
|
1598 else |
|
1599 error ("shell_cmd: first argument must be a string"); |
|
1600 } |
|
1601 else |
181
|
1602 print_usage ("shell_cmd"); |
1
|
1603 |
|
1604 return retval; |
|
1605 } |
|
1606 |
|
1607 /* |
|
1608 * Report rows and columns. |
|
1609 */ |
|
1610 tree_constant * |
164
|
1611 builtin_size (const tree_constant *args, int nargin, int nargout) |
1
|
1612 { |
|
1613 tree_constant *retval = NULL_TREE_CONST; |
|
1614 |
|
1615 if (nargin != 2) |
181
|
1616 print_usage ("size"); |
1
|
1617 else |
|
1618 { |
|
1619 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
1620 { |
|
1621 int nr = args[1].rows (); |
|
1622 int nc = args[1].columns (); |
|
1623 if (nargout == 1) |
|
1624 { |
|
1625 Matrix m (1, 2); |
|
1626 m.elem (0, 0) = nr; |
|
1627 m.elem (0, 1) = nc; |
|
1628 retval = new tree_constant [2]; |
|
1629 retval[0] = tree_constant (m); |
|
1630 } |
|
1631 else if (nargout == 2) |
|
1632 { |
|
1633 retval = new tree_constant [3]; |
|
1634 retval[0] = tree_constant ((double) nr); |
|
1635 retval[1] = tree_constant ((double) nc); |
|
1636 } |
|
1637 else |
181
|
1638 print_usage ("size"); |
1
|
1639 } |
|
1640 } |
181
|
1641 |
1
|
1642 return retval; |
|
1643 } |
|
1644 |
|
1645 /* |
|
1646 * Sort columns. |
|
1647 */ |
|
1648 tree_constant * |
164
|
1649 builtin_sort (const tree_constant *args, int nargin, int nargout) |
1
|
1650 { |
|
1651 tree_constant *retval = NULL_TREE_CONST; |
|
1652 |
|
1653 if (nargin == 2) |
|
1654 retval = sort (args, nargin, nargout); |
|
1655 else |
181
|
1656 print_usage ("sort"); |
1
|
1657 |
|
1658 return retval; |
|
1659 } |
|
1660 |
|
1661 /* |
|
1662 * Formatted printing to a string. |
|
1663 */ |
|
1664 tree_constant * |
164
|
1665 builtin_sprintf (const tree_constant *args, int nargin, int nargout) |
1
|
1666 { |
|
1667 tree_constant *retval = NULL_TREE_CONST; |
181
|
1668 |
1
|
1669 if (nargin < 2) |
181
|
1670 print_usage ("sprintf"); |
1
|
1671 else |
|
1672 retval = do_printf ("sprintf", args, nargin, nargout); |
181
|
1673 |
1
|
1674 return retval; |
|
1675 } |
|
1676 |
|
1677 /* |
|
1678 * Matrix sqrt. |
|
1679 */ |
|
1680 tree_constant * |
164
|
1681 builtin_sqrtm (const tree_constant *args, int nargin, int nargout) |
1
|
1682 { |
|
1683 tree_constant *retval = NULL_TREE_CONST; |
|
1684 |
|
1685 if (nargin == 2) |
|
1686 retval = matrix_sqrt (args[1]); |
|
1687 else |
181
|
1688 print_usage ("sqrtm"); |
1
|
1689 |
|
1690 return retval; |
|
1691 } |
|
1692 |
|
1693 /* |
|
1694 * Formatted reading from a string. |
|
1695 */ |
|
1696 tree_constant * |
164
|
1697 builtin_sscanf (const tree_constant *args, int nargin, int nargout) |
1
|
1698 { |
|
1699 tree_constant *retval = NULL_TREE_CONST; |
181
|
1700 |
1
|
1701 if (nargin != 3) |
181
|
1702 print_usage ("sscanf"); |
1
|
1703 else |
|
1704 retval = do_scanf ("sscanf", args, nargin, nargout); |
181
|
1705 |
1
|
1706 return retval; |
|
1707 } |
|
1708 |
|
1709 /* |
|
1710 * Sum. |
|
1711 */ |
|
1712 tree_constant * |
164
|
1713 builtin_sum (const tree_constant *args, int nargin, int nargout) |
1
|
1714 { |
|
1715 tree_constant *retval = NULL_TREE_CONST; |
181
|
1716 |
1
|
1717 if (nargin != 2) |
181
|
1718 print_usage ("sum"); |
1
|
1719 else |
|
1720 { |
|
1721 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
1722 { |
|
1723 retval = new tree_constant [2]; |
|
1724 retval[0] = args[1].sum (); |
|
1725 } |
|
1726 } |
181
|
1727 |
1
|
1728 return retval; |
|
1729 } |
|
1730 |
|
1731 /* |
|
1732 * Sum of squares. |
|
1733 */ |
|
1734 tree_constant * |
164
|
1735 builtin_sumsq (const tree_constant *args, int nargin, int nargout) |
1
|
1736 { |
|
1737 tree_constant *retval = NULL_TREE_CONST; |
181
|
1738 |
1
|
1739 if (nargin != 2) |
181
|
1740 print_usage ("sumsq"); |
1
|
1741 else |
|
1742 { |
|
1743 if (args != NULL_TREE_CONST && args[1].is_defined ()) |
|
1744 { |
|
1745 retval = new tree_constant [2]; |
|
1746 retval[0] = args[1].sumsq (); |
|
1747 } |
|
1748 } |
181
|
1749 |
1
|
1750 return retval; |
|
1751 } |
|
1752 |
|
1753 /* |
|
1754 * Singluar value decomposition. |
|
1755 */ |
|
1756 tree_constant * |
164
|
1757 builtin_svd (const tree_constant *args, int nargin, int nargout) |
1
|
1758 { |
|
1759 tree_constant *retval = NULL_TREE_CONST; |
|
1760 |
|
1761 if (nargin == 2 && (nargout == 1 || nargout == 3)) |
|
1762 DLD_BUILTIN (args, nargin, nargout, svd, |
|
1763 retval = svd (args, nargin, nargout);) |
|
1764 else |
181
|
1765 print_usage ("svd"); |
1
|
1766 |
|
1767 return retval; |
|
1768 } |
|
1769 |
|
1770 /* |
38
|
1771 * Sylvester equation solver. |
|
1772 */ |
|
1773 tree_constant * |
164
|
1774 builtin_syl (const tree_constant *args, int nargin, int nargout) |
38
|
1775 { |
|
1776 tree_constant *retval = NULL_TREE_CONST; |
|
1777 |
|
1778 if ((nargin == 4) && (nargout == 1)) |
|
1779 DLD_BUILTIN (args, nargin, nargout, syl, |
|
1780 retval = syl (args, nargin, nargout);) |
|
1781 else |
181
|
1782 print_usage ("syl"); |
38
|
1783 |
|
1784 return retval; |
|
1785 } |
|
1786 |
|
1787 /* |
444
|
1788 * Schur Decomposition. |
1
|
1789 */ |
|
1790 tree_constant * |
164
|
1791 builtin_schur (const tree_constant *args, int nargin, int nargout) |
1
|
1792 { |
|
1793 tree_constant *retval = NULL_TREE_CONST; |
|
1794 |
|
1795 if ((nargin == 3 || nargin == 2) && (nargout == 1 || nargout == 2)) |
181
|
1796 DLD_BUILTIN (args, nargin, nargout, schur, |
1
|
1797 retval = schur (args, nargin, nargout);) |
|
1798 else |
181
|
1799 print_usage ("schur"); |
1
|
1800 |
|
1801 return retval; |
|
1802 } |
|
1803 |
|
1804 /* |
444
|
1805 * Givens rotation. |
30
|
1806 */ |
|
1807 tree_constant * |
164
|
1808 builtin_givens (const tree_constant *args, int nargin, int nargout) |
30
|
1809 { |
|
1810 tree_constant *retval = NULL_TREE_CONST; |
|
1811 |
|
1812 if (nargin == 3 && (nargout == 1 || nargout == 2 )) |
|
1813 retval = givens (args, nargin, nargout); |
|
1814 else |
181
|
1815 print_usage ("givens"); |
30
|
1816 |
|
1817 return retval; |
|
1818 } |
|
1819 |
|
1820 /* |
444
|
1821 * Hessenberg Decomposition. |
1
|
1822 */ |
|
1823 tree_constant * |
164
|
1824 builtin_hess (const tree_constant *args, int nargin, int nargout) |
1
|
1825 { |
|
1826 tree_constant *retval = NULL_TREE_CONST; |
|
1827 |
|
1828 if (nargin == 2 && (nargout == 1 || nargout == 2)) |
|
1829 DLD_BUILTIN (args, nargin, nargout, hess, |
|
1830 retval = hess (args, nargin, nargout);) |
|
1831 else |
181
|
1832 print_usage ("hess"); |
1
|
1833 |
|
1834 return retval; |
|
1835 } |
|
1836 |
|
1837 /* |
210
|
1838 * Variable argument lists. |
|
1839 */ |
|
1840 tree_constant * |
|
1841 builtin_va_arg (const tree_constant *args, int nargin, int nargout) |
|
1842 { |
|
1843 tree_constant *retval = NULL_TREE_CONST; |
|
1844 if (nargin == 1) |
|
1845 { |
|
1846 if (curr_function != (tree_function *) NULL) |
|
1847 { |
|
1848 if (curr_function->takes_varargs ()) |
|
1849 { |
|
1850 retval = new tree_constant [2]; |
359
|
1851 retval[0] = curr_function->octave_va_arg (); |
210
|
1852 } |
|
1853 else |
214
|
1854 { |
|
1855 error ("va_arg only valid within function taking variable"); |
|
1856 error ("number of arguments"); |
|
1857 } |
210
|
1858 } |
|
1859 else |
|
1860 error ("va_arg only valid within function body"); |
|
1861 } |
|
1862 else |
|
1863 print_usage ("va_arg"); |
|
1864 |
|
1865 return retval; |
|
1866 } |
|
1867 |
|
1868 tree_constant * |
|
1869 builtin_va_start (const tree_constant *args, int nargin, int nargout) |
|
1870 { |
|
1871 tree_constant *retval = NULL_TREE_CONST; |
|
1872 if (nargin == 1) |
|
1873 { |
|
1874 if (curr_function != (tree_function *) NULL) |
|
1875 { |
|
1876 if (curr_function->takes_varargs ()) |
359
|
1877 curr_function->octave_va_start (); |
210
|
1878 else |
214
|
1879 { |
|
1880 error ("va_start only valid within function taking variable"); |
|
1881 error ("number of arguments"); |
|
1882 } |
210
|
1883 } |
|
1884 else |
|
1885 error ("va_start only valid within function body"); |
|
1886 } |
|
1887 else |
|
1888 print_usage ("va_start"); |
|
1889 |
|
1890 return retval; |
|
1891 } |
|
1892 |
|
1893 /* |
1
|
1894 * Copying information. |
|
1895 */ |
|
1896 tree_constant * |
164
|
1897 builtin_warranty (const tree_constant *args, int nargin, int nargout) |
1
|
1898 { |
|
1899 ostrstream output_buf; |
|
1900 output_buf << "\n Octave, version " << version_string |
272
|
1901 << ". Copyright (C) 1992, 1993, 1994 John W. Eaton\n" |
1
|
1902 << "\n\ |
|
1903 This program is free software; you can redistribute it and/or modify\n\ |
|
1904 it under the terms of the GNU General Public License as published by\n\ |
|
1905 the Free Software Foundation; either version 2 of the License, or\n\ |
|
1906 (at your option) any later version.\n\n\ |
|
1907 This program is distributed in the hope that it will be useful,\n\ |
|
1908 but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ |
|
1909 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ |
|
1910 GNU General Public License for more details.\n\n\ |
|
1911 You should have received a copy of the GNU General Public License\n\ |
|
1912 along with this program. If not, write to the Free Software\n\ |
|
1913 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.\n\n"; |
|
1914 |
|
1915 output_buf << ends; |
|
1916 maybe_page_output (output_buf); |
|
1917 |
|
1918 return NULL_TREE_CONST; |
|
1919 } |
|
1920 |
|
1921 /* |
|
1922 * A matrix of zeros. |
|
1923 */ |
|
1924 tree_constant * |
164
|
1925 builtin_zeros (const tree_constant *args, int nargin, int nargout) |
1
|
1926 { |
|
1927 tree_constant *retval = NULL_TREE_CONST; |
|
1928 |
|
1929 switch (nargin) |
|
1930 { |
|
1931 case 2: |
|
1932 retval = new tree_constant [2]; |
|
1933 retval[0] = fill_matrix (args[1], 0.0, "zeros"); |
|
1934 break; |
|
1935 case 3: |
|
1936 retval = new tree_constant [2]; |
|
1937 retval[0] = fill_matrix (args[1], args[2], 0.0, "zeros"); |
|
1938 break; |
|
1939 default: |
181
|
1940 print_usage ("zeros"); |
1
|
1941 break; |
|
1942 } |
181
|
1943 |
1
|
1944 return retval; |
|
1945 } |
|
1946 |
|
1947 /* |
|
1948 ;;; Local Variables: *** |
|
1949 ;;; mode: C++ *** |
|
1950 ;;; page-delimiter: "^/\\*" *** |
|
1951 ;;; End: *** |
|
1952 */ |