new menu.m improved (menu2.m) this is the last time

<[email protected]> Wed, 25 Feb 2004 03:54:06 -0600
Newsgroups gmane.comp.gnu.octave.sources
Message-ID <[email protected]>
I discovered a very important bug in my previous menu2.m (it resulted an
error if there were more than 10 arguments).

Now it is resolved, finished and without bugs (I hope so).
Of course, ir is compatible with the existent menu.m and the old menu2.m
Sorry the inconvenience if anybody were using it.

It can be seen in sourceforge.net/projects/wave2mid (version 0.2.7).


Here are the code.

----------------------
## Copyright (C) 1996, 1997 John W. Eaton
##
## This file is part of Octave.
##
## Octave is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2, or (at your option)
## any later version.
##
## Octave is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Octave; see the file COPYING.  If not, write to the Free
## Software Foundation, 59 Temple Place - Suite 330, Boston, MA
## 02111-1307, USA.

## -*- texinfo -*-
## @deftypefn {Function File} {} menu (@var{title}, @var{opt1}, @dots{})
## Print a title string followed by a series of options.  Each option will
## be printed along with a number.  The return value is the number of the
## option selected by the user.  This function is useful for interactive
## programs.  There is no limit to the number of options that may be passed
## in, but it may be confusing to present more than will fit easily on one
## screen.
## @end deftypefn
## @seealso{disp, printf, and input}

## Author: pablo busto based on menu.m from jwe 

function num = menu2 (t, varargin)
if (nargin < 2)
    printf ("usage:");
    printf ("menu3 (title, opt1, opt2, ...)\n");
    printf ("where opt1 is [\"shorcut1\";\"shortcut2\",text]\n");
    printf ("example:  menu3 (tittle, [\"Aa..\";\"OptA\"],
[\"Bb..\";\"OptB\"]...)\n\n");
  endif
  

  ## Force pending output to appear before the menu.

  fflush (stdout);

  ## Don't send the menu through the pager since doing that can cause
  ## major confusion.

  save_page_screen_output = page_screen_output;

  unwind_protect

    page_screen_output = 0;

    if (! isempty (t))
        disp (t);
        printf ("\n");
    endif

    num=[]; %Condition for while
    
    while ((num==[])||(num==0))
        nopt = nargin - 1;
        for i1=[1:nopt]     %writing menu
            printf("[%i]\t",i1);
            [m,n]=size(varargin{i1});%m is the interesting
            for i2=[1:m-1]
                printf(" [%s]\t",deblank(varargin{i1}(i2,:))); %erase
the spaces in the end
            endfor		
            printf(" %s\n",varargin{i1}(m,:));
        endfor
    
    
        s1=input("Choose one : ","s");%take s like a string
    
        %checking if it is a number
        s1num=str2num(s1);
        if ((s1num>=1)&&(s1num<=nopt))
            num=s1num;
        endif
    
        if num==[]
                %checking if it is a shortcut
                for i1=[nopt:-1:1]     %looking for
                        [m,n]=size(varargin{i1});%m is the interesting
                        for i2=[1:m]
                                (varargin{i1}(i2,1));
                                s1=deblank(s1);
                               
s2=deblank(sprintf("%s",varargin{i1}(i2,:)));
                                if strcmp(s1,s2)
                                        num=i1;
                                endif	
                        endfor
                endfor
        endif
        
        %printing error
        if ((num==[])||(num==[0]))
            printf ("error: input invalid or out of range\n");
        endif
        
    endwhile
    
  unwind_protect_cleanup

    page_screen_output = save_page_screen_output;

  end_unwind_protect

endfunction