#include "drmem.h"
 
#include "brender/brender.h"
 
#include "errors.h"
 
#include "harness/trace.h"
 
#include <stdlib.h>
 
 
 
br_allocator gAllocator = { "Death Race", DRStdlibAllocate, DRStdlibFree, DRStdlibInquire, Claim4ByteAlignment };
 
int gNon_fatal_allocation_errors = 0;
 
char* gMem_names[247] = {
 
    "",
 
    "BR_MEMORY_SCRATCH",
 
    "BR_MEMORY_PIXELMAP",
 
    "BR_MEMORY_PIXELS",
 
    "BR_MEMORY_VERTICES",
 
    "BR_MEMORY_FACES",
 
    "BR_MEMORY_GROUPS",
 
    "BR_MEMORY_MODEL",
 
    "BR_MEMORY_MATERIAL",
 
    "BR_MEMORY_MATERIAL_INDEX",
 
    "BR_MEMORY_ACTOR",
 
    "BR_MEMORY_PREPARED_VERTICES",
 
    "BR_MEMORY_PREPARED_FACES",
 
    "BR_MEMORY_LIGHT",
 
    "BR_MEMORY_CAMERA",
 
    "BR_MEMORY_BOUNDS",
 
    "BR_MEMORY_CLIP_PLANE",
 
    "BR_MEMORY_STRING",
 
    "BR_MEMORY_REGISTRY",
 
    "BR_MEMORY_TRANSFORM",
 
    "BR_MEMORY_RESOURCE_CLASS",
 
    "BR_MEMORY_FILE",
 
    "BR_MEMORY_ANCHOR",
 
    "BR_MEMORY_POOL",
 
    "BR_MEMORY_RENDER_MATERIAL",
 
    "BR_MEMORY_DATAFILE",
 
    "BR_MEMORY_IMAGE",
 
    "BR_MEMORY_IMAGE_ARENA",
 
    "BR_MEMORY_IMAGE_SECTIONS",
 
    "BR_MEMORY_IMAGE_NAMES",
 
    "BR_MEMORY_EXCEPTION_HANDLER",
 
    "BR_MEMORY_RENDER_DATA",
 
    "BR_MEMORY_TOKEN",
 
    "BR_MEMORY_TOKEN_MAP",
 
    "BR_MEMORY_OBJECT",
 
    "BR_MEMORY_OBJECT_DATA",
 
    "BR_MEMORY_DRIVER",
 
    "BR_MEMORY_LEXER",
 
    "BR_MEMORY_OBJECT_LIST",
 
    "BR_MEMORY_OBJECT_LIST_ENTRY",
 
    "BR_MEMORY_ENABLED_ACTORS",
 
    "BR_MEMORY_FMT_RESULTS",
 
    "BR_MEMORY_PREPARED_MODEL",
 
    "BR_MEMORY_ORDER_TABLE",
 
    "BR_MEMORY_TOKEN_VALUE",
 
    "BR_MEMORY_TOKEN_TEMPLATE",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "",
 
    "kMem_intf_pix_copy",
 
    "kMem_intf_pal_copy",
 
    "kMem_nodes_array",
 
    "kMem_sections_array",
 
    "kMem_key_names",
 
    "kMem_columns_z",
 
    "kMem_columns_x",
 
    "kMem_non_car_list",
 
    "kMem_simp_level",
 
    "kMem_crush_data",
 
    "kMem_crush_neighbours",
 
    "kMem_temp_fs",
 
    "kMem_error_pix_copy",
 
    "kMem_error_pal_copy",
 
    "kMem_flic_pal",
 
    "kMem_flic_data",
 
    "kMem_flic_data_2",
 
    "kMem_queued_flic",
 
    "kFlic_panel_pixels",
 
    "kMem_translations",
 
    "kMem_translations_text",
 
    "kMem_cur_pal_pixels",
 
    "kMem_render_pal_pixels",
 
    "kMem_scratch_pal_pixels",
 
    "kMem_shade_table_copy",
 
    "kMem_rear_screen_pixels",
 
    "kMem_rolling_letters",
 
    "kMem_intf_copy_areas",
 
    "kMem_strip_image",
 
    "kMem_strip_image_perm",
 
    "kMem_damage_clauses",
 
    "kMem_undamaged_vertices",
 
    "kMem_race_text_chunk",
 
    "kMem_race_text_str",
 
    "kMem_oppo_array",
 
    "kMem_oppo_text_chunk",
 
    "kMem_oppo_text_str",
 
    "kMem_br_font",
 
    "kMem_br_font_wid",
 
    "kMem_br_font_enc",
 
    "kMem_br_font_glyphs",
 
    "kMem_oppo_car_spec",
 
    "kMem_misc_string",
 
    "kMem_mac_host_buffer_1",
 
    "kMem_mac_host_buffer_2",
 
    "kMem_mac_net_details",
 
    "kMem_back_pixels",
 
    "kMem_quit_vfy_pixels",
 
    "kMem_quit_vfy_pal",
 
    "kMem_net_min_messages",
 
    "kMem_net_mid_messages",
 
    "kMem_net_max_messages",
 
    "kMem_net_pid_details",
 
    "kMem_net_car_spec",
 
    "kMem_dynamic_message",
 
    "kMem_player_list_join",
 
    "kMem_player_list_leave",
 
    "kMem_oppo_new_nodes",
 
    "kMem_oppo_new_sections",
 
    "kMem_cop_car_spec",
 
    "kMem_oppo_bit_per_node",
 
    "kMem_ped_action_list",
 
    "kMem_ped_sequences",
 
    "kMem_ped_array_stain",
 
    "kMem_ped_array",
 
    "kMem_ped_instructions",
 
    "kMem_ped_new_instruc",
 
    "kMem_pipe_model_geometry",
 
    "kMem_powerup_array",
 
    "kMem_powerup_float_parms",
 
    "kMem_powerup_int_parms",
 
    "kMem_drugs_palette",
 
    "kMem_pratcam_flic_array",
 
    "kMem_pratcam_flic_data",
 
    "kMem_pratcam_sequence_array",
 
    "kMem_pratcam_pixelmap",
 
    "kMem_video_pixels",
 
    "kMem_funk_prox_array",
 
    "kMem_new_mat_id",
 
    "kMem_new_mat_id_2",
 
    "kMem_new_mat_id_3",
 
    "kMem_special_volume",
 
    "kMem_special_screen",
 
    "kMem_new_special_vol",
 
    "kMem_saved_game",
 
    "kMem_new_save_game",
 
    "kMem_stor_space_pix",
 
    "kMem_stor_space_tab",
 
    "kMem_stor_space_mat",
 
    "kMem_stor_space_mod",
 
    "kMem_stor_space_save",
 
    "kMem_funk_spec",
 
    "kMem_groove_spec",
 
    "kMem_non_car_spec",
 
    "kMem_S3_scan_name",
 
    "kMem_S3_sound_header",
 
    "kMem_S3_sample",
 
    "kMem_S3_mac_channel",
 
    "kMem_S3_mac_path",
 
    "kMem_S3_sentinel",
 
    "kMem_S3_outlet",
 
    "kMem_S3_channel",
 
    "kMem_S3_descriptor",
 
    "kMem_S3_reverse_buffer",
 
    "kMem_S3_source",
 
    "kMem_S3_DOS_SOS_channel",
 
    "kMem_S3_PC_DOS_path",
 
    "kMem_S3_DOS_SOS_patch",
 
    "kMem_S3_DOS_SOS_song_structure",
 
    "kMem_S3_DOS_SOS_song_data",
 
    "kMem_S3_Windows_95_load_WAV_file",
 
    "kMem_S3_Windows_95_create_temp_buffer_space_to_reverse_sample",
 
    "kMem_S3_Windows_95_path",
 
    "kMem_DOS_HMI_file_open",
 
    "kMem_abuse_text",
 
    "kMem_action_replay_buffer",
 
    "kMem_misc",
 
    NULL,
 
};
 
