Retro68/prepare-headers.sh
2019-08-18 13:21:00 +02:00

174 lines
4.1 KiB
Bash

IN="$1"
OUT="$2"
# Make Mac OS X's tr and sed not complain that the files are not UTF-8
export LC_ALL=C
for file in $(cd "$IN"; ls *.h); do
# Filter by file names.
# Some CIncludes packages include the MPW standard library.
# Header files from that standard library would overwrite
# newlib header files and stop things from working.
case $file in
# Apple/MPW standard library internals
*Def.h|FSpio.h)
USE=false
;;
# whitelist all uppercase headers
[A-Z]*.h)
USE=true
;;
# whitelist OpenTransport
cred.h|dlpi.h|miioccom.h|mistream.h|modnames.h)
USE=true
;;
# whitelist OpenTransport (continued)
strlog.h|stropts.h|strstat.h|tihdr.h)
USE=true
;;
# Non-standard floating point headers that don't conflict
ddrt.h|fp.h)
USE=true
;;
# newlib does not provide fenv.h, so use Apple's
fenv.h)
USE=true
;;
# veclib headers
v*.h)
USE=true
;;
# unsupported: intrinsics.h perf.h
# all other (lowercase) headers: conflict with GCC or newlib headers
*)
USE=false
;;
esac
if [ $USE = true ]; then
sed 's/\r$//' < "$IN/$file" | tr '\r' '\n' > "$OUT/$file"
fi
done
############################# ConditionalMacros.h #############################
cat > "$OUT/ConditionalMacros.h" <<END_MARKER
#ifndef __CONDITIONALMACROS__WRAP__
#define __CONDITIONALMACROS__WRAP__
#if #cpu(powerpc)
#define TARGET_CPU_PPC 1
#define TARGET_OS_MAC 1
#define TARGET_RT_MAC_CFM 1
#define TARGET_RT_MAC_MACHO 0
#else
#define TARGET_CPU_68K 1
#define TARGET_OS_MAC 1
#define TARGET_RT_MAC_CFM 0
#define TARGET_RT_MAC_MACHO 0
#endif
#define PRAGMA_STRUCT_PACKPUSH 1
#define FUNCTION_PASCAL 1
#define TYPE_LONGLONG 1
#ifdef __cplusplus
#define TYPE_BOOL 1
#endif
#define __DEBUGGING__ /* HACK: Disable Debugging.h because its vdprintf conflicts with stdio.h */
END_MARKER
sed 's/\r$//' < "$IN/ConditionalMacros.h" | tr '\r' '\n' | sed 's/__GNUC__/__GNUC_DISABLED__/g' >> "$OUT/ConditionalMacros.h"
cat >> "$OUT/ConditionalMacros.h" <<END_MARKER
#endif /* __CONDITIONALMACROS__WRAP__ */
END_MARKER
############################# fp.h #############################
if [ -r "$IN/fp.h" ]; then
cat > "$OUT/fp.h" <<END_MARKER
#ifndef __FP__WRAP__
#define __FP__WRAP__
#include "math.h"
#pragma push_macro("__MWERKS__")
#define __MWERKS__ 0x6666
#define __cmath__
short relation(double x, double y);
END_MARKER
sed 's/\r$//' < $IN/fp.h | tr '\r' '\n' >> $OUT/fp.h
cat >> $OUT/fp.h <<END_MARKER
#pragma pop_macro("__MWERKS__")
#undef __cmath__
#endif /* __FP__WRAP__ */
END_MARKER
fi
############################# MixedMode.h #############################
sed 's/\r$//' < "$IN/MixedMode.h" | tr '\r' '\n' | sed 's/Opaque\#\#name\#\#\*/Opaque\#\#name \*/g' > "$OUT/MixedMode.h"
############################# CGBase.h #############################
if [ -r "$IN/CGBase.h" ]; then
cat > "$OUT/CGBase.h" <<END_MARKER
#ifndef __CGBASE__WRAP__
#define __CGBASE__WRAP__
#include <math.h>
#include <sys/types.h>
/* CGBase contains a hardcoded #ifdef that decides that stdint.h is available in MWERKS > 0x2300.
... otherwise, it contains an incompatible redefinition. */
#pragma push_macro("__MWERKS__")
#define __MWERKS__ 0x6666
#define u_int32_t __cgbase_incompatible_u_int32_t
END_MARKER
sed 's/\r$//' < "$IN/CGBase.h" | tr '\r' '\n' >> "$OUT/CGBase.h"
cat >> "$OUT/CGBase.h" <<END_MARKER
#undef u_int32_t __cgbase_incompatible_u_int32_t
#pragma pop_macro("__MWERKS__")
#endif /* __CGBASE__WRAP__ */
END_MARKER
fi
for f in Types.h Memory.h Windows.h Errors.h; do
if [ ! -r "$IN/$f" ]; then
echo "#include \"Mac$f\"" > "$OUT/$f"
elif [ ! -r "$IN/Mac$f" ]; then
echo "#include \"$f\"" > "$OUT/Mac$f"
fi
done
if [ -d "$IN/CoreFoundation" ]; then
mkdir -p "$OUT/CoreFoundation"
for file in $(cd "$IN"; ls CoreFoundation/*.h); do
sed 's/\r$//' < "$IN/$file" | tr '\r' '\n' > "$OUT/$file"
done
fi