rename optimizer.py to agsoptimize
[rofl0r-agsutils.git] / inject_all.sh
blobe1cb0b1a01a13f4fc1df39675e6b030398f9c54d
1 #!/bin/sh
2 BINDIR=$(dirname $(readlink -f "$0"))
4 usage() {
5 echo "usage: $0 [-or] gamefilesdir objdir"
6 echo "injects all gamescripts into game28.dta"
7 echo "and all roomscripts into the resp. crm file"
8 echo "if -r is given, the files will be recompiled first"
9 echo "if -o is given, the optimizer will be run first (activates -r)"
10 exit 1
13 OPTIMIZER="$BINDIR"/agsoptimize
14 do_optimize_real() {
15 echo "optimizing $1..."
16 tmp=ags.optimizer.tmp.$$
17 for opt in -cmp -pushpop -sourceline -lnl -ll -cmp2 -axmar -mrswap ; do
18 $OPTIMIZER $opt < "$1" > $tmp
19 test "$?" = 0 && mv $tmp "$1"
20 done
22 do_recompile_real() {
23 $BINDIR/agssemble "$1"
26 do_inject_real() {
27 "$BINDIR"/agsinject "$1" "$2" "$3"
30 do_optimize() {
31 $have_jobflow && printf "%s\n" "$1">&3 || do_optimize_real "$1"
33 do_recompile() {
34 $have_jobflow && printf "%s\n" "$1">&3 || do_recompile_real "$1"
36 do_inject() {
37 $have_jobflow && printf "%s:%s:%s\n" "$1" "$2" "$3">&3 \
38 || do_inject_real "$1" "$2" "$3"
41 test "$1" = --jfoptimize && {
42 do_optimize_real "$2"
43 exit $?
45 test "$1" = --jfrecompile && {
46 do_recompile_real "$2"
47 exit $?
49 test "$1" = --jfinject && {
50 arg1=$(printf "%s\n" "$2"|cut -d : -f 1)
51 arg2=$(printf "%s\n" "$2"|cut -d : -f 2)
52 arg3=$(printf "%s\n" "$2"|cut -d : -f 3)
53 do_inject_real "$arg1" "$arg2" "$arg3"
54 exit $?
57 have_jobflow=false
58 type jobflow >/dev/null 2>&1 && have_jobflow=true
60 optimize=false
61 recompile=false
62 inject=true
64 while getopts o name ; do
65 case $name in
66 o) optimize=true ; recompile=true ;;
67 r) recompile=true ;;
68 ?) usage ;;
69 esac
70 done
71 shift $(($OPTIND - 1))
73 GAMEFILESDIR="$1"
74 OBJDIR="$2"
76 test -z "$OBJDIR" && usage
78 test -d "$OBJDIR" || {
79 echo "error: objdir $OBJDIR not a directory" >&2
80 exit 1
83 test -e "$GAMEFILESDIR"/game28.dta || {
84 echo "error: "$GAMEFILESDIR"/game28.dta not found"
85 exit 1
88 iterate_files() {
89 cnt=0
90 for i in globalscript dialogscript ; do
91 $optimize && test -e "$OBJDIR"/"$i".s && do_optimize "$OBJDIR"/"$i".s
92 $recompile && test -e "$OBJDIR"/"$i".s && do_recompile "$OBJDIR"/"$i".s
93 $inject && {
94 test -e "$OBJDIR"/"$i".o || { echo "skipping $i" ; continue ; }
95 do_inject $cnt "$OBJDIR"/"$i".o "$GAMEFILESDIR"/game28.dta
97 cnt=$(($cnt + 1))
98 done
99 for i in 0 `seq 9999` ; do
100 i=gamescript"$i"
101 $optimize && test -e "$OBJDIR"/"$i".s && do_optimize "$OBJDIR"/"$i".s
102 $recompile && test -e "$OBJDIR"/"$i".s && do_recompile "$OBJDIR"/"$i".s
103 $inject && {
104 test -e "$OBJDIR"/"$i".o || break
105 do_inject $cnt "$OBJDIR"/"$i".o "$GAMEFILESDIR"/game28.dta
107 cnt=$(($cnt + 1))
108 done
109 for i in `seq 9999` ; do
110 i=room"$i"
111 $optimize && test -e "$OBJDIR"/"$i".s && do_optimize "$OBJDIR"/"$i".s
112 $recompile && test -e "$OBJDIR"/"$i".s && do_recompile "$OBJDIR"/"$i".s
113 $inject && {
114 test -e "$OBJDIR"/"$i".o && \
115 do_inject 0 "$OBJDIR"/"$i".o "$GAMEFILESDIR"/"$i".crm
117 done
120 setup_pipe() {
121 fd=$1
122 node="$(mktemp -u)" || exit 1
123 mkfifo -m0600 "$node" || exit 1
124 eval "exec $fd<> $node"
125 rm "$node"
128 jobflow_iterate() {
129 setup_pipe 3
130 jobflow -threads=$JOBS -eof=EOF -exec sh $0 "$1" {} <&3 &
131 jfpid=$!
132 iterate_files
133 echo EOF>&3
134 exec 3<&-
135 wait $jfpid
138 JOBS=8
139 if ! $have_jobflow ; then
140 iterate_files
141 else
142 echo "executing in parallel with jobflow"
143 trap "exit" INT TERM
144 trap "kill 0" EXIT
145 save_optimize=$optimize
146 save_recompile=$recompile
147 save_inject=$inject
148 optimize=false
149 recompile=false
150 inject=false
151 if $save_optimize ; then
152 optimize=true
153 jobflow_iterate --jfoptimize
154 optimize=false
156 if $save_recompile ; then
157 recompile=true
158 jobflow_iterate --jfrecompile
159 recompile=false
161 if $save_inject ; then
162 inject=true
163 # fixme: injections into game28.dta need to be sequential
164 # only room injections can be done in parallel
165 JOBS=1
166 jobflow_iterate --jfinject