|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 3254 (0xcb6)
Types: TextFile
Notes: UNIX file
Names: »input.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »unimenu/src/menu/input.c«
static char *SCCSid = "@(#)input.c 1.1 15:34:48 4/6/85";
/*
* Copyright (c) 1984
*
* LANTECH Systems, Incoroporated
*
* All rights reserved
*/
/*
* Function: get_choice(menu)
*
* Purpose: Decide what the user typed.
*
* Passed: A menu pointer, (it modifies the data to which
* the menu points.)
*
* Returns: 1) (via return) The type of choice.
* 2) (via *menu) The choice itself, in m_current
*
* Called by: main
*
* Calls: List to be compiled.
*
* History: Original code June 84, Robert Adams.
*
* Notes: This code should do smart abbreviation stuff.
*/
#include "defs.h"
int get_choice (menu) /* returns a type */
struct menu_f *menu; /* and sets menu -> m_current */
{
struct choice_f *chp; /* pointer to possible choices */
int chnum; /* value for choice */
int chtype;
int i; /* just a counter */
chp = menu->m_list; /* list of choices */
/*
* in the select system we return the number of
* the choice they were on when they quit
* chtype is set to the operation to perform
* depending on which key they terminated the select with
* <ret> = CHEXEC
* ? = CHELP
* <esc> = CHEXIT
*/
chnum = select(menu, &chtype); /* select takes care of input */
for ( i = 1; i < chnum && chp; i++ )
chp = chp->c_next;
if ( !chp )
chtype = CHINVLD;
switch (chtype)
{
case CHEXEC:
if (chp -> c_exec)
menu -> m_current = chp -> c_Exec;
else
menu -> m_current =
"/bin/echo No \"Exec:\" spec. in input file.";
break;
case CHHELP:
if (chp -> c_help)
menu -> m_current = chp -> c_Help;
else
menu->m_current = "/bin/echo No help.";
break;
case CHDUMP:
case CHINVLD:
case CHRPLOT:
menu -> m_current = NULL;
break;
case CHEXIT:
cls();
_exit (-chnum);
break;
default:
x (TRUE, "get_choice II: switch (bad chtype)");
break;
}
return (chtype);
}
#ifdef LONGMATCH
struct choice_f *best_match(chp, str)
struct choice_f *chp;
char *str;
{
struct choice_f *this_one = 0; /* the best match we could find */
int nmatched = 0; /* max chars we matched */
int cnt0, cnt1, cnt2; /* for counting matches */
int i;
char *op, *p;
while ( chp )
{
op = chp->c_Text;
p = str;
cnt0 = 0;
while ( *op && *p )
{
if ( (*op++ | 0x20) == (*p++ | 0x20) )
cnt0++;
}
if ( cnt0 == strlen(chp->c_Text) )
{
this_one = chp;
break;
}
cnt0 += cnt0; /* give this count higher priority */
cnt1 = match2(chp->c_Text, str); /* count matches */
cnt2 = match2(str, chp->c_Text);
/*
* take the greatest number of matching chars
*/
if ( cnt1 < cnt2 )
cnt1 = cnt2;
if ( cnt1 < cnt0 )
cnt1 = cnt0;
if ( cnt1 > nmatched )
{
nmatched = cnt1;
this_one = chp;
}
chp = chp->c_next;
}
return ( this_one );
}
/*
* match2 - in this match if the chars don't match
* we only increment string 1. This allows extra chars in
* one of the strings. e.g: "strings one" and "string one"
* will match.
*/
match2(s1, s2)
char *s1;
char *s2;
{
int cnt = 0;
while ( *s1 && *s2 )
{
while ( *s2 == ' ' )
s2++;
while ( *s1 == ' ' )
s1++;
if ( (*s1 | 0x20) == (*s2 | 0x20) )
{
cnt++;
s2++;
s1++;
}
else
s1++;
}
return ( cnt );
}
#endif