/****************************************************************************
- * Copyright (c) 1998-2005,2008 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
#include "menu.priv.h"
-MODULE_ID("$Id: m_driver.c,v 1.26 2008/07/05 20:54:33 tom Exp $")
+MODULE_ID("$Id: m_driver.c,v 1.31 2012/03/10 23:43:41 tom Exp $")
/* Macros */
/* Add a new character to the match pattern buffer */
#define Add_Character_To_Pattern(menu,ch) \
- { (menu)->pattern[((menu)->pindex)++] = (ch);\
+ { (menu)->pattern[((menu)->pindex)++] = (char) (ch);\
(menu)->pattern[(menu)->pindex] = '\0'; }
/*---------------------------------------------------------------------------
bool found = FALSE, passed = FALSE;
int idx, last;
- T((T_CALLED("_nc_Match_Next_Character(%p,%d,%p)"), menu, ch, item));
+ T((T_CALLED("_nc_Match_Next_Character(%p,%d,%p)"),
+ (void *)menu, ch, (void *)item));
assert(menu && item && *item);
idx = (*item)->index;
/*---------------------------------------------------------------------------
| Facility : libnmenu
-| Function : int menu_driver(MENU *menu, int c)
+| Function : int menu_driver(MENU* menu, int c)
|
| Description : Central dispatcher for the menu. Translates the logical
| request 'c' into a menu action.
ITEM *item;
int my_top_row, rdiff;
- T((T_CALLED("menu_driver(%p,%d)"), menu, c));
+ T((T_CALLED("menu_driver(%p,%d)"), (void *)menu, c));
if (!menu)
RETURN(E_BAD_ARGUMENT);
else
{
my_top_row += rdiff;
- while (rdiff-- > 0 && item != (ITEM *) 0)
+ while (rdiff-- > 0 && item != 0 && item->down != 0)
item = item->down;
}
break;
else
{
my_top_row -= rdiff;
- while (rdiff-- && item != (ITEM *) 0)
+ while (rdiff-- > 0 && item != 0 && item->up != 0)
item = item->up;
}
break;
result = E_UNKNOWN_COMMAND;
}
- if (E_OK == result)
+ if (item == 0)
+ {
+ result = E_BAD_STATE;
+ }
+ else if (E_OK == result)
{
/* Adjust the top row if it turns out that the current item unfortunately
doesn't appear in the menu window */