This source file includes following definitions.
- opal_argv_append
- opal_argv_append_nosize
- opal_argv_prepend_nosize
- opal_argv_append_unique_nosize
- opal_argv_free
- opal_argv_split_inter
- opal_argv_split
- opal_argv_split_with_empty
- opal_argv_count
- opal_argv_join
- opal_argv_join_range
- opal_argv_len
- opal_argv_copy
- opal_argv_delete
- opal_argv_insert
- opal_argv_insert_element
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 #include "opal_config.h"
  25 #include <stdlib.h>
  26 #include <string.h>
  27 
  28 #include "opal/util/argv.h"
  29 #include "opal/util/string_copy.h"
  30 #include "opal/constants.h"
  31 
  32 #define ARGSIZE 128
  33 
  34 
  35 
  36 
  37 
  38 int opal_argv_append(int *argc, char ***argv, const char *arg)
  39 {
  40     int rc;
  41 
  42     
  43     if (OPAL_SUCCESS != (rc = opal_argv_append_nosize(argv, arg))) {
  44         return rc;
  45     }
  46 
  47     *argc = opal_argv_count(*argv);
  48 
  49     return OPAL_SUCCESS;
  50 }
  51 
  52 int opal_argv_append_nosize(char ***argv, const char *arg)
  53 {
  54     int argc;
  55 
  56   
  57 
  58   if (NULL == *argv) {
  59     *argv = (char**) malloc(2 * sizeof(char *));
  60     if (NULL == *argv) {
  61         return OPAL_ERR_OUT_OF_RESOURCE;
  62     }
  63     argc = 0;
  64     (*argv)[0] = NULL;
  65     (*argv)[1] = NULL;
  66   }
  67 
  68   
  69   else {
  70         
  71         argc = opal_argv_count(*argv);
  72 
  73         *argv = (char**) realloc(*argv, (argc + 2) * sizeof(char *));
  74         if (NULL == *argv) {
  75             return OPAL_ERR_OUT_OF_RESOURCE;
  76         }
  77     }
  78 
  79     
  80 
  81     (*argv)[argc] = strdup(arg);
  82     if (NULL == (*argv)[argc]) {
  83         return OPAL_ERR_OUT_OF_RESOURCE;
  84     }
  85 
  86     argc = argc + 1;
  87     (*argv)[argc] = NULL;
  88 
  89     return OPAL_SUCCESS;
  90 }
  91 
  92 int opal_argv_prepend_nosize(char ***argv, const char *arg)
  93 {
  94     int argc;
  95     int i;
  96 
  97     
  98 
  99     if (NULL == *argv) {
 100         *argv = (char**) malloc(2 * sizeof(char *));
 101         if (NULL == *argv) {
 102             return OPAL_ERR_OUT_OF_RESOURCE;
 103         }
 104         (*argv)[0] = strdup(arg);
 105         (*argv)[1] = NULL;
 106     } else {
 107         
 108         argc = opal_argv_count(*argv);
 109 
 110         *argv = (char**) realloc(*argv, (argc + 2) * sizeof(char *));
 111         if (NULL == *argv) {
 112             return OPAL_ERR_OUT_OF_RESOURCE;
 113         }
 114         (*argv)[argc+1] = NULL;
 115 
 116         
 117         for (i=argc; 0 < i; i--) {
 118             (*argv)[i] = (*argv)[i-1];
 119         }
 120         (*argv)[0] = strdup(arg);
 121     }
 122 
 123     return OPAL_SUCCESS;
 124 }
 125 
 126 int opal_argv_append_unique_nosize(char ***argv, const char *arg, bool overwrite)
 127 {
 128     int i;
 129 
 130     
 131 
 132 
 133     if (NULL == *argv) {
 134         return opal_argv_append_nosize(argv, arg);
 135     }
 136 
 137     
 138     for (i=0; NULL != (*argv)[i]; i++) {
 139         if (0 == strcmp(arg, (*argv)[i])) {
 140             
 141             if (overwrite) {
 142                 free((*argv)[i]);
 143                 (*argv)[i] = strdup(arg);
 144             }
 145             return OPAL_SUCCESS;
 146         }
 147     }
 148 
 149     
 150     return opal_argv_append_nosize(argv, arg);
 151 }
 152 
 153 
 154 
 155 
 156 void opal_argv_free(char **argv)
 157 {
 158   char **p;
 159 
 160   if (NULL == argv)
 161     return;
 162 
 163   for (p = argv; NULL != *p; ++p) {
 164     free(*p);
 165   }
 166 
 167   free(argv);
 168 }
 169 
 170 
 171 
 172 
 173 
 174 static char **opal_argv_split_inter(const char *src_string, int delimiter,
 175         int include_empty)
 176 {
 177   char arg[ARGSIZE];
 178   char **argv = NULL;
 179   const char *p;
 180   char *argtemp;
 181   int argc = 0;
 182   size_t arglen;
 183 
 184   while (src_string && *src_string) {
 185     p = src_string;
 186     arglen = 0;
 187 
 188     while (('\0' != *p) && (*p != delimiter)) {
 189       ++p;
 190       ++arglen;
 191     }
 192 
 193     
 194 
 195     if (src_string == p) {
 196       if (include_empty) {
 197         arg[0] = '\0';
 198         if (OPAL_SUCCESS != opal_argv_append(&argc, &argv, arg))
 199           return NULL;
 200       }
 201     }
 202 
 203     
 204 
 205     else if ('\0' == *p) {
 206       if (OPAL_SUCCESS != opal_argv_append(&argc, &argv, src_string))
 207         return NULL;
 208       src_string = p;
 209       continue;
 210     }
 211 
 212     
 213 
 214     else if (arglen > (ARGSIZE - 1)) {
 215         argtemp = (char*) malloc(arglen + 1);
 216       if (NULL == argtemp)
 217         return NULL;
 218 
 219       opal_string_copy(argtemp, src_string, arglen + 1);
 220       argtemp[arglen] = '\0';
 221 
 222       if (OPAL_SUCCESS != opal_argv_append(&argc, &argv, argtemp)) {
 223         free(argtemp);
 224         return NULL;
 225       }
 226 
 227       free(argtemp);
 228     }
 229 
 230     
 231 
 232     else {
 233       opal_string_copy(arg, src_string, arglen + 1);
 234       arg[arglen] = '\0';
 235 
 236       if (OPAL_SUCCESS != opal_argv_append(&argc, &argv, arg))
 237         return NULL;
 238     }
 239 
 240     src_string = p + 1;
 241   }
 242 
 243   
 244 
 245   return argv;
 246 }
 247 
 248 char **opal_argv_split(const char *src_string, int delimiter)
 249 {
 250     return opal_argv_split_inter(src_string, delimiter, 0);
 251 }
 252 
 253 char **opal_argv_split_with_empty(const char *src_string, int delimiter)
 254 {
 255     return opal_argv_split_inter(src_string, delimiter, 1);
 256 }
 257 
 258 
 259 
 260 
 261 int opal_argv_count(char **argv)
 262 {
 263   char **p;
 264   int i;
 265 
 266   if (NULL == argv)
 267     return 0;
 268 
 269   for (i = 0, p = argv; *p; i++, p++)
 270     continue;
 271 
 272   return i;
 273 }
 274 
 275 
 276 
 277 
 278 
 279 
 280 char *opal_argv_join(char **argv, int delimiter)
 281 {
 282   char **p;
 283   char *pp;
 284   char *str;
 285   size_t str_len = 0;
 286   size_t i;
 287 
 288   
 289 
 290   if (NULL == argv || NULL == argv[0]) {
 291       return strdup("");
 292   }
 293 
 294   
 295 
 296 
 297   for (p = argv; *p; ++p) {
 298     str_len += strlen(*p) + 1;
 299   }
 300 
 301   
 302 
 303   if (NULL == (str = (char*) malloc(str_len)))
 304     return NULL;
 305 
 306   
 307 
 308   str[--str_len] = '\0';
 309   p = argv;
 310   pp = *p;
 311 
 312   for (i = 0; i < str_len; ++i) {
 313     if ('\0' == *pp) {
 314 
 315       
 316 
 317 
 318       str[i] = (char) delimiter;
 319       ++p;
 320       pp = *p;
 321     } else {
 322       str[i] = *pp++;
 323     }
 324   }
 325 
 326   
 327 
 328   return str;
 329 }
 330 
 331 
 332 
 333 
 334 
 335 
 336 char *opal_argv_join_range(char **argv, size_t start, size_t end, int delimiter)
 337 {
 338     char **p;
 339     char *pp;
 340     char *str;
 341     size_t str_len = 0;
 342     size_t i;
 343 
 344     
 345 
 346     if (NULL == argv || NULL == argv[0] || (int)start > opal_argv_count(argv)) {
 347         return strdup("");
 348     }
 349 
 350     
 351 
 352 
 353     for (p = &argv[start], i=start; *p && i < end; ++p, ++i) {
 354         str_len += strlen(*p) + 1;
 355     }
 356 
 357     
 358 
 359     if (NULL == (str = (char*) malloc(str_len)))
 360         return NULL;
 361 
 362     
 363 
 364     str[--str_len] = '\0';
 365     p = &argv[start];
 366     pp = *p;
 367 
 368     for (i = 0; i < str_len; ++i) {
 369         if ('\0' == *pp) {
 370 
 371             
 372 
 373 
 374             str[i] = (char) delimiter;
 375             ++p;
 376             pp = *p;
 377         } else {
 378             str[i] = *pp++;
 379         }
 380     }
 381 
 382     
 383 
 384     return str;
 385 }
 386 
 387 
 388 
 389 
 390 
 391 size_t opal_argv_len(char **argv)
 392 {
 393   char **p;
 394   size_t length;
 395 
 396   if (NULL == argv)
 397     return (size_t) 0;
 398 
 399   length = sizeof(char *);
 400 
 401   for (p = argv; *p; ++p) {
 402     length += strlen(*p) + 1 + sizeof(char *);
 403   }
 404 
 405   return length;
 406 }
 407 
 408 
 409 
 410 
 411 
 412 char **opal_argv_copy(char **argv)
 413 {
 414   char **dupv = NULL;
 415   int dupc = 0;
 416 
 417   if (NULL == argv)
 418     return NULL;
 419 
 420   
 421 
 422   dupv = (char**) malloc(sizeof(char*));
 423   dupv[0] = NULL;
 424 
 425   while (NULL != *argv) {
 426     if (OPAL_SUCCESS != opal_argv_append(&dupc, &dupv, *argv)) {
 427       opal_argv_free(dupv);
 428       return NULL;
 429     }
 430 
 431     ++argv;
 432   }
 433 
 434   
 435 
 436   return dupv;
 437 }
 438 
 439 
 440 int opal_argv_delete(int *argc, char ***argv, int start, int num_to_delete)
 441 {
 442     int i;
 443     int count;
 444     int suffix_count;
 445     char **tmp;
 446 
 447     
 448     if (NULL == argv || NULL == *argv || 0 == num_to_delete) {
 449         return OPAL_SUCCESS;
 450     }
 451     count = opal_argv_count(*argv);
 452     if (start > count) {
 453         return OPAL_SUCCESS;
 454     } else if (start < 0 || num_to_delete < 0) {
 455         return OPAL_ERR_BAD_PARAM;
 456     }
 457 
 458     
 459 
 460 
 461     suffix_count = count - (start + num_to_delete);
 462     if (suffix_count < 0) {
 463         suffix_count = 0;
 464     }
 465 
 466     
 467 
 468     for (i = start; i < count && i < start + num_to_delete; ++i) {
 469         free((*argv)[i]);
 470     }
 471 
 472     
 473 
 474     for (i = start; i < start + suffix_count; ++i) {
 475         (*argv)[i] = (*argv)[i + num_to_delete];
 476     }
 477 
 478     
 479 
 480     (*argv)[i] = NULL;
 481 
 482     
 483     tmp = (char**)realloc(*argv, sizeof(char*) * (i + 1));
 484     if (NULL != tmp) *argv = tmp;
 485 
 486     
 487     (*argc) -= num_to_delete;
 488 
 489     return OPAL_SUCCESS;
 490 }
 491 
 492 
 493 int opal_argv_insert(char ***target, int start, char **source)
 494 {
 495     int i, source_count, target_count;
 496     int suffix_count;
 497 
 498     
 499 
 500     if (NULL == target || NULL == *target || start < 0) {
 501         return OPAL_ERR_BAD_PARAM;
 502     } else if (NULL == source) {
 503         return OPAL_SUCCESS;
 504     }
 505 
 506     
 507 
 508     target_count = opal_argv_count(*target);
 509     source_count = opal_argv_count(source);
 510     if (start > target_count) {
 511         for (i = 0; i < source_count; ++i) {
 512             opal_argv_append(&target_count, target, source[i]);
 513         }
 514     }
 515 
 516     
 517 
 518     else {
 519 
 520         
 521 
 522         *target = (char**) realloc(*target,
 523                                    sizeof(char *) * (target_count + source_count + 1));
 524 
 525         
 526 
 527         suffix_count = target_count - start;
 528         for (i = suffix_count - 1; i >= 0; --i) {
 529             (*target)[start + source_count + i] =
 530                 (*target)[start + i];
 531         }
 532         (*target)[start + suffix_count + source_count] = NULL;
 533 
 534         
 535 
 536         for (i = start; i < start + source_count; ++i) {
 537             (*target)[i] = strdup(source[i - start]);
 538         }
 539     }
 540 
 541     
 542 
 543     return OPAL_SUCCESS;
 544 }
 545 
 546 int opal_argv_insert_element(char ***target, int location, char *source)
 547 {
 548     int i, target_count;
 549     int suffix_count;
 550 
 551     
 552 
 553     if (NULL == target || NULL == *target || location < 0) {
 554         return OPAL_ERR_BAD_PARAM;
 555     } else if (NULL == source) {
 556         return OPAL_SUCCESS;
 557     }
 558 
 559     
 560     target_count = opal_argv_count(*target);
 561     if (location > target_count) {
 562         opal_argv_append(&target_count, target, source);
 563         return OPAL_SUCCESS;
 564     }
 565 
 566     
 567     *target = (char**) realloc(*target,
 568                                sizeof(char*) * (target_count + 2));
 569 
 570     
 571     suffix_count = target_count - location;
 572     for (i = suffix_count - 1; i >= 0; --i) {
 573         (*target)[location + 1 + i] =
 574         (*target)[location + i];
 575     }
 576     (*target)[location + suffix_count + 1] = NULL;
 577 
 578     
 579     (*target)[location] = strdup(source);
 580 
 581     
 582     return OPAL_SUCCESS;
 583 }