rnd-19990216-1
[rocksndiamonds.git] / src / misc.c
index c3e5b205eaa0e83837b2ed5b13d5bf4db5000d71..efa04a14c314d92d55bc416e0390898e61b60f7c 100644 (file)
@@ -235,12 +235,49 @@ char *getLoginName()
 {
   struct passwd *pwd;
 
-  if (!(pwd = getpwuid(getuid())))
-    return "ANONYMOUS";
+  if ((pwd = getpwuid(getuid())) == NULL)
+    return ANONYMOUS_NAME;
   else
     return pwd->pw_name;
 }
 
+char *getRealName()
+{
+#ifndef MSDOS
+  struct passwd *pwd;
+
+  if ((pwd = getpwuid(getuid())) == NULL || strlen(pwd->pw_gecos) == 0)
+    return ANONYMOUS_NAME;
+  else
+  {
+    static char real_name[1024];
+    char *from_ptr = pwd->pw_gecos, *to_ptr = real_name;
+
+    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';
+
+    return real_name;
+  }
+#else
+  return ANONYMOUS_NAME;
+#endif
+}
+
 char *getHomeDir()
 {
 #ifndef MSDOS
@@ -542,6 +579,46 @@ void *checked_calloc(unsigned long size)
   return ptr;
 }
 
+void getFileChunk(FILE *file, char *chunk_buffer, int *chunk_length,
+                 int byte_order)
+{
+  const int chunk_identifier_length = 4;
+
+  fgets(chunk_buffer, chunk_identifier_length + 1, file);
+
+  if (byte_order == BYTE_ORDER_BIG_ENDIAN)
+    *chunk_length = ((fgetc(file) << 24) |
+                    (fgetc(file) << 16) |
+                    (fgetc(file) <<  8)  |
+                    (fgetc(file) <<  0));
+  else          /* BYTE_ORDER_LITTLE_ENDIAN */
+    *chunk_length = ((fgetc(file) <<  0) |
+                    (fgetc(file) <<  8) |
+                    (fgetc(file) << 16)  |
+                    (fgetc(file) << 24));
+}
+
+void putFileChunk(FILE *file, char *chunk_name, int chunk_length,
+                 int byte_order)
+{
+  fputs(chunk_name, file);
+
+  if (byte_order == BYTE_ORDER_BIG_ENDIAN)
+  {
+    fputc((chunk_length >> 24) & 0xff, file);
+    fputc((chunk_length >> 16) & 0xff, file);
+    fputc((chunk_length >>  8) & 0xff, file);
+    fputc((chunk_length >>  0) & 0xff, file);
+  }
+  else          /* BYTE_ORDER_LITTLE_ENDIAN */
+  {
+    fputc((chunk_length >>  0) & 0xff, file);
+    fputc((chunk_length >>  8) & 0xff, file);
+    fputc((chunk_length >> 16) & 0xff, file);
+    fputc((chunk_length >> 24) & 0xff, file);
+  }
+}
+
 #define TRANSLATE_KEYSYM_TO_KEYNAME    0
 #define TRANSLATE_KEYSYM_TO_X11KEYNAME 1
 #define TRANSLATE_X11KEYNAME_TO_KEYSYM 2