BAL and Maple Release 2.2

Signed-off-by: Shad Ansari <developer@Carbon.local>
diff --git a/bal_release/src/lib/libcmdline/cmdline.c b/bal_release/src/lib/libcmdline/cmdline.c
new file mode 100644
index 0000000..d20b10a
--- /dev/null
+++ b/bal_release/src/lib/libcmdline/cmdline.c
@@ -0,0 +1,135 @@
+/******************************************************************************
+ *
+ *  <:copyright-BRCM:2016:DUAL/GPL:standard
+ *
+ *     Copyright (c) 2016 Broadcom
+ *     All Rights Reserved
+ *
+ *  Unless you and Broadcom execute a separate written software license
+ *  agreement governing use of this software, this software is licensed
+ *  to you under the terms of the GNU General Public License version 2
+ *  (the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
+ *  with the following added to such license:
+ *
+ *     As a special exception, the copyright holders of this software give
+ *     you permission to link this software with independent modules, and
+ *     to copy and distribute the resulting executable under terms of your
+ *     choice, provided that you also meet, for each linked independent
+ *     module, the terms and conditions of the license of that module.
+ *     An independent module is a module which is not derived from this
+ *     software.  The special exception does not apply to any modifications
+ *     of the software.
+ *
+ *  Not withstanding the above, under no circumstances may you combine
+ *  this software in any way with any other Broadcom software provided
+ *  under a license other than the GPL, without Broadcom's express prior
+ *  written consent.
+ *
+ *  :>
+ *
+ *****************************************************************************/
+/*
+ * cmdline.c - Command line argument helper
+ */
+
+#include <cmdline.h>
+
+/* Print usage information */
+bcmos_errno cl_print_usage(const char *app, const char *arg,
+    const cl_argument supported_args[], int num_supported_args,
+    cl_argument_usage_flags flags)
+{
+    const char *owner = "";
+    int i;
+
+    if (arg)
+        bcmos_printf("*** Error in parameter %s\n", arg);
+    if (app)
+    {
+        const char *p, *fname;
+        p = strrchr(app, '/');
+        fname = p ? p + 1 : app;
+        bcmos_printf("Usage: %s arguments\n", fname);
+    }
+    for (i = 0; i < num_supported_args; i++)
+    {
+        const cl_argument *opt = &supported_args[i];
+        if ((flags & CL_ARGUMENT_USAGE_FLAG_OWNER) != 0 &&
+            opt->owner && strcmp(opt->owner, owner))
+        {
+            owner = opt->owner;
+            bcmos_printf("\n%s options:\n", owner);
+        }
+        if (opt->short_name)
+            bcmos_printf("%-3s%c", opt->short_name, opt->long_name ? ',' : ' ');
+        else
+            bcmos_printf("    ");
+        bcmos_printf("%-20s %20s  %s\n",
+            opt->long_name ? opt->long_name : "",
+            opt->extra_arg ? opt->extra_arg : "",
+            opt->description ? opt->description : "");
+    }
+    return BCM_ERR_PARM;
+}
+
+/* Get parameter by name */
+const cl_argument *cl_parm_get(const char *name, const cl_argument supported_args[], int num_supported_args)
+{
+    const cl_argument *opt = NULL;
+    int i;
+
+    /* Make sure that all mandatory parameters are set */
+    for (i = 0; i < num_supported_args; i++)
+    {
+        opt = &supported_args[i];
+        if ((opt->short_name && !strcmp(opt->short_name, name)) ||
+            (opt->long_name && !strcmp(opt->long_name, name)))
+            break;
+    }
+    return (i < num_supported_args) ? opt : NULL;
+}
+
+/* Validate command line parameters */
+bcmos_errno cl_validate(int argc, char *argv[],
+    const cl_argument supported_args[], int num_supported_args)
+{
+    bcmos_bool parm_set[num_supported_args];
+    bcmos_errno rc = BCM_ERR_OK;
+    int i;
+
+    memset(parm_set, 0, sizeof(parm_set));
+    for (i = 1; i < argc; i++)
+    {
+        const cl_argument *opt = cl_parm_get(argv[i], supported_args, num_supported_args);
+        if (opt == NULL)
+        {
+            bcmos_printf("*** Invalid parameter: %s\n", argv[i]);
+            rc = BCM_ERR_PARM;
+            break;
+        }
+        if (opt->extra_arg)
+        {
+            ++i;
+            if (i >= argc)
+            {
+                bcmos_printf("*** Argument is missing after %s\n", argv[i-1]);
+                rc = BCM_ERR_PARM;
+                break;
+            }
+        }
+        parm_set[opt - supported_args] = BCMOS_TRUE;
+    }
+
+    /* Make sure that all mandatory parameters are set */
+    for (i = 0; i < num_supported_args; i++)
+    {
+        const cl_argument *opt = &supported_args[i];
+        if ((opt->flags & CL_ARGUMENT_FLAG_MANDATORY) && !parm_set[i])
+        {
+            bcmos_printf("*** Mandatory parameter %s is missing\n", opt->long_name ? opt->long_name : opt->short_name);
+            rc = BCM_ERR_PARM;
+            break;
+        }
+    }
+    return rc;
+}