Mac OS X >= 10.7 support
[runtime.git] / scripts / stripspaces.tcl
1 #! /usr/bin/tcl
2 #
3 #  stripspaces.tcl - strip trailing spaces from source files
4 #
5 #  Author: Giovanni Giacobbi <giovanni@giacobbi.net>
6 #
7 #  Copyright (C) 2002 - 2003 Giovanni Giacobbi
8 #
9 #  This program is free software; you can redistribute it and/or modify
10 #  it under the terms of the GNU General Public License as published by
11 #  the Free Software Foundation; version 2 of the License.
12 #
13 #  This program is distributed in the hope that it will be useful,
14 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #  GNU General Public License for more details.
17 #
18
19 # Global variables
20 set Targets ""
21 set Output ""
22
23 # Procedures
24 # ---
25 proc do_strip_main {in_file out_file} {
26   set lines 0
27   if {[catch {set fd [open "$in_file" r]} errtmp]} {return -1}
28   if {[catch {set fw [open "$out_file" w]} errtmp]} {return -1}
29
30   while {![eof $fd]} {
31     set str [string trimright [gets $fd]]
32     if {![eof $fd]} {
33       incr lines
34       puts $fw $str;
35     }
36   }
37
38   close $fd
39   close $fw
40   return $lines
41 }
42 proc parse_args {} {
43   global argc argv Targets Output
44
45   # unset this if we find a "--" argument
46   set argv_safe $argv
47   set parse_args 1
48   while {[llength $argv_safe] > 0} {
49     set this_arg [lvarpop argv_safe]
50     switch -exact -- $this_arg {
51       "-o" {
52         if {!$parse_args} {lappend Targets $this_arg; continue}
53         set next_arg [lvarpop argv_safe]
54         if {$next_arg == ""} {
55           puts stderr "Error: option requires an argument -- o"
56           puts stderr ""
57           exit 1
58         }
59         set Output $next_arg
60       }
61       "--" {
62         if {!$parse_args} {lappend Targets $this_arg; continue}
63         set parse_args 0
64       }
65       default {
66         lappend Targets $this_arg
67       }
68     }
69   }
70
71   return
72 }
73
74 # Main
75 # ---
76
77 # check what they gave us
78 parse_args
79
80 if {[llength $Targets] < 1} {
81   puts stderr "Usage: ./stripspaces.tcl \[-o output\] <file1> \[file2\] ..."
82   puts stderr ""
83   exit 1
84 }
85
86 if {([llength $Targets] > 1) && ($Output != "")} {
87   if {[file exists $Output]} {
88     if {![file isdirectory $Output]} {
89       puts stderr "Error: Specified multiple files but output target exists and is not a directory!"
90       puts stderr ""
91       exit 1
92     }
93   } else {
94     if {[catch {mkdir $Output} errtmp]} {
95       puts stderr "Error: Couldn't create directory \"$Output\""
96       puts stderr ""
97       exit 1
98     }
99   }
100 }
101
102 set done 0
103
104 foreach xfile $Targets {
105   if {![file readable $xfile]} {
106     puts stderr "Error: Cannot open file \"$xfile\" (skipped)."
107     continue
108   }
109
110   if {$Output == ""} {
111     set xoutput "$xfile.strip"
112   } elseif {[file isdirectory $Output]} {
113     set xoutput "$Output/$xfile.strip"
114   } else {
115     set xoutput $Output
116   }
117
118   puts stderr "Stripping trailing spaces from \"$xfile\" (output: \"$xoutput\")"
119   set ret [do_strip_main $xfile $xoutput]
120   if {$ret < 0} {
121     puts stderr "$xfile: Failed. Couldn't open the input/output filename."
122     puts stderr ""
123   } else {
124     puts stderr "File $xfile done. Parsed $ret lines."
125   }
126
127   incr done
128 }