Index: game.c ================================================================== --- game.c +++ game.c @@ -25,11 +25,12 @@ Uint8 solution_replay=255; static volatile Uint8 timerflag; static int exam_scroll; static MoveItem*inputs; -static int inputs_size,inputs_count; +static size_t inputs_size; +static int inputs_count; static Uint8 side_mode=255; static Uint8 should_record_solution; static Uint8 replay_speed; static Uint8 replay_time; static Uint8 solved; @@ -75,10 +76,14 @@ fclose(o); if(replay_count && !replay_list) fatal("Allocation failed\n"); return replay_count; } +#define MSIZ (sizeof(MoveItem)) +#define memcpyM(a_,b_,c_) memcpy(a_,b_,(c_)*MSIZ); +#define memmoveM(a_,b_,c_) memmove(a_,b_,(c_)*MSIZ); + static void record_solution(void); static void setup_game(void) { const char*v; optionquery[1]=Q_showInventory; @@ -1171,26 +1176,26 @@ } if(solution_replay) { screen_message("You cannot play your own moves during the solution replay"); return -3; } - if(inputs_count>=inputs_size) { - inputs=realloc(inputs,inputs_size+=32); + if(inputs_count*MSIZ>=inputs_size) { + inputs=realloc(inputs,inputs_size+=32*MSIZ); if(!inputs) fatal("Allocation failed\n"); } inputs[inputs_count++]=number; return 0; case '+ ': replay: // Replay saved_inserting=inserting; inserting=0; replay_time=0; if(number>replay_count-replay_pos) number=replay_count-replay_pos; if(number<=0) return prev; - if(inputs_count+number>=inputs_size) { - inputs=realloc(inputs,inputs_size+=number+1); + if((inputs_count+number)*MSIZ>=inputs_size) { + inputs=realloc(inputs,inputs_size+=(number+1)*MSIZ); if(!inputs) fatal("Allocation failed\n"); } - memcpy(inputs+inputs_count,replay_list+replay_pos,number); + memcpyM(inputs+inputs_count,replay_list+replay_pos,number); inputs_count+=number; return 0; case '- ': // Rewind saved_inserting=inserting; number=replay_pos-number; @@ -1198,15 +1203,15 @@ //fallthru case '= ': restart: // Restart begin_level(level_id); if(!number) return 1; if(number>replay_count) number=replay_count; - if(number>=inputs_size) { - inputs=realloc(inputs,inputs_size=number+1); + if(number*MSIZ>=inputs_size) { + inputs=realloc(inputs,inputs_size=(number+1)*MSIZ); if(!inputs) fatal("Allocation failed\n"); } - memcpy(inputs,replay_list,inputs_count=number); + memcpyM(inputs,replay_list,inputs_count=number); no_dead_anim=1; return 1; case '^<': // Rewind to mark number=replay_mark; goto restart; @@ -1219,11 +1224,11 @@ if(solution_replay) { screen_message("You cannot delete moves during the solution replay"); return -3; } if(replay_pos==replay_count) return 0; - memmove(replay_list+replay_pos,replay_list+replay_pos+1,replay_count-replay_pos-1); + memmoveM(replay_list+replay_pos,replay_list+replay_pos+1,replay_count-replay_pos-1); replay_count--; if(replay_mark>replay_pos) replay_mark--; return 0; case '^+': // Insert moves if(solution_replay) return 0; @@ -1386,21 +1391,20 @@ if(inserting) { if(replay_pos>=0xFFFE || replay_pos==replay_count) { inserting=0; } else { if(replay_count>0xFFFE) replay_count=0xFFFE; - if(replay_size<0xFFFF) { - replay_list=realloc(replay_list,replay_size=0xFFFF); + if(replay_size<0x10000*MSIZ) { + replay_list=realloc(replay_list,replay_size=0x10000*MSIZ); if(!replay_list) fatal("Allocation failed\n"); } - memmove(replay_list+replay_pos+1,replay_list+replay_pos,replay_count-replay_pos); + memmoveM(replay_list+replay_pos+1,replay_list+replay_pos,replay_count-replay_pos); replay_count++; } } - if(replay_pos>=replay_size) { - if(replay_size>0xFFFF) replay_size=0xFFFF; - replay_list=realloc(replay_list,replay_size+=0x200); + if(replay_pos*MSIZ>=replay_size) { + replay_list=realloc(replay_list,replay_size+=0x200*MSIZ); if(!replay_list) fatal("Allocation failed\n"); } replay_list[replay_pos++]=k; if(replay_pos>replay_count) replay_count=replay_pos; }