diff --git a/Makefile b/Makefile index 24aec177..74877dbf 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,8 @@ clean: test: build @echo "Building tests" @$(MAKE) -C test build - test/build/c1tests + @cp -r test/assets/DATA test/build + @(cd test/build && ./c1tests) run: build @echo "Running dethrace" diff --git a/run.sh b/run.sh index 8e185884..dc4b9d32 100755 --- a/run.sh +++ b/run.sh @@ -8,5 +8,5 @@ set -eu # CODE_DIR=$(pwd) -cd ${DETHRACE_ROOT_DIR} +ln -s $CODE_DIR ${DETHRACE_ROOT_DIR} ${CODE_DIR}/src/DETHRACE/build/c1 diff --git a/src/BRSRC13/CORE/V1DB/dbsetup.c b/src/BRSRC13/CORE/V1DB/dbsetup.c index d2cceb92..c79b308f 100644 --- a/src/BRSRC13/CORE/V1DB/dbsetup.c +++ b/src/BRSRC13/CORE/V1DB/dbsetup.c @@ -40,8 +40,6 @@ br_error BrV1dbBegin() { return 4103; } - printf("BrV1dbBegin\n"); - BrMemSet(&v1db, 0, sizeof(br_v1db_state)); v1db.active = 1; BrRegistryNew(&v1db.reg_models); diff --git a/src/DETHRACE/Makefile b/src/DETHRACE/Makefile index 6b16d5c6..a5eb2385 100644 --- a/src/DETHRACE/Makefile +++ b/src/DETHRACE/Makefile @@ -12,8 +12,8 @@ DEPS := $(OBJS:.o=.d) INC_DIRS := $(shell find $(SRC_DIR) -type d) $(BR_SRC_DIR) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) -CFLAGS ?= $(INC_FLAGS) -Wno-return-type -Wno-missing-declarations -Werror=implicit-function-declaration -LDFLAGS ?= -lm +CFLAGS ?= $(INC_FLAGS) -g -Wno-return-type -Wno-missing-declarations -Werror=implicit-function-declaration +LDFLAGS ?= -lm -fno-pie .PHONY: clean build test diff --git a/src/DETHRACE/common/displays.h b/src/DETHRACE/common/displays.h index a1dda3e3..d737b997 100644 --- a/src/DETHRACE/common/displays.h +++ b/src/DETHRACE/common/displays.h @@ -4,6 +4,8 @@ #include "br_types.h" #include "dr_types.h" +extern int gDim_amount; + // Offset: 0 // Size: 56 // EAX: pStr diff --git a/src/DETHRACE/common/globvrkm.h b/src/DETHRACE/common/globvrkm.h index f70fa327..adf6a733 100644 --- a/src/DETHRACE/common/globvrkm.h +++ b/src/DETHRACE/common/globvrkm.h @@ -4,4 +4,6 @@ #include "br_types.h" #include "dr_types.h" +extern float gRecovery_cost[3]; + #endif diff --git a/src/DETHRACE/common/graphics.h b/src/DETHRACE/common/graphics.h index a7fcb1ef..35715e06 100644 --- a/src/DETHRACE/common/graphics.h +++ b/src/DETHRACE/common/graphics.h @@ -4,6 +4,8 @@ #include "br_types.h" #include "dr_types.h" +extern br_scalar gAmbient_adjustment; + // Offset: 0 // Size: 44 void TurnOnPaletteConversion(); diff --git a/src/DETHRACE/common/init.c b/src/DETHRACE/common/init.c index ca889d9b..2cfc4888 100644 --- a/src/DETHRACE/common/init.c +++ b/src/DETHRACE/common/init.c @@ -199,6 +199,7 @@ void InitialiseApplication(int pArgc, char** pArgv) { // EDX: pArgv void InitialiseDeathRace(int pArgc, char** pArgv) { PDInitialiseSystem(); + InitialiseApplication(pArgc, pArgv); //dword_112DF8 = 1; // never checked by game } diff --git a/src/DETHRACE/common/init.h b/src/DETHRACE/common/init.h index 42219833..b508787f 100644 --- a/src/DETHRACE/common/init.h +++ b/src/DETHRACE/common/init.h @@ -4,6 +4,10 @@ #include "br_types.h" #include "dr_types.h" +extern int gCredits_per_rank[3]; +extern int gInitial_credits[3]; +extern int gInitial_rank; + // Offset: 0 // Size: 115 void AllocateSelf(); diff --git a/src/DETHRACE/common/loading.c b/src/DETHRACE/common/loading.c index b5a97ad1..4f893e78 100644 --- a/src/DETHRACE/common/loading.c +++ b/src/DETHRACE/common/loading.c @@ -1,9 +1,24 @@ #include "loading.h" +#include #include +#include "displays.h" +#include "errors.h" #include "globvars.h" +#include "globvrkm.h" +#include "graphics.h" +#include "init.h" +#include "newgame.h" +#include "opponent.h" +#include "pc-dos/dossys.h" +#include "pedestrn.h" +#include "sound.h" #include "utility.h" +#include "world.h" + +#define HITHER_MULTIPLIER 2.0f +#define AMBIENT_MULTIPLIER 0.0099999998f char* gWheel_actor_names[6]; int gFunk_groove_flags[30]; @@ -13,7 +28,7 @@ char* gDrivable_car_names[6]; char* gYour_car_names[2][6]; char gDef_def_water_screen_name[32]; tHeadup_info gHeadup_image_info[31]; -int gAllow_open_to_fail; +int gAllow_open_to_fail = 1; br_material* gDestn_screen_mat; br_material* gSource_screen_mat; char* gRaces_file_names[9]; @@ -182,6 +197,146 @@ void LoadGeneralParameters() { int temp; char s[256]; char* str; + + PathCat(the_path, gApplication_path, "ACTORS"); + PathCat(the_path, the_path, "PROG.ACT"); + f = fopen(the_path, "rb"); + if (f) { + fgets(s, 255, f); + fclose(f); + for (i = 0; i < strlen(gDecode_string); i++) { + gDecode_string[i] -= 50; + } + + // trim trailing CRLF etc + while (s[0] != '\0' && s[strlen(s) - 1] < 0x20) { + s[strlen(s) - 1] = 0; + } + + if (strcmp(s, gDecode_string) == 0) { + gDecode_thing = 0; + printf("Expecting decrypted text files!\n"); + } + + for (i = 0; i < strlen(gDecode_string); i++) { + gDecode_string[i] -= 50; + } + } + PathCat(the_path, gApplication_path, "GENERAL.TXT"); + f = DRfopen(the_path, "rt"); + if (!f) { + FatalError(8); + } + gCamera_hither = GetAFloat(f) * HITHER_MULTIPLIER; + gCamera_yon = GetAFloat(f); + gCamera_angle = GetAFloat(f); + gAmbient_adjustment = GetAFloat(f) * AMBIENT_MULTIPLIER; + gDim_amount = GetAnInt(f); + gInitial_rank = GetAnInt(f); + GetThreeInts(f, &gInitial_credits[0], &gInitial_credits[1], &gInitial_credits[2]); + GetThreeInts(f, &gCredits_per_rank[0], &gCredits_per_rank[1], &gCredits_per_rank[2]); + gCar_crush_min_fold = GetAFloat(f); + gCar_crush_max_fold = GetAFloat(f); + gCar_crush_wibble = GetAFloat(f); + gCar_crush_limit_deviant = GetAFloat(f); + gCar_crush_split_chance = GetAFloat(f); + gCar_crush_softness = GetAFloat(f); + GetThreeFloats(f, &gRepair_cost[0], &gRepair_cost[1], &gRepair_cost[2]); + GetThreeFloats(f, &gRecovery_cost[0], &gRecovery_cost[1], &gRecovery_cost[2]); + GetThreeInts(f, &gPed_time_value[0], &gPed_time_value[1], &gPed_time_value[2]); + if (gProgram_state.sausage_eater_mode) { + for (i = 0; i < 7; i++) { + GetALineAndDontArgue(f, s); + } + + GetThreeFloats(f, gCar_time_value, &gCar_time_value[1], &gCar_time_value[2]); + GetThreeFloats(f, gCar_cred_value, &gCar_cred_value[1], &gCar_cred_value[2]); + GetThreeInts(f, gWasted_time, &gWasted_time[1], &gWasted_time[2]); + GetThreeInts(f, gWasted_creds, &gWasted_creds[1], &gWasted_creds[2]); + GetThreeInts(f, gRoll_over_time, &gRoll_over_time[1], &gRoll_over_time[2]); + GetThreeInts(f, gRoll_over_creds, &gRoll_over_creds[1], &gRoll_over_creds[2]); + GetThreeInts(f, gCheck_point_cash, &gCheck_point_cash[1], &gCheck_point_cash[2]); + } else { + GetThreeFloats(f, gCar_time_value, &gCar_time_value[1], &gCar_time_value[2]); + GetThreeFloats(f, gCar_cred_value, &gCar_cred_value[1], &gCar_cred_value[2]); + GetThreeInts(f, gWasted_time, &gWasted_time[1], &gWasted_time[2]); + GetThreeInts(f, gWasted_creds, &gWasted_creds[1], &gWasted_creds[2]); + GetThreeInts(f, gRoll_over_time, &gRoll_over_time[1], &gRoll_over_time[2]); + GetThreeInts(f, gRoll_over_creds, &gRoll_over_creds[1], &gRoll_over_creds[2]); + GetThreeInts(f, gCheck_point_cash, &gCheck_point_cash[1], &gCheck_point_cash[2]); + for (i = 0; i < 7; i++) { + GetALineAndDontArgue(f, s); + } + } + GetThreeInts(f, gJump_start_fine, &gJump_start_fine[1], &gJump_start_fine[2]); + GetThreeInts(f, gPoints_per_second, &gPoints_per_second[1], &gPoints_per_second[2]); + GetThreeInts(f, gCunning_stunt_bonus, &gCunning_stunt_bonus[1], &gCunning_stunt_bonus[2]); + GetAString(f, gBasic_car_names[0]); + GetAString(f, gBasic_car_names[1]); + gKnobbled_frame_period = GetAnInt(f); + if (gKnobbled_frame_period) { + gKnobbled_frame_period = 1000 / gKnobbled_frame_period; + } + gOpponent_nastyness_frigger = GetAFloat(f); + ParseSpecialVolume(f, &gDefault_default_water_spec_vol, gDef_def_water_screen_name); + GetALineAndDontArgue(f, s); + str = strtok(s, "\t ,/"); + for (i = 0; i < 5; i++) { + sscanf(str, "%d", &gInitial_net_credits[i]); + str = strtok(NULL, "\t ,/"); + } + + gTag_start_time = 1000 * GetAnInt(f); + gFox_start_time = 1000 * GetAnInt(f); + + GetALineAndDontArgue(f, s); + str = strtok(s, "\t ,/"); + for (i = 0; i < 7; i++) { + sscanf(str, "%f", &gNet_repair_cost[i]); + str = strtok(NULL, "\t ,/"); + } + GetALineAndDontArgue(f, s); + str = strtok(s, "\t ,/"); + for (i = 0; i < 7; i++) { + sscanf(str, "%f", &gNet_recovery_cost[i]); + str = strtok(NULL, "\t ,/"); + } + GetALineAndDontArgue(f, s); + str = strtok(s, "\t ,/"); + for (i = 0; i < 7; i++) { + sscanf(str, "%f", &gNet_softness[i]); + str = strtok(NULL, "\t ,/"); + } + GetALineAndDontArgue(f, s); + str = strtok(s, "\t ,/"); + for (i = 0; i < 7; i++) { + sscanf(str, "%f", &gNet_offensive[i]); + str = strtok(NULL, "\t ,/"); + } + GetALineAndDontArgue(f, s); + str = strtok(s, "\t ,/"); + for (i = 0; i < 7; i++) { + sscanf(str, "%d", &gNet_target[i]); + str = strtok(NULL, "\t ,/"); + } + + gMin_respawn_time = 1000 * GetAnInt(f); + gRespawn_variance = 1000 * GetAnInt(f); + gDemo_rank = GetAnInt(f); + gDemo_armour = GetAnInt(f); + gDemo_power = GetAnInt(f); + gDemo_offensive = GetAnInt(f); + for (i = 0; i < 5; i++) { + gDemo_opponents[i] = GetAnInt(f); + } + + gGravity_multiplier = GetAFloat(f); + gZombie_factor = GetAFloat(f); + gCut_delay_1 = GetAFloat(f); + gCut_delay_2 = GetAFloat(f); + gCut_delay_3 = GetAFloat(f); + gCut_delay_4 = 1.0f; + fclose(f); } // Offset: 3472 @@ -822,6 +977,11 @@ int GetAnInt(FILE* pF) { char s[256]; char* str; int result; + + GetALineAndDontArgue(pF, s); + str = strtok(s, "\t ,/"); + sscanf(str, "%d", &result); + return result; } // Offset: 33828 @@ -831,6 +991,11 @@ float GetAFloat(FILE* pF) { char s[256]; char* str; float result; + + GetALineAndDontArgue(pF, s); + str = strtok(s, "\t ,/"); + sscanf(str, "%f", &result); + return result; } // Offset: 33932 @@ -850,6 +1015,12 @@ float GetAFloatPercent(FILE* pF) { void GetPairOfFloats(FILE* pF, float* pF1, float* pF2) { char s[256]; char* str; + + GetALineAndDontArgue(pF, s); + str = strtok(s, "\t ,/"); + sscanf(str, "%f", pF1); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%f", pF2); } // Offset: 34172 @@ -861,6 +1032,14 @@ void GetPairOfFloats(FILE* pF, float* pF1, float* pF2) { void GetThreeFloats(FILE* pF, float* pF1, float* pF2, float* pF3) { char s[256]; char* str; + + GetALineAndDontArgue(pF, s); + str = strtok(s, "\t ,/"); + sscanf(str, "%f", pF1); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%f", pF2); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%f", pF3); } // Offset: 34344 @@ -871,6 +1050,12 @@ void GetThreeFloats(FILE* pF, float* pF1, float* pF2, float* pF3) { void GetPairOfInts(FILE* pF, int* pF1, int* pF2) { char s[256]; char* str; + + GetALineAndDontArgue(pF, s); + str = strtok(s, "\t ,/"); + sscanf(str, "%d", pF1); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%d", pF2); } // Offset: 34476 @@ -882,6 +1067,14 @@ void GetPairOfInts(FILE* pF, int* pF1, int* pF2) { void GetThreeInts(FILE* pF, int* pF1, int* pF2, int* pF3) { char s[256]; char* str; + + GetALineAndDontArgue(pF, s); + str = strtok(s, "\t ,/"); + sscanf(str, "%d", pF1); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%d", pF2); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%d", pF3); } // Offset: 34648 @@ -904,12 +1097,23 @@ void GetThreeIntsAndAString(FILE* pF, int* pF1, int* pF2, int* pF3, char* pS) { void GetFourInts(FILE* pF, int* pF1, int* pF2, int* pF3, int* pF4) { char s[256]; char* str; + + GetALineAndDontArgue(pF, s); + str = strtok(s, "\t ,/"); + sscanf(str, "%d", pF1); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%d", pF2); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%d", pF3); + str = strtok(NULL, "\t ,/"); + sscanf(str, "%d", pF4); } // Offset: 35056 // Size: 51 // EAX: pF br_scalar GetAScalar(FILE* pF) { + return GetAFloat(pF); } // Offset: 35108 @@ -1000,6 +1204,10 @@ void GetThreeFloatPercents(FILE* pF, float* pF1, float* pF2, float* pF3) { void GetAString(FILE* pF, char* pString) { char s[256]; char* str; + + GetALineAndDontArgue(pF, s); + str = strtok(s, "\t ,/"); + strcpy(pString, str); } // Offset: 36396 @@ -1048,8 +1256,89 @@ FILE* OldDRfopen(char* pFilename, char* pMode) { tPath_name CD_dir; tPath_name path_file; tPath_name source_check; - static int source_exists; + static int source_exists = 1; int len; + int c; + + fp = fopen(pFilename, pMode); + + if (fp) { + len = strlen(pFilename) + 1; + if (gDecode_thing != 0) { + if (strcmp(&pFilename[len - 4], ".TXT") != 0 + && strcmp(&pFilename[len - 12], "DKEYMAP0.TXT") != 0 + && strcmp(&pFilename[len - 12], "DKEYMAP1.TXT") != 0 + && strcmp(&pFilename[len - 12], "DKEYMAP2.TXT") != 0 + && strcmp(&pFilename[len - 12], "DKEYMAP3.TXT") != 0 + && strcmp(&pFilename[len - 12], "KEYMAP_0.TXT") != 0 + && strcmp(&pFilename[len - 12], "KEYMAP_1.TXT") != 0 + && strcmp(&pFilename[len - 12], "KEYMAP_2.TXT") != 0 + && strcmp(&pFilename[len - 12], "KEYMAP_3.TXT") != 0 + && strcmp(&pFilename[len - 11], "OPTIONS.TXT") != 0 + && strcmp(&pFilename[len - 12], "KEYNAMES.TXT") != 0 + && strcmp(&pFilename[len - 10], "KEYMAP.TXT") != 0 + && strcmp(&pFilename[len - 9], "PATHS.TXT") != 0 + && strcmp(&pFilename[len - 11], "PRATCAM.TXT") != 0) { + + c = fgetc(fp); + if (c != gDecode_thing) { + fclose(fp); + return NULL; + } + ungetc(c, fp); + return fp; + } + } + } + if (gCD_fully_installed) { + return fp; + } + if (source_exists == 1) { + strcpy(path_file, "DATA"); + strcat(path_file, gDir_separator); + strcat(path_file, "PATHS.TXT"); + + if (!PDCheckDriveExists(path_file)) { + source_exists = 0; + return NULL; + } + test1 = fopen(path_file, "rt"); + if (!test1) { + source_exists = 0; + return NULL; + } + + GetALineAndDontArgue(test1, source_check); + strcat(source_check, gDir_separator); + strcat(source_check, "DATA"); + strcat(source_check, gDir_separator); + strcat(source_check, "GENERAL.TXT"); + + fclose(test1); + if (PDCheckDriveExists(source_check)) { + source_exists++; + } else { + PDFatalError("Carmageddon CD not in drive."); + if (gCD_fully_installed) { + source_exists = 0; + } + } + } + if (!source_exists) { + return fp; + } + + data_dir = strstr(pFilename, "DATA"); + if (data_dir != NULL) { + if (GetCDPathFromPathsTxtFile(CD_dir)) { + strcat(CD_dir, gDir_separator); + strcat(CD_dir, data_dir); + if (PDCheckDriveExists(CD_dir)) { + fp = fopen(CD_dir, pMode); + } + } + } + return fp; } // Offset: 38332 @@ -1070,6 +1359,20 @@ FILE* DRfopen(char* pFilename, char* pMode) { FILE* result; tPath_name CD_dir; char msg[336]; + + result = OldDRfopen(pFilename, pMode); + if (!result && !gAllow_open_to_fail) { + if (GetCDPathFromPathsTxtFile(CD_dir) && !PDCheckDriveExists(CD_dir)) { + if (gMisc_strings[0]) { + PDFatalError(GetMiscString(243)); + } else { + PDFatalError("Could not find the Carmageddon CD"); + } + sprintf(msg, "DRfopen( \"%s\", \"%s\" ) failed", pFilename, pMode); + PDFatalError(msg); + } + } + return result; } // Offset: 38604 @@ -1083,6 +1386,7 @@ int GetCDPathFromPathsTxtFile(char* pPath_name) { if (!got_it_already) { sprintf(paths_txt, "%s%s%s", gApplication_path, gDir_separator, "PATHS.TXT"); + printf("%s\n", paths_txt); paths_txt_fp = fopen(paths_txt, "rt"); if (!paths_txt_fp) { return 0; diff --git a/src/DETHRACE/common/newgame.c b/src/DETHRACE/common/newgame.c index 21f231c9..f561f883 100644 --- a/src/DETHRACE/common/newgame.c +++ b/src/DETHRACE/common/newgame.c @@ -1,6 +1,8 @@ #include "newgame.h" -char* gBasic_car_names[2]; +char x[] = "xxxxxxxx.TXT"; +char y[] = "yyyyyyyy.TXT"; +char* gBasic_car_names[2] = { x, y }; tNet_game_options gNet_settings[8]; tRadio_bastards gRadio_bastards[11]; tJoinable_game gGames_to_join[6]; diff --git a/src/DETHRACE/common/newgame.h b/src/DETHRACE/common/newgame.h index 761b5b93..d3d08b7b 100644 --- a/src/DETHRACE/common/newgame.h +++ b/src/DETHRACE/common/newgame.h @@ -4,6 +4,29 @@ #include "br_types.h" #include "dr_types.h" +extern char* gBasic_car_names[2]; +extern tNet_game_options gNet_settings[8]; +extern tRadio_bastards gRadio_bastards[11]; +extern tJoinable_game gGames_to_join[6]; +extern tNet_game_options* gOptions; +extern int gNet_target[7]; +extern int gLast_graph_sel; +extern tInterface_spec* gThe_interface_spec; +extern tNet_sequence_type gNet_race_sequence; +extern tNet_game_type gLast_game_type; +extern int gCurrent_net_game_count; +extern tU32 gAnne_flic_data_length; +extern int gShifted_default_yet; +extern int gNet_storage_allocated; +extern tU8* gFrank_flic_data; +extern char* gNet_name; +extern tU32 gFrank_flic_data_length; +extern tU8* gAnne_flic_data; +extern int gLast_net_choose_box; +extern int gCurrent_game_selection; +extern int gRace_index; +extern int gRadio_selected; + // Offset: 0 // Size: 149 void StartRollingPlayerNamesIn(); diff --git a/src/DETHRACE/common/opponent.h b/src/DETHRACE/common/opponent.h index b9fafc20..809219e5 100644 --- a/src/DETHRACE/common/opponent.h +++ b/src/DETHRACE/common/opponent.h @@ -4,6 +4,8 @@ #include "br_types.h" #include "dr_types.h" +extern float gOpponent_nastyness_frigger; + // Offset: 0 // Size: 137 // EAX: pThe_actor diff --git a/src/DETHRACE/common/pedestrn.h b/src/DETHRACE/common/pedestrn.h index f955e169..267b5529 100644 --- a/src/DETHRACE/common/pedestrn.h +++ b/src/DETHRACE/common/pedestrn.h @@ -4,6 +4,10 @@ #include "br_types.h" #include "dr_types.h" +extern int gMin_respawn_time; +extern int gRespawn_variance; +extern float gZombie_factor; + // Offset: 0 // Size: 152 // EAX: pModel diff --git a/src/DETHRACE/common/utility.c b/src/DETHRACE/common/utility.c index 3563dbe2..1c678f00 100644 --- a/src/DETHRACE/common/utility.c +++ b/src/DETHRACE/common/utility.c @@ -22,7 +22,7 @@ tU32 gOther_long_key[] = { 0x26D6A867, 0x1B45DDB6, 0x13227E32, 0x3794C215 }; char* gMisc_strings[250]; int gIn_check_quit; tU32 gLost_time; -int gEncryption_method = 1; +int gEncryption_method = 0; br_pixelmap* g16bit_palette; br_pixelmap* gSource_for_16bit_palette; @@ -32,11 +32,6 @@ int CheckQuit() { int got_as_far_as_verify; } -// Offset: 144 -// Size: 50 -double sqr(double pN) { -} - // Offset: 196 // Size: 542 // EAX: pS @@ -47,6 +42,80 @@ void EncodeLine(char* pS) { char* key; unsigned char c; FILE* test; + + tPath_name test_path; + char temp[256]; + + len = strlen(pS); + key = (char*)gLong_key; + if (!gEncryption_method) { + strcpy(test_path, gApplication_path); + strcat(test_path, gDir_separator); + strcat(test_path, "GENERAL.TXT"); + + test = fopen(test_path, "rt"); + if (test) { + fgets(temp, 256, test); + if (temp[0] != '@') { + gEncryption_method = 2; + } else { + gEncryption_method = 1; + EncodeLine(&temp[1]); + temp[7] = '\0'; + if (strcmp(&temp[1], "0.01\t\t") != 0) { + gEncryption_method = 2; + } + } + fclose(test); + } else { + gEncryption_method = 2; + } + } + while (len > 0 && (pS[len - 1] == '\r' || pS[len - 1] == '\n')) { + --len; + pS[len] = 0; + } + + seed = len % 16; + for (i = 0; i < len; i++) { + c = pS[i]; + if (i >= 2) { + if (pS[i - 1] == '/' && pS[i - 2] == '/') { + key = (char*)gOther_long_key; + } + } + if (gEncryption_method == 1) { + if (c == '\t') { + c = 0x80; + } + c -= 0x20; + if (!(c & 0x80)) { + c = (c ^ key[seed]) & 0x7f; + c += 0x20; + } + seed += 7; + seed = seed % 16; + + if (c == 0x80) { + c = '\t'; + } + } else { + if (c == '\t') { + c = 0x9f; + } + c -= 0x20; + c = (c ^ key[seed]) & 0x7f; + c += 0x20; + + seed += 7; + seed = seed % 16; + + if (c == 0x9f) { + c = '\t'; + } + } + pS[i] = c; + } } // Offset: 740 @@ -126,8 +195,9 @@ char* GetALineWithNoPossibleService(FILE* pF, /*unsigned*/ char* pS) { break; } } - if (ch != -1) + if (ch != -1) { ungetc(ch, pF); + } } while (!isalnum(s[0]) && s[0] != '-' && s[0] != '.' @@ -172,7 +242,9 @@ char* GetALineAndDontArgue(FILE* pF, char* pS) { // EDX: pStr_1 // EBX: pStr_2 void PathCat(char* pDestn_str, char* pStr_1, char* pStr_2) { - strcpy(pDestn_str, pStr_1); + if (pDestn_str != pStr_1) { // Added to avoid strcpy overlap checks + strcpy(pDestn_str, pStr_1); + } if (strlen(pStr_2) != 0) { strcat(pDestn_str, gDir_separator); strcat(pDestn_str, pStr_2); diff --git a/src/DETHRACE/common/utility.h b/src/DETHRACE/common/utility.h index 1dc26474..6df93262 100644 --- a/src/DETHRACE/common/utility.h +++ b/src/DETHRACE/common/utility.h @@ -4,14 +4,13 @@ #include "br_types.h" #include "dr_types.h" +extern char* gMisc_strings[250]; +extern int gEncryption_method; + // Offset: 0 // Size: 144 int CheckQuit(); -// Offset: 144 -// Size: 50 -double sqr(double pN); - // Offset: 196 // Size: 542 // EAX: pS diff --git a/src/DETHRACE/common/world.c b/src/DETHRACE/common/world.c index a66797e6..d2cc0a55 100644 --- a/src/DETHRACE/common/world.c +++ b/src/DETHRACE/common/world.c @@ -1,5 +1,10 @@ #include "world.h" +#include "brender.h" +#include "loading.h" + +#include + br_actor* gActor_array[500]; float* gGroove_funk_bindings[960]; br_actor* gDelete_list[500]; @@ -872,6 +877,23 @@ int GetCarSimplificationLevel() { // EBX: pScreen_name_str void ParseSpecialVolume(FILE* pF, tSpecial_volume* pSpec, char* pScreen_name_str) { char s[256]; + pSpec->gravity_multiplier = GetAScalar(pF); + pSpec->viscosity_multiplier = GetAScalar(pF); + pSpec->car_damage_per_ms = GetAScalar(pF); + pSpec->ped_damage_per_ms = GetAScalar(pF); + pSpec->camera_special_effect_index = GetAnInt(pF); + pSpec->sky_col = GetAnInt(pF); + + GetAString(pF, s); + if (pScreen_name_str) { + strcpy(pScreen_name_str, s); + } else { + pSpec->screen_material = BrMaterialFind(s); + } + pSpec->entry_noise = GetAnInt(pF); + pSpec->exit_noise = GetAnInt(pF); + pSpec->engine_noise_index = GetAnInt(pF); + pSpec->material_modifier_index = GetAnInt(pF); } // Offset: 23584 diff --git a/src/DETHRACE/new/stack_trace_handler.h b/src/DETHRACE/new/stack_trace_handler.h new file mode 100644 index 00000000..2d377456 --- /dev/null +++ b/src/DETHRACE/new/stack_trace_handler.h @@ -0,0 +1,316 @@ +// Based on https://gist.github.com/jvranish/4441299 + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#endif + +static int stack_nbr = 0; +static char _program_name[1024]; + +/* Resolve symbol name and source location given the path to the executable + and an address */ +int addr2line(char const* const program_name, void const* const addr) { + char addr2line_cmd[512] = { 0 }; + +/* have addr2line map the address to the relent line in the code */ +#ifdef __APPLE__ + /* apple does things differently... */ + sprintf(addr2line_cmd, "atos -o %.256s %p", program_name, addr); +#else + sprintf(addr2line_cmd, "addr2line -f -p -e %.256s %p", program_name, addr); +#endif + + fprintf(stderr, "%d: ", stack_nbr++); + return system(addr2line_cmd); +} + +#ifdef _WIN32 +void windows_print_stacktrace(CONTEXT* context) { + SymInitialize(GetCurrentProcess(), 0, true); + + STACKFRAME frame = { 0 }; + + /* setup initial stack frame */ + frame.AddrPC.Offset = context->Eip; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrStack.Offset = context->Esp; + frame.AddrStack.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context->Ebp; + frame.AddrFrame.Mode = AddrModeFlat; + + while (StackWalk(IMAGE_FILE_MACHINE_I386, + GetCurrentProcess(), + GetCurrentThread(), + &frame, + context, + 0, + SymFunctionTableAccess, + SymGetModuleBase, + 0)) { + addr2line(_program_name, (void*)frame.AddrPC.Offset); + } + + SymCleanup(GetCurrentProcess()); +} + +LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS* ExceptionInfo) { + switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { + case EXCEPTION_ACCESS_VIOLATION: + fputs("Error: EXCEPTION_ACCESS_VIOLATION\n", stderr); + break; + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + fputs("Error: EXCEPTION_ARRAY_BOUNDS_EXCEEDED\n", stderr); + break; + case EXCEPTION_BREAKPOINT: + fputs("Error: EXCEPTION_BREAKPOINT\n", stderr); + break; + case EXCEPTION_DATATYPE_MISALIGNMENT: + fputs("Error: EXCEPTION_DATATYPE_MISALIGNMENT\n", stderr); + break; + case EXCEPTION_FLT_DENORMAL_OPERAND: + fputs("Error: EXCEPTION_FLT_DENORMAL_OPERAND\n", stderr); + break; + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + fputs("Error: EXCEPTION_FLT_DIVIDE_BY_ZERO\n", stderr); + break; + case EXCEPTION_FLT_INEXACT_RESULT: + fputs("Error: EXCEPTION_FLT_INEXACT_RESULT\n", stderr); + break; + case EXCEPTION_FLT_INVALID_OPERATION: + fputs("Error: EXCEPTION_FLT_INVALID_OPERATION\n", stderr); + break; + case EXCEPTION_FLT_OVERFLOW: + fputs("Error: EXCEPTION_FLT_OVERFLOW\n", stderr); + break; + case EXCEPTION_FLT_STACK_CHECK: + fputs("Error: EXCEPTION_FLT_STACK_CHECK\n", stderr); + break; + case EXCEPTION_FLT_UNDERFLOW: + fputs("Error: EXCEPTION_FLT_UNDERFLOW\n", stderr); + break; + case EXCEPTION_ILLEGAL_INSTRUCTION: + fputs("Error: EXCEPTION_ILLEGAL_INSTRUCTION\n", stderr); + break; + case EXCEPTION_IN_PAGE_ERROR: + fputs("Error: EXCEPTION_IN_PAGE_ERROR\n", stderr); + break; + case EXCEPTION_INT_DIVIDE_BY_ZERO: + fputs("Error: EXCEPTION_INT_DIVIDE_BY_ZERO\n", stderr); + break; + case EXCEPTION_INT_OVERFLOW: + fputs("Error: EXCEPTION_INT_OVERFLOW\n", stderr); + break; + case EXCEPTION_INVALID_DISPOSITION: + fputs("Error: EXCEPTION_INVALID_DISPOSITION\n", stderr); + break; + case EXCEPTION_NONCONTINUABLE_EXCEPTION: + fputs("Error: EXCEPTION_NONCONTINUABLE_EXCEPTION\n", stderr); + break; + case EXCEPTION_PRIV_INSTRUCTION: + fputs("Error: EXCEPTION_PRIV_INSTRUCTION\n", stderr); + break; + case EXCEPTION_SINGLE_STEP: + fputs("Error: EXCEPTION_SINGLE_STEP\n", stderr); + break; + case EXCEPTION_STACK_OVERFLOW: + fputs("Error: EXCEPTION_STACK_OVERFLOW\n", stderr); + break; + default: + fputs("Error: Unrecognized Exception\n", stderr); + break; + } + fflush(stderr); + /* If this is a stack overflow then we can't walk the stack, so just show + where the error happened */ + if (EXCEPTION_STACK_OVERFLOW != ExceptionInfo->ExceptionRecord->ExceptionCode) { + windows_print_stacktrace(ExceptionInfo->ContextRecord); + } else { + addr2line(_program_name, (void*)ExceptionInfo->ContextRecord->Eip); + } + + return EXCEPTION_EXECUTE_HANDLER; +} + +void set_signal_handler(char* program_name) { + strcpy(_program_name, program_name); + SetUnhandledExceptionFilter(windows_exception_handler); +} +#else + +#define MAX_STACK_FRAMES 64 +static void* stack_traces[MAX_STACK_FRAMES]; + +void posix_print_stack_trace() { + int i, trace_size = 0; + char** messages = (char**)NULL; + + fputs("\nStack trace:\n", stderr); + + trace_size = backtrace(stack_traces, MAX_STACK_FRAMES); + messages = backtrace_symbols(stack_traces, trace_size); + + /* skip the first couple stack frames (as they are this function and + our handler) and also skip the last frame as it's (always?) junk. */ + for (i = 3; i < (trace_size - 1); ++i) { + if (addr2line(_program_name, stack_traces[i]) != 0) { + printf(" error determining line # for: %s\n", messages[i]); + } + } + if (messages) { + free(messages); + } +} + +void posix_signal_handler(int sig, siginfo_t* siginfo, void* context) { + (void)context; + fputs("\n******************\n", stderr); + + switch (sig) { + case SIGSEGV: + fputs("Caught SIGSEGV\n", stderr); + break; + case SIGINT: + fputs("Caught SIGINT\n", stderr); + break; + case SIGFPE: + switch (siginfo->si_code) { + case FPE_INTDIV: + fputs("Caught SIGFPE: FPE_INTDIV\n", stderr); + break; + case FPE_INTOVF: + fputs("Caught SIGFPE: FPE_INTOVF\n", stderr); + break; + case FPE_FLTDIV: + fputs("Caught SIGFPE: FPE_FLTDIV\n", stderr); + break; + case FPE_FLTOVF: + fputs("Caught SIGFPE: FPE_FLTOVF\n", stderr); + break; + case FPE_FLTUND: + fputs("Caught SIGFPE: FPE_FLTUND\n", stderr); + break; + case FPE_FLTRES: + fputs("Caught SIGFPE: FPE_FLTRES\n", stderr); + break; + case FPE_FLTINV: + fputs("Caught SIGFPE: FPE_FLTINV\n", stderr); + break; + case FPE_FLTSUB: + fputs("Caught SIGFPE: FPE_FLTSUB\n", stderr); + break; + default: + fputs("Caught SIGFPE: Arithmetic Exception\n", stderr); + break; + } + case SIGILL: + switch (siginfo->si_code) { + case ILL_ILLOPC: + fputs("Caught SIGILL: ILL_ILLOPC\n", stderr); + break; + case ILL_ILLOPN: + fputs("Caught SIGILL: ILL_ILLOPN\n", stderr); + break; + case ILL_ILLADR: + fputs("Caught SIGILL: ILL_ILLADR\n", stderr); + break; + case ILL_ILLTRP: + fputs("Caught SIGILL: ILL_ILLTRP\n", stderr); + break; + case ILL_PRVOPC: + fputs("Caught SIGILL: ILL_PRVOPC\n", stderr); + break; + case ILL_PRVREG: + fputs("Caught SIGILL: ILL_PRVREG\n", stderr); + break; + case ILL_COPROC: + fputs("Caught SIGILL: ILL_COPROC\n", stderr); + break; + case ILL_BADSTK: + fputs("Caught SIGILL: ILL_BADSTK\n", stderr); + break; + default: + fputs("Caught SIGILL: Illegal Instruction\n", stderr); + break; + } + break; + case SIGTERM: + fputs("Caught SIGTERM\n", stderr); + break; + case SIGABRT: + fputs("Caught SIGABRT\n", stderr); + break; + default: + break; + } + fputs("******************\n", stderr); + posix_print_stack_trace(); + exit(1); +} + +static uint8_t alternate_stack[SIGSTKSZ]; +void set_signal_handler(char* program_name) { + + strcpy(_program_name, program_name); + + /* setup alternate stack */ + { + stack_t ss = {}; + /* malloc is usually used here, I'm not 100% sure my static allocation + is valid but it seems to work just fine. */ + ss.ss_sp = (void*)alternate_stack; + ss.ss_size = SIGSTKSZ; + ss.ss_flags = 0; + + if (sigaltstack(&ss, NULL) != 0) { + err(1, "sigaltstack"); + } + } + + /* register our signal handlers */ + { + struct sigaction sig_action = {}; + sig_action.sa_sigaction = posix_signal_handler; + sigemptyset(&sig_action.sa_mask); + +#ifdef __APPLE__ + /* for some reason we backtrace() doesn't work on osx + when we use an alternate stack */ + sig_action.sa_flags = SA_SIGINFO; +#else + sig_action.sa_flags = SA_SIGINFO | SA_ONSTACK; +#endif + + if (sigaction(SIGSEGV, &sig_action, NULL) != 0) { + err(1, "sigaction"); + } + if (sigaction(SIGFPE, &sig_action, NULL) != 0) { + err(1, "sigaction"); + } + if (sigaction(SIGINT, &sig_action, NULL) != 0) { + err(1, "sigaction"); + } + if (sigaction(SIGILL, &sig_action, NULL) != 0) { + err(1, "sigaction"); + } + if (sigaction(SIGTERM, &sig_action, NULL) != 0) { + err(1, "sigaction"); + } + if (sigaction(SIGABRT, &sig_action, NULL) != 0) { + err(1, "sigaction"); + } + } +} +#endif \ No newline at end of file diff --git a/src/DETHRACE/pc-dos/main.c b/src/DETHRACE/pc-dos/main.c index 55d784cd..fbbc7fc2 100644 --- a/src/DETHRACE/pc-dos/main.c +++ b/src/DETHRACE/pc-dos/main.c @@ -1,3 +1,4 @@ +#include "new/stack_trace_handler.h" #include "pc-dos/dossys.h" extern int _main(int pArgc, char* pArgv[]); @@ -5,6 +6,7 @@ extern int _main(int pArgc, char* pArgv[]); // EAX: pArgc // EDX: pArgv // Moved from pc-dos/dossys.c to enable unit testing -int main(int pArgc, char* pArgv[]) { - return _main(pArgc, pArgv); +int main(int argc, char* argv[]) { + set_signal_handler(argv[0]); + return _main(argc, argv); } diff --git a/test/DETHRACE/test_dossys.c b/test/DETHRACE/test_dossys.c index ad9ef50d..520c94c2 100644 --- a/test/DETHRACE/test_dossys.c +++ b/test/DETHRACE/test_dossys.c @@ -7,11 +7,6 @@ #include "pc-dos/dossys.h" void test_dossys_PDInitialiseSystem() { - - FILE* file = fopen("/tmp/KEYBOARD.COK", "wt"); - fprintf(file, "abcdef"); - fclose(file); - PDInitialiseSystem(); TEST_ASSERT_EQUAL_STRING("abc", gASCII_table); TEST_ASSERT_EQUAL_STRING("def", gASCII_shift_table); diff --git a/test/DETHRACE/test_loading.c b/test/DETHRACE/test_loading.c index bddefff4..17035c3d 100644 --- a/test/DETHRACE/test_loading.c +++ b/test/DETHRACE/test_loading.c @@ -4,27 +4,47 @@ #include #include "common/globvars.h" +#include "common/init.h" #include "common/loading.h" +#include "common/newgame.h" void test_loading_GetCDPathFromPathsTxtFile() { int result; tPath_name cd_path; - unlink("/tmp/PATHS.TXT"); - - // should return false, path does not exist - result = GetCDPathFromPathsTxtFile(cd_path); - TEST_ASSERT_EQUAL_INT(0, result); - - FILE* file = fopen("/tmp/PATHS.TXT", "wt"); - fprintf(file, "test_cd_path\r\n"); - fclose(file); - result = GetCDPathFromPathsTxtFile(cd_path); TEST_ASSERT_EQUAL_INT(1, result); - TEST_ASSERT_EQUAL_STRING("test_cd_path", cd_path); + TEST_ASSERT_EQUAL_STRING(".\\DATA\\MINICD", cd_path); +} + +void test_loading_OldDRfopen() { + FILE* f; + + f = OldDRfopen("DATA/i-dont-exist", "rt"); + TEST_ASSERT_NULL(f); + + f = OldDRfopen("DATA/GENERAL.TXT", "rt"); + TEST_ASSERT_NOT_NULL(f); +} + +void test_loading_LoadGeneralParameters() { + + LoadGeneralParameters(); + TEST_ASSERT_EQUAL_FLOAT(0.02f, gCamera_hither); + TEST_ASSERT_EQUAL_INT(7500, gInitial_credits[0]); + TEST_ASSERT_EQUAL_INT(5000, gInitial_credits[1]); + TEST_ASSERT_EQUAL_INT(3000, gInitial_credits[2]); + TEST_ASSERT_EQUAL_STRING("BLKEAGLE.TXT", gBasic_car_names[0]); + TEST_ASSERT_EQUAL_FLOAT(0.2f, gDefault_default_water_spec_vol.gravity_multiplier); + TEST_ASSERT_EQUAL_FLOAT(50.0f, gDefault_default_water_spec_vol.viscosity_multiplier); + + TEST_ASSERT_EQUAL_INT(0, gInitial_net_credits[0]); + TEST_ASSERT_EQUAL_INT(2000, gInitial_net_credits[1]); + TEST_ASSERT_EQUAL_INT(1, gGravity_multiplier); } void test_loading_suite() { RUN_TEST(test_loading_GetCDPathFromPathsTxtFile); + RUN_TEST(test_loading_OldDRfopen); + RUN_TEST(test_loading_LoadGeneralParameters); } diff --git a/test/DETHRACE/test_utility.c b/test/DETHRACE/test_utility.c index 8e2eb34f..2375a8c5 100644 --- a/test/DETHRACE/test_utility.c +++ b/test/DETHRACE/test_utility.c @@ -3,8 +3,20 @@ #include "common/utility.h" #include +void test_utility_EncodeLinex() { + char buf[50]; + // first line of GENERAL.TXT, "@" prefix and line ending stripped + char input[] = "\x29\x2a\x9c\x22\x61\x4d\x5e\x5f\x60\x34\x64\x57\x8d\x2b\x82\x7b\x33\x4c"; + strcpy(buf, input); + EncodeLine(buf); + //TEST_ASSERT_EQUAL_INT(2, gEncryption_method); + char expected[] = "0.01\t\t\t\t\t// Hither"; + TEST_ASSERT_EQUAL_STRING(expected, buf); +} + void test_utility_DecodeLine2() { char buf[50]; + gEncryption_method = 1; // first line of GENERAL.TXT, "@" prefix and line ending stripped char input[] = "\x29\x2a\x9c\x22\x61\x4d\x5e\x5f\x60\x34\x64\x57\x8d\x2b\x82\x7b\x33\x4c"; strcpy(buf, input); @@ -69,6 +81,7 @@ void test_utility_PathCat() { } void test_utility_suite() { + RUN_TEST(test_utility_EncodeLinex); RUN_TEST(test_utility_DecodeLine2); RUN_TEST(test_utility_EncodeLine2); RUN_TEST(test_utility_StripCR); diff --git a/test/Makefile b/test/Makefile index 49bb5f14..e49de68d 100644 --- a/test/Makefile +++ b/test/Makefile @@ -16,8 +16,8 @@ DEPS := $(OBJS:.o=.d) INC_DIRS := $(shell find $(SRC_DIR) -type d) $(BR_SRC_DIR) $(DR_SRC_DIR) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) -CFLAGS ?= $(INC_FLAGS) -LDFLAGS ?= -lm +CFLAGS ?= $(INC_FLAGS) -g +LDFLAGS ?= -lm -fno-pie .PHONY: clean build run diff --git a/test/assets/DATA/ACTORS/PROG.ACT b/test/assets/DATA/ACTORS/PROG.ACT new file mode 100644 index 00000000..7167e786 --- /dev/null +++ b/test/assets/DATA/ACTORS/PROG.ACT @@ -0,0 +1 @@ + ******************************************************************************************************************************************************************************************************************************************************************** \ No newline at end of file diff --git a/test/assets/DATA/GENERAL.TXT b/test/assets/DATA/GENERAL.TXT new file mode 100644 index 00000000..5f7fd824 --- /dev/null +++ b/test/assets/DATA/GENERAL.TXT @@ -0,0 +1,83 @@ +@)*œ"aM^_`4dW+‚{3L +@Ÿ&O}n_`›KŽp3VJ9P +@1™=Tx^_`›K!pb5r;[Uz4<{Ž +@n_`›KŽ_3V3—SErq3aFƒŒ˜‚66›v8J +@+yŽ™„,“Nb5.‡‰–‚5b”r5U@i{({‚BŠ ž"*‚}3MT;u0z“Œœ +@*XM^_`›K!pb?}?JNzx}g‡Œƒ +@|;o,U;)4œ?R}no`›K!pb?}?JNzx}v”‡Œ›ƒ6b|$žBzw55•‰ž›e.“e3R +@<)4œ#M~koP+g:o,I>™„ƒ<4žgƒ††„e2“avLFu}s‰H—–&*V`=WKw41p‡„ +@z oœyŽ™„,™„,“aMqpB/ž˜'#š35LRh|‚y†(!' z7PS;r}‡Œ‹—W##•g9L +@{ hœyŽ™„,56œ?R}^_`›K!pb$v&_Ni4>z•–H”˜7b“r5V‡h4yŠB„— .V;5LB4-p”BMR“$/—t3— +@"Q}ns@){>o0Y:)4œ“abqF0‘˜3'„jv]Hh`}s‰H—–&*V`=WKw41p‡„ +@mP7s"jœyŽ™+ƒ;@4xƒB˜—…e2“wvUNwx}s‰H—–&*V`=WKw41p‡„ +@>q+L")*™?Qclj`›K!pb%v5QIg}eƒH‡™,6Vp7L‡u0t‡H”˜7b“r5V‡h4yŠB„— .V;!WSs4-p‚‘A +@5?Yak_`›K!pb5a3ZNog}eƒH‡™,6Vp7L‡u0t‡H”˜7b“r5V‡h4yŠB„— .V;!WSs4-p‚‘A +@-K>5=œ?W}^_`›d!e–Ÿ~3žFlu/qƒ†H”˜7br%JNus}v‡H”˜7b“r5V‡h4yŠB„— .V;!WSs4-p‚‘A +@J>)4 !Q}nsQ+{>_œy!6ždiq9|’‘H“ $0’v2žAtf}b‡‘œ›™"b•r$žAtf}p‡ R„.+švRBmq15N•†Ÿe2“w%— +@hoL({"n)yŽ™„ƒ<4‰|‹‡H“ $0’v2žAtf}g‰Ž„›™"b•r$žAtf}p‡ R„.+švRBmq15N•†Ÿe2“w%— +@H>)4 "Q}nsQ+{>_œy!6ždiq9|’‘H“ $0’v2žAtf}g‰Ž„›™"b•r$žAtf}p‡ R„.+švRBmq15N•†Ÿe2“w%— +@){>o0L>)(™#aM^pOH1… &Ÿg%žFlu/qƒ†H”˜7b•{3]Lk{4{’‘H”˜7b“r5V‡h4yŠB„— .V;!WSs4-p‚‘A +@>q+L")*™?Qclj`›K!pb%v5QIg}eƒH‡™,6Vp7L‡u0t‡H”˜7b“r5V‡h4yŠB„— .V;!WSs4-p‚‘A +@5?Yak_`›K!pb5a3ZNog}eƒH‡™,6Vp7L‡u0t‡H”˜7b“r5V‡h4yŠB„— .V;!WSs4-p‚‘A +@-K>5=œ?W}^_`›d!e–Ÿ~3žFlu/qƒ†H”˜7br%JNus}v‡H”˜7b“r5V‡h4yŠB„— .V;!WSs4-p‚‘A +@J>)4 !Q}nsQ+{>_œy!6ždiq9|’‘H“ $0’v2žAtf}b‡‘œ›™"b•r$žAtf}p‡ R„.+švRBmq15N•†Ÿe2“w%— +@hoL({"n)yŽ™„ƒ<4‰|‹‡H“ $0’v2žAtf}g‰Ž„›™"b•r$žAtf}p‡ R„.+švRBmq15N•†Ÿe2“w%— +@H>)4 "Q}nsQ+{>_œy!6ždiq9|’‘H“ $0’v2žAtf}g‰Ž„›™"b•r$žAtf}p‡ R„.+švRBmq15N•†Ÿe2“w%— +@){>o0L>)(™#aM^pOH1… &Ÿg%žFlu/qƒ†H”˜7b•{3]Lk{4{’‘H”˜7b“r5V‡h4yŠB„— .V;!WSs4-p‚‘A +@nP+{"n,I>55œ#QM^_`4dW7›cvMSzf)5 ‹†—W#-„33_Ds41p‡„ +@PxrnP7~Ž_œy!6ždiq9|’‘H‚’7b…v5QI42sF–Ÿ’e ™}#M +@<)4œ?P}noL.{>_œy!6ždnz3|ˆ…Hƒ0,‚34QIng}s‰H—–&*V`=WKw41p‡„ +@!6ždzf.5’H‡„ b—`vZB}u(y’‘R +@œ“+^ŠI“YWZAP +@Ÿ‘.RŽMžNWZAP +@)„,“abqF$š“š b„r"[‡pz2w„Ž W#-„37]Sr{35”‡˜ž–p”NHNWtbK38WD~fq5XBYRJe,—`"WBi4uc‡Ž—„e “g![Bu4m;WB‰œ“esF3%VHnx95‚A +@!pb2v0_Rw`}`ˆ† $6“avMW~w4tŠBž›0/“3&_Uzy8aƒ› +@+e<_œyŽ™„,“abqF…š“,63;KKo}-y‡š +@,4,“aM^_`›K!pb z%]Hh})lFžƒ,2šz3L +@#aM^_`›KŽ_3V3•_U;po.yŽ™„,“aMqpB8—“ 1‚a?_I;p™„,“aM^_O4R$*7˜wvwc;{;5ƒŒœ Že,™z%[ +@xooP›KŽ_œyŽ™+ƒ;G2`ˆ†H;3e-33FNo43z‘ +@<_œyŽ™„,“abqF'†•ž+'V}9WT~44{‚‡ +@>™„,“aM^_`4dW(#‚v$WFw44{‚‡ +@)(ž#Q}rjP+{"n,I>)(ž#Q}n_`›d!e‘‚r$JNus}x‰Œ‹W,,V}3JPtf65‹Œ—Wm$™av[Fx|}f‹„žW)' v:— +@=oœyŽ™„,o,U?)4œ?P}noL*{>o0H>)4 +@3V3•_U;g2s’Œ„e$—p"QU;r2gF‡‰‘Ÿe,“gvYFvq}aŸ’ +@?74 "OxrnN.g?q)U?71 "OxrnN. +@p3VMxvgŽ`=>’;/o2}žk9iY•$.3‰~9.9s‹.|eO{A#;+@|*c:<wia +@<74 O}rnN+g?q,U?74 "O}rnN+ +@™„,“aMqpB,—š*b„r5[‡iu3~F‡™‡ž3#šv8J +@<™„,“aMqpB,—š*b—a;QRi41p‡„ +@Q›KŽ_œy!6žc~y25–Ÿ—…e.“e3R +@SM^_`›K!pb2v;Q‡tr;pˆ‘„’e.“e3R +@bqF-˜‚˜+'˜g%žSsu)5‡’˜—–7bŸ}vZBv{}r‡ +@(2 +@(6 +@+6 +@(= +@, +@3V32[Aza1aF%š“,63›KKo}-y‡š +@* +@V!vxKrw}f‰—†–W!'šr/M +@>_œyŽ™„ƒ<4™pŠƒ‘R_,,V`3]Hup.%SFx}sŠ‹‹ +@œ“aM^_`4dW'šr/žrz}fƒ‡œ“6kVq3XHiq}f‰—†–W!7„z8Y‡k{.aK‘…“”.b?] +@o`›KŽ_œV!vzBwu$5N‹†R„ !™}2MŽ;v8s‰R„*7˜wvZRi}3rFE†ƒe+˜32[Jt3}sŠ‹‹ +@4,“aM^_O4R3 .—jv–Nu4.p…†–„lb”v0QU~4.z“ŒŒR“00Ÿ}1žWtg)8‚‡…W6.Ÿw3MOtc}sŠ‹‹ diff --git a/test/assets/DATA/KEYBOARD.COK b/test/assets/DATA/KEYBOARD.COK new file mode 100644 index 00000000..d96dc957 --- /dev/null +++ b/test/assets/DATA/KEYBOARD.COK @@ -0,0 +1 @@ +abcdef \ No newline at end of file diff --git a/test/assets/DATA/MINICD/DATA/GENERAL.TXT b/test/assets/DATA/MINICD/DATA/GENERAL.TXT new file mode 100644 index 00000000..0f745c88 --- /dev/null +++ b/test/assets/DATA/MINICD/DATA/GENERAL.TXT @@ -0,0 +1 @@ +Placeholder file for CD check... \ No newline at end of file diff --git a/test/assets/DATA/PATHS.TXT b/test/assets/DATA/PATHS.TXT new file mode 100644 index 00000000..fc5b668a --- /dev/null +++ b/test/assets/DATA/PATHS.TXT @@ -0,0 +1,5 @@ +.\DATA\MINICD +. +Full +English +..\CARMA diff --git a/test/framework/unity.c b/test/framework/unity.c index 424c634f..1c561ecc 100644 --- a/test/framework/unity.c +++ b/test/framework/unity.c @@ -1606,6 +1606,8 @@ void UnityMessage(const char* msg, const UNITY_LINE_TYPE line) { void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) { Unity.CurrentTestName = FuncName; Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; + if (!UnityTestMatches()) + return; Unity.NumberOfTests++; UNITY_CLR_DETAILS(); UNITY_EXEC_TIME_START(); @@ -1670,7 +1672,7 @@ int UnityEnd(void) { /*----------------------------------------------- * Command Line Argument Support *-----------------------------------------------*/ -#ifdef UNITY_USE_COMMAND_LINE_ARGS +// #ifdef UNITY_USE_COMMAND_LINE_ARGS char* UnityOptionIncludeNamed = NULL; char* UnityOptionExcludeNamed = NULL; @@ -1842,5 +1844,5 @@ int UnityTestMatches(void) { return retval; } -#endif /* UNITY_USE_COMMAND_LINE_ARGS */ +//#endif /* UNITY_USE_COMMAND_LINE_ARGS */ /*-----------------------------------------------*/ diff --git a/test/framework/unity_internals.h b/test/framework/unity_internals.h index 3130efba..344b8179 100644 --- a/test/framework/unity_internals.h +++ b/test/framework/unity_internals.h @@ -732,6 +732,10 @@ extern const char UnityStrErrShorthand[]; #define UNITY_BEGIN() UnityBegin(__FILE__) #endif +#ifndef UNITY_PARSE_OPTS +#define UNITY_PARSE_OPTS() UnityParseOptions(argc, argv) +#endif + #ifndef UNITY_END #define UNITY_END() UnityEnd() #endif @@ -750,10 +754,8 @@ extern const char UnityStrErrShorthand[]; * Command Line Argument Support *-----------------------------------------------*/ -#ifdef UNITY_USE_COMMAND_LINE_ARGS int UnityParseOptions(int argc, char** argv); int UnityTestMatches(void); -#endif /*------------------------------------------------------- * Basic Fail and Ignore diff --git a/test/main.c b/test/main.c index 115bcce2..936bc0b3 100644 --- a/test/main.c +++ b/test/main.c @@ -1,12 +1,19 @@ #include #include #include +#include +#include + +#define UNITY_USE_COMMAND_LINE_ARGS 1 #include "framework/unity.h" #include "CORE/V1DB/dbsetup.h" #include "common/globvars.h" +#include "new/stack_trace_handler.h" + +#define debug(format_, ...) fprintf(stderr, format_, __VA_ARGS__) #define debug(format_, ...) fprintf(stderr, format_, __VA_ARGS__) @@ -22,19 +29,31 @@ extern void test_fwsetup_suite(); extern void test_resource_suite(); void setUp(void) { - strcpy(gApplication_path, "/tmp"); - strcpy(gDir_separator, "/"); - - BrV1dbBeginWrapper_Float(); } void tearDown(void) { } -int main(int pArgc, char** pArgv) { +void setupGlobalVars() { + strcpy(gDir_separator, "/"); + getcwd(gApplication_path, 256); + strcat(gApplication_path, "/DATA"); +} + +int main(int argc, char** argv) { UNITY_BEGIN(); + if (UnityParseOptions(argc, argv) != 0) { + exit(1); + } + + set_signal_handler(argv[0]); + + setupGlobalVars(); + + BrV1dbBeginWrapper_Float(); + // BRSRC13 test_brlists_suite(); test_fwsetup_suite();