Mercurial > hg > Applications > Grep
comparison c/regexParser/regexParser.cc @ 150:a4940a8dd263 pairPro
implement insertCharClass
author | masa |
---|---|
date | Wed, 16 Dec 2015 16:42:18 +0900 |
parents | f1880f25fabf |
children | 6ba059ce9109 |
comparison
equal
deleted
inserted
replaced
149:f1880f25fabf | 150:a4940a8dd263 |
---|---|
83 | 83 |
84 |----------------| | 84 |----------------| |
85 13. b--e | 85 13. b--e |
86 | 86 |
87 */ | 87 */ |
88 CharClassPtr insertCharClass(CharClassPtr cc, unsigned char begin, unsigned char end) { | 88 CharClassPtr insertCharClass(CharClassPtr cc, unsigned long begin, unsigned long end) { |
89 | 89 |
90 if (end < cc->cond.range.begin ) { // 1 | 90 if (end < cc->cond.range.begin ) { // 1 |
91 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); | 91 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); |
92 if (cc->left) { | 92 if (cc->left) { |
93 cc1->left = insertCharClass(cc->left,begin,end); | 93 cc1->left = insertCharClass(cc->left,begin,end); |
96 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); | 96 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); |
97 cc1->left = cc2; | 97 cc1->left = cc2; |
98 return cc1; | 98 return cc1; |
99 } | 99 } |
100 } else if (end == cc->cond.range.begin ) { // 2 | 100 } else if (end == cc->cond.range.begin ) { // 2 |
101 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); | |
102 cc->cond.range.begin = begin; | 101 cc->cond.range.begin = begin; |
102 return cc; | |
103 } else if (end <= cc->cond.range.end) { // 3,4,6,7,9,10 | 103 } else if (end <= cc->cond.range.end) { // 3,4,6,7,9,10 |
104 if (begin < cc->cond.range.begin) { // 3,4 | 104 if (begin < cc->cond.range.begin) { // 3,4 |
105 cc->cond.range.begin = begin; | 105 cc->cond.range.begin = begin; |
106 } | 106 } |
107 return cc; | |
107 } else if (begin > cc->cond.range.end ) { // 13 | 108 } else if (begin > cc->cond.range.end ) { // 13 |
108 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); | 109 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); |
109 if (cc->right) { | 110 if (cc->right) { |
110 cc1->right = insertCharClass(cc->right,begin,end); | 111 cc1->right = insertCharClass(cc->right,begin,end); |
111 return cc1; | 112 return cc1; |
112 } else { | 113 } else { |
113 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); | 114 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); |
114 cc1->right = cc2; | 115 cc1->right = cc2; |
115 return cc1; | 116 return cc1; |
116 } | 117 } |
117 } else if (begin == cc->cond.range.end ) { // 12 | 118 } |
118 cc->cond.range.end = end; | 119 if (cc->right) { |
120 return insertCharClass(cc->right,cc->cond.range.begin,end); | |
121 } | |
122 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { // 12 | |
123 if (end > cc->cond.range.end) cc->cond.range.end = end; // 11 | |
119 } else if (begin < cc->cond.range.begin) { // 5 | 124 } else if (begin < cc->cond.range.begin) { // 5 |
120 cc->cond.range.begin = begin; | 125 cc->cond.range.begin = begin; |
126 cc->cond.range.end = end; | |
127 } else { | |
128 printf("insertCharClass Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end); | |
121 } | 129 } |
122 return cc; | 130 return cc; |
123 } | 131 } |
124 | 132 |
125 // <charClass> ::= '['<literal>'-'<literal>']' | 133 // <charClass> ::= '['<literal>'-'<literal>']' |
148 rangeList->begin = *ri->ptr; | 156 rangeList->begin = *ri->ptr; |
149 rangeList->end = *ri->ptr; | 157 rangeList->end = *ri->ptr; |
150 rangeList->next = NULL; | 158 rangeList->next = NULL; |
151 } | 159 } |
152 | 160 |
153 for (RangeListPtr r = &cc->cond.range; r; r = r->next) { | 161 RangeListPtr r = cc->cond.range.next; |
162 cc->cond.range.next = 0; | |
163 for (; r; r = r->next) { | |
154 cc = insertCharClass(cc, r->begin, r->end); | 164 cc = insertCharClass(cc, r->begin, r->end); |
155 } | 165 } |
156 | 166 |
157 n->cc = cc; | 167 n->cc = cc; |
158 // TODO literal support | 168 // TODO literal support |