]> git.saurik.com Git - cycript.git/blob - Filter.sh
Avoid crashing when the user types a mismatched }.
[cycript.git] / Filter.sh
1 #!/usr/bin/env bash
2
3 # Cycript - Optimizing JavaScript Compiler/Runtime
4 # Copyright (C) 2009-2015 Jay Freeman (saurik)
5
6 # GNU Affero General Public License, Version 3 {{{
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU Affero General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
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 Affero General Public License for more details.
17 #
18 # You should have received a copy of the GNU Affero General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 # }}}
21
22 file=$1
23 shift
24
25 filters=("$@")
26
27 function include() {
28 file=$1
29 shift
30
31 dir=/${file}
32 dir=${dir%/*}
33 dir=${dir:-/.}
34 dir=${dir#/}
35 dir=${dir}/
36
37 while IFS= read -r line; do
38 if false; then :
39 elif [[ ${line} = @if* ]]; then
40 line=${line#@if }
41 for name in "${filters[@]}"; do
42 if [[ ${line} = ${name}' '* ]]; then
43 echo "${line#${name} }"
44 fi
45 done
46 elif [[ ${line} = @begin* ]]; then
47 set ${line}; shift
48 filter=
49 for name in "${filters[@]}"; do
50 for side in "$@"; do
51 if [[ ${name} == ${side} ]]; then
52 unset filter
53 fi
54 done
55 done
56 elif [[ ${line} = @end ]]; then
57 unset filter
58 elif [[ ${line} = @include* ]]; then
59 line=${line#@include }
60 include "${dir}${line}"
61 elif [[ -z ${filter+@} ]]; then
62 echo "${line}"
63 fi
64 done <"${file}"
65 }
66
67 include "${file}"