-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstrfork.cpp
89 lines (78 loc) · 1.69 KB
/
strfork.cpp
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
#include <stdio.h>
#include "nnstring.h"
#include "nnvector.h"
/*
[ {A,B}{C,D} ]
[ A{C,D} ] [ B{C,D} ]
AC AD BC BD
*/
int strfork(const char *base,NnString &result)
{
int beforesize=0;
int quote=0;
NnString::Iter p(base);
/* 「{」より左の文字列を、まずはコピー */
while( *p != '{' || quote ){
if( *p == '\0' ){
result = base;
return 0;
}else if( *p == '"' ){
quote ^= 1;
}
++beforesize;
++p;
}
++p; // skip '{'
NnVector array;
NnString *one=new NnString(base,beforesize);
/* 「}」までの文字列をコピー */
for(;;){
if( *p == '}' && quote==0 )
break;
if( *p == ',' && quote == 0 ){
array.append( one );
one = new NnString(base,beforesize);
}else if( *p == '\0'){
delete one;
result = base;
return -1;
}else{
if( *p == '"' )
quote ^= 1;
*one << (char)*p;
}
++p;
}
++p; // skip '}'
result.erase();
/* カンマが一つもない時は、{,} 構文ではない */
if( array.size() == 0 ){
result = base;
delete one;
return 1;
}
array.append( one );
for(int i=0 ; i<array.size() ; ++i ){
NnString temp = *(NnString*)array.at(i);
temp << *p << p.next;
strfork( temp.chars() , *(NnString*)array.at(i) );
result << *(NnString*)array.at(i) ;
if( i < array.size() - 1 )
result << ' ';
}
return array.size();
}
void brace_expand( NnString &s )
{
NnVector array;
s.splitTo( array );
s.erase();
for(int i=0;i<array.size();i++){
NnString temp;
strfork(((NnString*)array.at(i))->chars() , temp );
s << temp;
if( i < array.size() - 1 ){
s << ' ';
}
}
}