You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.2 KiB
158 lines
4.2 KiB
-- --- T2-COPYRIGHT-NOTE-BEGIN --- |
|
-- This copyright note is auto-generated by ./scripts/Create-CopyPatch. |
|
-- |
|
-- T2 SDE: package/.../lua-pcre/string.lua |
|
-- Copyright (C) 2006 The T2 SDE Project |
|
-- Copyright (C) 2006 Juergen "George" Sawinski |
|
-- |
|
-- More information can be found in the files COPYING and README. |
|
-- |
|
-- This program is free software; you can redistribute it and/or modify |
|
-- it under the terms of the GNU General Public License as published by |
|
-- the Free Software Foundation; version 2 of the License. A copy of the |
|
-- GNU General Public License can be found in the file COPYING. |
|
-- --- T2-COPYRIGHT-NOTE-END --- |
|
|
|
require "@RX@" |
|
|
|
--[[ TODO ------------------------------------------------------------------- |
|
- describe string.{cflags,eflags} |
|
- gsub does not handle eflags |
|
--]] ------------------------------------------------------------------------ |
|
|
|
--[[ DESCRIPTION ------------------------------------------------------------ |
|
|
|
This file replaces the default string library routines "find", "gsub", |
|
"gmatch" with mostly similiarly behaving equivalents with regular |
|
expression syntax patterns. |
|
|
|
The original functions are stored in the "string.orig" table. |
|
|
|
Additional methods: |
|
|
|
string.study([<boolean>]) |
|
|
|
This function causes the string replacement functions to store the |
|
regular expression if the argument is empty or "true". The default |
|
compile and execution flags cannot be changed then, however. |
|
|
|
Supplying "false" as argument clears the regular expression store. |
|
|
|
string.cflags(...) |
|
|
|
string.eflags(...) |
|
|
|
--]] ------------------------------------------------------------------------ |
|
|
|
-- original string library functions |
|
string.orig = { |
|
find = string.find, |
|
gsub = string.gsub, |
|
gmatch = string.gmatch, |
|
} |
|
|
|
-- default compile and excuation flags |
|
local __default_flags__ = { |
|
compile = nil, |
|
execute = nil, |
|
} |
|
|
|
-- string.study ------------------------------------------------------------- |
|
local __study__ = nil |
|
|
|
local function study_regex_new(pattern) |
|
assert(__study__, "study_regex_new called outside study mode.") |
|
|
|
if not __study__[pattern] then |
|
__study__[pattern] = @RX@.new(pattern, __default_flags__.compile) |
|
end |
|
|
|
return __study__[pattern] |
|
end |
|
|
|
local function regex_new(pattern) |
|
return @RX@.new(pattern, __default_flags__.compile) |
|
end |
|
|
|
local RX = regex_new |
|
|
|
function string.study(what) |
|
if what == nil then what = true end |
|
|
|
if what then |
|
if not __study__ then __study__ = {} end |
|
RX = study_regex_new |
|
else |
|
if __study__ then |
|
for k,v in pairs(__study__) do |
|
v:__gc() |
|
end |
|
end |
|
|
|
__study__ = nil |
|
RX = regex_new |
|
end |
|
end |
|
|
|
-- string.cflags ------------------------------------------------------------ |
|
function string.cflags(...) |
|
if __study__ then error("unable to set compile flags in study mode") end |
|
|
|
__default_flags__.compile = @RX@.flags(arg) |
|
end |
|
|
|
-- string.cflags ------------------------------------------------------------ |
|
function string.eflags(...) |
|
if __study__ then error("unable to set execution flags in study mode") end |
|
|
|
__default_flags__.execute = @RX@.flags(arg) |
|
end |
|
|
|
-- string.find regex replacement -------------------------------------------- |
|
function string.find(str, pattern, start, plain) |
|
local idx_start, idx_end, capture |
|
|
|
if plain then |
|
return string.orig.find(s, pat, init, plain) |
|
end |
|
|
|
idx_start, idx_end, capture = |
|
RX(pattern):match(str, start, __default_flags__.execute) |
|
|
|
return idx_start,idx_end,unpack(capture) |
|
end |
|
|
|
-- string.gmatch regex replacement ------------------------------------------ |
|
|
|
-- simple result table iterator |
|
local function @RX@_next(t) |
|
if t then |
|
local row = t[1] |
|
table.remove(t, 1) |
|
|
|
if row then return unpack(row) end |
|
end |
|
end |
|
|
|
function string.gmatch(str, pattern) |
|
local t = {} -- table of result tables |
|
|
|
local function capture(str, sub) -- record results in t |
|
table.insert(t, sub) |
|
end |
|
|
|
-- execute regex |
|
RX(pattern):gmatch(str, capture, __default_flags__.execute) |
|
|
|
-- return our own simple iterator |
|
return @RX@_next, t |
|
end |
|
|
|
-- string.gsub regex replacement -------------------------------------------- |
|
function string.gsub(str, pat, repl, n) |
|
-- FIXME execution flags |
|
return generic_gsub(RX, str, pat, repl, n) |
|
end |
|
|
|
-- original lrexlib/gsub.lua: |
|
|
|
|