summaryrefslogtreecommitdiff
path: root/cpukit/libmisc/shell/shell_makeargs.c
blob: 5d4657677b443171ec799b93e33032fd35e9637a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
 *  Split string into argc/argv style argument list
 *
 *  COPYRIGHT (c) 1989-2008.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.org/license/LICENSE.
 */

#if HAVE_CONFIG_H
#include "config.h"
#endif

#include <string.h>
#include <ctype.h>
#include <rtems/shell.h>

int rtems_shell_make_args(
  char  *commandLine,
  int   *argc_p,
  char **argv_p,
  int    max_args
)
{
  int   argc;
  char *ch;
  int   status = 0;
 
  argc = 0;
  ch = commandLine;

  while ( *ch ) {

    while ( isspace((unsigned char)*ch) ) ch++;

    if ( *ch == '\0' )
      break;

    if ( *ch == '"' ) {
      argv_p[ argc ] = ++ch;
      while ( ( *ch != '\0' ) && ( *ch != '"' ) ) ch++;
    } else {
      argv_p[ argc ] = ch;
      while ( ( *ch != '\0' ) && ( !isspace((unsigned char)*ch) ) ) ch++;
    }

    argc++;

    if ( *ch == '\0' )
      break;

    *ch++ = '\0';

    if ( argc == (max_args-1) ) {
        status = -1;
        break;
    }


  }
  argv_p[ argc ] = NULL;
  *argc_p = argc;
  return status;
}