summaryrefslogtreecommitdiff
path: root/TAO/tao/arg_shifter.h
blob: 4b1017828faadc6cb382f02915db78b744ea0609 (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// This may look like C, but it's really -*- C++ -*-

// ========================================================================
//
// = LIBRARY 
//     TAO 
//  
// = FILENAME 
//     arg_shifter
// 
// = AUTHOR 
//     Seth Widoff 
// 
// = VERSION 
//     $Id$
// ========================================================================

#if !defined (TAO_ARG_SHIFTER_H)
#define TAO_ARG_SHIFTER_H

class Arg_Shifter
  // = TITLE
  //    Happy ADT to shift known args to the back of the argv vector,
  //    so deeper levels of argument parsing can locate the yet
  //    unprocessed arguments at the beginning of the vector.
  //
  // = DESCRIPTION
  //    The Arg_Shifter copies the pointers of the argv vector into a
  //    temporary array. As the Arg_Shifter iterates over the temp, is
  //    places known arguments in the rear of the argv and unknown
  //    ones in the beginning. So, after having visited all the
  //    arguments in the temp vector, Arg_Shifter has placed all the
  //    unknown arguments in their original order at the front of
  //    argv.
{
public:

  Arg_Shifter (int &argc, char **argv, char **temp = 0);
  // Sumbit to the Arg_Shifter the vector over which to iterate, also
  // providing the temporary array if the client doesn't want the
  // arg_shifter to dynamically allocate its own. If internal dynamic
  // allocation fails, the Arg_Shifter will set all the indices to the
  // end of the vector, forbidding iteration. Following iteration over
  // argv, the argc value will contain the number of unconsumed
  // arguments.
  
  ~Arg_Shifter (void);
  
  char* get_current (void) const;
  // Get the current head of the vector.

  int consume_arg (int number = 1);
  // Consume <number> argument(s) by sticking them/it on the end of
  // the vector.

  int ignore_arg (int number = 1);
  // Place <number> arguments in the same relative order ahead of the
  // known arguemnts in the vector.

  int is_anything_left (void) const;
  // Returns the number of args left to see in the vector.

  int is_option_next (void) const;
  // Returns 1 if there's a next item in the vector and it begins with
  // '-'.
  
  int is_parameter_next (void) const;
  // Returns 1 if there's a next item in the vector and it doesn't
  // begin with '-'.
  
  int num_ignored_args (void) const;
  // Returns the number of irrelevant args seen.
  
private:
  int &argc_;
  // The size of the argument vector.

  int total_size_;
  // The size of argv_.
  
  char **temp_;
  // The temporary array over which we traverse.
  
  char **argv_;
  // The array in which the arguments are reordered.

  int current_index_;
  // The element in <temp_> we're currently examining.

  int back_;
  // The index of <argv_> in which we'll stick the next unknown
  // argument.
  
  int front_;
  // The index of <argv_> in which we'll stick the next known
  // argument. 
};

#endif /* TAO_ARG_SHIFTER_H */