int set_menu_format(MENU *m, int rows, int cols) { if (rows < 0 || cols < 0) { return (E_BAD_ARGUMENT); } if (m) { if (Posted(m)) { return (E_POSTED); } if (rows == 0) { rows = FRows(m); } if (cols == 0) { cols = FCols(m); } /* The pattern buffer is allocated after items have been */ /* connected */ if (Pattern(m)) { IthPattern(m, 0) = '\0'; Pindex(m) = 0; } FRows(m) = rows; FCols(m) = cols; Cols(m) = min(cols, Nitems(m)); Rows(m) = (Nitems(m)-1) / cols + 1; Height(m) = min(rows, Rows(m)); Top(m) = 0; Current(m) = IthItem(m, 0); SetLink(m); _scale(m); } else { if (rows > 0) { FRows(Dfl_Menu) = rows; } if (cols > 0) { FCols(Dfl_Menu) = cols; } } return (E_OK); }
int set_menu_opts(MENU *m, int opt) { ITEM **ip; if (m) { if (Posted(m)) { return (E_POSTED); } /* Check to see if the ROWMAJOR option is changing. If so, */ /* set top and current to 0. */ if ((opt & O_ROWMAJOR) != RowMajor(m)) { Top(m) = 0; Current(m) = IthItem(m, 0); (void) set_menu_format(m, FRows(m), FCols(m)); } /* if O_NONCYCLIC option changed, set bit to re-link items */ if ((opt & O_NONCYCLIC) != (Mopt(m) & O_NONCYCLIC)) { SetLink(m); } Mopt(m) = opt; if (OneValue(m) && Items(m)) { for (ip = Items(m); *ip; ip++) { /* Unset values if selection not allowed. */ Value(*ip) = FALSE; } } _scale(m); /* Redo sizing information */ } else { Mopt(Dfl_Menu) = opt; } return (E_OK); }
int _match(MENU *m, char c, ITEM **current) { int i, j; int found; /* * Indicates search has cycled past the current item. If the current * item is matched after cycled is true then NO_MATCH results. */ int cycled; /* If a backspace is encountered then search backward from the */ /* current item. Otherwise, search forward from the current item. */ i = Index(*current); if (c && c != '\b') { /* c could be null */ if (Pindex(m)+1 > MaxName(m)) { return (E_NO_MATCH); } IthPattern(m, Pindex(m)) = c; IthPattern(m, ++Pindex(m)) = '\0'; if (--i < 0) { i = Nitems(m)-1; } } j = i; found = FALSE; cycled = FALSE; do { if (c == '\b') { if (--i < 0) { i = Nitems(m)-1; } } else { if (++i >= Nitems(m)) { i = 0; } } if (substr(m, Pattern(m), Name(IthItem(m, i)))) { found = TRUE; break; } cycled = TRUE; } while (i != j); if (found) { if (i == Index(*current) && cycled) { return (E_NO_MATCH); } *current = IthItem(m, i); } else { if (c && c != '\b') { Pindex(m) -= 1; IthPattern(m, Pindex(m)) = '\0'; } return (E_NO_MATCH); } return (E_OK); }