#!/bin/bash set -eu pipefail function java_to_class () { while read line; do echo "${line%.java}.class" done } function rename_class_files () { while read line; do local name="${line//\$/_}" if [ ! "$name" = "$line" ]; then mv "$line" "$name" fi done } function classpath_mk () { echo -n "CLASS_PATH =" > classpath.mk while read line; do local name="${line//\$/\$\$}" echo " \\" >> classpath.mk printf "\t${name}.o" >> classpath.mk done echo >> classpath.mk } function classpath_inc_c () { truncate -s0 c/classpath.inc.c while read line; do local name0="${line//\//_}" local name1="${name0//$/_}" local name="${name1//./_}" echo "(const uint8_t *)&_binary_${name}_start," >> c/classpath.inc.c done } function make_header () { while read line; do truncate -s0 "${line}.h" local name0="${line//\//_}" local name1="${name0//$/_}" local name="${name1//./_}" echo '#pragma once' > "${line}.h" echo '' >> "${line}.h" echo '#include ' >> "${line}.h" echo '' >> "${line}.h" echo '#ifdef __cplusplus' >> "${line}.h" echo 'extern C {' >> "${line}.h" echo '#endif' >> "${line}.h" echo '' >> "${line}.h" echo "extern uint32_t _binary_${name}_start __asm(\"_binary_${name}_start\");" >> "${line}.h" echo "extern uint32_t _binary_${name}_end __asm(\"_binary_${name}_end\");" >> "${line}.h" echo "extern uint32_t _binary_${name}_size __asm(\"_binary_${name}_size\");" >> "${line}.h" echo '' >> "${line}.h" echo '#ifdef __cplusplus' >> "${line}.h" echo '}' >> "${line}.h" echo '#endif' >> "${line}.h" done } function classpath_h () { truncate -s0 c/classpath.h while read line; do echo "#include \"$line.h\"" >> c/classpath.h done } declare -a boot_classes=( example/GdromTest.class example/GdromDirectoryRecordHandler.class filesystem/iso9660/ByteParser.class filesystem/iso9660/DirectoryRecord.class filesystem/iso9660/ExtentReader.class filesystem/iso9660/PrimaryVolumeDescriptor.class filesystem/iso9660/VolumeParser.class java/io/PrintStream.class java/lang/DecimalDigits.class java/lang/Integer.class java/lang/Object.class java/lang/String.class java/lang/System.class java/misc/Memory.class sega/dreamcast/gdrom/G1IF.class sega/dreamcast/gdrom/GdromIF.class sega/dreamcast/gdrom/GdromBits.class sega/dreamcast/gdrom/Gdrom.class sega/dreamcast/gdrom/GdromExtentReader.class sega/dreamcast/gdrom/GdromCommandPacketFormat_cd_read.class sega/dreamcast/gdrom/GdromCommandPacketFormat.class sega/dreamcast/gdrom/GdromCommandPacketFormat_get_toc.class sega/dreamcast/gdrom/GdromCommandPacketInterface.class sega/dreamcast/gdrom/GdromProtocol.class jvm/internal/Loader.class ) function boot_classes () { local length=${#boot_classes[@]} for ((i=0;i classes.txt application_classes | sort >> classes.txt