static void read_recording_queue_chunks( void) { long i, sizeof_read, action_flags; short count, player_index, num_flags; ActionQueue *queue; short error; for (player_index = 0; player_index < dynamic_world->player_count; player_index++) { queue= get_player_recording_queue(player_index); for (count = 0; count < RECORD_CHUNK_SIZE; ) { if (replay.resource_data) { boolean hit_end= FALSE; if (replay.film_resource_offset >= replay.resource_data_size) { hit_end = TRUE; } else { num_flags = * (short *) (replay.resource_data + replay.film_resource_offset); replay.film_resource_offset += sizeof(num_flags); action_flags = *(long *) (replay.resource_data + replay.film_resource_offset); replay.film_resource_offset+= sizeof(action_flags); } if (hit_end || num_flags == END_OF_RECORDING_INDICATOR) { replay.have_read_last_chunk= TRUE; break; } } else { sizeof_read = sizeof(num_flags); error= vblFSRead(replay.recording_file_refnum, &sizeof_read, &num_flags); if (!error) { sizeof_read = sizeof(action_flags); error= vblFSRead(replay.recording_file_refnum, &sizeof_read, &action_flags); assert(!error || (error == errHitFileEOF && sizeof_read == sizeof(action_flags))); } if ((error == errHitFileEOF && sizeof_read != sizeof(long)) || num_flags == END_OF_RECORDING_INDICATOR) { replay.have_read_last_chunk = TRUE; break; } } assert(replay.have_read_last_chunk || num_flags); count += num_flags; vassert((num_flags != 0 && count <= RECORD_CHUNK_SIZE) || replay.have_read_last_chunk, csprintf(temporary, "num_flags = %d, count = %d", num_flags, count)); for (i = 0; i < num_flags; i++) { *(queue->buffer + queue->write_index) = action_flags; INCREMENT_QUEUE_COUNTER(queue->write_index); assert(queue->read_index != queue->write_index); } } assert(replay.have_read_last_chunk || count == RECORD_CHUNK_SIZE); } return; }
static void read_recording_queue_chunks( void) { logContext("reading recording queue chunks"); int32 i, sizeof_read; uint32 action_flags; int16 count, player_index, num_flags; ActionQueue *queue; for (player_index = 0; player_index < dynamic_world->player_count; player_index++) { queue= get_player_recording_queue(player_index); for (count = 0; count < RECORD_CHUNK_SIZE; ) { if (replay.resource_data) { bool hit_end= false; if (replay.film_resource_offset >= replay.resource_data_size) { hit_end = true; } else { uint8* S; S = (uint8 *)(replay.resource_data + replay.film_resource_offset); StreamToValue(S,num_flags); replay.film_resource_offset += sizeof(num_flags); S = (uint8 *)(replay.resource_data + replay.film_resource_offset); StreamToValue(S,action_flags); replay.film_resource_offset+= sizeof(action_flags); } if (hit_end || num_flags == END_OF_RECORDING_INDICATOR) { replay.have_read_last_chunk= true; break; } } else { sizeof_read = sizeof(num_flags); uint8 NumFlagsBuffer[sizeof(num_flags)]; bool HitEOF = false; if (vblFSRead(FilmFile, &sizeof_read, NumFlagsBuffer, HitEOF)) { uint8 *S = NumFlagsBuffer; StreamToValue(S,num_flags); sizeof_read = sizeof(action_flags); uint8 ActionFlagsBuffer[sizeof(action_flags)]; bool status = vblFSRead(FilmFile, &sizeof_read, ActionFlagsBuffer, HitEOF); S = ActionFlagsBuffer; StreamToValue(S,action_flags); assert(status || (HitEOF && sizeof_read == sizeof(action_flags))); } if ((HitEOF && sizeof_read != sizeof(action_flags)) || num_flags == END_OF_RECORDING_INDICATOR) { replay.have_read_last_chunk = true; break; } } if (!(replay.have_read_last_chunk || num_flags)) { logAnomaly("chunk contains no flags"); } count += num_flags; for (i = 0; i < num_flags; i++) { *(queue->buffer + queue->write_index) = action_flags; INCREMENT_QUEUE_COUNTER(queue->write_index); assert(queue->read_index != queue->write_index); } } assert(replay.have_read_last_chunk || count == RECORD_CHUNK_SIZE); } }