From 290058189dbccd2e549cc57e2f7ea388b424e26e Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Tue, 15 Aug 2023 11:23:39 -0600 Subject: [PATCH] Added kysc to remove macros and removed no_segmented_memory --- include/level_commands.h | 39 --- include/macros.h | 11 - include/segment_symbols.h | 90 ----- levels/menu/script.c | 5 - ...eq_channel_layer_process_script_copt.inc.c | 20 -- src/audio/playback.c | 16 - src/engine/level_script.c | 10 - src/engine/surface_load.c | 2 - src/engine/surface_load.h | 2 - src/game/macro_special_objects.c | 2 - src/game/macro_special_objects.h | 2 - src/game/memory.c | 118 ------- src/game/memory.h | 8 - src/game/paintings.c | 2 - src/goddard/renderer.c | 99 ------ tools/audiofile/audiofile.cpp | 4 - tools/ido5.3_recomp/libc_impl.c | 10 - tools/ido5.3_recomp/recomp.cpp | 6 - tools/kysc/.gitignore | 1 + tools/kysc/Cargo.lock | 320 ++++++++++++++++++ tools/kysc/Cargo.toml | 9 + tools/kysc/src/coan.rs | 25 ++ tools/kysc/src/fsu.rs | 23 ++ tools/kysc/src/main.rs | 64 ++++ 24 files changed, 442 insertions(+), 446 deletions(-) create mode 100644 tools/kysc/.gitignore create mode 100644 tools/kysc/Cargo.lock create mode 100644 tools/kysc/Cargo.toml create mode 100644 tools/kysc/src/coan.rs create mode 100644 tools/kysc/src/fsu.rs create mode 100644 tools/kysc/src/main.rs diff --git a/include/level_commands.h b/include/level_commands.h index f2490fe1..2929a7c5 100644 --- a/include/level_commands.h +++ b/include/level_commands.h @@ -34,7 +34,6 @@ #define REGULAR_FACE 0x0002 #define DIZZY_FACE 0x0003 -#ifdef NO_SEGMENTED_MEMORY #define EXECUTE(seg, script, scriptEnd, entry) \ CMD_BBH(0x00, 0x10, 0x0000), \ CMD_PTR(NULL), \ @@ -46,19 +45,6 @@ CMD_PTR(NULL), \ CMD_PTR(NULL), \ CMD_PTR(entry) -#else -#define EXECUTE(seg, script, scriptEnd, entry) \ - CMD_BBH(0x00, 0x10, seg), \ - CMD_PTR(script), \ - CMD_PTR(scriptEnd), \ - CMD_PTR(entry) - -#define EXIT_AND_EXECUTE(seg, script, scriptEnd, entry) \ - CMD_BBH(0x01, 0x10, seg), \ - CMD_PTR(script), \ - CMD_PTR(scriptEnd), \ - CMD_PTR(entry) -#endif #define EXIT() \ CMD_BBH(0x02, 0x04, 0x0000) @@ -132,7 +118,6 @@ #define POP_POOL() \ CMD_BBH(0x15, 0x04, 0x0000) -#ifdef NO_SEGMENTED_MEMORY #define FIXED_LOAD(loadAddr, romStart, romEnd) \ CMD_BBH(0x16, 0x10, 0x0000), \ CMD_PTR(NULL), \ @@ -148,38 +133,14 @@ CMD_BBH(0x18, 0x0C, 0x0000), \ CMD_PTR(NULL), \ CMD_PTR(NULL) -#else -#define FIXED_LOAD(loadAddr, romStart, romEnd) \ - CMD_BBH(0x16, 0x10, 0x0000), \ - CMD_PTR(loadAddr), \ - CMD_PTR(romStart), \ - CMD_PTR(romEnd) - -#define LOAD_RAW(seg, romStart, romEnd) \ - CMD_BBH(0x17, 0x0C, seg), \ - CMD_PTR(romStart), \ - CMD_PTR(romEnd) - -#define LOAD_MIO0(seg, romStart, romEnd) \ - CMD_BBH(0x18, 0x0C, seg), \ - CMD_PTR(romStart), \ - CMD_PTR(romEnd) -#endif #define LOAD_MARIO_HEAD(sethead) \ CMD_BBH(0x19, 0x04, sethead) -#ifdef NO_SEGMENTED_MEMORY #define LOAD_MIO0_TEXTURE(seg, romStart, romEnd) \ CMD_BBH(0x1A, 0x0C, 0x0000), \ CMD_PTR(NULL), \ CMD_PTR(NULL) -#else -#define LOAD_MIO0_TEXTURE(seg, romStart, romEnd) \ - CMD_BBH(0x1A, 0x0C, seg), \ - CMD_PTR(romStart), \ - CMD_PTR(romEnd) -#endif #define INIT_LEVEL() \ CMD_BBH(0x1B, 0x04, 0x0000) diff --git a/include/macros.h b/include/macros.h index 9e90b71a..68acf04d 100644 --- a/include/macros.h +++ b/include/macros.h @@ -47,20 +47,9 @@ #define ALIGNED16 #endif -#ifndef NO_SEGMENTED_MEMORY -// convert a virtual address to physical. -#define VIRTUAL_TO_PHYSICAL(addr) ((uintptr_t)(addr) & 0x1FFFFFFF) - -// convert a physical address to virtual. -#define PHYSICAL_TO_VIRTUAL(addr) ((uintptr_t)(addr) | 0x80000000) - -// another way of converting virtual to physical -#define VIRTUAL_TO_PHYSICAL2(addr) ((u8 *)(addr) - 0x80000000U) -#else // no conversion needed other than cast #define VIRTUAL_TO_PHYSICAL(addr) ((uintptr_t)(addr)) #define PHYSICAL_TO_VIRTUAL(addr) ((uintptr_t)(addr)) #define VIRTUAL_TO_PHYSICAL2(addr) ((void *)(addr)) -#endif #endif // MACROS_H diff --git a/include/segment_symbols.h b/include/segment_symbols.h index 22b37131..c51b4a60 100644 --- a/include/segment_symbols.h +++ b/include/segment_symbols.h @@ -1,95 +1,5 @@ #ifndef SEGMENT_SYMBOLS_H #define SEGMENT_SYMBOLS_H -#ifndef NO_SEGMENTED_MEMORY -#define DECLARE_SEGMENT(name) \ - extern u8 _##name##SegmentRomStart[]; \ - extern u8 _##name##SegmentRomEnd[]; - -#define DECLARE_ACTOR_SEGMENT(name) \ - DECLARE_SEGMENT(name##_mio0) \ - DECLARE_SEGMENT(name##_geo) - -#define DECLARE_LEVEL_SEGMENT(name) \ - DECLARE_SEGMENT(name) \ - DECLARE_SEGMENT(name##_segment_7) - -DECLARE_ACTOR_SEGMENT(common0) -DECLARE_ACTOR_SEGMENT(common1) -DECLARE_ACTOR_SEGMENT(group0) -DECLARE_ACTOR_SEGMENT(group1) -DECLARE_ACTOR_SEGMENT(group2) -DECLARE_ACTOR_SEGMENT(group3) -DECLARE_ACTOR_SEGMENT(group4) -DECLARE_ACTOR_SEGMENT(group5) -DECLARE_ACTOR_SEGMENT(group6) -DECLARE_ACTOR_SEGMENT(group7) -DECLARE_ACTOR_SEGMENT(group8) -DECLARE_ACTOR_SEGMENT(group9) -DECLARE_ACTOR_SEGMENT(group10) -DECLARE_ACTOR_SEGMENT(group11) -DECLARE_ACTOR_SEGMENT(group12) -DECLARE_ACTOR_SEGMENT(group13) -DECLARE_ACTOR_SEGMENT(group14) -DECLARE_ACTOR_SEGMENT(group15) -DECLARE_ACTOR_SEGMENT(group16) -DECLARE_ACTOR_SEGMENT(group17) - -DECLARE_SEGMENT(entry) -DECLARE_SEGMENT(engine) -DECLARE_SEGMENT(behavior) -DECLARE_SEGMENT(scripts) -DECLARE_SEGMENT(goddard) -extern u8 _goddardSegmentStart[]; - -DECLARE_LEVEL_SEGMENT(menu) -DECLARE_LEVEL_SEGMENT(intro) -DECLARE_LEVEL_SEGMENT(ending) - -#define STUB_LEVEL(_0, _1, _2, _3, _4, _5, _6, _7, _8) -#define DEFINE_LEVEL(_0, _1, _2, folder, _4, _5, _6, _7, _8, _9, _10) DECLARE_LEVEL_SEGMENT(folder) - -#include "levels/level_defines.h" - -#undef STUB_LEVEL -#undef DEFINE_LEVEL - -DECLARE_SEGMENT(segment2_mio0) - -DECLARE_SEGMENT(water_skybox_mio0) -DECLARE_SEGMENT(ccm_skybox_mio0) -DECLARE_SEGMENT(clouds_skybox_mio0) -DECLARE_SEGMENT(bitfs_skybox_mio0) -DECLARE_SEGMENT(wdw_skybox_mio0) -DECLARE_SEGMENT(cloud_floor_skybox_mio0) -DECLARE_SEGMENT(ssl_skybox_mio0) -DECLARE_SEGMENT(bbh_skybox_mio0) -DECLARE_SEGMENT(bidw_skybox_mio0) -DECLARE_SEGMENT(bits_skybox_mio0) - -DECLARE_SEGMENT(fire_mio0) -DECLARE_SEGMENT(spooky_mio0) -DECLARE_SEGMENT(generic_mio0) -DECLARE_SEGMENT(water_mio0) -DECLARE_SEGMENT(sky_mio0) -DECLARE_SEGMENT(snow_mio0) -DECLARE_SEGMENT(cave_mio0) -DECLARE_SEGMENT(machine_mio0) -DECLARE_SEGMENT(mountain_mio0) -DECLARE_SEGMENT(grass_mio0) -DECLARE_SEGMENT(outside_mio0) -DECLARE_SEGMENT(inside_mio0) -DECLARE_SEGMENT(effect_mio0) -DECLARE_SEGMENT(title_screen_bg_mio0) - -DECLARE_SEGMENT(debug_level_select_mio0) - -#ifdef VERSION_EU -DECLARE_SEGMENT(translation_de_mio0) -DECLARE_SEGMENT(translation_en_mio0) -DECLARE_SEGMENT(translation_fr_mio0) -#endif - -#endif #endif // SEGMENT_SYMBOLS_H diff --git a/levels/menu/script.c b/levels/menu/script.c index 0a83a4a4..e2a79d07 100644 --- a/levels/menu/script.c +++ b/levels/menu/script.c @@ -72,18 +72,13 @@ const LevelScript level_main_menu_entry_2[] = { /*25*/ FREE_LEVEL_POOL(), /*26*/ LOAD_AREA(/*area*/ 2), -#ifdef NO_SEGMENTED_MEMORY // sVisibleStars is set to 0 during FIXED_LOAD above on N64, but not when NO_SEGMENTED_MEMORY is used. // lvl_init_act_selector_values_and_stars must be called here otherwise the previous // value is retained and causes incorrect drawing during the 16 transition frames. CALL(/*arg*/ 0, /*func*/ lvl_init_act_selector_values_and_stars), -#endif /*27*/ TRANSITION(/*transType*/ WARP_TRANSITION_FADE_FROM_COLOR, /*time*/ 16, /*color*/ 0xFF, 0xFF, 0xFF), /*29*/ SLEEP(/*frames*/ 16), /*30*/ SET_MENU_MUSIC(/*seq*/ 0x000D), -#ifndef NO_SEGMENTED_MEMORY - /*31*/ CALL(/*arg*/ 0, /*func*/ lvl_init_act_selector_values_and_stars), -#endif /*33*/ CALL_LOOP(/*arg*/ 0, /*func*/ lvl_update_obj_and_load_act_button_actions), /*35*/ GET_OR_SET(/*op*/ OP_SET, /*var*/ VAR_CURR_ACT_NUM), /*36*/ STOP_MUSIC(/*fadeOutTime*/ 0x00BE), diff --git a/src/audio/copt/seq_channel_layer_process_script_copt.inc.c b/src/audio/copt/seq_channel_layer_process_script_copt.inc.c index 87bb8968..ce5ebbba 100644 --- a/src/audio/copt/seq_channel_layer_process_script_copt.inc.c +++ b/src/audio/copt/seq_channel_layer_process_script_copt.inc.c @@ -20,10 +20,6 @@ #define PORTAMENTO_MODE_5 5 #define COPT 0 -#if COPT -#define M64_READ_U8(state, dst) \ - dst = m64_read_u8(state); -#else #define M64_READ_U8(state, dst) \ { \ u8 * _ptr_pc; \ @@ -33,13 +29,8 @@ _pc = *_ptr_pc; \ dst = _pc; \ } -#endif -#if COPT -#define M64_READ_S16(state, dst) \ - dst = m64_read_s16(state); -#else #define M64_READ_S16(state, dst) \ { \ s16 _ret; \ @@ -49,11 +40,6 @@ ((*state).pc)++; \ dst = _ret; \ } -#endif -#if COPT -#define M64_READ_COMPRESSED_U16(state, dst) \ - dst = m64_read_compressed_u16(state); -#else #define M64_READ_COMPRESSED_U16(state, dst) \ { \ u16 ret = *(state->pc++); \ @@ -63,12 +49,7 @@ } \ dst = ret; \ } -#endif -#if COPT -#define GET_INSTRUMENT(seqChannel, instId, _instOut, _adsr, dst, l) \ - dst = get_instrument(seqChannel, instId, _instOut, _adsr); -#else #define GET_INSTRUMENT(seqChannel, instId, _instOut, _adsr, dst, l) \ { \ struct AdsrSettings *adsr = _adsr; \ @@ -112,7 +93,6 @@ struct Instrument **instOut = _instOut;\ *instOut = NULL; \ ret ## l: ; \ } -#endif void seq_channel_layer_process_script(struct SequenceChannelLayer *layer) { struct SequencePlayer *seqPlayer; // sp5C, t4 diff --git a/src/audio/playback.c b/src/audio/playback.c index d1e692a7..2ddfbd79 100644 --- a/src/audio/playback.c +++ b/src/audio/playback.c @@ -271,12 +271,6 @@ struct Drum *get_drum(s32 bankId, s32 drumId) { return NULL; } -#ifndef NO_SEGMENTED_MEMORY - if ((uintptr_t) gCtlEntries[bankId].drums < 0x80000000U) { - stubbed_printf("Percussion Pointer Error\n"); - return NULL; - } -#endif drum = gCtlEntries[bankId].drums[drumId]; if (drum == NULL) { @@ -393,11 +387,6 @@ void process_notes(void) { #if defined(VERSION_EU) || defined(VERSION_SH) playbackState = (struct NotePlaybackState *) ¬e->priority; if (note->parentLayer != NO_LAYER) { -#ifndef NO_SEGMENTED_MEMORY - if ((uintptr_t) playbackState->parentLayer < 0x7fffffffU) { - continue; - } -#endif #ifdef VERSION_SH if (note != playbackState->parentLayer->note && playbackState->unkSH34 == 0) { playbackState->adsr.action |= ADSR_ACTION_RELEASE; @@ -680,11 +669,6 @@ struct Drum *get_drum(s32 bankId, s32 drumId) { return NULL; } -#ifndef NO_SEGMENTED_MEMORY - if ((uintptr_t) gCtlEntries[bankId].drums < 0x80000000U) { - return NULL; - } -#endif drum = gCtlEntries[bankId].drums[drumId]; if (drum == NULL) { diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 292a021e..9237e101 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -1,7 +1,5 @@ #include -#ifdef NO_SEGMENTED_MEMORY #include -#endif #include "sm64.h" #include "audio/external.h" @@ -594,9 +592,6 @@ static void level_cmd_set_gamma(void) { static void level_cmd_set_terrain_data(void) { if (sCurrAreaIndex != -1) { -#ifndef NO_SEGMENTED_MEMORY - gAreas[sCurrAreaIndex].terrainData = segmented_to_virtual(CMD_GET(void *, 4)); -#else Collision *data; u32 size; @@ -605,7 +600,6 @@ static void level_cmd_set_terrain_data(void) { size = get_area_terrain_size(data) * sizeof(Collision); gAreas[sCurrAreaIndex].terrainData = alloc_only_pool_alloc(sLevelPool, size); memcpy(gAreas[sCurrAreaIndex].terrainData, data, size); -#endif } sCurrentCmd = CMD_NEXT; } @@ -619,9 +613,6 @@ static void level_cmd_set_rooms(void) { static void level_cmd_set_macro_objects(void) { if (sCurrAreaIndex != -1) { -#ifndef NO_SEGMENTED_MEMORY - gAreas[sCurrAreaIndex].macroObjects = segmented_to_virtual(CMD_GET(void *, 4)); -#else // The game modifies the macro object data (for example marking coins as taken), // so it must be reset when the level reloads. MacroObject *data = segmented_to_virtual(CMD_GET(void *, 4)); @@ -631,7 +622,6 @@ static void level_cmd_set_macro_objects(void) { } gAreas[sCurrAreaIndex].macroObjects = alloc_only_pool_alloc(sLevelPool, len * sizeof(MacroObject)); memcpy(gAreas[sCurrAreaIndex].macroObjects, data, len * sizeof(MacroObject)); -#endif } sCurrentCmd = CMD_NEXT; } diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index 7511920c..689f95fd 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -529,7 +529,6 @@ void alloc_surface_pools(void) { reset_red_coins_collected(); } -#ifdef NO_SEGMENTED_MEMORY /** * Get the size of the terrain data, to get the correct size when copying later. */ @@ -577,7 +576,6 @@ u32 get_area_terrain_size(s16 *data) { return data - startPos; } -#endif /** diff --git a/src/engine/surface_load.h b/src/engine/surface_load.h index 08e5f208..b07422ce 100644 --- a/src/engine/surface_load.h +++ b/src/engine/surface_load.h @@ -32,9 +32,7 @@ extern struct Surface *sSurfacePool; extern s16 sSurfacePoolSize; void alloc_surface_pools(void); -#ifdef NO_SEGMENTED_MEMORY u32 get_area_terrain_size(s16 *data); -#endif void load_area_terrain(s16 index, s16 *data, s8 *surfaceRooms, s16 *macroObjects); void clear_dynamic_surfaces(void); void load_object_collision_model(void); diff --git a/src/game/macro_special_objects.c b/src/game/macro_special_objects.c index 2f71a0dd..f4884d83 100644 --- a/src/game/macro_special_objects.c +++ b/src/game/macro_special_objects.c @@ -324,7 +324,6 @@ void spawn_special_objects(s16 areaIndex, s16 **specialObjList) { } } -#ifdef NO_SEGMENTED_MEMORY u32 get_special_objects_size(s16 *data) { s16 *startPos = data; s32 numOfSpecialObjects; @@ -368,4 +367,3 @@ u32 get_special_objects_size(s16 *data) { return data - startPos; } -#endif diff --git a/src/game/macro_special_objects.h b/src/game/macro_special_objects.h index 978d2be9..778d3dbd 100644 --- a/src/game/macro_special_objects.h +++ b/src/game/macro_special_objects.h @@ -14,8 +14,6 @@ void spawn_macro_abs_special(s32 model, const BehaviorScript *behavior, s16 x, s void spawn_macro_objects(s16 areaIndex, s16 *macroObjList); void spawn_macro_objects_hardcoded(s16 areaIndex, s16 *macroObjList); void spawn_special_objects(s16 areaIndex, s16 **specialObjList); -#ifdef NO_SEGMENTED_MEMORY u32 get_special_objects_size(s16 *data); -#endif #endif // MACRO_SPECIAL_OBJECTS_H diff --git a/src/game/memory.c b/src/game/memory.c index 9748f301..4f0443fc 100644 --- a/src/game/memory.c +++ b/src/game/memory.c @@ -73,28 +73,6 @@ void *get_segment_base_addr(s32 segment) { return (void *) (sSegmentTable[segment] | 0x80000000); } -#ifndef NO_SEGMENTED_MEMORY -void *segmented_to_virtual(const void *addr) { - size_t segment = (uintptr_t) addr >> 24; - size_t offset = (uintptr_t) addr & 0x00FFFFFF; - - return (void *) ((sSegmentTable[segment] + offset) | 0x80000000); -} - -void *virtual_to_segmented(u32 segment, const void *addr) { - size_t offset = ((uintptr_t) addr & 0x1FFFFFFF) - sSegmentTable[segment]; - - return (void *) ((segment << 24) + offset); -} - -void move_segment_table_to_dmem(void) { - s32 i; - - for (i = 0; i < 16; i++) { - gSPSegment(gDisplayListHead++, i, sSegmentTable[i]); - } -} -#else void *segmented_to_virtual(const void *addr) { return (void *) addr; } @@ -105,7 +83,6 @@ void *virtual_to_segmented(u32 segment, const void *addr) { void move_segment_table_to_dmem(void) { } -#endif /** * Initialize the main memory pool. This pool is conceptually a pair of stacks @@ -275,101 +252,6 @@ static void *dynamic_dma_read(u8 *srcStart, u8 *srcEnd, u32 side) { return dest; } -#ifndef NO_SEGMENTED_MEMORY -/** - * Load data from ROM into a newly allocated block, and set the segment base - * address to this block. - */ -void *load_segment(s32 segment, u8 *srcStart, u8 *srcEnd, u32 side) { - void *addr = dynamic_dma_read(srcStart, srcEnd, side); - - if (addr != NULL) { - set_segment_base_addr(segment, addr); - } - return addr; -} - -/* - * Allocate a block of memory starting at destAddr and ending at the end of - * the memory pool. Then copy srcStart through srcEnd from ROM to this block. - * If this block is not large enough to hold the ROM data, or that portion - * of the pool is already allocated, return NULL. - */ -void *load_to_fixed_pool_addr(u8 *destAddr, u8 *srcStart, u8 *srcEnd) { - void *dest = NULL; - u32 srcSize = ALIGN16(srcEnd - srcStart); - u32 destSize = ALIGN16((u8 *) sPoolListHeadR - destAddr); - - if (srcSize <= destSize) { - dest = main_pool_alloc(destSize, MEMORY_POOL_RIGHT); - if (dest != NULL) { - bzero(dest, destSize); - osWritebackDCacheAll(); - dma_read(dest, srcStart, srcEnd); - osInvalICache(dest, destSize); - osInvalDCache(dest, destSize); - } - } else { - } - return dest; -} - -/** - * Decompress the block of ROM data from srcStart to srcEnd and return a - * pointer to an allocated buffer holding the decompressed data. Set the - * base address of segment to this address. - */ -void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd) { - void *dest = NULL; - - u32 compSize = ALIGN16(srcEnd - srcStart); - u8 *compressed = main_pool_alloc(compSize, MEMORY_POOL_RIGHT); - - // Decompressed size from mio0 header - u32 *size = (u32 *) (compressed + 4); - - if (compressed != NULL) { - dma_read(compressed, srcStart, srcEnd); - dest = main_pool_alloc(*size, MEMORY_POOL_LEFT); - if (dest != NULL) { - decompress(compressed, dest); - set_segment_base_addr(segment, dest); - main_pool_free(compressed); - } else { - } - } else { - } - return dest; -} - -void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd) { - UNUSED void *dest = NULL; - u32 compSize = ALIGN16(srcEnd - srcStart); - u8 *compressed = main_pool_alloc(compSize, MEMORY_POOL_RIGHT); - UNUSED u32 *pUncSize = (u32 *) (compressed + 4); - - if (compressed != NULL) { - dma_read(compressed, srcStart, srcEnd); - decompress(compressed, gDecompressionHeap); - set_segment_base_addr(segment, gDecompressionHeap); - main_pool_free(compressed); - } else { - } - return gDecompressionHeap; -} - -void load_engine_code_segment(void) { - void *startAddr = (void *) SEG_ENGINE; - u32 totalSize = SEG_FRAMEBUFFERS - SEG_ENGINE; - UNUSED u32 alignedSize = ALIGN16(_engineSegmentRomEnd - _engineSegmentRomStart); - - bzero(startAddr, totalSize); - osWritebackDCacheAll(); - dma_read(startAddr, _engineSegmentRomStart, _engineSegmentRomEnd); - osInvalICache(startAddr, totalSize); - osInvalDCache(startAddr, totalSize); -} -#endif /** * Allocate an allocation-only pool from the main pool. This pool doesn't diff --git a/src/game/memory.h b/src/game/memory.h index 6a9feeaf..b32692ac 100644 --- a/src/game/memory.h +++ b/src/game/memory.h @@ -55,19 +55,11 @@ u32 main_pool_available(void); u32 main_pool_push_state(void); u32 main_pool_pop_state(void); -#ifndef NO_SEGMENTED_MEMORY -void *load_segment(s32 segment, u8 *srcStart, u8 *srcEnd, u32 side); -void *load_to_fixed_pool_addr(u8 *destAddr, u8 *srcStart, u8 *srcEnd); -void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd); -void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd); -void load_engine_code_segment(void); -#else #define load_segment(...) #define load_to_fixed_pool_addr(...) #define load_segment_decompress(...) #define load_segment_decompress_heap(...) #define load_engine_code_segment(...) -#endif struct AllocOnlyPool *alloc_only_pool_init(u32 size, u32 side); void *alloc_only_pool_alloc(struct AllocOnlyPool *pool, s32 size); diff --git a/src/game/paintings.c b/src/game/paintings.c index 24f0ab04..9bfca393 100644 --- a/src/game/paintings.c +++ b/src/game/paintings.c @@ -1066,7 +1066,6 @@ void reset_painting(struct Painting *painting) { gRipplingPainting = NULL; -#ifdef NO_SEGMENTED_MEMORY // Make sure all variables are reset correctly. // With segmented memory the segments that contain the relevant // Painting structs are reloaded from ROM upon level load. @@ -1083,7 +1082,6 @@ void reset_painting(struct Painting *painting) { // that moves the painting stops during level unload. painting->posX = 3456.0f; } -#endif } /** diff --git a/src/goddard/renderer.c b/src/goddard/renderer.c index 938036c3..3b69fd4b 100644 --- a/src/goddard/renderer.c +++ b/src/goddard/renderer.c @@ -23,15 +23,9 @@ #define MAX_GD_DLS 1000 #define OS_MESG_SI_COMPLETE 0x33333333 -#ifndef NO_SEGMENTED_MEMORY -#define GD_VIRTUAL_TO_PHYSICAL(addr) ((uintptr_t)(addr) &0x0FFFFFFF) -#define GD_LOWER_24(addr) ((uintptr_t)(addr) &0x00FFFFFF) -#define GD_LOWER_29(addr) (((uintptr_t)(addr)) & 0x1FFFFFFF) -#else #define GD_VIRTUAL_TO_PHYSICAL(addr) (addr) #define GD_LOWER_24(addr) ((uintptr_t)(addr)) #define GD_LOWER_29(addr) (((uintptr_t)(addr))) -#endif #define MTX_INTPART_PACK(w1, w2) (((w1) &0xFFFF0000) | (((w2) >> 16) & 0xFFFF)) #define MTX_FRACPART_PACK(w1, w2) ((((w1) << 16) & 0xFFFF0000) | ((w2) &0xFFFF)) @@ -3708,102 +3702,9 @@ void stub_renderer_18(UNUSED u32 a0) { void stub_renderer_19(UNUSED u32 a0) { } -#ifndef NO_SEGMENTED_MEMORY -/** - * Copies `size` bytes of data from ROM address `romAddr` to RAM address `vAddr`. - */ -static void gd_block_dma(u32 romAddr, void *vAddr, s32 size) { - s32 blockSize; - - do { - if ((blockSize = size) > 0x1000) { - blockSize = 0x1000; - } - - osPiStartDma(&sGdDMAReqMesg, OS_MESG_PRI_NORMAL, OS_READ, romAddr, vAddr, blockSize, &sGdDMAQueue); - osRecvMesg(&sGdDMAQueue, &sGdDMACompleteMsg, OS_MESG_BLOCK); - romAddr += blockSize; - vAddr = (void *) ((uintptr_t) vAddr + blockSize); - size -= 0x1000; - } while (size > 0); -} - -/** - * Loads the specified DynList from ROM and processes it. - */ -struct GdObj *load_dynlist(struct DynList *dynlist) { - u32 segSize; - u8 *allocSegSpace; - void *allocPtr; - uintptr_t dynlistSegStart; - uintptr_t dynlistSegEnd; - s32 i; - s32 tlbEntries; - struct GdObj *loadedList; - - i = -1; - - // Make sure the dynlist exists - while (sDynLists[++i].list != NULL) { - if (sDynLists[i].list == dynlist) { - break; - } - } - if (sDynLists[i].list == NULL) { - fatal_printf("load_dynlist() ptr not found in any banks"); - } - - switch (sDynLists[i].flag) { - case STD_LIST_BANK: - dynlistSegStart = (uintptr_t) _gd_dynlistsSegmentRomStart; - dynlistSegEnd = (uintptr_t) _gd_dynlistsSegmentRomEnd; - break; - default: - fatal_printf("load_dynlist() unkown bank"); - } - -#define PAGE_SIZE 65536 // size of a 64K TLB page - - segSize = dynlistSegEnd - dynlistSegStart; - allocSegSpace = gd_malloc_temp(segSize + PAGE_SIZE); - - if ((allocPtr = (void *) allocSegSpace) == NULL) { - fatal_printf("Not enough DRAM for DATA segment \n"); - } - - allocSegSpace = (u8 *) (((uintptr_t) allocSegSpace + PAGE_SIZE) & 0xFFFF0000); - - // Copy the dynlist data from ROM - gd_block_dma(dynlistSegStart, (void *) allocSegSpace, segSize); - - tlbEntries = (segSize / PAGE_SIZE) / 2 + 1; - if (tlbEntries >= 31) { - fatal_printf("load_dynlist() too many TLBs"); - } - - // Map virtual address 0x04000000 to `allocSegSpace` - for (i = 0; i < tlbEntries; i++) { - osMapTLB(i, 0, - (void *) (uintptr_t) (0x04000000 + (i * 2 * PAGE_SIZE)), // virtual address to map - GD_LOWER_24(((uintptr_t) allocSegSpace) + (i * 2 * PAGE_SIZE) + 0), // even page address - GD_LOWER_24(((uintptr_t) allocSegSpace) + (i * 2 * PAGE_SIZE) + PAGE_SIZE), // odd page address - -1); - } - -#undef PAGE_SIZE - - // process the dynlist - loadedList = proc_dynlist(dynlist); - - gd_free(allocPtr); - - return loadedList; -} -#else struct GdObj *load_dynlist(struct DynList *dynlist) { return proc_dynlist(dynlist); } -#endif /** * Unused (not called) diff --git a/tools/audiofile/audiofile.cpp b/tools/audiofile/audiofile.cpp index 163237b5..c3f40cf7 100644 --- a/tools/audiofile/audiofile.cpp +++ b/tools/audiofile/audiofile.cpp @@ -14114,7 +14114,6 @@ int afGetVirtualChannels (AFfilehandle file, int trackid) #define SEG_MASK (0x70) /* Segment field mask. */ /* see libst.h */ -#ifdef SUPERCEDED static const short seg_end[8] = {0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF}; @@ -14298,7 +14297,6 @@ int _af_ulaw2linear (unsigned char u_val) return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS)); } -#endif // file: openclose.cpp /* @@ -14326,9 +14324,7 @@ int _af_ulaw2linear (unsigned char u_val) #include #include -#ifdef HAVE_UNISTD_H #include -#endif #include diff --git a/tools/ido5.3_recomp/libc_impl.c b/tools/ido5.3_recomp/libc_impl.c index af4ca713..2127583a 100644 --- a/tools/ido5.3_recomp/libc_impl.c +++ b/tools/ido5.3_recomp/libc_impl.c @@ -172,9 +172,7 @@ static char ctype[] = { 0, #define REDIRECT_USR_LIB -#ifdef REDIRECT_USR_LIB static char bin_dir[PATH_MAX + 1]; -#endif static int g_file_max = 3; #if defined(__CYGWIN__) || defined(__APPLE__) @@ -236,7 +234,6 @@ static void free_all_file_bufs(uint8_t *mem) { } static void find_bin_dir(void) { -#ifdef REDIRECT_USR_LIB // gets the current executable's path char path[PATH_MAX + 1] = {0}; #ifdef __CYGWIN__ @@ -257,7 +254,6 @@ static void find_bin_dir(void) { #endif strcpy(bin_dir, dirname(path)); -#endif } int main(int argc, char *argv[]) { @@ -1205,7 +1201,6 @@ static uint32_t init_file(uint8_t *mem, int fd, int i, const char *path, const c } if (fd == -1) { -#ifdef REDIRECT_USR_LIB char fixed_path[PATH_MAX + 1]; if (!strcmp(path, "/usr/lib/err.english.cc") && bin_dir[0] != '\0') { int n = snprintf(fixed_path, sizeof(fixed_path), "%s/err.english.cc", bin_dir); @@ -1213,7 +1208,6 @@ static uint32_t init_file(uint8_t *mem, int fd, int i, const char *path, const c path = fixed_path; } } -#endif fd = open(path, flags, 0666); if (fd < 0) { MEM_U32(ERRNO_ADDR) = errno; @@ -2438,7 +2432,6 @@ int wrapper_execvp(uint8_t *mem, uint32_t file_addr, uint32_t argv_addr) { } argv[argc] = NULL; -#ifdef REDIRECT_USR_LIB if (!strncmp(file, "/usr/lib/", 9) && bin_dir[0] != '\0') { char fixed_path[PATH_MAX + 1]; #ifdef __CYGWIN__ @@ -2454,9 +2447,6 @@ int wrapper_execvp(uint8_t *mem, uint32_t file_addr, uint32_t argv_addr) { } else { execvp(file, argv); } -#else - execvp(file, argv); -#endif MEM_U32(ERRNO_ADDR) = errno; for (uint32_t i = 0; i < argc; i++) { diff --git a/tools/ido5.3_recomp/recomp.cpp b/tools/ido5.3_recomp/recomp.cpp index 2bf6e132..99f16ad9 100644 --- a/tools/ido5.3_recomp/recomp.cpp +++ b/tools/ido5.3_recomp/recomp.cpp @@ -797,9 +797,6 @@ static void pass2(void) { uint32_t faddr = insn.operands[1].imm; li_function_pointers.insert(faddr); functions[faddr].referenced_by_function_pointer = true; -#if INSPECT_FUNCTION_POINTERS - fprintf(stderr, "li function pointer: 0x%x at 0x%x\n", faddr, addr); -#endif } } for (auto it = functions.begin(); it != functions.end(); ++it) { @@ -2288,9 +2285,6 @@ static void inspect_data_function_pointers(vector>& ret continue; } if (addr >= text_vaddr && addr < text_vaddr + text_section_len && addr % 4 == 0) { -#if INSPECT_FUNCTION_POINTERS - fprintf(stderr, "assuming function pointer 0x%x at 0x%x\n", addr, section_vaddr + i); -#endif ret.push_back(make_pair(section_vaddr + i, addr)); label_addresses.insert(addr); functions[addr].referenced_by_function_pointer = true; diff --git a/tools/kysc/.gitignore b/tools/kysc/.gitignore new file mode 100644 index 00000000..9f970225 --- /dev/null +++ b/tools/kysc/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/tools/kysc/Cargo.lock b/tools/kysc/Cargo.lock new file mode 100644 index 00000000..37dd8657 --- /dev/null +++ b/tools/kysc/Cargo.lock @@ -0,0 +1,320 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anstream" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-wincon", + "concolor-override", + "concolor-query", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" + +[[package]] +name = "anstyle-parse" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7d1bb534e9efed14f3e5f44e7dd1a4f709384023a4165199a4241e18dff0116" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-wincon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3127af6145b149f3287bb9a0d10ad9c5692dba8c53ad48285e5bec4063834fa" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "clap" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046ae530c528f252094e4a77886ee1374437744b2bff1497aa898bbddbbb29b3" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "223163f58c9a40c3b0a43e1c4b50a9ce09f007ea2cb1ec258a687945b4b7929f" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" + +[[package]] +name = "concolor-override" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a855d4a1978dc52fb0536a04d384c2c0c1aa273597f08b77c8c4d3b2eec6037f" + +[[package]] +name = "concolor-query" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d11d52c3d7ca2e6d0040212be9e4dbbcd78b6447f535b6b561f449427944cf" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "errno" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "io-lifetimes" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "is-terminal" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256017f749ab3117e93acb91063009e1f1bb56d03965b14c2c8df4eb02c524d8" +dependencies = [ + "hermit-abi", + "io-lifetimes", + "rustix", + "windows-sys", +] + +[[package]] +name = "kysc" +version = "0.1.0" +dependencies = [ + "clap", +] + +[[package]] +name = "libc" +version = "0.2.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" + +[[package]] +name = "linux-raw-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd550e73688e6d578f0ac2119e32b797a327631a42f9433e59d02e139c8df60d" + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "proc-macro2" +version = "1.0.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustix" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e78cc525325c06b4a7ff02db283472f3c042b7ff0c391f96c6d5ac6f4f91b75" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" diff --git a/tools/kysc/Cargo.toml b/tools/kysc/Cargo.toml new file mode 100644 index 00000000..090beb36 --- /dev/null +++ b/tools/kysc/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "kysc" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = { version = "4.2.1", features = ["derive"] } diff --git a/tools/kysc/src/coan.rs b/tools/kysc/src/coan.rs new file mode 100644 index 00000000..67778f6c --- /dev/null +++ b/tools/kysc/src/coan.rs @@ -0,0 +1,25 @@ +use std::process::Command; + +#[derive(Clone, Debug)] +pub(crate) enum CoanMode { + Define, + Undefine, +} + +pub(crate) struct Coan; + +impl Coan { + pub fn execute(path: String, mode: CoanMode, defs: Vec) { + let mut cmd = Command::new("coan"); + cmd.arg("source"); + for def in defs { + cmd.arg(format!("{}{}", match mode { + CoanMode::Define => "-D", + CoanMode::Undefine => "-U", + }, def)); + } + cmd.arg("-r"); + cmd.arg(path); + cmd.output().expect("failed to execute process"); + } +} \ No newline at end of file diff --git a/tools/kysc/src/fsu.rs b/tools/kysc/src/fsu.rs new file mode 100644 index 00000000..33c9bba9 --- /dev/null +++ b/tools/kysc/src/fsu.rs @@ -0,0 +1,23 @@ +use std::io; +use std::fs::{self, DirEntry}; +use std::path::Path; + +pub(crate) struct FsUtils; + +impl FsUtils { + // one possible implementation of walking a directory only visiting files + pub(crate) fn visit_dirs(dir: &Path, cb: &dyn Fn(&DirEntry)) -> io::Result<()> { + if dir.is_dir() { + for entry in fs::read_dir(dir)? { + let entry = entry?; + let path = entry.path(); + if path.is_dir() { + Self::visit_dirs(&path, cb)?; + } else { + cb(&entry); + } + } + } + Ok(()) + } +} \ No newline at end of file diff --git a/tools/kysc/src/main.rs b/tools/kysc/src/main.rs new file mode 100644 index 00000000..aca821fe --- /dev/null +++ b/tools/kysc/src/main.rs @@ -0,0 +1,64 @@ +use std::path::Path; +use coan::{Coan, CoanMode}; +use fsu::FsUtils; +use clap::{Parser, Subcommand}; +use std::fs; + +/// Simple coan wrapper to remove definitions from a directory +#[derive(Parser, Debug)] +#[command(name = "kysc", version)] +struct Args { + #[clap(subcommand)] + subcmd: SubCommands +} + +#[derive(Debug, Subcommand)] +pub enum SubCommands { + /// Preprocess macro definitions + Define { + /// Path to the directory to remove the definitions from + path: String, + /// List of definitions to remove + defines: Vec, + }, + /// Delete a time entry + Undefine { + /// Path to the directory to remove the definitions from + path: String, + /// List of definitions to remove + defines: Vec, + } +} + +mod fsu; +mod coan; + +fn run_coan(path: String, mode: CoanMode, defs: Vec) { + let allowed = vec!["h", "c", "hpp", "cpp"]; + let _rs = FsUtils::visit_dirs(Path::new(path.as_str()), &|entry| { + let path = entry.path(); + let ext = path.extension(); + if ext.is_none() { + return; + } + let file = fs::canonicalize(&path).unwrap(); + if !allowed.contains(&ext.unwrap().to_str().unwrap()) { + return; + } + let can = file.to_str().unwrap(); + Coan::execute(String::from(can), mode.clone(), defs.clone()); + println!("{}", can); + }); +} + +fn main() { + let args = Args::parse(); + match args.subcmd { + SubCommands::Define { path, defines } => { + run_coan(path, CoanMode::Define, defines); + }, + SubCommands::Undefine { path, defines } => { + run_coan(path, CoanMode::Undefine, defines); + } + } +}