diff options
Diffstat (limited to 'Godeps/_workspace/src/github.com/obscuren/otto/type_regexp.go')
-rw-r--r-- | Godeps/_workspace/src/github.com/obscuren/otto/type_regexp.go | 146 |
1 files changed, 0 insertions, 146 deletions
diff --git a/Godeps/_workspace/src/github.com/obscuren/otto/type_regexp.go b/Godeps/_workspace/src/github.com/obscuren/otto/type_regexp.go deleted file mode 100644 index 5f17bde69..000000000 --- a/Godeps/_workspace/src/github.com/obscuren/otto/type_regexp.go +++ /dev/null @@ -1,146 +0,0 @@ -package otto - -import ( - "fmt" - "regexp" - "unicode/utf8" - - "github.com/robertkrimen/otto/parser" -) - -type _regExpObject struct { - regularExpression *regexp.Regexp - global bool - ignoreCase bool - multiline bool - source string - flags string -} - -func (runtime *_runtime) newRegExpObject(pattern string, flags string) *_object { - self := runtime.newObject() - self.class = "RegExp" - - global := false - ignoreCase := false - multiline := false - re2flags := "" - - // TODO Maybe clean up the panicking here... TypeError, SyntaxError, ? - - for _, chr := range flags { - switch chr { - case 'g': - if global { - panic(newError("SyntaxError: newRegExpObject: %s %s", pattern, flags)) - } - global = true - case 'm': - if multiline { - panic(newError("SyntaxError: newRegExpObject: %s %s", pattern, flags)) - } - multiline = true - re2flags += "m" - case 'i': - if ignoreCase { - panic(newError("SyntaxError: newRegExpObject: %s %s", pattern, flags)) - } - ignoreCase = true - re2flags += "i" - } - } - - re2pattern, err := parser.TransformRegExp(pattern) - if err != nil { - panic(newTypeError("Invalid regular expression: %s", err.Error())) - } - if len(re2flags) > 0 { - re2pattern = fmt.Sprintf("(?%s:%s)", re2flags, re2pattern) - } - - regularExpression, err := regexp.Compile(re2pattern) - if err != nil { - panic(newSyntaxError("Invalid regular expression: %s", err.Error()[22:])) - } - - self.value = _regExpObject{ - regularExpression: regularExpression, - global: global, - ignoreCase: ignoreCase, - multiline: multiline, - source: pattern, - flags: flags, - } - self.defineProperty("global", toValue_bool(global), 0, false) - self.defineProperty("ignoreCase", toValue_bool(ignoreCase), 0, false) - self.defineProperty("multiline", toValue_bool(multiline), 0, false) - self.defineProperty("lastIndex", toValue_int(0), 0100, false) - self.defineProperty("source", toValue_string(pattern), 0, false) - return self -} - -func (self *_object) regExpValue() _regExpObject { - value, _ := self.value.(_regExpObject) - return value -} - -func execRegExp(this *_object, target string) (match bool, result []int) { - if this.class != "RegExp" { - panic(newTypeError("Calling RegExp.exec on a non-RegExp object")) - } - lastIndex := toInteger(this.get("lastIndex")).value - index := lastIndex - global := toBoolean(this.get("global")) - if !global { - index = 0 - } - if 0 > index || index > int64(len(target)) { - } else { - result = this.regExpValue().regularExpression.FindStringSubmatchIndex(target[index:]) - } - if result == nil { - //this.defineProperty("lastIndex", toValue_(0), 0111, true) - this.put("lastIndex", toValue_int(0), true) - return // !match - } - match = true - startIndex := index - endIndex := int(lastIndex) + result[1] - // We do this shift here because the .FindStringSubmatchIndex above - // was done on a local subordinate slice of the string, not the whole string - for index, _ := range result { - result[index] += int(startIndex) - } - if global { - //this.defineProperty("lastIndex", toValue_(endIndex), 0111, true) - this.put("lastIndex", toValue_int(endIndex), true) - } - return // match -} - -func execResultToArray(runtime *_runtime, target string, result []int) *_object { - captureCount := len(result) / 2 - valueArray := make([]Value, captureCount) - for index := 0; index < captureCount; index++ { - offset := 2 * index - if result[offset] != -1 { - valueArray[index] = toValue_string(target[result[offset]:result[offset+1]]) - } else { - valueArray[index] = UndefinedValue() - } - } - matchIndex := result[0] - if matchIndex != 0 { - matchIndex = 0 - // Find the rune index in the string, not the byte index - for index := 0; index < result[0]; { - _, size := utf8.DecodeRuneInString(target[index:]) - matchIndex += 1 - index += size - } - } - match := runtime.newArrayOf(valueArray) - match.defineProperty("input", toValue_string(target), 0111, false) - match.defineProperty("index", toValue_int(matchIndex), 0111, false) - return match -} |