summaryrefslogtreecommitdiff
path: root/src/piraha/Bracket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/piraha/Bracket.cc')
-rw-r--r--src/piraha/Bracket.cc45
1 files changed, 29 insertions, 16 deletions
diff --git a/src/piraha/Bracket.cc b/src/piraha/Bracket.cc
index d1c52632..47f5c443 100644
--- a/src/piraha/Bracket.cc
+++ b/src/piraha/Bracket.cc
@@ -1,4 +1,5 @@
#include "Piraha.hpp"
+#include <string.h>
using namespace piraha;
@@ -69,8 +70,9 @@ static void fail(Bracket *b,Matcher *m) {
}
bool Bracket::match(Matcher *m) {
- if(m->pos >= (int)m->input_size)
+ if(m->pos >= (int)m->input_size) {
return false;
+ }
for(range_iter r = ranges.begin();r != ranges.end(); ++r) {
if((*r)->match(m)) {
if(neg) {
@@ -93,24 +95,35 @@ bool Bracket::match(Matcher *m) {
}
}
-std::ostream& piraha::operator<<(std::ostream& o,Bracket& b) {
- for(range_iter r = b.ranges.begin();r != b.ranges.end(); ++r) {
+void insertc(std::ostream& o,char c) {
+ if(c == '-') {
+ o << "\\-";
+ } else if(c == '\n') {
+ o << "\\n";
+ } else if(c == '\r') {
+ o << "\\r";
+ } else if(c == '\t') {
+ o << "\\t";
+ } else if(strchr("[]-",c)>=0) {
+ o << "\\" << c;
+ } else {
+ o << c;
+ }
+}
+
+void Bracket::insert(std::ostream& o) {
+ o << "[";
+ if(neg)
+ o << "^";
+ for(range_iter r = ranges.begin();r != ranges.end(); ++r) {
char lo = (*r)->lo, hi = (*r)->hi;
if(lo == hi) {
- if(lo == '-') {
- o << "\\-";
- } else if(lo == '\n') {
- o << "\\n";
- } else if(lo == '\r') {
- o << "\\r";
- } else if(lo == '\t') {
- o << "\\t";
- } else {
- o << lo;
- }
+ insertc(o,lo);
} else {
- o << lo << '-' << hi;
+ insertc(o,lo);
+ o << '-';
+ insertc(o,hi);
}
}
- return o;
+ o << "]";
}