On Mon, Sep 22, 2014 at 10:38:00AM +0200, David Marchand wrote:
> Identify all options through the getopt_long return value.
> This way, we only need a big switch/case.
> 
> Indentation is broken to ease commit review (fixed in next commit).
> 
> Suggested-by: Neil Horman <nhorman at tuxdriver.com>
> Signed-off-by: David Marchand <david.marchand at 6wind.com>
> ---
>  lib/librte_eal/bsdapp/eal/eal.c             |   21 +++-----
>  lib/librte_eal/common/eal_common_options.c  |   77 
> ++++++++++++++++-----------
>  lib/librte_eal/common/include/eal_options.h |   28 +++++++++-
>  lib/librte_eal/linuxapp/eal/eal.c           |   44 ++++++++-------
>  4 files changed, 105 insertions(+), 65 deletions(-)
> 
> diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
> index 58f00fd..c4b75a4 100644
> --- a/lib/librte_eal/bsdapp/eal/eal.c
> +++ b/lib/librte_eal/bsdapp/eal/eal.c
> @@ -354,8 +354,7 @@ eal_parse_args(int argc, char **argv)
>               if (opt == '?')
>                       return -1;
>  
> -             ret = eal_parse_common_option(opt, optarg, option_index,
> -                                           &internal_config);
> +             ret = eal_parse_common_option(opt, optarg, &internal_config);
>               /* common parser is not happy */
>               if (ret < 0) {
>                       eal_usage(prgname);
> @@ -371,21 +370,15 @@ eal_parse_args(int argc, char **argv)
>               }
>  
>               switch (opt) {
> -             /* long options */
> -             case 0:
> -                     {
> -                             RTE_LOG(ERR, EAL, "Option %s is not supported "
> -                                     "on FreeBSD\n",
> -                                     eal_long_options[option_index].name);
> -                             eal_usage(prgname);
> -                             return -1;
> -                     }
> -                     break;
> -
>               default:
> -                     if (isprint(opt)) {
> +                     if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
>                               RTE_LOG(ERR, EAL, "Option %c is not supported "
>                                       "on FreeBSD\n", opt);
> +                     } else if (opt >= OPT_LONG_MIN_NUM &&
> +                                opt < OPT_LONG_MAX_NUM) {
> +                             RTE_LOG(ERR, EAL, "Option %s is not supported "
> +                                     "on FreeBSD\n",
> +                                     eal_long_options[option_index].name);
>                       } else {
>                               RTE_LOG(ERR, EAL, "Option %d is not supported "
>                                       "on FreeBSD\n", opt);
> diff --git a/lib/librte_eal/common/eal_common_options.c 
> b/lib/librte_eal/common/eal_common_options.c
> index ead4300..4009f02 100644
> --- a/lib/librte_eal/common/eal_common_options.c
> +++ b/lib/librte_eal/common/eal_common_options.c
> @@ -63,24 +63,24 @@ eal_short_options[] =
>  
>  const struct option
>  eal_long_options[] = {
> -     {OPT_HUGE_DIR, 1, 0, 0},
> -     {OPT_PROC_TYPE, 1, 0, 0},
> -     {OPT_NO_SHCONF, 0, 0, 0},
> -     {OPT_NO_HPET, 0, 0, 0},
> -     {OPT_VMWARE_TSC_MAP, 0, 0, 0},
> -     {OPT_NO_PCI, 0, 0, 0},
> -     {OPT_NO_HUGE, 0, 0, 0},
> -     {OPT_FILE_PREFIX, 1, 0, 0},
> -     {OPT_SOCKET_MEM, 1, 0, 0},
> -     {OPT_PCI_WHITELIST, 1, 0, 'w'},
> -     {OPT_PCI_BLACKLIST, 1, 0, 'b'},
> -     {OPT_VDEV, 1, 0, 0},
> -     {OPT_SYSLOG, 1, NULL, 0},
> -     {OPT_LOG_LEVEL, 1, NULL, 0},
> -     {OPT_BASE_VIRTADDR, 1, 0, 0},
> -     {OPT_XEN_DOM0, 0, 0, 0},
> -     {OPT_CREATE_UIO_DEV, 1, NULL, 0},
> -     {OPT_VFIO_INTR, 1, NULL, 0},
> +     {OPT_HUGE_DIR, 1, 0, OPT_HUGE_DIR_NUM},
> +     {OPT_PROC_TYPE, 1, 0, OPT_PROC_TYPE_NUM},
> +     {OPT_NO_SHCONF, 0, 0, OPT_NO_SHCONF_NUM},
> +     {OPT_NO_HPET, 0, 0, OPT_NO_HPET_NUM},
> +     {OPT_VMWARE_TSC_MAP, 0, 0, OPT_VMWARE_TSC_MAP_NUM},
> +     {OPT_NO_PCI, 0, 0, OPT_NO_PCI_NUM},
> +     {OPT_NO_HUGE, 0, 0, OPT_NO_HUGE_NUM},
> +     {OPT_FILE_PREFIX, 1, 0, OPT_FILE_PREFIX_NUM},
> +     {OPT_SOCKET_MEM, 1, 0, OPT_SOCKET_MEM_NUM},
> +     {OPT_PCI_WHITELIST, 1, 0, OPT_PCI_WHITELIST_NUM},
> +     {OPT_PCI_BLACKLIST, 1, 0, OPT_PCI_BLACKLIST_NUM},
> +     {OPT_VDEV, 1, 0, OPT_VDEV_NUM},
> +     {OPT_SYSLOG, 1, NULL, OPT_SYSLOG_NUM},
> +     {OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM},
> +     {OPT_BASE_VIRTADDR, 1, 0, OPT_BASE_VIRTADDR_NUM},
> +     {OPT_XEN_DOM0, 0, 0, OPT_XEN_DOM0_NUM},
> +     {OPT_CREATE_UIO_DEV, 1, NULL, OPT_CREATE_UIO_DEV_NUM},
> +     {OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM},
>       {0, 0, 0, 0}
>  };
>  
> @@ -238,7 +238,7 @@ eal_parse_proc_type(const char *arg)
>  }
>  
>  int
> -eal_parse_common_option(int opt, const char *optarg, int longindex,
> +eal_parse_common_option(int opt, const char *optarg,
>                       struct internal_config *conf)
>  {
>       switch (opt) {
> @@ -296,32 +296,46 @@ eal_parse_common_option(int opt, const char *optarg, 
> int longindex,
>               break;
>  
>       /* long options */
> -     case 0:
> -             if (!strcmp(eal_long_options[longindex].name, OPT_NO_HUGE)) {
> +     case OPT_NO_HUGE_NUM:
>                       conf->no_hugetlbfs = 1;
> -             } else if (!strcmp(eal_long_options[longindex].name, 
> OPT_NO_PCI)) {
> +             break;
> +
> +     case OPT_NO_PCI_NUM:
>                       conf->no_pci = 1;
> -             } else if (!strcmp(eal_long_options[longindex].name, 
> OPT_NO_HPET)) {
> +             break;
> +
> +     case OPT_NO_HPET_NUM:
>                       conf->no_hpet = 1;
> -             } else if (!strcmp(eal_long_options[longindex].name, 
> OPT_VMWARE_TSC_MAP)) {
> +             break;
> +
> +     case OPT_VMWARE_TSC_MAP_NUM:
>                       conf->vmware_tsc_map = 1;
> -             } else if (!strcmp(eal_long_options[longindex].name, 
> OPT_NO_SHCONF)) {
> +             break;
> +
> +     case OPT_NO_SHCONF_NUM:
>                       conf->no_shconf = 1;
> -             } else if (!strcmp(eal_long_options[longindex].name, 
> OPT_PROC_TYPE)) {
> +             break;
> +
> +     case OPT_PROC_TYPE_NUM:
>                       conf->process_type = eal_parse_proc_type(optarg);
> -             } else if (!strcmp(eal_long_options[longindex].name, OPT_VDEV)) 
> {
> +             break;
> +
> +     case OPT_VDEV_NUM:
>                       if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
>                                       optarg) < 0) {
>                               return -1;
>                       }
> -             } else if (!strcmp(eal_long_options[longindex].name, 
> OPT_SYSLOG)) {
> +             break;
> +
> +     case OPT_SYSLOG_NUM:
>                       if (eal_parse_syslog(optarg, conf) < 0) {
>                               RTE_LOG(ERR, EAL, "invalid parameters for --"
>                                               OPT_SYSLOG "\n");
>                               return -1;
>                       }
> -             } else if (!strcmp(eal_long_options[longindex].name,
> -                              OPT_LOG_LEVEL)) {
> +             break;
> +
> +     case OPT_LOG_LEVEL_NUM: {
>                       uint32_t log;
>  
>                       if (eal_parse_log_level(optarg, &log) < 0) {
> @@ -331,9 +345,8 @@ eal_parse_common_option(int opt, const char *optarg, int 
> longindex,
>                               return -1;
>                       }
>                       conf->log_level = log;
> -             }
> -
>               break;
> +             }
>  
>       /* don't know what to do, leave this to caller */
>       default:
> diff --git a/lib/librte_eal/common/include/eal_options.h 
> b/lib/librte_eal/common/include/eal_options.h
> index 4e6b90d..22819ec 100644
> --- a/lib/librte_eal/common/include/eal_options.h
> +++ b/lib/librte_eal/common/include/eal_options.h
> @@ -30,29 +30,55 @@
>   *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>  
> +
> +enum {
> +     /* long options mapped to a short option */
>  #define OPT_PCI_WHITELIST "pci-whitelist"
> +     OPT_PCI_WHITELIST_NUM = 'w',
>  #define OPT_PCI_BLACKLIST "pci-blacklist"
> +     OPT_PCI_BLACKLIST_NUM = 'b',
>  
> +     /* first long only option value must be >= 256, so that we won't
> +      * conflict with short options */
> +     OPT_LONG_MIN_NUM = 256,
>  #define OPT_HUGE_DIR    "huge-dir"
> +     OPT_HUGE_DIR_NUM = OPT_LONG_MIN_NUM,
>  #define OPT_PROC_TYPE   "proc-type"
> +     OPT_PROC_TYPE_NUM,
>  #define OPT_NO_SHCONF   "no-shconf"
> +     OPT_NO_SHCONF_NUM,
>  #define OPT_NO_HPET     "no-hpet"
> +     OPT_NO_HPET_NUM,
>  #define OPT_VMWARE_TSC_MAP   "vmware-tsc-map"
> +     OPT_VMWARE_TSC_MAP_NUM,
>  #define OPT_NO_PCI      "no-pci"
> +     OPT_NO_PCI_NUM,
>  #define OPT_NO_HUGE     "no-huge"
> +     OPT_NO_HUGE_NUM,
>  #define OPT_FILE_PREFIX "file-prefix"
> +     OPT_FILE_PREFIX_NUM,
>  #define OPT_SOCKET_MEM  "socket-mem"
> +     OPT_SOCKET_MEM_NUM,
>  #define OPT_VDEV        "vdev"
> +     OPT_VDEV_NUM,
>  #define OPT_SYSLOG      "syslog"
> +     OPT_SYSLOG_NUM,
>  #define OPT_LOG_LEVEL   "log-level"
> +     OPT_LOG_LEVEL_NUM,
>  #define OPT_BASE_VIRTADDR   "base-virtaddr"
> +     OPT_BASE_VIRTADDR_NUM,
>  #define OPT_XEN_DOM0    "xen-dom0"
> +     OPT_XEN_DOM0_NUM,
>  #define OPT_CREATE_UIO_DEV "create-uio-dev"
> +     OPT_CREATE_UIO_DEV_NUM,
>  #define OPT_VFIO_INTR    "vfio-intr"
> +     OPT_VFIO_INTR_NUM,
> +     OPT_LONG_MAX_NUM
> +};
>  
>  extern const char eal_short_options[];
>  extern const struct option eal_long_options[];
>  
> -int eal_parse_common_option(int opt, const char *argv, int longindex,
> +int eal_parse_common_option(int opt, const char *argv,
>                           struct internal_config *conf);
>  void eal_common_usage(void);
> diff --git a/lib/librte_eal/linuxapp/eal/eal.c 
> b/lib/librte_eal/linuxapp/eal/eal.c
> index d82debf..1d468dd 100644
> --- a/lib/librte_eal/linuxapp/eal/eal.c
> +++ b/lib/librte_eal/linuxapp/eal/eal.c
> @@ -553,8 +553,7 @@ eal_parse_args(int argc, char **argv)
>               if (opt == '?')
>                       return -1;
>  
> -             ret = eal_parse_common_option(opt, optarg, option_index,
> -                                           &internal_config);
> +             ret = eal_parse_common_option(opt, optarg, &internal_config);
>               /* common parser is not happy */
>               if (ret < 0) {
>                       eal_usage(prgname);
> @@ -584,8 +583,7 @@ eal_parse_args(int argc, char **argv)
>                       break;
>  
>               /* long options */
> -             case 0:
> -                     if (!strcmp(eal_long_options[option_index].name, 
> OPT_XEN_DOM0)) {
> +             case OPT_XEN_DOM0_NUM:
>               #ifdef RTE_LIBRTE_XEN_DOM0
>                               internal_config.xen_dom0_support = 1;
>               #else
> @@ -594,46 +592,56 @@ eal_parse_args(int argc, char **argv)
>                                       " RTE_LIBRTE_XEN_DOM0=y\n");
>                               return -1;
>               #endif
> -                     } else if (!strcmp(eal_long_options[option_index].name, 
> OPT_HUGE_DIR)) {
> +                     break;
> +
> +             case OPT_HUGE_DIR_NUM:
>                               internal_config.hugepage_dir = optarg;
> -                     } else if (!strcmp(eal_long_options[option_index].name, 
> OPT_FILE_PREFIX)) {
> +                     break;
> +
> +             case OPT_FILE_PREFIX_NUM:
>                               internal_config.hugefile_prefix = optarg;
> -                     } else if (!strcmp(eal_long_options[option_index].name, 
> OPT_SOCKET_MEM)) {
> +                     break;
> +
> +             case OPT_SOCKET_MEM_NUM:
>                               if (eal_parse_socket_mem(optarg) < 0) {
>                                       RTE_LOG(ERR, EAL, "invalid parameters 
> for --"
>                                                       OPT_SOCKET_MEM "\n");
>                                       eal_usage(prgname);
>                                       return -1;
>                               }
> -                     } else if (!strcmp(eal_long_options[option_index].name, 
> OPT_BASE_VIRTADDR)) {
> +                     break;
> +
> +             case OPT_BASE_VIRTADDR_NUM:
>                               if (eal_parse_base_virtaddr(optarg) < 0) {
>                                       RTE_LOG(ERR, EAL, "invalid parameter 
> for --"
>                                                       OPT_BASE_VIRTADDR "\n");
>                                       eal_usage(prgname);
>                                       return -1;
>                               }
> -                     } else if (!strcmp(eal_long_options[option_index].name, 
> OPT_VFIO_INTR)) {
> +                     break;
> +
> +             case OPT_VFIO_INTR_NUM:
>                               if (eal_parse_vfio_intr(optarg) < 0) {
>                                       RTE_LOG(ERR, EAL, "invalid parameters 
> for --"
>                                                       OPT_VFIO_INTR "\n");
>                                       eal_usage(prgname);
>                                       return -1;
>                               }
> -                     } else if (!strcmp(eal_long_options[option_index].name, 
> OPT_CREATE_UIO_DEV)) {
> +                     break;
> +
> +             case OPT_CREATE_UIO_DEV_NUM:
>                               internal_config.create_uio_dev = 1;
> -                     } else {
> -                             RTE_LOG(ERR, EAL, "Option %s is not supported "
> -                                     "on Linux\n",
> -                                     eal_long_options[option_index].name);
> -                             eal_usage(prgname);
> -                             return -1;
> -                     }
>                       break;
>  
>               default:
> -                     if (isprint(opt)) {
> +                     if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
>                               RTE_LOG(ERR, EAL, "Option %c is not supported "
>                                       "on Linux\n", opt);
> +                     } else if (opt >= OPT_LONG_MIN_NUM &&
> +                                opt < OPT_LONG_MAX_NUM) {
> +                             RTE_LOG(ERR, EAL, "Option %s is not supported "
> +                                     "on Linux\n",
> +                                     eal_long_options[option_index].name);
>                       } else {
>                               RTE_LOG(ERR, EAL, "Option %d is not supported "
>                                       "on Linux\n", opt);
> -- 
> 1.7.10.4
> 
> 
Thanks!  This looks much nicer
Neil

Reply via email to