summaryrefslogtreecommitdiff
path: root/scripts/context/lua/mtx-grep.lua
blob: 18e36d2ea413d1f37a531a94f0a9bac7b396b7af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
if not modules then modules = { } end modules ['mtx-babel'] = {
    version   = 1.001,
    comment   = "companion to mtxrun.lua",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

scripts      = scripts      or { }
scripts.grep = scripts.grep or { }

banner = banner .. " | simple grepper "

function scripts.grep.find(pattern, files, offset)
    if pattern and pattern ~= "" then
        local format = string.format
        input.starttiming(scripts.grep)
        local count, nofmatches, noffiles, nofmatchedfiles = environment.argument("count"), 0, 0, 0
        local function grep(name)
            local data = io.loaddata(name)
            if data then
                noffiles = noffiles + 1
                local n, m = 0, 0
                for line in data:gmatch("[^\n]+") do -- faster than loop over lines
                    n = n + 1
                    if line:find(pattern) then
                        m = m + 1
                        if not count then
                            input.log(format("%s %s: %s",name,n,line))
                            io.flush()
                        end
                    end
                end
                if count and m > 0 then
                    nofmatches = nofmatches + m
                    nofmatchedfiles = nofmatchedfiles + 1
                    input.log(format("%s: %s",name,m))
                    io.flush()
                end
            end
        end
--~         for i=offset or 1, #files do
--~             local filename = files[i]
--~             if filename:find("%*") then
--~                 for _, name in ipairs(dir.glob(filename)) do
--~                     grep(name)
--~                 end
--~             else
--~                 grep(filename)
--~             end
--~         end
        for i=offset or 1, #files do
            for _, name in ipairs(dir.glob(files[i])) do
                grep(name)
            end
        end
        input.stoptiming(scripts.grep)
        if count and nofmatches > 0 then
            input.log(format("\nfiles: %s, matches: %s, matched files: %s, runtime: %0.3f seconds",noffiles,nofmatches,nofmatchedfiles,input.loadtime(scripts.grep)))
        end
    end
end

messages.help = [[
--pattern             search for pattern (optional)
--count               count matches only
]]

input.verbose = true

local pattern = environment.argument("pattern")
local files   = environment.files and #environment.files > 0 and environment.files

if pattern and files then
    scripts.grep.find(pattern, files)
elseif files then
    scripts.grep.find(files[1], files, 2)
else
    input.help(banner,messages.help)
end