summaryrefslogtreecommitdiff
path: root/src/setting.cpp
diff options
context:
space:
mode:
authornavewindre <nw@moneybot.cc>2024-07-12 00:55:39 +0200
committernavewindre <nw@moneybot.cc>2024-07-12 00:55:39 +0200
commit2ebf959ec02048c15323e1bbfc63faedcf5067b6 (patch)
tree18862ba5d3b4be44294c0a81317d31eace7ee150 /src/setting.cpp
parentecca2728f1a583ea484f8bdcda390a30e4906f1d (diff)
ha haaa
Diffstat (limited to 'src/setting.cpp')
-rw-r--r--src/setting.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/setting.cpp b/src/setting.cpp
new file mode 100644
index 0000000..e46888c
--- /dev/null
+++ b/src/setting.cpp
@@ -0,0 +1,133 @@
+//|_ _ _. _ ._ |_ _. _ |
+//| | (/_ (_| \/ (/_ | | | | (_| (_ |<
+
+#include "setting.h"
+
+const char* get_path() {
+ static char out_dir[260]{};
+
+ if( !out_dir[0] ) {
+ strcat( out_dir, getenv( "USERPROFILE" ) );
+ strcat( out_dir, "/" );
+ strcat( out_dir, ".godword" );
+ }
+
+ return out_dir;
+}
+
+// credits: gcc
+size_t getline(char **lineptr, size_t *n, FILE *stream) {
+ char *bufptr = NULL;
+ char *p = bufptr;
+ size_t size;
+ int c;
+
+ if (lineptr == NULL) {
+ return -1;
+ }
+ if (stream == NULL) {
+ return -1;
+ }
+ if (n == NULL) {
+ return -1;
+ }
+ bufptr = *lineptr;
+ size = *n;
+
+ c = fgetc(stream);
+ if (c == EOF) {
+ return -1;
+ }
+ if (bufptr == NULL) {
+ bufptr = (char*)malloc(128);
+ if (bufptr == NULL) {
+ return -1;
+ }
+ size = 128;
+ }
+ p = bufptr;
+ while(c != EOF) {
+ if ((p - bufptr) > int(size - 1)) {
+ size = size + 128;
+ bufptr = (char*)realloc(bufptr, size);
+ if (bufptr == NULL) {
+ return -1;
+ }
+ }
+ *p++ = c;
+ if (c == '\n') {
+ break;
+ }
+ c = fgetc(stream);
+ }
+
+ *p++ = '\0';
+ *lineptr = bufptr;
+ *n = size;
+
+ return p - bufptr - 1;
+}
+
+void setting_save( const char* name, const void* src, U32 size ) {
+ char* buffer = (char*)malloc( size * 2 + 1 );
+ const U8* data = (const U8*)( src );
+
+ memset( buffer, 0, size * 2 + 1 );
+
+ for( U32 i = 0; i < size; ++i ) {
+ sprintf( &buffer[2 * i], "%02x", data[i] );
+ }
+
+ FILE* f = fopen( get_path(), "a" );
+ if( !f )
+ return free( buffer );
+
+ fprintf( f, "%s = %s\n", name, buffer );
+ fflush( f );
+
+ free( buffer );
+ fclose( f );
+}
+
+void setting_load( const char* name, const void* dst, U32 size ) {
+ char* buffer = (char*)malloc( size * 2 + 1 );
+ U8* data = (U8*)( dst );
+
+ memset( buffer, 0, size * 2 + 1 );
+
+ FILE* f = fopen( get_path(), "r+" );
+ if( !f )
+ return free( buffer );
+
+ char read_name[64]{};
+ char* line = nullptr;
+ U32 len = 128;
+
+ /*
+ * probably not the proper way
+ * don't wanna fuck with an entire ini parser
+ */
+ while( getline( &line, &len, f ) != -1 ) {
+ if( line ) {
+ sscanf( line, "%s = %s", read_name, buffer );
+ if( !strcmp( name, read_name ) )
+ break;
+
+ free( line );
+ line = nullptr;
+ }
+ }
+
+ fclose( f );
+
+ if( !buffer[0] )
+ return free( buffer );
+
+ for( U32 i = 0; i < size; ++i ) {
+ unsigned temp;
+ sscanf( &buffer[2 * i], "%02x", &temp );
+ data[i] = temp;
+ }
+
+ free( buffer );
+}