renamed and moved function to sanitize player name
[rocksndiamonds.git] / src / libgame / misc.c
index 0b70e206b6002424b9adf0b94254a77b44919ab9..a6bef9b878af3869cedb0d7272927584606c7093 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "platform.h"
 
-#if !defined(PLATFORM_WIN32)
+#if defined(PLATFORM_UNIX)
 #include <pwd.h>
 #include <sys/param.h>
 #endif
@@ -363,6 +363,38 @@ static void Log(int log_level, char *mode, char *format, ...)
   va_end(ap);
 }
 
+void DebugContinued(char *mode, char *format, ...)
+{
+  static char message[MAX_LINE_LEN] = { 0 };
+
+  // initialize message (optional)
+  if (strEqual(format, ""))
+  {
+    message[0] = '\0';
+
+    return;
+  }
+
+  char *message_ptr = message + strlen(message);
+  int size_left = MAX_LINE_LEN - strlen(message);
+  va_list ap;
+
+  // append message
+  va_start(ap, format);
+  vsnprintf(message_ptr, size_left, format, ap);
+  va_end(ap);
+
+  // finalize message
+  if (strSuffix(format, "\n"))
+  {
+    message[strlen(message) - 1] = '\0';
+
+    Debug(mode, message);
+
+    message[0] = '\0';
+  }
+}
+
 void Debug(char *mode, char *format, ...)
 {
   va_list ap;
@@ -751,6 +783,48 @@ static char *get_corrected_real_name(char *real_name)
 }
 #endif
 
+#if defined(PLATFORM_UNIX)
+static struct passwd *getPasswdEntry(void)
+{
+#if defined(PLATFORM_EMSCRIPTEN)
+  // currently not fully supported; force fallback to default values
+  return NULL;
+#else
+  return getpwuid(getuid());
+#endif
+}
+
+char *getUnixLoginName(void)
+{
+  struct passwd *pwd = getPasswdEntry();
+
+  if (pwd != NULL && strlen(pwd->pw_name) != 0)
+    return pwd->pw_name;
+
+  return NULL;
+}
+
+char *getUnixRealName(void)
+{
+  struct passwd *pwd = getPasswdEntry();
+
+  if (pwd != NULL && strlen(pwd->pw_gecos) != 0)
+    return pwd->pw_gecos;
+
+  return NULL;
+}
+
+char *getUnixHomeDir(void)
+{
+  struct passwd *pwd = getPasswdEntry();
+
+  if (pwd != NULL && strlen(pwd->pw_dir) != 0)
+    return pwd->pw_dir;
+
+  return NULL;
+}
+#endif
+
 char *getLoginName(void)
 {
   static char *login_name = NULL;
@@ -759,6 +833,7 @@ char *getLoginName(void)
   if (login_name == NULL)
   {
     unsigned long buffer_size = MAX_USERNAME_LEN + 1;
+
     login_name = checked_malloc(buffer_size);
 
     if (GetUserName(login_name, &buffer_size) == 0)
@@ -767,12 +842,12 @@ char *getLoginName(void)
 #elif defined(PLATFORM_UNIX) && !defined(PLATFORM_ANDROID)
   if (login_name == NULL)
   {
-    struct passwd *pwd;
+    char *name = getUnixLoginName();
 
-    if ((pwd = getpwuid(getuid())) == NULL)
-      login_name = ANONYMOUS_NAME;
+    if (name != NULL)
+      login_name = getStringCopy(name);
     else
-      login_name = getStringCopy(pwd->pw_name);
+      login_name = ANONYMOUS_NAME;
   }
 #else
   login_name = ANONYMOUS_NAME;
@@ -799,10 +874,10 @@ char *getRealName(void)
 #elif defined(PLATFORM_UNIX) && !defined(PLATFORM_ANDROID)
   if (real_name == NULL)
   {
-    struct passwd *pwd;
+    char *name = getUnixRealName();
 
-    if ((pwd = getpwuid(getuid())) != NULL && strlen(pwd->pw_gecos) != 0)
-      real_name = get_corrected_real_name(pwd->pw_gecos);
+    if (name != NULL)
+      real_name = get_corrected_real_name(name);
     else
       real_name = ANONYMOUS_NAME;
   }
@@ -813,6 +888,21 @@ char *getRealName(void)
   return real_name;
 }
 
+char *getFixedUserName(char *name)
+{
+  // needed because player name must be a fixed length string
+  char *name_new = checked_malloc(MAX_PLAYER_NAME_LEN + 1);
+
+  strncpy(name_new, name, MAX_PLAYER_NAME_LEN);
+  name_new[MAX_PLAYER_NAME_LEN] = '\0';
+
+  if (strlen(name) > MAX_PLAYER_NAME_LEN)              // name has been cut
+    if (strchr(name_new, ' '))
+      *strchr(name_new, ' ') = '\0';
+
+  return name_new;
+}
+
 time_t getFileTimestampEpochSeconds(char *filename)
 {
   struct stat file_status;
@@ -1321,30 +1411,6 @@ void GetOptions(int argc, char *argv[],
 }
 
 
-// ----------------------------------------------------------------------------
-// error handling functions
-// ----------------------------------------------------------------------------
-
-#define MAX_INTERNAL_ERROR_SIZE                1024
-
-// used by SetError() and GetError() to store internal error messages
-static char internal_error[MAX_INTERNAL_ERROR_SIZE];
-
-void SetError(char *format, ...)
-{
-  va_list ap;
-
-  va_start(ap, format);
-  vsnprintf(internal_error, MAX_INTERNAL_ERROR_SIZE, format, ap);
-  va_end(ap);
-}
-
-char *GetError(void)
-{
-  return internal_error;
-}
-
-
 // ----------------------------------------------------------------------------
 // checked memory allocation and freeing functions
 // ----------------------------------------------------------------------------
@@ -3710,14 +3776,14 @@ void FreeCustomArtworkLists(struct ArtworkListInfo *artwork_info)
 
 char *getLogFilename(char *basename)
 {
-  return getPath2(getUserGameDataDir(), basename);
+  return getPath2(getMainUserGameDataDir(), basename);
 }
 
 void OpenLogFiles(void)
 {
   int i;
 
-  InitUserDataDirectory();
+  InitMainUserDataDirectory();
 
   for (i = 0; i < NUM_LOGS; i++)
   {
@@ -3777,7 +3843,7 @@ void NotifyUserAboutErrorFile(void)
 
 #if DEBUG
 
-#define DEBUG_PRINT_INIT_TIMESTAMPS            FALSE
+#define DEBUG_PRINT_INIT_TIMESTAMPS            TRUE
 #define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH      10
 
 #define DEBUG_NUM_TIMESTAMPS                   10
@@ -3845,7 +3911,7 @@ void debug_print_timestamp(int counter_nr, char *message)
   counter[counter_nr][1] = counter[counter_nr][0];
 
   if (message)
-    Debug("time", "%s%s%s %.3f %s",
+    Debug("time:init", "%s%s%s %.3f %s",
          debug_print_timestamp_get_padding(counter_nr * indent_size),
          message,
          debug_print_timestamp_get_padding(padding_size - strlen(message)),