summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/deps/mruby-onig-regexp/mrblib/onig_regexp.rb
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--web/server/h2o/libh2o/deps/mruby-onig-regexp/mrblib/onig_regexp.rb140
1 files changed, 140 insertions, 0 deletions
diff --git a/web/server/h2o/libh2o/deps/mruby-onig-regexp/mrblib/onig_regexp.rb b/web/server/h2o/libh2o/deps/mruby-onig-regexp/mrblib/onig_regexp.rb
new file mode 100644
index 00000000..2dc8d55e
--- /dev/null
+++ b/web/server/h2o/libh2o/deps/mruby-onig-regexp/mrblib/onig_regexp.rb
@@ -0,0 +1,140 @@
+class OnigRegexp
+ @memo = {}
+
+ # ISO 15.2.15.6.1
+ def self.compile(*args)
+ as = args.to_s
+ unless @memo.key? as
+ @memo[as] = self.new(*args)
+ end
+ @memo[as]
+ end
+
+ # ISO 15.2.15.6.3
+ def self.last_match
+ @last_match
+ end
+
+ # ISO 15.2.15.7.2
+ def initialize_copy(other)
+ initialize(other.source, other.options)
+ end
+
+ # ISO 15.2.15.7.4
+ def ===(str)
+ not self.match(str).nil?
+ end
+
+ # ISO 15.2.15.7.5
+ def =~(str)
+ m = self.match(str)
+ m ? m.begin(0) : nil
+ end
+
+ # ISO 15.2.15.7.8
+ attr_reader :source
+end
+
+class String
+ # ISO 15.2.10.5.5
+ def =~(a)
+ begin
+ (a.class.to_s == 'String' ? Regexp.new(a.to_s) : a) =~ self
+ rescue
+ false
+ end
+ end
+
+ # redefine methods with oniguruma regexp version
+ [:sub, :gsub, :split, :scan].each do |v|
+ alias_method "string_#{v}".to_sym, v
+ alias_method v, "onig_regexp_#{v}".to_sym
+ end
+
+ alias_method :old_slice, :slice
+ alias_method :old_square_brancket, :[]
+
+ def [](*args)
+ return old_square_brancket(*args) unless args[0].class == Regexp
+
+ if args.size == 2
+ match = args[0].match(self)
+ if match
+ if args[1] == 0
+ str = match[0]
+ else
+ str = match.captures[args[1] - 1]
+ end
+ return str
+ end
+ end
+
+ match_data = args[0].match(self)
+ if match_data
+ result = match_data.to_s
+ return result
+ end
+ end
+
+ alias_method :slice, :[]
+
+ def slice!(*args)
+ if args.size < 2
+ result = slice(*args)
+ nth = args[0]
+
+ if nth.class == Regexp
+ lm = Regexp.last_match
+ self[nth] = '' if result
+ Regexp.last_match = lm
+ else
+ self[nth] = '' if result
+ end
+ else
+ result = slice(*args)
+
+ nth = args[0]
+ len = args[1]
+
+ if nth.class == Regexp
+ lm = Regexp.last_match
+ self[nth, len] = '' if result
+ Regexp.last_match = lm
+ else
+ self[nth, len] = '' if result && nth != self.size
+ end
+ end
+
+ result
+ end
+
+ alias_method :old_index, :index
+
+ def index(pattern, pos=0)
+ if pattern.class == Regexp
+ str = self[pos..-1]
+ if str
+ if num = (pattern =~ str)
+ if pos < 0
+ num += self.size
+ end
+ return num + pos
+ end
+ end
+ nil
+ else
+ self.old_index(pattern, pos)
+ end
+ end
+end
+
+module Kernel
+ def =~(_)
+ nil
+ end
+end
+
+Regexp = OnigRegexp unless Object.const_defined?(:Regexp)
+MatchData = OnigMatchData unless Object.const_defined? :MatchData
+
+# This is based on https://github.com/masamitsu-murase/mruby-hs-regexp