]> git.saurik.com Git - cycript.git/blobdiff - trampoline.sh
Cycript's lexer does not need to be "interactive".
[cycript.git] / trampoline.sh
index 81ac2ce7afdc50b48e83a5bb763380b097bcd8dd..97e078a40a4e514ee20deb74a5304370f8b31623 100755 (executable)
@@ -1,34 +1,59 @@
-#!/bin/bash
-
-shopt -s extglob
+#!/usr/bin/env bash
+
+# Cycript - Optimizing JavaScript Compiler/Runtime
+# Copyright (C) 2009-2013  Jay Freeman (saurik)
+
+# GNU General Public License, Version 3 {{{
+#
+# Cycript is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation, either version 3 of the License,
+# or (at your option) any later version.
+#
+# Cycript is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Cycript.  If not, see <http://www.gnu.org/licenses/>.
+# }}}
+
+set -e
 
 hpp=$1
 object=$2
 name=$3
 sed=$4
-otool=$5
-lipo=$6
-nm=$7
-shift 7
-
-#shift 1
-#set /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -I/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.3.sdk/usr/include "$@"
+lipo=$5
+nm=$6
+otool=$7
 
-"$@"
+exec >"${hpp}"
 
-detailed=$(lipo -detailed_info "${object}")
+detailed=$("${lipo}" -detailed_info "${object}")
 
-{
+regex=$'\nNon-fat file: .* is architecture: (.*)'
+if [[ ${detailed} =~ ${regex} ]]; then
+    archs=(${BASH_REMATCH[1]})
+    unset detailed
+else
+    archs=($(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architecture //; p; }; d;'))
+fi
 
 echo '#include "Trampoline.hpp"'
 
-for arch in $(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architecture //; p; }; d;'); do
-    offset=$(echo "${detailed}" | "${sed}" -e '
-        /^architecture / { x; s/.*/0/; x; };
-        /^architecture '${arch}'$/ { x; s/.*/1/; x; };
-        x; /^1$/ { x; /^ *offset / { s/^ *offset //; p; }; x; }; x;
-        d;
-    ')
+for arch in "${archs[@]}"; do
+    if [[ "${detailed+@}" ]]; then
+        offset=$(echo "${detailed}" | "${sed}" -e '
+            /^architecture / { x; s/.*/0/; x; };
+            /^architecture '${arch}'$/ { x; s/.*/1/; x; };
+            x; /^1$/ { x; /^ *offset / { s/^ *offset //; p; }; x; }; x;
+            d;
+        ')
+    else
+        offset=0
+    fi
 
     file=($("${otool}" -arch "${arch}" -l "${object}" | "${sed}" -e '
         x; /^1$/ { x;
@@ -37,7 +62,7 @@ for arch in $(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architectu
         x; }; x;
 
         /^ *cmd LC_SEGMENT/ { x; s/.*/1/; x; };
-        
+
         d;
     '))
 
@@ -47,12 +72,12 @@ for arch in $(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architectu
     echo
     echo "static const char ${name}_${arch}_data_[] = {"
 
-    od -v -t x1 -t c -j "$((offset + fileoff))" -N "${filesize}" "${object}" | "${sed}" -e '
+    LANG=C od -v -t x1 -t c -j "$((offset + fileoff))" -N "${filesize}" "${object}" | "${sed}" -e '
         /^[0-7]/ ! {
             s@^        @//  @;
             s/\(....\)/ \1/g;
             s@^ // @//@;
-            s/ *$//;
+            s/ *$/,/;
         };
 
         /^[0-7]/ {
@@ -76,17 +101,14 @@ for arch in $(echo "${detailed}" | "${sed}" -e '/^architecture / { s/^architectu
 
     echo
     echo "/*"
-    "${otool}" -vVt -arch "${arch}" "${object}"
+    "${otool}" -arch "${arch}" -vVt "${object}"
     echo "*/"
 
     echo
-    echo "static Trampoline ${name}_${arch}_ = {"
+    echo "_disused static Trampoline ${name}_${arch}_ = {"
     echo "    ${name}_${arch}_data_,"
     echo "    sizeof(${name}_${arch}_data_),"
     echo "    ${name}_${arch}_entry_,"
     echo "};"
-done
-
-} >"${hpp}"
 
-#rm -f "${object}"
+done