BOOL iffgetchunk(strid_t stream, char *desttype, glui32 *ulength, glui32 file_size) { int i; glui32 c; unsigned char length[4]; c = glk_stream_get_position(stream); if(c & 1) { glk_get_char_stream(stream); /* Eat padding */ c++; } if(glk_get_buffer_stream(stream, desttype, 4) != 4) return FALSE; if(glk_get_buffer_stream(stream, (char *) length, 4) != 4) return FALSE; *ulength = MSBdecode4(length); for(i = 0; i < 4; i++) if(desttype[i] < 0x20 || desttype[i] > 0x7e) return FALSE; c += 8; return ((c + *ulength) <= file_size); }
glui32 fillstruct(strid_t stream, const unsigned *info, glui32 *dest, glui32 (*special)(strid_t)) { unsigned char buffer[4]; unsigned e; glui32 len = 0;; for(e = 0; info[e]; e++) { if(info[e] == 0x8000) { *dest++ = special(stream); len++; } else if(info[e] > 4) { unsigned i; for(i = 0; i < info[e]; i++) { *dest++ = glk_get_char_stream(stream); len++; } } else { glk_get_buffer_stream(stream, (char *) buffer, info[e]); switch(info[e]) { case 1: *dest = MSBdecode1(buffer); break; case 2: *dest = MSBdecode2(buffer); break; case 3: *dest = MSBdecode3(buffer); break; case 4: *dest = MSBdecode4(buffer); break; } dest++; len+=info[e]; } } return len; }