root/orte/util/parse_options.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. orte_util_parse_range_options
  2. orte_util_get_ranges

   1 /*
   2  * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
   3  *                         University Research and Technology
   4  *                         Corporation.  All rights reserved.
   5  * Copyright (c) 2004-2008 The University of Tennessee and The University
   6  *                         of Tennessee Research Foundation.  All rights
   7  *                         reserved.
   8  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
   9  *                         University of Stuttgart.  All rights reserved.
  10  * Copyright (c) 2004-2005 The Regents of the University of California.
  11  *                         All rights reserved.
  12  * Copyright (c) 2008      Sun Microsystems, Inc.  All rights reserved.
  13  * Copyright (c) 2008      Cisco Systems, Inc.  All rights reserved.
  14  * Copyright (c) 2015      Research Organization for Information Science
  15  *                         and Technology (RIST). All rights reserved.
  16  * $COPYRIGHT$
  17  *
  18  * Additional copyrights may follow
  19  *
  20  * $HEADER$
  21  */
  22 #include "orte_config.h"
  23 #include "orte/constants.h"
  24 
  25 #include <stdio.h>
  26 #include <string.h>
  27 #include <stdlib.h>
  28 #ifdef HAVE_UNISTD_H
  29 #include <unistd.h>
  30 #endif
  31 #ifdef HAVE_SYS_TYPES_H
  32 #include <sys/types.h>
  33 #endif
  34 
  35 #include "opal/util/argv.h"
  36 #include "opal/util/output.h"
  37 
  38 #include "orte/runtime/orte_globals.h"
  39 
  40 #include "orte/util/parse_options.h"
  41 
  42 void orte_util_parse_range_options(char *inp, char ***output)
  43 {
  44     char **r1=NULL, **r2=NULL;
  45     int i, vint;
  46     int start, end, n;
  47     char nstr[32];
  48     char *input, *bang;
  49     bool bang_option=false;
  50 
  51     /* protect against null input */
  52     if (NULL == inp) {
  53         return;
  54     }
  55 
  56     /* protect the provided input */
  57     input = strdup(inp);
  58 
  59     /* check for the special '!' operator */
  60     if (NULL != (bang = strchr(input, '!'))) {
  61         bang_option = true;
  62         *bang = '\0';
  63     }
  64 
  65     /* split on commas */
  66     r1 = opal_argv_split(input, ',');
  67     /* for each resulting element, check for range */
  68     for (i=0; i < opal_argv_count(r1); i++) {
  69         r2 = opal_argv_split(r1[i], '-');
  70         if (1 < opal_argv_count(r2)) {
  71             /* given range - get start and end */
  72             start = strtol(r2[0], NULL, 10);
  73             end = strtol(r2[1], NULL, 10);
  74         } else {
  75             /* check for wildcard - have to do this here because
  76              * the -1 would have been caught in the split
  77              */
  78             vint = strtol(r1[i], NULL, 10);
  79             if (-1 == vint) {
  80                 opal_argv_free(*output);
  81                 *output = NULL;
  82                 opal_argv_append_nosize(output, "-1");
  83                 opal_argv_free(r2);
  84                 goto cleanup;
  85             }
  86             start = strtol(r2[0], NULL, 10);
  87             end = start;
  88         }
  89         for (n = start; n <= end; n++) {
  90             snprintf(nstr, 32, "%d", n);
  91             opal_argv_append_nosize(output, nstr);
  92         }
  93         opal_argv_free(r2);
  94     }
  95 
  96 cleanup:
  97     if (bang_option) {
  98         opal_argv_append_nosize(output, "BANG");
  99     }
 100     free(input);
 101     opal_argv_free(r1);
 102 
 103 }
 104 
 105 void orte_util_get_ranges(char *inp, char ***startpts, char ***endpts)
 106 {
 107     char **r1=NULL, **r2=NULL;
 108     int i;
 109     char *input;
 110 
 111     /* protect against null input */
 112     if (NULL == inp) {
 113         return;
 114     }
 115 
 116     /* protect the provided input */
 117     input = strdup(inp);
 118 
 119     /* split on commas */
 120     r1 = opal_argv_split(input, ',');
 121     /* for each resulting element, check for range */
 122     for (i=0; i < opal_argv_count(r1); i++) {
 123         r2 = opal_argv_split(r1[i], '-');
 124         if (2 == opal_argv_count(r2)) {
 125             /* given range - get start and end */
 126             opal_argv_append_nosize(startpts, r2[0]);
 127             opal_argv_append_nosize(endpts, r2[1]);
 128         } else if (1 == opal_argv_count(r2)) {
 129             /* only one value provided, so it is both the start
 130              * and the end
 131              */
 132             opal_argv_append_nosize(startpts, r2[0]);
 133             opal_argv_append_nosize(endpts, r2[0]);
 134         } else {
 135             /* no idea how to parse this */
 136             opal_output(0, "%s Unknown parse error on string: %s(%s)",
 137                         ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), inp, r1[i]);
 138         }
 139         opal_argv_free(r2);
 140     }
 141 
 142     free(input);
 143     opal_argv_free(r1);
 144 
 145 }

/* [<][>][^][v][top][bottom][index][help] */