diff options
| author | Ray <[email protected]> | 2022-07-05 13:24:14 +0200 |
|---|---|---|
| committer | Ray <[email protected]> | 2022-07-05 13:24:14 +0200 |
| commit | e722a8dbef59cf0ecccf141af61e1e1c8a24849f (patch) | |
| tree | f7958e9d9708f252203584e088e422eda9352fb4 /examples/core | |
| parent | e0f0a5f663af0c12cfe6a88fec4634358e76d126 (diff) | |
| download | raylib-e722a8dbef59cf0ecccf141af61e1e1c8a24849f.tar.gz raylib-e722a8dbef59cf0ecccf141af61e1e1c8a24849f.zip | |
WARNING: BREAKING: REMOVED: `*StorageValue()` functions
Those functions were platform dependent and user has no control over the file created. They have been removed from raylib and just moved to `core_storage_values` example.
Diffstat (limited to 'examples/core')
| -rw-r--r-- | examples/core/core_storage_values.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/examples/core/core_storage_values.c b/examples/core/core_storage_values.c index 41173d26..03bd70f1 100644 --- a/examples/core/core_storage_values.c +++ b/examples/core/core_storage_values.c @@ -11,12 +11,20 @@ #include "raylib.h" +#include <stdlib.h> // Required for: calloc(), free() + +#define STORAGE_DATA_FILE "storage.data" // Storage file + // NOTE: Storage positions must start with 0, directly related to file memory layout typedef enum { STORAGE_POSITION_SCORE = 0, STORAGE_POSITION_HISCORE = 1 } StorageData; +// Persistent storage functions +static bool SaveStorageValue(unsigned int position, int value); +static int LoadStorageValue(unsigned int position); + //------------------------------------------------------------------------------------ // Program main entry point //------------------------------------------------------------------------------------ @@ -87,4 +95,97 @@ int main(void) //-------------------------------------------------------------------------------------- return 0; +} + +// Save integer value to storage file (to defined position) +// NOTE: Storage positions is directly related to file memory layout (4 bytes each integer) +bool SaveStorageValue(unsigned int position, int value) +{ + bool success = false; + unsigned int dataSize = 0; + unsigned int newDataSize = 0; + unsigned char *fileData = LoadFileData(STORAGE_DATA_FILE, &dataSize); + unsigned char *newFileData = NULL; + + if (fileData != NULL) + { + if (dataSize <= (position*sizeof(int))) + { + // Increase data size up to position and store value + newDataSize = (position + 1)*sizeof(int); + newFileData = (unsigned char *)RL_REALLOC(fileData, newDataSize); + + if (newFileData != NULL) + { + // RL_REALLOC succeded + int *dataPtr = (int *)newFileData; + dataPtr[position] = value; + } + else + { + // RL_REALLOC failed + TraceLog(LOG_WARNING, "FILEIO: [%s] Failed to realloc data (%u), position in bytes (%u) bigger than actual file size", STORAGE_DATA_FILE, dataSize, position*sizeof(int)); + + // We store the old size of the file + newFileData = fileData; + newDataSize = dataSize; + } + } + else + { + // Store the old size of the file + newFileData = fileData; + newDataSize = dataSize; + + // Replace value on selected position + int *dataPtr = (int *)newFileData; + dataPtr[position] = value; + } + + success = SaveFileData(STORAGE_DATA_FILE, newFileData, newDataSize); + RL_FREE(newFileData); + + TraceLog(LOG_INFO, "FILEIO: [%s] Saved storage value: %i", STORAGE_DATA_FILE, value); + } + else + { + TraceLog(LOG_INFO, "FILEIO: [%s] File created successfully", STORAGE_DATA_FILE); + + dataSize = (position + 1)*sizeof(int); + fileData = (unsigned char *)RL_MALLOC(dataSize); + int *dataPtr = (int *)fileData; + dataPtr[position] = value; + + success = SaveFileData(STORAGE_DATA_FILE, fileData, dataSize); + UnloadFileData(fileData); + + TraceLog(LOG_INFO, "FILEIO: [%s] Saved storage value: %i", STORAGE_DATA_FILE, value); + } + + return success; +} + +// Load integer value from storage file (from defined position) +// NOTE: If requested position could not be found, value 0 is returned +int LoadStorageValue(unsigned int position) +{ + int value = 0; + unsigned int dataSize = 0; + unsigned char *fileData = LoadFileData(STORAGE_DATA_FILE, &dataSize); + + if (fileData != NULL) + { + if (dataSize < (position*4)) TraceLog(LOG_WARNING, "FILEIO: [%s] Failed to find storage position: %i", STORAGE_DATA_FILE, position); + else + { + int *dataPtr = (int *)fileData; + value = dataPtr[position]; + } + + UnloadFileData(fileData); + + TraceLog(LOG_INFO, "FILEIO: [%s] Loaded storage value: %i", STORAGE_DATA_FILE, value); + } + + return value; }
\ No newline at end of file |
