<?php
const CAN_BIN = "java -jar /home/azq2/.bin/can.jar -nopc";
static $imported_class = array(
"java/io/" => "",
"java/lang/" => ""
);
static $short_to_long_type = array(
"B" => "byte",
"C" => "char",
"D" => "double",
"F" => "float",
"I" => "int",
"J" => "long",
"S" => "short",
"Z" => "boolean",
"V" => "void",
);
$action = "install_wprappers";
if ($action == "get_wrapper") {
$file = "/home/azq2/dev/j2me/api/javax/microedition/io/Connector.class";
$code = shell_exec(CAN_BIN." ".escapeshellarg($file));
if (!preg_match("#\.class .*? ([^\s]+)#", $code, $class) > 0 && !preg_match("#\.class ([^\s]+)#", $code, $class) > 0) {
echo $code;
die("not class! :(\n");
}
$class = $class[1];
$wrap_class_ns = "hooks";
$wrap_class_name = str_replace("/", "_", $class);
$class_data = "";
$class_data .= "package $wrap_class_ns;\n";
foreach ($imported_class as $cl => $v)
$class_data .= "import ".str_replace("/", ".", $cl)."*;\n";
$class_data .= "\n";
$class_data .= "public class $wrap_class_name {\n";
$orig_class = str_replace("/", ".", strtr($class, $imported_class));
$matched = preg_match_all("#\.method([^\(]+) ([^\(]+)\(([^\s\)]*)\)([^\s]+)(.*?)\.end method#si", $code, $methods);
for ($i = 0; $i < $matched; ++$i) {
$attrs = explode(" ", trim($methods[1][$i]));
if (in_array("asbtract", $attrs) || in_array("private", $attrs) || $methods[2][$i][0] == "<")
continue;
$throws = "";
if (preg_match_all("#\.throws ([^\s]+)#si", $code, $throws) > 0) {
$throws[1] = array_unique($throws[1]);
$throws = "throws ".str_replace("/", ".", strtr(implode(", ", $throws[1]), $imported_class));
} else
$throws = "";
if (in_array("static", $attrs)) {
$class_data .= "\tpublic static ".get_type($methods[4][$i])." ".$methods[2][$i]."(".implode(", ", parse_types($methods[3][$i])).") $throws {\n";
$class_data .= "\t\t".($methods[4][$i] != "V" ? "return" : "")." $orig_class.".$methods[2][$i]."(".implode(", ", parse_types($methods[3][$i], 1)).");\n";
$class_data .= "\t}\n\n";
} else {
$args = "L$class;".$methods[3][$i];
$class_data .= "\tpublic static ".get_type($methods[4][$i])." ".$methods[2][$i]."(".implode(", ", parse_types($args)).") $throws {\n";
$class_data .= "\t\t".($methods[4][$i] != "V" ? "return" : "")." v0.".$methods[2][$i]."(".implode(", ", parse_types($methods[3][$i], 1, 1)).");\n";
$class_data .= "\t}\n\n";
}
}
$class_data .= "}\n";
echo $class_data;
$root = "/home/azq2/проекты/j2me/nr";
`mkdir -p "$root/$wrap_class_ns/"`;
file_put_contents("$root/$wrap_class_ns/$wrap_class_name.java", $class_data);
} elseif ($action == "install_wprappers") {
$files = glob("src/*.j");
$methods_override = array(
"java/io/DataInputStream" => true,
"java/io/DataOutputStream" => true,
"java/io/RandomAccessFile" => true,
"javax/microedition/io/Connector" => true,
"java/io/RandomAccessFile" => true,
);
$methods = array();
foreach ($files as $f) {
$data = file_get_contents($f);
$data = preg_replace_callback("#(invokestatic|invokespecial|invokevirtual)\s+([^\s]+)/([^\s\(]+)\(([^\s\(\)]*)\)([^\s]+)\n#si", function ($m) {
global $methods_override, $methods;
// echo "| ".$m[1]." | ".$m[2]." | ".$m[3]." | ".$m[4]." | ".$m[5]." |\n";
$method = " (".$m[1].") ".($m[1] == 'invokestatic' ? 'static ' : '').get_type($m[5])." ".
str_replace("/", ".", $m[2]).".".$m[3]."(".implode(", ", parse_types($m[4])).")";
if (isset($methods_override[$m[2]])) {
if ($m[1] == 'invokevirtual') {
$wrap_class = "hooks/".str_replace("/", "_", $m[2]);
return
"\n\n".
"; ".trim($m[0])."\n".
"invokestatic ".$wrap_class."/".$m[3]."(L".$m[2].";".$m[4].")".$m[5].
"\n\n";
} elseif ($m[1] == 'invokestatic') {
$wrap_class = "hooks/".str_replace("/", "_", $m[2]);
return
"\n\n".
"; ".trim($m[0])."\n".
"invokestatic ".$wrap_class."/".$m[3]."(".$m[4].")".$m[5].
"\n\n";
}
if (isset($methods[$method]))
++$methods[$method];
else
$methods[$method] = 1;
echo " ".$m[1]." \n";
}
return $m[0];
}, $data);
file_put_contents("src_gen/".basename($f), $data);
}
foreach ($methods as $m => $n)
echo "$n | $m\n";
}
//echo implode("\n", array_keys($methods));
// B, C, D, F, I, J, S, and Z. In the return type of a method we also allow V
function parse_types($types, $mode = 0, $arg_n = 0) {
global $short_to_long_type, $imported_class;
$is_array = false;
$len = strlen($types);
$arr = array();
for ($i = 0; $i < $len; ++$i) {
if ($types[$i] == '[') {
$is_array = true;
++$i;
}
if ($types[$i] == 'L') {
$end = strpos($types, ';', $i) ;
$type_name = str_replace("/", ".", strtr(substr($types, $i + 1, $end - ($i + 1)), $imported_class)).($is_array ? "[]" : "");
$var_name = "v".($arg_n++);
$i = $end;
} elseif (isset($short_to_long_type[$types[$i]])) {
$type_name = $short_to_long_type[$types[$i]].($is_array ? "[]" : "");
$var_name = "v".($arg_n++);
} else
die(" O_O ");
if ($mode == 0)
$arr[] = "$type_name $var_name";
elseif ($mode == 1)
$arr[] = $var_name;
elseif ($mode == 2)
$arr[] = $type_name;
$is_array = false;
}
return $arr;
}
function get_type($type) {
global $short_to_long_type, $imported_class;
if (!strlen($type))
return "";
$i = 0;
$is_array = false;
if ($type[$i] == '[') {
$is_array = true;
++$i;
}
if ($type[$i] == 'L') {
$end = strpos($type, ';', $i) ;
return str_replace("/", ".", strtr(substr($type, $i + 1, $end - ($i + 1)), $imported_class)).($is_array ? "[]" : "");
} elseif (isset($short_to_long_type[$type[$i]]))
return $short_to_long_type[$type[$i]].($is_array ? "[]" : "");
else
die(" O_O ");
}