rnd-19990219-2
[rocksndiamonds.git] / src / misc.c
index efa04a14c314d92d55bc416e0390898e61b60f7c..2200460af29dcdc8783c0844220ddf85e47e5f7c 100644 (file)
@@ -579,46 +579,84 @@ void *checked_calloc(unsigned long size)
   return ptr;
 }
 
-void getFileChunk(FILE *file, char *chunk_buffer, int *chunk_length,
-                 int byte_order)
+short getFile16BitInteger(FILE *file, int byte_order)
 {
-  const int chunk_identifier_length = 4;
-
-  fgets(chunk_buffer, chunk_identifier_length + 1, file);
+  if (byte_order == BYTE_ORDER_BIG_ENDIAN)
+    return ((fgetc(file) <<  8) |
+           (fgetc(file) <<  0));
+  else          /* BYTE_ORDER_LITTLE_ENDIAN */
+    return ((fgetc(file) <<  0) |
+           (fgetc(file) <<  8));
+}
 
+void putFile16BitInteger(FILE *file, short value, int byte_order)
+{
   if (byte_order == BYTE_ORDER_BIG_ENDIAN)
-    *chunk_length = ((fgetc(file) << 24) |
-                    (fgetc(file) << 16) |
-                    (fgetc(file) <<  8)  |
-                    (fgetc(file) <<  0));
+  {
+    fputc((value >>  8) & 0xff, file);
+    fputc((value >>  0) & 0xff, file);
+  }
   else          /* BYTE_ORDER_LITTLE_ENDIAN */
-    *chunk_length = ((fgetc(file) <<  0) |
-                    (fgetc(file) <<  8) |
-                    (fgetc(file) << 16)  |
-                    (fgetc(file) << 24));
+  {
+    fputc((value >>  0) & 0xff, file);
+    fputc((value >>  8) & 0xff, file);
+  }
 }
 
-void putFileChunk(FILE *file, char *chunk_name, int chunk_length,
-                 int byte_order)
+int getFile32BitInteger(FILE *file, int byte_order)
 {
-  fputs(chunk_name, file);
+  if (byte_order == BYTE_ORDER_BIG_ENDIAN)
+    return ((fgetc(file) << 24) |
+           (fgetc(file) << 16) |
+           (fgetc(file) <<  8) |
+           (fgetc(file) <<  0));
+  else          /* BYTE_ORDER_LITTLE_ENDIAN */
+    return ((fgetc(file) <<  0) |
+           (fgetc(file) <<  8) |
+           (fgetc(file) << 16) |
+           (fgetc(file) << 24));
+}
 
+void putFile32BitInteger(FILE *file, int value, int byte_order)
+{
   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);
+    fputc((value >> 24) & 0xff, file);
+    fputc((value >> 16) & 0xff, file);
+    fputc((value >>  8) & 0xff, file);
+    fputc((value >>  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);
+    fputc((value >>  0) & 0xff, file);
+    fputc((value >>  8) & 0xff, file);
+    fputc((value >> 16) & 0xff, file);
+    fputc((value >> 24) & 0xff, file);
   }
 }
 
+void getFileChunk(FILE *file, char *chunk_buffer, int *chunk_length,
+                 int byte_order)
+{
+  const int chunk_identifier_length = 4;
+
+  /* read chunk identifier */
+  fgets(chunk_buffer, chunk_identifier_length + 1, file);
+
+  /* read chunk length */
+  *chunk_length = getFile32BitInteger(file, byte_order);
+}
+
+void putFileChunk(FILE *file, char *chunk_name, int chunk_length,
+                 int byte_order)
+{
+  /* write chunk identifier */
+  fputs(chunk_name, file);
+
+  /* write chunk length */
+  putFile32BitInteger(file, chunk_length, byte_order);
+}
+
 #define TRANSLATE_KEYSYM_TO_KEYNAME    0
 #define TRANSLATE_KEYSYM_TO_X11KEYNAME 1
 #define TRANSLATE_X11KEYNAME_TO_KEYSYM 2