br_resource_class gStainless_classes[118];
 
 
 
// IDA: void __cdecl SetNonFatalAllocationErrors()
 
void SetNonFatalAllocationErrors(void) {
 
    LOG_TRACE("()");
 
 
 
    gNon_fatal_allocation_errors = 1;
 
}
 
 
 
// IDA: void __cdecl ResetNonFatalAllocationErrors()
 
void ResetNonFatalAllocationErrors(void) {
 
    LOG_TRACE("()");
 
 
 
    gNon_fatal_allocation_errors = 0;
 
}
 
 
 
// IDA: int __cdecl AllocationErrorsAreFatal()
 
int AllocationErrorsAreFatal(void) {
 
    return gNon_fatal_allocation_errors == 0;
 
}
 
 
 
// IDA: void __cdecl MAMSInitMem()
 
void MAMSInitMem(void) {
 
    //int i; // Pierre-Marie Baty -- unused variable
 
    //FILE* f; // Pierre-Marie Baty -- unused variable
 
    //tPath_name the_path; // Pierre-Marie Baty -- unused variable
 
    LOG_TRACE("()");
 
}
 
 
 
// IDA: void __usercall PrintMemoryDump(int pFlags@<EAX>, char *pTitle@<EDX>)
 
void PrintMemoryDump(int pFlags, char* pTitle) {
 
    LOG_TRACE("(%d, \"%s\")", pFlags, pTitle);
 
}
 
 
 
