/**
 *  \file cliface.h
 *
 *  This file contains definitions for command line interface (CLI) framework.
 */

/*
 *  Copyright (C) 2017. Mindtree Ltd.
 *  All rights reserved.
 */

#ifndef _H_CLIFACE_
#define _H_CLIFACE_

/* --------------------------------------------- Header File Inclusion */
#include "EM_os.h"

/* --------------------------------------------- Global Definitions */


/* --------------------------------------------- Macros */

/* Debug Macros */
/* TBD: Mapped with debug sub-system */
#define CLI_ERR(...)       /* printf(__VA_ARGS__) */
#define CLI_TRC(...)       /* printf(__VA_ARGS__) */
#define CLI_INF(...)       /* printf(__VA_ARGS__) */

#define CLI_STR_COMPARE(s0, s1)    strcmp((const char *)(s0), (const char *)(s1))

#define CLI_NULL_CHECK(ptr) \
        if (NULL == (ptr)) \
        {\
            CLI_ERR( \
            "[CLI] NULL Pointer\n"); \
            \
            return EM_FAILURE; \
        }

#define CLI_IS_WHITE_SPACE(ch)   ((' ' == (ch)) || ('\t' == (ch)))
#define CLI_IS_CMD_SEPARATOR(ch) ((' ' == (ch)) || ('\t' == (ch)) || ('\r' == (ch)) || ('\n' == (ch)))

/** TBD: Move to limits/configuration header file */
#define CLI_MAX_ARGS    16

#define CLI_strlen(s)   EM_str_len(s)

/* --------------------------------------------- Data Types/ Structures */
/**
 * CLI command handler.
 *
 * CLI will call the handler for the received command.
 *
 * \param [in] argc    Number of arguments.
 * \param [in] argv    List of arguments.
 */
typedef EM_RESULT (* CLI_CMD_HANDLER)
        (
            UINT32        argc,
            UCHAR       * argv[]
        ) DECL_REENTRANT;

/** This data structure represents a CLI command */
typedef struct _cli_command
{
    /** Command name */
    DECL_CONST UCHAR           * cmd;

    /* Command description */
    DECL_CONST UCHAR           * desc;

    /** Command handler */
    DECL_CONST CLI_CMD_HANDLER   cmd_hdlr;

} CLI_COMMAND;


/* --------------------------------------------- Functions */
EM_RESULT CLI_init
           (
                void
           );

EM_RESULT CLI_process_line
           (
               /* IN */ UCHAR       * buffer,
               /* IN */ UINT32        buffer_len,
               /* IN */ CLI_COMMAND * cmd_list,
               /* IN */ UINT32        cmd_count
           );

INT32 CLI_strtoi
      (
          /* IN */ UCHAR *data,
          /* IN */ UINT16 data_length,
          /* IN */ UINT8 base
      );

EM_RESULT CLI_strtoarray
          (
              /* IN */  UCHAR  * data,
              /* IN */  UINT16   data_length,
              /* OUT */ UINT8  * output_array,
              /* IN */  UINT16   output_array_len
          );

EM_RESULT CLI_strtoarray_le
          (
              /* IN */  UCHAR  * data,
              /* IN */  UINT16   data_length,
              /* OUT */ UINT8  * output_array,
              /* IN */  UINT16   output_array_len
          );

#endif /* _H_CLIFACE_ */