aboutsummaryrefslogtreecommitdiff
path: root/archive/hge/ini.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archive/hge/ini.cpp')
-rw-r--r--archive/hge/ini.cpp196
1 files changed, 196 insertions, 0 deletions
diff --git a/archive/hge/ini.cpp b/archive/hge/ini.cpp
new file mode 100644
index 0000000..6fed586
--- /dev/null
+++ b/archive/hge/ini.cpp
@@ -0,0 +1,196 @@
+/*
+** Haaf's Game Engine 1.8
+** Copyright (C) 2003-2007, Relish Games
+** hge.relishgames.com
+**
+** Core functions implementation: unix ini file
+*/
+
+#include "hge_impl.h"
+
+const char *HGE_Impl::_BuildProfilePath(const char *section, const char *name, const char *szIniFile)
+{
+ // !!! FIXME: not efficient.
+ static char path[_MAX_PATH];
+ const char *home = getenv("HOME");
+ strcpy(path, home);
+ mkdir(path, S_IRWXU);
+
+ #if PLATFORM_MACOSX
+ strcat(path, "/Library");
+ mkdir(path, S_IRWXU);
+ strcat(path, "/Application Support");
+ mkdir(path, S_IRWXU);
+ strcat(path, "/");
+ strcat(path, szWinTitle);
+ mkdir(path, S_IRWXU);
+ #else
+ strcat(path, "/.");
+ strcat(path, szWinTitle);
+ mkdir(path, S_IRWXU);
+ #endif
+
+ strcat(path, "/inis");
+ mkdir(path, S_IRWXU);
+
+ strcat(path, "/");
+ strcat(path, szIniFile);
+ mkdir(path, S_IRWXU);
+ strcat(path, "/");
+ strcat(path, section);
+ mkdir(path, S_IRWXU);
+ strcat(path, "/");
+ strcat(path, name);
+
+ return path;
+}
+
+bool HGE_Impl::_WritePrivateProfileString(const char *section, const char *name, const char *buf, const char *szIniFile)
+{
+ const char *path = _BuildProfilePath(section, name, szIniFile);
+ FILE *io = fopen(path, "wb");
+ if (io == NULL)
+ return false;
+ const size_t rc = fwrite(buf, strlen(buf), 1, io);
+ if (fclose(io) == EOF)
+ return false;
+ return (rc == 1);
+}
+
+bool HGE_Impl::_GetPrivateProfileString(const char *section, const char *name, const char *deflt, char *buf, size_t bufsize, const char *szIniFile)
+{
+ bool retval = false;
+ const char *path = _BuildProfilePath(section, name, szIniFile);
+ FILE *io = fopen(path, "rb");
+ if (io != NULL)
+ {
+ const size_t rc = fread(buf, 1, bufsize-1, io);
+ retval = (ferror(io) == 0);
+ fclose(io);
+ if (retval)
+ buf[rc] = '\0';
+ }
+
+ if (!retval)
+ snprintf(buf, bufsize, "%s", deflt);
+
+ return retval;
+}
+
+// We parse the usual .ini files, and build them into our directory tree when items don't exist.
+// !!! FIXME: this code sort of stinks. In fact, the whole directory tree thing could be a mistake...
+void HGE_Impl::_LoadIniFile(const char *fname)
+{
+ char section[128] = { 0 };
+ struct stat statbuf;
+ if (stat(fname, &statbuf) == -1)
+ return;
+ FILE *io = fopen(fname, "rb");
+ char *buf = new char[statbuf.st_size + 1];
+ size_t rc = fread(buf, statbuf.st_size, 1, io);
+ buf[statbuf.st_size] = '\0';
+ fclose(io);
+ if (rc == 1)
+ {
+ char *start = buf;
+ char *ptr = start;
+ while (start <= (buf + statbuf.st_size))
+ {
+ while ((*ptr != '\r') && (*ptr != '\n') && (*ptr != '\0'))
+ ptr++;
+ *ptr = '\0';
+
+ while ((*start == ' ') || (*start == '\t') || (*start == '\r') || (*start == '\n'))
+ start++;
+
+ if ((*start == ';') || (*start == '\0')) // comment or empty line.
+ ;
+ else if (*start == '[') // section
+ {
+ start++;
+ char *end = strchr(start, ']');
+ if (end != NULL)
+ {
+ *end = '\0';
+ snprintf(section, sizeof (section), "%s", start);
+ }
+ }
+ else if (section[0] != '\0')
+ {
+ char *eq = strchr(start, '=');
+ if (eq != NULL)
+ {
+ *eq = '\0';
+ eq++;
+ char tmpbuf[128];
+ if (!_GetPrivateProfileString(section, start, "", tmpbuf, sizeof (tmpbuf), fname))
+ _WritePrivateProfileString(section, start, eq, fname);
+ }
+ }
+ ptr++;
+ start = ptr;
+ }
+ }
+ delete[] buf;
+}
+
+void CALL HGE_Impl::Ini_SetInt(const char *section, const char *name, int value)
+{
+ char buf[256];
+
+ if(szIniFile[0]) {
+ sprintf(buf,"%d",value);
+ _WritePrivateProfileString(section, name, buf, szIniFile);
+ }
+}
+
+
+int CALL HGE_Impl::Ini_GetInt(const char *section, const char *name, int def_val)
+{
+ char buf[256];
+
+ if(szIniFile[0]) {
+ if(_GetPrivateProfileString(section, name, "", buf, sizeof(buf), szIniFile))
+ { return atoi(buf); }
+ else { return def_val; }
+ }
+ return def_val;
+}
+
+
+void CALL HGE_Impl::Ini_SetFloat(const char *section, const char *name, float value)
+{
+ char buf[256];
+
+ if(szIniFile[0]) {
+ sprintf(buf,"%f",value);
+ _WritePrivateProfileString(section, name, buf, szIniFile);
+ }
+}
+
+
+float CALL HGE_Impl::Ini_GetFloat(const char *section, const char *name, float def_val)
+{
+ char buf[256];
+
+ if(szIniFile[0]) {
+ if(_GetPrivateProfileString(section, name, "", buf, sizeof(buf), szIniFile))
+ { return (float)atof(buf); }
+ else { return def_val; }
+ }
+ return def_val;
+}
+
+
+void CALL HGE_Impl::Ini_SetString(const char *section, const char *name, const char *value)
+{
+ if(szIniFile[0]) _WritePrivateProfileString(section, name, value, szIniFile);
+}
+
+
+char* CALL HGE_Impl::Ini_GetString(const char *section, const char *name, const char *def_val)
+{
+ if(szIniFile[0]) _GetPrivateProfileString(section, name, def_val, szIniString, sizeof(szIniString), szIniFile);
+ else strcpy(szIniString, def_val);
+ return szIniString;
+}