// IDA: void* __cdecl DRStdlibAllocate(br_size_t size, br_uint_8 type)
 
void* DRStdlibAllocate(br_size_t size, br_uint_8 type) {
 
    void* p;
 
    //int i; // Pierre-Marie Baty -- unused variable
 
    char s[256];
 
 
 
    if (size == 0) {
 
        return NULL;
 
    }
 
    if (p == NULL && !gNon_fatal_allocation_errors) {
 
        PrintMemoryDump(0, "AT ERROR TIME");
 
        sprintf(s
, "%s/%d", gMem_names
[type
], (int)size
);  
        FatalError(kFatalError_OOMCarmageddon_S, s);
 
    }
 
    return p;
 
}
 
 
 
// IDA: void __cdecl DRStdlibFree(void *mem)
 
void DRStdlibFree(void* mem) {
 
    //int i; // Pierre-Marie Baty -- unused variable
 
}
 
 
 
// IDA: br_size_t __cdecl DRStdlibInquire(br_uint_8 type)
 
br_size_t DRStdlibInquire(br_uint_8 type) {
 
    return 0;
 
}
 
 
 
// IDA: br_uint_32 __cdecl Claim4ByteAlignment(br_uint_8 type)
 
br_uint_32 Claim4ByteAlignment(br_uint_8 type) {
 
    return 4;
 
}
 
 
 
// IDA: void __cdecl InstallDRMemCalls()
 
void InstallDRMemCalls(void) {
 
    BrAllocatorSet(&gAllocator);
 
}
 
 
 
// IDA: void __usercall MAMSUnlock(void **pPtr@<EAX>)
 
void MAMSUnlock(void** pPtr) {
 
    DRStdlibFree(*pPtr);
 
    *pPtr = NULL;
 
}
 
 
 
// IDA: void __usercall MAMSLock(void **pPtr@<EAX>)
 
void MAMSLock(void** pPtr) {
 
    LOG_TRACE("(%p)", pPtr);
 
}
 
 
 
// IDA: void __cdecl CreateStainlessClasses()
 
void CreateStainlessClasses(void) {
 
    int i;
 
 
 
    for (i = 129; i < 246; i++) {
 
        gStainless_classes[i - 129].res_class = i;
 
        if (!BrResClassAdd(&gStainless_classes[i - 129])) {
 
            FatalError(kFatalError_OOMCarmageddon_S, gStainless_classes[i - 129].identifier);
 
        }
 
    }
 
}
 
 
 
// IDA: void __cdecl CheckMemory()
 
void CheckMemory(void) {
 
}