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
  
81
  
82
  
83
  
84
  
85
  
86
  
87
  
88
  
89
  
90
  
91
  
92
  
93
  
94
  
95
  
#! /usr/bin/env pike 
// -*- pike -*- $Id: rsif,v 1.8 2002/04/21 16:23:21 nilsson Exp $ 
 
string version = ("$Revision: 1.8 $"/" ")[1]; 
int verbosity = 1; // more output 
int overwrite = 1; // no backups 
 
constant usage = #"rsif [options] <from> <to> <files> 
 
rsif (\"replace string in file\") replaces all occurrences of the string 
<from> with the string <to> in listed files. The name of the files that 
were changed are written to stdout. Available options: 
 
  -b, --backups   Saves the unaltered file in <filename>~ 
  -v, --verbose   Writes more junk to stderr. 
  -q, --quiet     Writes no output at all. 
  -V, --version   Writes the version number of rsif. 
  -h, --help      Shows this help message.\n"; 
 
int main(int argc, array(string) argv) 
{ 
  foreach(Getopt.find_all_options(argv, ({ 
    ({ "backup",     Getopt.NO_ARG,       "-b,--backup"/"," }), 
    ({ "verbose",    Getopt.NO_ARG,       "-v,--verbose"/"," }), 
    ({ "version",    Getopt.NO_ARG,       "-V,--version"/"," }), 
    ({ "quiet",      Getopt.NO_ARG,       "-q,--quiet"/"," }), 
    ({ "help",       Getopt.NO_ARG,       "-h,--help"/"," }) })), array opt) 
    switch(opt[0]) 
    { 
      case "backup": 
        overwrite = 0; 
        break; 
      case "verbose": 
        verbosity++; 
        break; 
      case "version": 
        write(version + "\n"); 
        return 0; 
      case "quiet": 
        verbosity = 0; 
        break; 
      case "help": 
        write(usage); 
        return 0; 
    } 
  argv = Getopt.get_args(argv); 
 
  if(4 > (argc = sizeof(argv))) { 
    werror(usage); 
    return 1; 
  } 
 
  string from = argv[1], to = argv[2], file; 
  if(argc == 4 && argv[-1] == "-") 
  { 
    if(file = Stdio.stdin.read()) 
    { 
      if(has_value(file, argv[1])) 
      { 
        if(verbosity > 1) 
          werror("Processing stdin.\n"); 
        write(replace(file, argv[1], argv[2])); 
      } else 
        write(file); 
    } 
    return 0; 
  } 
 
  int failures, mode; 
  if(verbosity > 1) 
    werror("Replaced strings in these files:\n"); 
  foreach(argv[3..], string filename) 
  { 
    if(file = Stdio.read_file(filename)) 
    { 
      if(has_value(file, argv[1])) 
      { 
        if(verbosity > 0) 
          write("%s\n", filename); 
        file = replace(file, argv[1], argv[2]); 
        mode = file_stat(filename)->mode; 
        if(overwrite || mv(filename, filename + "~")) 
          failures += !Stdio.write_file(filename, file, mode); 
        else 
        { 
          werror("Failed to create backup file.\n"); 
          failures++; 
        } 
      } 
    } 
  } 
  return failures; 
}