aboutsummaryrefslogtreecommitdiff
path: root/tools/replace.nom
blob: 3ce2411f77f80f0add0294dee6a7e75a8d96aeac (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
#!/usr/bin/env nomsu -V4.12.12.8
#
    Tool to find and replace one tree with another.
    nomsu tools/replace.nom [-i] tree_to_replace replacement file1 file2 directory1 ...
    If "-i" is the first argument, replacements will be performed in-place. Otherwise, the
    upgraded code will be printed.
    
use "lib/os.nom"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

barf "Deprecated."
if ((size of %args.extra_args) < 3):
    say "Usage: nomsu tools/replace.nom [-i] tree_to_replace replacement files..."
    lua> "os.exit(1)"
%pattern = (%args.extra_args.1 parsed)
%replacement = (%args.extra_args.2 parsed)
for %filename in %args.extra_args at %i:
    if (%i < 3):
        do next %i
    %file = (read file %filename)
    unless %file:
        barf "File does not exist: \%filename"
    %nomsu = (NomsuCode from (Source %filename 1 (size of %file)) %file)
    %tree = (%nomsu parsed)
    
    # TODO: fix this to use variable substitution
    %tree2 = (%tree::map (for %subtree: if (%subtree == %pattern): return %replacement))
    if (%tree2 == %tree):
        say "No changes in \%filename"
        do next %filename
    %text = ((%tree2 as nomsu)::text)
    when:
        %args."-i":
            say "Replaced in \%filename"
            write %text to file %filename
        
        else:
            say %text