#include #include #include #include #define OLD_OCTAVE static void safe_fclose (void *f) { if (f) fclose ((FILE *) f); } DEFUN_DLD (ftest, args, nargout, "ftest(name)\n\ \n\ Execute all lines starting with ##! in the function file.") { octave_value_list retval; int nargin = args.length (); if (nargin != 1) { print_usage ("ftest"); return retval; } string name = args(0).string_value (); string path = fcn_file_in_path (name); string test; if (! path.empty ()) { FILE *fptr = fopen (path.c_str (), "r"); if (fptr) { #ifdef OLD_OCTAVE add_unwind_protect (safe_fclose, (void *) fptr); #else unwind_protect::add (safe_fclose, (void *) fptr); #endif enum STATE { start, hash, hashhash, in_test, skip } state; int c; while ((c = getc(fptr)) != EOF) { if (state == in_test) test += (char) c; else if (c == '#' && state==start) state=hash; else if (c == '#' && state==hash) state=hashhash; else if (c == '!' && state==hashhash) state=in_test; else state=skip; if (c == '\n') state = start; } #ifdef OLD_OCTAVE run_unwind_protect (); #else unwind_protect::run (); #endif } } if (!test.empty()) { test = "if 1,\n" + test + "endif"; return feval("eval", octave_value(test), 0); } else return retval; }