/* random generator functions */
/* ------------------------------------------------------------------------- */
+#if 0
unsigned int SimpleRND(unsigned int max)
{
-#if defined(TARGET_SDL)
- static unsigned long root = 654321;
- unsigned long current_ms;
+ return (random_linux_libc(RND_FREE) % max);
+}
- current_ms = SDL_GetTicks();
- root = root * 4253261 + current_ms;
- return (root % max);
-#else
- static unsigned long root = 654321;
- struct timeval current_time;
+unsigned int InitSimpleRND(long seed)
+{
+ if (seed == NEW_RANDOMIZE)
+ {
+ struct timeval current_time;
- gettimeofday(¤t_time, NULL);
- root = root * 4253261 + current_time.tv_sec + current_time.tv_usec;
- return (root % max);
-#endif
-}
+ gettimeofday(¤t_time, NULL);
+ seed = (long)current_time.tv_usec;
+ }
-#ifdef DEBUG
-static unsigned int last_RND_value = 0;
+ srandom_linux_libc(RND_FREE, (unsigned int) seed);
-unsigned int last_RND()
-{
- return last_RND_value;
+ return (unsigned int) seed;
}
-#endif
unsigned int RND(unsigned int max)
{
-#ifdef DEBUG
- return (last_RND_value = random_linux_libc() % max);
-#else
- return (random_linux_libc() % max);
-#endif
+ return (random_linux_libc(RND_GAME) % max);
}
unsigned int InitRND(long seed)
{
-#if defined(TARGET_SDL)
- unsigned long current_ms;
-
if (seed == NEW_RANDOMIZE)
{
- current_ms = SDL_GetTicks();
- srandom_linux_libc((unsigned int) current_ms);
- return (unsigned int) current_ms;
- }
- else
- {
- srandom_linux_libc((unsigned int) seed);
- return (unsigned int) seed;
+ struct timeval current_time;
+
+ gettimeofday(¤t_time, NULL);
+ seed = (long)current_time.tv_usec;
}
-#else
- struct timeval current_time;
+ srandom_linux_libc(RND_GAME, (unsigned int) seed);
+
+ return (unsigned int) seed;
+}
+#endif
+
+unsigned int init_random_number(int nr, long seed)
+{
if (seed == NEW_RANDOMIZE)
{
+#if defined(TARGET_SDL)
+ seed = (long)SDL_GetTicks();
+#else
+ struct timeval current_time;
+
gettimeofday(¤t_time, NULL);
- srandom_linux_libc((unsigned int) current_time.tv_usec);
- return (unsigned int) current_time.tv_usec;
- }
- else
- {
- srandom_linux_libc((unsigned int) seed);
- return (unsigned int) seed;
- }
+ seed = (long)current_time.tv_usec;
#endif
+ }
+
+ srandom_linux_libc(nr, (unsigned int) seed);
+
+ return (unsigned int) seed;
+}
+
+unsigned int get_random_number(int nr, unsigned int max)
+{
+ return (random_linux_libc(nr) % max);
}
/* system info functions */
/* ------------------------------------------------------------------------- */
+static char *get_corrected_real_name(char *real_name)
+{
+ char *real_name_new = checked_malloc(MAX_USERNAME_LEN + 1);
+ char *from_ptr = real_name;
+ char *to_ptr = real_name_new;
+
+ if (strchr(real_name, 'ß') == NULL) /* name does not contain 'ß' */
+ {
+ strncpy(real_name_new, real_name, MAX_USERNAME_LEN);
+ real_name_new[MAX_USERNAME_LEN] = '\0';
+
+ return real_name_new;
+ }
+
+ /* the user's real name may contain a 'ß' character (german sharp s),
+ which has no equivalent in upper case letters (which our fonts use) */
+ while (*from_ptr && (long)(to_ptr - real_name_new) < MAX_USERNAME_LEN - 1)
+ {
+ if (*from_ptr != 'ß')
+ *to_ptr++ = *from_ptr++;
+ else
+ {
+ from_ptr++;
+ *to_ptr++ = 's';
+ *to_ptr++ = 's';
+ }
+ }
+
+ *to_ptr = '\0';
+
+ return real_name_new;
+}
+
char *getLoginName()
{
-#if defined(PLATFORM_WIN32)
- return ANONYMOUS_NAME;
-#else
static char *login_name = NULL;
+#if defined(PLATFORM_WIN32)
+ 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)
+ strcpy(login_name, ANONYMOUS_NAME);
+ }
+#else
if (login_name == NULL)
{
struct passwd *pwd;
else
login_name = getStringCopy(pwd->pw_name);
}
+#endif
return login_name;
-#endif
}
char *getRealName()
{
-#if defined(PLATFORM_UNIX)
- struct passwd *pwd;
+ static char *real_name = NULL;
- if ((pwd = getpwuid(getuid())) == NULL || strlen(pwd->pw_gecos) == 0)
- return ANONYMOUS_NAME;
- else
+#if defined(PLATFORM_WIN32)
+ if (real_name == NULL)
{
- static char real_name[1024];
- char *from_ptr = pwd->pw_gecos, *to_ptr = real_name;
+ static char buffer[MAX_USERNAME_LEN + 1];
+ unsigned long buffer_size = MAX_USERNAME_LEN + 1;
- if (strchr(pwd->pw_gecos, 'ß') == NULL)
- return pwd->pw_gecos;
-
- /* the user's real name contains a 'ß' character (german sharp s),
- which has no equivalent in upper case letters (which our fonts use) */
- while (*from_ptr != '\0' && (long)(to_ptr - real_name) < 1024 - 2)
- {
- if (*from_ptr != 'ß')
- *to_ptr++ = *from_ptr++;
- else
- {
- from_ptr++;
- *to_ptr++ = 's';
- *to_ptr++ = 's';
- }
- }
- *to_ptr = '\0';
+ if (GetUserName(buffer, &buffer_size) != 0)
+ real_name = get_corrected_real_name(buffer);
+ else
+ real_name = ANONYMOUS_NAME;
+ }
+#elif defined(PLATFORM_UNIX)
+ if (real_name == NULL)
+ {
+ struct passwd *pwd;
- return real_name;
+ if ((pwd = getpwuid(getuid())) != NULL && strlen(pwd->pw_gecos) != 0)
+ real_name = get_corrected_real_name(pwd->pw_gecos);
+ else
+ real_name = ANONYMOUS_NAME;
}
-#else /* !PLATFORM_UNIX */
- return ANONYMOUS_NAME;
+#else
+ real_name = ANONYMOUS_NAME;
#endif
+
+ return real_name;
}
char *getHomeDir()
{
-#if defined(PLATFORM_UNIX)
- static char *home_dir = NULL;
+ static char *dir = NULL;
- if (home_dir == NULL)
+#if defined(PLATFORM_WIN32)
+ if (dir == NULL)
{
- if ((home_dir = getenv("HOME")) == NULL)
+ dir = checked_malloc(MAX_PATH + 1);
+
+ if (!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, dir)))
+ strcpy(dir, ".");
+ }
+#elif defined(PLATFORM_UNIX)
+ if (dir == NULL)
+ {
+ if ((dir = getenv("HOME")) == NULL)
{
struct passwd *pwd;
- if ((pwd = getpwuid(getuid())) == NULL)
- home_dir = ".";
+ if ((pwd = getpwuid(getuid())) != NULL)
+ dir = getStringCopy(pwd->pw_dir);
else
- home_dir = getStringCopy(pwd->pw_dir);
+ dir = ".";
}
}
-
- return home_dir;
#else
- return ".";
+ dir = ".";
#endif
+
+ return dir;
}