X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fmisc.c;h=2200460af29dcdc8783c0844220ddf85e47e5f7c;hp=efa04a14c314d92d55bc416e0390898e61b60f7c;hb=78ec772d11cb8823d8dca05c227b472da8708a07;hpb=56fed90e3cabb9ef3052a15e6d49b47eead2cd09 diff --git a/src/misc.c b/src/misc.c index efa04a14..2200460a 100644 --- a/src/misc.c +++ b/src/misc.c @@ -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