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

-- --- 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: