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
|
// PR tree-optimization/49039
// { dg-do run }
template <class T1, class T2>
struct pair
{
T1 first;
T2 second;
pair (const T1 & a, const T2 & b):first (a), second (b) {}
};
template <class T1, class T2>
inline pair <T1, T2>
make_pair (T1 x, T2 y)
{
return pair <T1, T2> (x, y);
}
typedef __SIZE_TYPE__ size_t;
struct S
{
const char *Data;
size_t Length;
static size_t min (size_t a, size_t b) { return a < b ? a : b; }
static size_t max (size_t a, size_t b) { return a > b ? a : b; }
S () :Data (0), Length (0) { }
S (const char *Str) : Data (Str), Length (__builtin_strlen (Str)) {}
S (const char *data, size_t length) : Data (data), Length (length) {}
bool empty () const { return Length == 0; }
size_t size () const { return Length; }
S slice (size_t Start, size_t End) const
{
Start = min (Start, Length);
End = min (max (Start, End), Length);
return S (Data + Start, End - Start);
}
pair <S, S> split (char Separator) const
{
size_t Idx = find (Separator);
if (Idx == ~size_t (0))
return make_pair (*this, S ());
return make_pair (slice (0, Idx), slice (Idx + 1, ~size_t (0)));
}
size_t find (char C, size_t From = 0) const
{
for (size_t i = min (From, Length), e = Length; i != e; ++i)
if (Data[i] == C)
return i;
return ~size_t (0);
}
};
void
Test (const char *arg)
{
S Desc (arg);
while (!Desc.empty ())
{
pair <S, S> Split = Desc.split ('-');
S Token = Split.first;
Desc = Split.second;
if (Token.empty ())
continue;
Split = Token.split (':');
S Specifier = Split.first;
if (Specifier.empty ())
__builtin_abort ();
}
}
int
main ()
{
Test ("-");
return 0;
}
|