Merge branch '2019-10-28-azure-ci-support'
[oweals/u-boot.git] / common / menu.c
index 322b75e62f27e23d433c7504fc072502e651f33c..7b66d199a9b13054706f5886e19829a85c322d12 100644 (file)
@@ -1,21 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright 2010-2011 Calxeda, Inc.
- *
- * This program 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 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope 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
- * this program.  If not, see <http://www.gnu.org/licenses/>.
+ * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
  */
 
 #include <common.h>
+#include <cli.h>
 #include <malloc.h>
 #include <errno.h>
 #include <linux/list.h>
@@ -50,6 +40,7 @@ struct menu {
        char *(*item_choice)(void *);
        void *item_choice_data;
        struct list_head items;
+       int item_cnt;
 };
 
 /*
@@ -115,12 +106,9 @@ static inline void *menu_item_destroy(struct menu *m,
        return NULL;
 }
 
-void __menu_display_statusline(struct menu *m)
+__weak void menu_display_statusline(struct menu *m)
 {
-       return;
 }
-void menu_display_statusline(struct menu *m)
-       __attribute__ ((weak, alias("__menu_display_statusline")));
 
 /*
  * Display a menu so the user can make a choice of an item. First display its
@@ -176,7 +164,7 @@ static inline struct menu_item *menu_item_by_key(struct menu *m,
  * Set *choice to point to the default item's data, if any default item was
  * set, and returns 1. If no default item was set, returns -ENOENT.
  */
-static inline int menu_default_choice(struct menu *m, void **choice)
+int menu_default_choice(struct menu *m, void **choice)
 {
        if (m->default_item) {
                *choice = m->default_item->data;
@@ -207,13 +195,16 @@ static inline int menu_interactive_choice(struct menu *m, void **choice)
                menu_display(m);
 
                if (!m->item_choice) {
-                       readret = readline_into_buffer("Enter choice: ", cbuf,
-                                       m->timeout / 10);
+                       readret = cli_readline_into_buffer("Enter choice: ",
+                                                          cbuf, m->timeout);
 
                        if (readret >= 0) {
                                choice_item = menu_item_by_key(m, cbuf);
                                if (!choice_item)
                                        printf("%s not found\n", cbuf);
+                       } else if (readret == -1)  {
+                               printf("<INTERRUPT>\n");
+                               return -EINTR;
                        } else {
                                return menu_default_choice(m, choice);
                        }
@@ -282,7 +273,7 @@ int menu_get_choice(struct menu *m, void **choice)
        if (!m || !choice)
                return -EINVAL;
 
-       if (!m->prompt)
+       if (!m->prompt || m->item_cnt == 1)
                return menu_default_choice(m, choice);
 
        return menu_interactive_choice(m, choice);
@@ -334,6 +325,7 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)
        item->data = item_data;
 
        list_add_tail(&item->list, &m->items);
+       m->item_cnt++;
 
        return 1;
 }
@@ -359,7 +351,7 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)
  * make it obvious what the key for each entry is.
  *
  * item_choice - If not NULL, will be called when asking the user to choose an
- * item. Returns a key string corresponding to the choosen item or NULL if
+ * item. Returns a key string corresponding to the chosen item or NULL if
  * no item has been selected.
  *
  * item_choice_data - Will be passed as the argument to the item_choice function
@@ -385,6 +377,7 @@ struct menu *menu_create(char *title, int timeout, int prompt,
        m->item_data_print = item_data_print;
        m->item_choice = item_choice;
        m->item_choice_data = item_choice_data;
+       m->item_cnt = 0;
 
        if (title) {
                m->title = strdup(title);