# HG changeset patch # User jwe # Date 787471628 0 # Node ID 18be848f10a9d64f7d004fefcb5fda1324db41b9 # Parent d2dd114ba5dd37c3310035d784e9a4e3cd925fc6 [project @ 1994-12-15 06:06:46 by jwe] diff -r d2dd114ba5dd -r 18be848f10a9 src/help.cc --- a/src/help.cc Thu Dec 15 05:58:17 1994 +0000 +++ b/src/help.cc Thu Dec 15 06:07:08 1994 +0000 @@ -671,7 +671,7 @@ symbol_record *sym_rec = lookup_by_name (*argv, 0); - if (sym_rec) + if (sym_rec && sym_rec->is_defined ()) { char *h = sym_rec->help (); if (h && *h) @@ -682,6 +682,14 @@ } } + char *h = get_help_from_file (*argv); + if (h && *h) + { + output_buf << "\n" << h << "\n"; + delete [] h; + continue; + } + output_buf << "\nhelp: sorry, `" << *argv << "' is not documented\n"; } diff -r d2dd114ba5dd -r 18be848f10a9 src/lex.l --- a/src/lex.l Thu Dec 15 05:58:17 1994 +0000 +++ b/src/lex.l Thu Dec 15 06:07:08 1994 +0000 @@ -641,6 +641,10 @@ // input. if (interactive && ! (reading_fcn_file || get_input_from_eval_string)) yyrestart (stdin); + +// Delete the buffer for help text. + delete [] help_buf; + help_buf = 0; } // Replace backslash escapes in a string with the real values. @@ -985,7 +989,6 @@ defining_func = 1; promptflag--; beginning_of_function = 1; - help_buf[0] = '\0'; if (! (reading_fcn_file || reading_script_file)) input_line_number = 1; return FCN; @@ -1090,52 +1093,55 @@ static void grab_help_text (void) { - int max_len = HELP_BUF_LENGTH - 1; + if (! help_buf) + { + ostrstream buf; - int in_comment = 1; - int len = 0; - int c = 0; + int in_comment = 1; + int c = 0; - while ((c = yyinput ()) != EOF) - { - if (in_comment) + while ((c = yyinput ()) != EOF) { - help_buf[len++] = c; - if (c == '\n') - in_comment = 0; - } - else - { - switch (c) + if (in_comment) + { + buf << (char) c; + if (c == '\n') + in_comment = 0; + } + else { - case '%': - case '#': - in_comment = 1; - break; + switch (c) + { + case '%': + case '#': + in_comment = 1; + break; - case ' ': - case '\t': - break; + case ' ': + case '\t': + break; - default: - goto done; + default: + goto done; + } } } - if (len > max_len) + done: + + if (c) + yyunput (c, yytext); + + buf << ends; + + help_buf = buf.str (); + + if (! help_buf || ! *help_buf) { - warning ("grab_help_text: buffer overflow after caching %d chars", - max_len); - break; + delete [] help_buf; + help_buf = 0; } } - - done: - - if (c) - yyunput (c, yytext); - - help_buf[len] = '\0'; } // Return 1 if the given character matches any character in the given diff -r d2dd114ba5dd -r 18be848f10a9 src/parse.h --- a/src/parse.h Thu Dec 15 05:58:17 1994 +0000 +++ b/src/parse.h Thu Dec 15 06:07:08 1994 +0000 @@ -73,10 +73,8 @@ // The column of the current token. extern int current_input_column; -#define HELP_BUF_LENGTH 8192 - // Buffer for help text snagged from function files. -extern char help_buf [HELP_BUF_LENGTH]; +extern char *help_buf; // Nonzero means we're working on a plot command. extern int plotting; diff -r d2dd114ba5dd -r 18be848f10a9 src/parse.y --- a/src/parse.y Thu Dec 15 05:58:17 1994 +0000 +++ b/src/parse.y Thu Dec 15 06:07:08 1994 +0000 @@ -91,8 +91,7 @@ int current_input_column = 1; // Buffer for help text snagged from function files. -// Probably shouldn't be a fixed size... -char help_buf [HELP_BUF_LENGTH]; +char *help_buf = 0; // Nonzero means we're working on a plot command. int plotting = 0; diff -r d2dd114ba5dd -r 18be848f10a9 src/pt-cmd.cc --- a/src/pt-cmd.cc Thu Dec 15 05:58:17 1994 +0000 +++ b/src/pt-cmd.cc Thu Dec 15 06:07:08 1994 +0000 @@ -281,7 +281,7 @@ for (int i = 0; i < steps; i++) { - tree_constant *rhs; + tree_constant *rhs = 0; if (nr == 1) { diff -r d2dd114ba5dd -r 18be848f10a9 src/variables.cc --- a/src/variables.cc Thu Dec 15 05:58:17 1994 +0000 +++ b/src/variables.cc Thu Dec 15 06:07:08 1994 +0000 @@ -498,9 +498,34 @@ return 0; } -static void +static int +looks_like_octave_copyright (char *s) +{ + if (s && strncmp (s, " Copyright (C) ", 15) == 0) + { + s = strchr (s, '\n'); + if (s) + { + s++; + s = strchr (s, '\n'); + if (s) + { + s++; + if (strncmp (s, " This file is part of Octave.", 29) == 0) + return 1; + } + } + } + return 0; +} + +static char * gobble_leading_white_space (FILE *ffile) { + ostrstream buf; + + int first_comments_seen = 0; + int have_help_text = 0; int in_comment = 0; int c; while ((c = getc (ffile)) != EOF) @@ -508,6 +533,12 @@ current_input_column++; if (in_comment) { + if (! have_help_text) + { + first_comments_seen = 1; + buf << (char) c; + } + if (c == '\n') { input_line_number++; @@ -521,6 +552,8 @@ { case ' ': case '\t': + if (first_comments_seen) + have_help_text = 1; break; case '\n': @@ -536,10 +569,23 @@ default: current_input_column--; ungetc (c, ffile); - return; + goto done; } } } + + done: + + buf << ends; + char *help_txt = buf.str (); + + if (! help_txt || ! *help_txt || looks_like_octave_copyright (help_txt)) + { + delete help_txt; + help_txt = 0; + } + + return help_txt; } static int @@ -547,8 +593,6 @@ { int status = 0; - gobble_leading_white_space (ffile); - long pos = ftell (ffile); char buf [10]; @@ -596,6 +640,8 @@ // Check to see if this file defines a function or is just a list of // commands. + char *tmp_help_txt = gobble_leading_white_space (ffile); + if (is_function_file (ffile)) { unwind_protect_int (echo_input); @@ -618,6 +664,9 @@ reset_parser (); + delete [] help_buf; + help_buf = tmp_help_txt; + int status = yyparse (); if (status != 0) @@ -726,6 +775,23 @@ return sym_rec; } +char * +get_help_from_file (const char *f) +{ + char *path = fcn_file_in_path (f); + if (path && *path) + { + FILE *fptr = fopen (path, "r"); + if (fptr) + { + char *help_txt = gobble_leading_white_space (fptr); + fclose (fptr); + return help_txt; + } + } + return 0; +} + // Variable values. // Look for the given name in the global symbol table. If it refers diff -r d2dd114ba5dd -r 18be848f10a9 src/variables.h --- a/src/variables.h Thu Dec 15 05:58:17 1994 +0000 +++ b/src/variables.h Thu Dec 15 06:07:08 1994 +0000 @@ -68,6 +68,8 @@ extern symbol_record *lookup_by_name (const char *nm, int exec_script = 1); +extern char *get_help_from_file (const char *f); + extern char *builtin_string_variable (const char *); extern int builtin_real_scalar_variable (const char *, double&);