common: add a grepenv command
[oweals/u-boot.git] / common / cmd_nvedit.c
index df0e6dbafdaa63f70ebd17463e82c9f97e6a1446..817f39b5d908cf5d7fa323f27591bf0d3034b403 100644 (file)
@@ -4,7 +4,9 @@
  *
  * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  * Andreas Heppel <aheppel@sysgo.de>
-
+ *
+ * Copyright 2011 Freescale Semiconductor, Inc.
+ *
  * See file CREDITS for list of people who contributed to this
  * project.
  *
@@ -160,6 +162,37 @@ int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return rcode;
 }
 
+#ifdef CONFIG_CMD_GREPENV
+static int do_env_grep (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       ENTRY *match;
+       unsigned char matched[env_htab.size / 8];
+       int rcode = 1, arg = 1, idx;
+
+       if (argc < 2)
+               return cmd_usage(cmdtp);
+
+       memset(matched, 0, env_htab.size / 8);
+
+       while (arg <= argc) {
+               idx = 0;
+               while ((idx = hstrstr_r(argv[arg], idx, &match, &env_htab))) {
+                       if (!(matched[idx / 8] & (1 << (idx & 7)))) {
+                               puts(match->key);
+                               puts("=");
+                               puts(match->data);
+                               puts("\n");
+                       }
+                       matched[idx / 8] |= 1 << (idx & 7);
+                       rcode = 0;
+               }
+               arg++;
+       }
+
+       return rcode;
+}
+#endif
+
 /*
  * Set a new environment variable,
  * or replace or delete an existing one.
@@ -829,6 +862,9 @@ static cmd_tbl_t cmd_env_sub[] = {
 #if defined(CONFIG_CMD_EXPORTENV)
        U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""),
 #endif
+#if defined(CONFIG_CMD_GREPENV)
+       U_BOOT_CMD_MKENT(grep, CONFIG_SYS_MAXARGS, 1, do_env_grep, "", ""),
+#endif
 #if defined(CONFIG_CMD_IMPORTENV)
        U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""),
 #endif
@@ -878,8 +914,11 @@ U_BOOT_CMD(
 #if defined(CONFIG_CMD_EDITENV)
        "env edit name - edit environment variable\n"
 #endif
-       "env export [-t | -b | -c] addr [size] - export environmnt\n"
-       "env import [-d] [-t | -b | -c] addr [size] - import environmnt\n"
+       "env export [-t | -b | -c] addr [size] - export environment\n"
+#if defined(CONFIG_CMD_GREPENV)
+       "env grep string [...] - search environment\n"
+#endif
+       "env import [-d] [-t | -b | -c] addr [size] - import environment\n"
        "env print [name ...] - print environment\n"
 #if defined(CONFIG_CMD_RUN)
        "env run var [...] - run commands in an environment variable\n"
@@ -911,6 +950,16 @@ U_BOOT_CMD_COMPLETE(
        var_complete
 );
 
+#ifdef CONFIG_CMD_GREPENV
+U_BOOT_CMD_COMPLETE(
+       grepenv, CONFIG_SYS_MAXARGS, 0,  do_env_grep,
+       "search environment variables",
+       "string ...\n"
+       "    - list environment name=value pairs matching 'string'",
+       var_complete
+);
+#endif
+
 U_BOOT_CMD_COMPLETE(
        setenv, CONFIG_SYS_MAXARGS, 0,  do_env_set,
        "set environment variables",