summaryrefslogtreecommitdiffhomepage
path: root/examples/core
diff options
context:
space:
mode:
authorRay <[email protected]>2022-07-05 13:24:14 +0200
committerRay <[email protected]>2022-07-05 13:24:14 +0200
commite722a8dbef59cf0ecccf141af61e1e1c8a24849f (patch)
treef7958e9d9708f252203584e088e422eda9352fb4 /examples/core
parente0f0a5f663af0c12cfe6a88fec4634358e76d126 (diff)
downloadraylib-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.c101
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