rnd-19981108-2
[rocksndiamonds.git] / src / misc.c
index 7a790ce13f0cc96d3efbbb193badefdb7b5bd3a1..c560ae4bc0f6c3ae2931b82d5d5a9f5a4f9e39f6 100644 (file)
@@ -76,7 +76,7 @@ static void sleep_milliseconds(unsigned long milliseconds_delay)
     delay.tv_usec = 1000 * (milliseconds_delay % 1000);
 
     if (select(0, NULL, NULL, NULL, &delay) != 0)
-      Error(ERR_RETURN, "sleep_milliseconds(): select() failed");
+      Error(ERR_WARN, "sleep_milliseconds(): select() failed");
   }
 }
 
@@ -129,12 +129,23 @@ void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay)
   *counter_var = actual_counter;
 }
 
-char *int2str(int ct, int nr)
+char *int2str(int number, int size)
 {
-  static char str[20];
+  static char s[40];
 
-  sprintf(str,"%09d",ct);
-  return(&str[strlen(str)-nr]);
+  if (size > 20)
+    size = 20;
+
+  if (size)
+  {
+    sprintf(s, "                    %09d", number);
+    return &s[strlen(s) - size];
+  }
+  else
+  {
+    sprintf(s, "%d", number);
+    return s;
+  }
 }
 
 unsigned int SimpleRND(unsigned int max)
@@ -144,39 +155,59 @@ unsigned int SimpleRND(unsigned int max)
 
   gettimeofday(&current_time,NULL);
   root = root * 4253261 + current_time.tv_sec + current_time.tv_usec;
-  return(root % max);
+  return (root % max);
 }
 
 unsigned int RND(unsigned int max)
 {
-  return(random_linux_libc() % max);
+  return (random_linux_libc() % max);
 }
 
 unsigned int InitRND(long seed)
 {
   struct timeval current_time;
 
-  if (seed==NEW_RANDOMIZE)
+  if (seed == NEW_RANDOMIZE)
   {
     gettimeofday(&current_time,NULL);
     srandom_linux_libc((unsigned int) current_time.tv_usec);
-    return((unsigned int) current_time.tv_usec);
+    return (unsigned int)current_time.tv_usec;
   }
   else
   {
     srandom_linux_libc((unsigned int) seed);
-    return((unsigned int) seed);
+    return (unsigned int)seed;
   }
 }
 
-char *GetLoginName()
+char *getLoginName()
 {
   struct passwd *pwd;
 
-  if (!(pwd=getpwuid(getuid())))
-    return("ANONYMOUS");
+  if (!(pwd = getpwuid(getuid())))
+    return "ANONYMOUS";
   else
-    return(pwd->pw_name);
+    return pwd->pw_name;
+}
+
+char *getHomeDir()
+{
+  static char *home_dir = NULL;
+
+  if (!home_dir)
+  {
+    if (!(home_dir = getenv("HOME")))
+    {
+      struct passwd *pwd;
+
+      if ((pwd = getpwuid(getuid())))
+       home_dir = pwd->pw_dir;
+      else
+       home_dir = ".";
+    }
+  }
+
+  return home_dir;
 }
 
 void MarkTileDirty(int x, int y)
@@ -185,11 +216,10 @@ void MarkTileDirty(int x, int y)
   int yy = redraw_y1 + y;
 
   if (!redraw[xx][yy])
-  {
-    redraw[xx][yy] = TRUE;
     redraw_tiles++;
-    redraw_mask |= REDRAW_TILES;
-  }
+
+  redraw[xx][yy] = TRUE;
+  redraw_mask |= REDRAW_TILES;
 }
 
 void GetOptions(char *argv[])
@@ -200,6 +230,8 @@ void GetOptions(char *argv[])
   options.display_name = NULL;
   options.server_host = NULL;
   options.server_port = 0;
+  options.base_directory = BASE_PATH;
+  options.level_directory = BASE_PATH "/" LEVELS_DIRECTORY;
   options.serveronly = FALSE;
   options.network = FALSE;
   options.verbose = FALSE;
@@ -243,6 +275,7 @@ void GetOptions(char *argv[])
       printf("Usage: %s [options] [server.name [port]]\n"
             "Options:\n"
             "  -d, --display machine:0       X server display\n"
+            "  -b, --basepath directory      alternative base directory\n"
             "  -l, --levels directory        alternative level directory\n"
             "  -s, --serveronly              only start network server\n"
             "  -n, --network                 network multiplayer game\n"
@@ -261,16 +294,33 @@ void GetOptions(char *argv[])
 
       printf("--display == '%s'\n", options.display_name);
     }
+    else if (strncmp(option, "-basepath", option_len) == 0)
+    {
+      if (option_arg == NULL)
+       Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
+
+      options.base_directory = option_arg;
+      if (option_arg == next_option)
+       options_left++;
+
+      printf("--basepath == '%s'\n", options.base_directory);
+
+      /* adjust path for level directory accordingly */
+      options.level_directory = checked_malloc(strlen(options.base_directory) +
+                                              strlen(LEVELS_DIRECTORY) + 2);
+      sprintf(options.level_directory, "%s/%s",
+             options.base_directory, LEVELS_DIRECTORY);
+    }
     else if (strncmp(option, "-levels", option_len) == 0)
     {
       if (option_arg == NULL)
        Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
 
-      level_directory = option_arg;
+      options.level_directory = option_arg;
       if (option_arg == next_option)
        options_left++;
 
-      printf("--levels == '%s'\n", level_directory);
+      printf("--levels == '%s'\n", options.level_directory);
     }
     else if (strncmp(option, "-network", option_len) == 0)
     {
@@ -318,7 +368,7 @@ void Error(int mode, char *format_str, ...)
   FILE *output_stream = stderr;
   char *process_name = "";
 
-  if (mode == ERR_EXIT_SOUNDSERVER)
+  if (mode & ERR_SOUNDSERVER)
     process_name = " sound server";
 
   if (format_str)
@@ -331,6 +381,9 @@ void Error(int mode, char *format_str, ...)
 
     fprintf(output_stream, "%s%s: ", program_name, process_name);
 
+    if (mode & ERR_WARN)
+      fprintf(output_stream, "warning: ");
+
     va_start(ap, format_str);  /* ap points to first unnamed argument */
   
     for(format_ptr=format_str; *format_ptr; format_ptr++)
@@ -370,11 +423,11 @@ void Error(int mode, char *format_str, ...)
     fprintf(output_stream, "\n");
   }
   
-  if (mode == ERR_EXIT_HELP)
+  if (mode & ERR_HELP)
     fprintf(output_stream, "%s: Try option '--help' for more information.\n",
            program_name);
 
-  if (mode != ERR_RETURN)
+  if (mode & ERR_EXIT)
   {
     fprintf(output_stream, "%s%s: aborting\n", program_name, process_name);
     CloseAllAndExit(1);