From 8f33ee4940b9c35bf4627b7ef1126d03748da646 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sun, 14 Dec 2003 02:32:21 +0100 Subject: [PATCH] rocksndiamonds-3.0.8 --- CHANGES | 19 +- ChangeLog | 500 --------------------------------- src/Makefile | 6 +- src/{conf_dem.c => conf_hlp.c} | 2 +- src/conftime.h | 2 +- src/editor.c | 6 +- src/files.c | 30 +- src/game.c | 9 +- src/init.c | 15 +- src/libgame/misc.c | 20 +- src/libgame/misc.h | 1 + src/libgame/msdos.c | 16 +- src/libgame/setup.c | 146 ++++------ src/libgame/sound.c | 22 +- src/libgame/system.c | 3 +- src/main.h | 2 +- src/tools.c | 2 +- 17 files changed, 125 insertions(+), 676 deletions(-) delete mode 100644 ChangeLog rename src/{conf_dem.c => conf_hlp.c} (99%) diff --git a/CHANGES b/CHANGES index 223c6183..f8bad859 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,4 @@ -Release Version 3.0.8 [13 DEC 2003] +Release Version 3.0.8 [14 DEC 2003] ----------------------------------- - added "musicinfo.conf" for menu and level music configuration - added "editorsetup.conf" for editor element list configuration @@ -16,6 +16,23 @@ Release Version 3.0.8 [13 DEC 2003] - fixed bug with double nut cracking sound - fixed a very nasty bug in dragon turning code in TurnRoundExt() - finally fixed tape recording when player is created from CE change + - added new contributed levels from the following players: + + Audrius Saikunas (4 levels) + + Efraim Yawitz (20 levels) + + Krystian Abramowicz (100 levels) + + Paul E Collins (formerly known as Equinox Tetrachloride; 64 levels) + + Sebastian Simon (12 levels) + - amazing new level set: + + "BD2K3" from Alan Bond + + 43 levels full of BD nostalgia, action and fantastic effects + + overwhelming use of custom elements + + complete artwork set with graphics, sounds and music + + available as a separate download from www.artsoft.org + - another great level set was updated: + + "jue2" from Jürgen Bonhagen + + 15 new mind-boggling levels full of new challenges for your brain + + complete artwork set with graphics and sounds + + available for downloading from "http://www.jb-line.de/rnd.html" Release Version 3.0.7 [10 NOV 2003] ----------------------------------- diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 2fccf0c9..00000000 --- a/ChangeLog +++ /dev/null @@ -1,500 +0,0 @@ -2003-12-13 - * fixed bug with double nut cracking sound - (by eliminating "default element action sound" assignment in init.c) - -2003-12-10 - * fixed crash when no music info files are available - -2003-12-07 - * fixed boring and sleeping sounds - -2003-12-05 - * added "maze runner" and "maze hunter" movement types - * added extended collision conditions for custom elements - -2003-12-03 - * added warnings for undefined token values in artwork config files - -2003-12-02 - * added menu entry for level set information to the info screen - -2003-12-02 - * fixed bug with wrong default impact sound for colored emeralds - -2003-11-30 - * added several sub-screens for the info screen - * menu text now also clickable (not only blue/red sphere left of it) - -2003-11-25 - * added configurable "bored" and "sleeping" animations for the player - * added "awakening" sound for player waking up after sleeping - -2003-11-22 - * added "copy" and "exchange" functions for custom elements to editor - -2003-11-21 - * added configurable element animations for info screen - -2003-11-20 - * added configurable music credits for info screen - -2003-11-19 - * finally fixed tape recording when player is created from CE change - -2003-11-18 - * added "editorsetup.conf" for editor element list configuration - -2003-11-16 - * added "musicinfo.conf" for menu and level music configuration - -2003-11-14 - * fixed a very nasty bug in dragon turning code in TurnRoundExt() - (that only showed up on Linux, but not on Windows systems) - -2003-11-13 - * fixed turning movement of butterflies and fireflies (no frame reset) - * enhanced sniksnak turning movement (two steps instead of only one) - -2003-11-10 - * Version number set to 3.0.8. - -2003-11-10 - * Version 3.0.7 released. - -2003-11-09 - * fixed reset of player animation frame when, for example, - walking, digging or collecting share the same animation - * fixed CE with "deadly when touching" exploding when touching amoeba - -2003-11-08 - * fixed tape recording when player is created from CE element change - -2003-11-04 - * introduced "turning..." action graphic for elements with move delay - (non-CE: bug, spaceship, sniksnak, mole, pacman, yamyam) - * added turning animations for bug, spaceship and sniksnak - -2003-11-03 - * prevent "extended" changed elements from delay change in same frame - -2003-11-02 - * fixed bug when pushing element that can move away to the side - (like pushing falling elements, but now with moving elements) - -2003-11-01 - * finally fixed serious bug in code for delayed element pushing (again) - -2003-10-19 - * unavailable setup options now marked as "n/a" instead of "off" - * new boolean directive "latest_engine" for "levelinfo.conf": when set - to "true", levels are always played with the latest game engine, - which is desired for levels that are imported from other games; all - other levels are played with the engine version stored in level file - (which is normally the engine version the level was created with) - -2003-10-18 - * fixed serious bug in code for delayed element pushing - * fixed little bug in animation frame selection for pushed elements - * speed-up of reading config file for verbose output - -2003-10-08 - * added configuration option for opening and closing Supaplex exit - * added configuration option for moving up/down animation for Murphy - * fixed incorrectly displayed animation for attacking dragon - * fixed bug with not setting initial gravity for each new game - * fixed bug with teleportation of player by custom element change - * fixed bug with player not getting smashed by rock sometimes - -2003-10-06 - * Version number set to 3.0.7. - -2003-10-06 - * Version 3.0.6 released. - -2003-10-05 - * added support for MP3 music for SDL version through SMPEG library - -2003-10-03 - * fixed bug when initializing font graphic structure - * fixed bug with animation mode "pingpong" when using only 1 frame - * fixed bug with extended change target introduced in 3.0.5 - * fixed bug where passing over moving element doubles player speed - * fixed bug with elements continuing to move into push direction - * fixed bug with duplicated player when dropping bomb with shield on - * added "switching" event for custom elements ("pressing" only once) - * fixed switching bug (resetting flag when not switching but not idle) - -2003-09-29 - * fixed element tokens for certain file elements with ".active" etc. - -2003-09-29 - * Version number set to 3.0.6. - -2003-09-29 - * Version 3.0.5 released. - -2003-09-28 - * now four envelope elements available - * font, background, animation and sound for envelope now configurable - * main menu doors opening/closing animation type now configurable - -2003-09-27 - * active/inactive sides configurable for custom element changes - * new movement type "move when pushed" available for custom elements - -2003-09-20 - * fixed bug in multiple config pages loader code that caused crashes - -2003-09-13 - * enhanced (remaining low-resolution) Supaplex graphics - -2003-09-13 - * Version number set to 3.0.5. - -2003-09-13 - * Version 3.0.4 released. - -2003-09-12 src/tools.c - * fixed bug in custom definition of crumbled element graphics - -2003-09-11 src/files.c - * fixed bug in multiple config pages code that caused crashes - -2003-09-08 - * Version number set to 3.0.4. - -2003-09-08 - * Version 3.0.3 released. - -2003-09-07 - * added music to Supaplex classic level set - -2003-09-07 src/libgame/misc.c - * added support for loading various music formats through SDL_mixer - -2003-09-06 (various source files) - * fixed several nasty bugs that may have caused crashes on some systems - * added envelope content which gets displayed when collecting envelope - * added multiple change event pages for custom elements - -2003-08-24 src/game.c - * fixed problem with player animation when snapping and moving - -2003-08-23 src/screens.c, src/cartoons.c, src/libgame/toons.c - * fixed problem with flickering when drawing toon animations - -2003-08-23 src/libgame/sdl.c - * fixed problem with setting mouse cursor in SDL version in fullscreen - -2003-08-23 src/game.c - * fixed bug (missing array boundary check) which could crash the game - -2003-08-23 - * Version number set to 3.0.3. - -2003-08-22 - * Version 3.0.2 released. - -2003-08-21 src/game.c - * fixed bug with creating inaccessible elements at player position - -2003-08-20 src/init.c - * fixed bug with not finding current level artwork directory - -2003-08-20 src/files.c - * fixed bug with choosing wrong engine version when playing tapes - * fixed bug with messing up custom element properties in 3.0.0 levels - -2003-08-18 - * Version number set to 3.0.2. - -2003-08-18 - * Version 3.0.1 released. - -2003-08-17 (no source files affected) - * changed all "classic" PCX image files with 16 colors or less to - 256 color (8 bit) storage format, because the Allegro game library - cannot handle PCX files with less than 256 colors (contributed - graphics are not affected and might look wrong in the DOS version) - -2003-08-16 src/init.c - * fixed bug which (for example) crashed the level editor when defining - "dynamite.EDITOR: [NONE]", because graphics may not be undefined - (only set to default) -- invalid graphics now set to default graphic - -2003-08-16 src/init.c - * fixed graphical bug of player digging/collecting/snapping element - when no corresponding graphic/animation is defined for this action, - resulting in player being drawn as EL_EMPTY (which should only be - done to elements being collected, but not to the player) - -2003-08-16 src/game.c - * fixed small graphical bug of player not totally moving into exit - -2003-08-16 src/libgame/setup.c - * fixed bug with wrong MS-DOS 8.3 filename conversion - -2003-08-16 src/tools.c - * fixed bug with invisible mouse cursor when pressing ESC while playing - -2003-08-16 (various source files) - * added another 128 custom elements (disabled in editor by default) - -2003-08-16 src/editor.c - * fixed NULL string bug causing Solaris to crash in sprintf() - -2003-08-16 src/screen.c - * fixed drawing over scrollbar on level selection with custom fonts - -2003-08-15 src/game.c - * cleanup of simple sounds / loop sounds / music settings - -2003-08-08 (various source files) - * added custom element property for dropping collected elements - -2003-08-08 src/conf_gfx.c - * fixed bug with missing graphic for active red disk bomb - -2003-08-07 src/files.c, src/editor.c src/game.c, src/main.h - * Extended variable "level.gravity" to "level.initial_gravity" and - "game.current_gravity" to prevent level setting from being changed - by playing the level (keeping the runtime value after playing). - - * Fixed graphics bug when digging element that has 'crumbled' graphic - definition, but not 'diggable' graphic definition. - -2003-08-06 - * Version number set to 3.0.1. - -2003-08-05 - * Version 3.0.0 released. - -2003-08-05 - * various bug fixes; among others: - - fixed bug with pushing spring over empty space - - fixed bug with leaving tube while placing dynamite - - fixed bug with explosion of smashed penguins - - allow Murphy player graphic in levels with non-Supaplex elements - -2003-04-07 - * Various changes. - * I have forgotten to document changes for some time. - -2002-12-31 - * Pre-Release Version 2.2.0rc1 released. - -2002-08-25 - * Version number set to 2.1.2. - -2002-08-13 - * Version 2.1.1 released. - -2002-08-10 - * Version number set to 2.1.1. - -2002-08-05 - * Version 2.1.0 released. - -2002-05-19 - * Version number set to 2.1.0. - -2002-04-03 to 2002-05-19 (various source files) - * graphics, sounds and music now fully configurable - * bug fixed that prevented walking through tubes when gravity on - -2002-04-02 src/events.c, src/editor.c - * Make Escape key less aggressive when playing or when editing level. - This can be configured as an option in the setup menu. (Default is - "less aggressive" which means "ask user if something can be lost" - when pressing the Escape key.) - -2002-04-02 src/screen.c - * Added "graphics setup" screen. - -2002-04-01 src/screen.c - * Changed "choose level" setup screen stuff to be more generic (to - make it easier to add more "choose from generic tree" setup screens). - -2002-04-01 src/config.c, src/timestamp.h - * Added source files "src/config.[ch]" and "src/timestamp.h" (which - automatically gets created by "src/Makefile" and contains an actual - compile-time timestamp to identify development versions of the game). - -2002-03-31 src/tape.c, src/events.c - * Added quick game/tape save/load functions to tape stuff which can be - invoked by a keyboard shortcut. Default: "F1" saves game/tape, "F2" - loads previously recorded tape and directly goes into recording mode - from the end of the tape (therefore appending to the tape). - -2002-03-31 src/tape.c - * Added "index mark" function to tape recorder. When playing or - recording, "eject" button changes to "index" button. Setting index - mark is not yet implemented, but pressing index button when playing - allows very quick advancing to end of tape (when normal playing), - very fast forward mode (when playing with normal fast forward) or - very fast reaching of "pause before end of tape" (when playing with - "pause before end" playing mode). - -2002-03-30 src/cartoons.c - * Moved some stuff from cartoons.c to the new "src/libgame/toons.c". - -2002-03-29 src/screen.c - * Changed setup screen stuff to be more generic (to make it easier - to add more setup screens). - -2002-03-23 src/main.c, src/main.h - * Various changes due to the introduction of the new libgame files - "setup.c" and "joystick.c". - -2002-03-23 src/files.c - * Generic parts of "src/files.c" (mainly setup and level directory - stuff) moved to new libgame file "src/libgame/setup.c". - -2002-03-23 src/joystick.c - * File "src/joystick.c" moved to libgame source tree, with - correspondig changes. - -2002-03-22 src/screens.c - * "HandleChooseLevel()": Another bug in level series navigation fixed. - (Wrong level series information displayed when entering main group.) - -2002-03-22 src/editor.c - * Slight change to support new gadget event "GD_EVENT_INFO_LEAVING". - -2002-03-22 src/editor.c - * Changed behaviour of "Escape" key in level editor to be more - intuitive: When in "Element Properties" or "Level Info" mode, - return to "Drawing Mode" instead of leaving the level editor. - -2002-03-21 src/game.c, src/editor.c, src/files.c - * 2.0.1 introduced the corrected "Emerald Mine" style behaviour of - gems (emeralds, diamonds, ...) slipping down from normal wall, - steel wall and growing wall (as in E.M.C. style levels). Although - the behaviour of contributed and private levels wasn't changed (due - to the use of "level.game_version"; see previous entry), editing - those levels will (of course) change the behaviour accordingly. - - This change seems a bit too hard after thinking about it, because - the EM style behaviour is not the "expected" behaviour (gems would - normally only slip down from "rounded" walls). Therefore this was - now changed to an element property for gem style elements, with the - default setting "off" (which means: no special EM style behaviour). - To fix older converted levels, this flag is set to "on" for pre-2.0 - levels that are neither contributed nor private levels. - -2002-03-20 src/files.h - * Corrected settings for "level.game_version" depending of level type. - (Contributed and private levels always get played with game engine - version they were created with, while converted levels always get - played with the most recent version of the game engine, to let new - corrections of the emulation behaviour take effect.) - -2002-03-20 src/main.h - * Added "#include ". This seems to be needed by "tape.c" for - compiling the SDL version on some systems. - Thanks to the several people who pointed this out. - -2002-03-19 - * Version number set to 2.0.2. - -2002-03-19 - * Version 2.0.1 released. - -2002-03-18 src/screens.c - * "HandleChooseLevel()": Small bug in level series navigation fixed. - -2002-03-18 src/files.c [src/libgame/misc.c] - * Moved some common functions from src/files.c to src/libgame/misc.c. - -2002-03-18 src/files.c [src/libgame/misc.c] - * Changed permissions for new directories and saved files (especially - score files) according to suggestions of Debian users and mantainers. - Thanks to Drew Parsons for the patch. - -2002-03-17 src/files.c - * Changed "{Load|Save}{Level|Tape}()" to IFF style file format: - Replaced "cookie" header string ("ROCKSNDIAMONDS_...\n") with - real IFF style header "RND1....XXXX" (where "XXXX" is "CAVE" - for levels and "TAPE" for tapes). Old "cookie" style format is - still supported for reading. New level and tape files are written - in new format. - - * New IFF chunk "VERS" contains version numbers for file and game - (where "game version" is the version of the program that wrote the - file, and "file version" is a version number to distinguish files - with different format, for example after adding new features). - -2002-03-15 src/screen.c - * "DrawHallOfFame()": "FadeSounds()" when entering the hall of fame. - (Before, you heard a mixture of the in-game music and the - hall-of-fame music.) - -2002-03-14 src/events.c - * Function "DumpTape()" (files.c) now available by pressing 't' from - main menu (when in DEBUG mode). - -2002-03-14 src/game.c - * "GameWon()": When game was won playing a tape, now there is no delay - raising the score and no corresponding sound is played. - -2002-03-14 src/files.c - * Changed "LoadTape()" for real chunk support and also adjusted - "SaveTape()" accordingly. - -2002-03-14 src/game.c, src/tape.c, src/files.c - * Important changes to tape format: The old tape format stored all - actions with a real effect with a corresponding delay between the - stored actions. This had some major disadvantages (for example, - push delays had to be ignored, pressing a button for some seconds - mutated to several single button presses because of the non-action - delays between two action frames etc.). The new tape format just - stupidly records all device actions and replays them later. I really - don't know why I haven't solved it that way before?! Old-style tapes - (with tape file version less than 2.0) get converted to the new - format on-the-fly when loading and can therefore still be played; - only some minor parts of the old-style tape handling code was needed. - (A perfect conversion is not possible, because there is information - missing about the device actions between two action frames.) - -2002-03-14 src/files.c - * New function "DumpTape()" to dump the contents of the current tape - in a human readable format. - -2002-03-14 src/game.c - * Small tape bug fixed: When automatically advancing to next level - after a game was won, the tape from the previous level still was - loaded as a tape for the new level. - -2002-03-14 src/tape.c - * Small graphical bug fixed: When pressing ""Record" or "Play" on - tape, cartoons did not get completely removed because - StopAnimation() was not called. - -2002-03-13 src/files.c - * Changed "LoadLevel()" and "SaveLevel()" to add new chunk "CNT2". - Fixed bug of "CONT" and "BODY" (chunk size was set to 8-bit element - size even when using 16-bit elements). Added new chunk "CNT2" for - 16-bit amoeba content (previously written in 8-bit field in "HEAD" - chunk even when content was 16-bit element). "CNT2" should now be - able to store content for arbitrary elements (up to eight blocks of - 3 x 3 element arrays). All "CNT2" elements will always be stored as - 16-bit elements. "CONT" (with 8/16-bit elements) now obsolete. - -2002-03-13 src/files.c - * Changed "LoadLevel()" for real chunk support. - -2002-03-12 src/game.c - * Fixed problem (introduced after 2.0.0 release) with penguins - not getting killed by enemies - -2002-02-24 src/game.c, src/main.h - * Added "player->is_moving"; now "player->last_move_dir" does - not contain any information if the player is just moving at - the moment or not. - Before, "player->last_move_dir" was misused for this purpose - for the robot stuff (robots don't kill players when they are - moving). But setting "player->last_move_dir" to MV_NO_MOVING - broke tapes when walking through pipes! - ("IS_MOVING()" uses "MovPos[][]", but this fails when it is 0 - in a continuous movement. This fact is ignored for friends and - enemies, though.) diff --git a/src/Makefile b/src/Makefile index 16c6cd6a..05eccd99 100644 --- a/src/Makefile +++ b/src/Makefile @@ -112,7 +112,7 @@ CONFIG_GAME_DIR = $(CONFIG_RO_GAME_DIR) $(CONFIG_RW_GAME_DIR) CONFIG = $(CONFIG_GAME_DIR) $(CONFIG_SCORE_ENTRIES) $(JOYSTICK) -DEBUG = -DDEBUG -g +# DEBUG = -DDEBUG -g # PROFILING = $(PROFILING_FLAGS) # OPTIONS = $(DEBUG) -Wall # only for debugging purposes @@ -136,7 +136,7 @@ SRCS = main.c \ conf_gfx.c \ conf_snd.c \ conf_mus.c \ - conf_dem.c \ + conf_hlp.c \ init.c \ config.c \ events.c \ @@ -154,7 +154,7 @@ OBJS = main.o \ conf_gfx.o \ conf_snd.o \ conf_mus.o \ - conf_dem.o \ + conf_hlp.o \ init.o \ config.o \ events.o \ diff --git a/src/conf_dem.c b/src/conf_hlp.c similarity index 99% rename from src/conf_dem.c rename to src/conf_hlp.c index 7f844618..68cd4cfb 100644 --- a/src/conf_dem.c +++ b/src/conf_hlp.c @@ -8,7 +8,7 @@ * Germany * * e-mail: info@artsoft.org * *----------------------------------------------------------* -* conf_inf.c * +* conf_hlp.c * ***********************************************************/ #include "libgame/libgame.h" diff --git a/src/conftime.h b/src/conftime.h index 606fe707..aa6bde03 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "[2003-12-13 16:52]" +#define COMPILE_DATE_STRING "[2003-12-14 02:31]" diff --git a/src/editor.c b/src/editor.c index f6df5544..9914b16f 100644 --- a/src/editor.c +++ b/src/editor.c @@ -3075,8 +3075,7 @@ static void ReinitializeElementList() int pos = 0; int i, j; - if (editor_elements != NULL) - free(editor_elements); + checked_free(editor_elements); if (!initialized) { @@ -5533,8 +5532,7 @@ char *getElementDescriptionFilename(int element) static char *filename = NULL; char basename[MAX_FILENAME_LEN]; - if (filename != NULL) - free(filename); + checked_free(filename); /* 1st try: look for element description file for exactly this element */ sprintf(basename, "%s.txt", element_info[element].token_name); diff --git a/src/files.c b/src/files.c index e064ee6d..929ce334 100644 --- a/src/files.c +++ b/src/files.c @@ -2919,7 +2919,7 @@ static struct MusicFileInfo *get_music_file_info_ext(char *basename, int music, getStringCopy(value != NULL && *value != '\0' ? value : UNKNOWN_NAME); } - tmp_music_file_info.basename = basename; + tmp_music_file_info.basename = getStringCopy(basename); tmp_music_file_info.music = music; tmp_music_file_info.is_sound = is_sound; @@ -2975,23 +2975,17 @@ void LoadMusicInfo() { next = music_file_info->next; - if (music_file_info->title_header) - free(music_file_info->title_header); - if (music_file_info->artist_header) - free(music_file_info->artist_header); - if (music_file_info->album_header) - free(music_file_info->album_header); - if (music_file_info->year_header) - free(music_file_info->year_header); - - if (music_file_info->title) - free(music_file_info->title); - if (music_file_info->artist) - free(music_file_info->artist); - if (music_file_info->album) - free(music_file_info->album); - if (music_file_info->year) - free(music_file_info->year); + checked_free(music_file_info->basename); + + checked_free(music_file_info->title_header); + checked_free(music_file_info->artist_header); + checked_free(music_file_info->album_header); + checked_free(music_file_info->year_header); + + checked_free(music_file_info->title); + checked_free(music_file_info->artist); + checked_free(music_file_info->album); + checked_free(music_file_info->year); free(music_file_info); diff --git a/src/game.c b/src/game.c index 455599f5..05e65026 100644 --- a/src/game.c +++ b/src/game.c @@ -8918,13 +8918,10 @@ void InitPlayLevelSound() { int num_sounds = getSoundListSize(); - if (loop_sound_frame != NULL) - free(loop_sound_frame); + checked_free(loop_sound_frame); + checked_free(loop_sound_volume); - if (loop_sound_volume != NULL) - free(loop_sound_volume); - - loop_sound_frame = checked_calloc(num_sounds * sizeof(int)); + loop_sound_frame = checked_calloc(num_sounds * sizeof(int)); loop_sound_volume = checked_calloc(num_sounds * sizeof(int)); } diff --git a/src/init.c b/src/init.c index 104aef40..9871ed6c 100644 --- a/src/init.c +++ b/src/init.c @@ -614,9 +614,9 @@ void InitElementGraphicInfo() for (act = 0; act < NUM_ACTIONS; act++) { - boolean act_remove = ((IS_DIGGABLE(i) && act == ACTION_DIGGING) || - (IS_SNAPPABLE(i) && act == ACTION_SNAPPING) || - (IS_COLLECTIBLE(i) && act == ACTION_COLLECTING)); + boolean act_remove = (act == ACTION_DIGGING || + act == ACTION_SNAPPING || + act == ACTION_COLLECTING); boolean act_turning = (act == ACTION_TURNING_FROM_LEFT || act == ACTION_TURNING_FROM_RIGHT || act == ACTION_TURNING_FROM_UP || @@ -967,8 +967,7 @@ static void InitGraphicInfo() GC copy_clipmask_gc = None; #endif - if (graphic_info != NULL) - free(graphic_info); + checked_free(graphic_info); graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo)); @@ -1265,8 +1264,7 @@ static void InitSoundInfo() int num_sounds = getSoundListSize(); int i, j; - if (sound_info != NULL) - free(sound_info); + checked_free(sound_info); sound_effect_properties = checked_calloc(num_sounds * sizeof(int)); sound_info = checked_calloc(num_sounds * sizeof(struct SoundInfo)); @@ -1497,8 +1495,7 @@ static void InitMusicInfo() int num_music = getMusicListSize(); int i, j; - if (music_info != NULL) - free(music_info); + checked_free(music_info); music_info = checked_calloc(num_music * sizeof(struct MusicInfo)); diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 0c4547e0..06ca9357 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -90,8 +90,7 @@ char *i_to_a(unsigned int i) { static char *a = NULL; - if (a != NULL) - free(a); + checked_free(a); if (i > 2147483647) /* yes, this is a kludge */ i = 2147483647; @@ -501,8 +500,7 @@ char *getStringToLower(char *s) void setString(char **old_value, char *new_value) { - if (*old_value != NULL) - free(*old_value); + checked_free(*old_value); *old_value = getStringCopy(new_value); } @@ -784,7 +782,7 @@ void Error(int mode, char *format, ...) /* ------------------------------------------------------------------------- */ -/* memory allocation functions */ +/* checked memory allocation and freeing functions */ /* ------------------------------------------------------------------------- */ void *checked_malloc(unsigned long size) @@ -821,6 +819,12 @@ void *checked_realloc(void *ptr, unsigned long size) return ptr; } +void checked_free(void *ptr) +{ + if (ptr != NULL) /* this check should be done by free() anyway */ + free(ptr); +} + /* ------------------------------------------------------------------------- */ /* various helper functions */ @@ -1480,8 +1484,7 @@ boolean fileHasPrefix(char *basename, char *prefix) static char *basename_lower = NULL; int basename_length, prefix_length; - if (basename_lower != NULL) - free(basename_lower); + checked_free(basename_lower); if (basename == NULL || prefix == NULL) return FALSE; @@ -1503,8 +1506,7 @@ boolean fileHasSuffix(char *basename, char *suffix) static char *basename_lower = NULL; int basename_length, suffix_length; - if (basename_lower != NULL) - free(basename_lower); + checked_free(basename_lower); if (basename == NULL || suffix == NULL) return FALSE; diff --git a/src/libgame/misc.h b/src/libgame/misc.h index 0e771902..af65d4ca 100644 --- a/src/libgame/misc.h +++ b/src/libgame/misc.h @@ -109,6 +109,7 @@ void Error(int, char *, ...); void *checked_malloc(unsigned long); void *checked_calloc(unsigned long); void *checked_realloc(void *, unsigned long); +void checked_free(void *); inline void swap_numbers(int *, int *); inline void swap_number_pairs(int *, int *, int *, int *); diff --git a/src/libgame/msdos.c b/src/libgame/msdos.c index 02c6a96e..a82da6cd 100644 --- a/src/libgame/msdos.c +++ b/src/libgame/msdos.c @@ -378,8 +378,7 @@ Status XStringListToTextProperty(char **list, int count, void XFree(void *data) { - if (data) - free(data); + checked_free(data); } GC XCreateGC(Display *display, Drawable d, unsigned long value_mask, @@ -598,11 +597,9 @@ void XFreePixmap(Display *display, Pixmap pixmap) void XFreeGC(Display *display, GC gc) { - XGCValues *gcv; + XGCValues *gcv = (XGCValues *)gc; - gcv = (XGCValues *)gc; - if (gcv) - free(gcv); + checked_free(gcv); } void XUnmapWindow(Display *display, Window window) @@ -616,11 +613,8 @@ void XCloseDisplay(Display *display) if (is_screen_bitmap(bitmap)) destroy_bitmap(bitmap); - if (display->screens) - free(display->screens); - - if (display) - free(display); + checked_free(display->screens); + checked_free(display); /* return to text mode (or DOS box on Windows screen) */ set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 1ff198f0..905c890e 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -97,8 +97,7 @@ static char *getUserLevelDir(char *level_subdir) char *data_dir = getUserDataDir(); char *userlevel_subdir = LEVELS_DIRECTORY; - if (userlevel_dir) - free(userlevel_dir); + checked_free(userlevel_dir); if (level_subdir != NULL) userlevel_dir = getPath3(data_dir, userlevel_subdir, level_subdir); @@ -114,8 +113,7 @@ static char *getScoreDir(char *level_subdir) char *data_dir = getCommonDataDir(); char *score_subdir = SCORES_DIRECTORY; - if (score_dir) - free(score_dir); + checked_free(score_dir); if (level_subdir != NULL) score_dir = getPath3(data_dir, score_subdir, level_subdir); @@ -131,8 +129,7 @@ static char *getLevelSetupDir(char *level_subdir) char *data_dir = getUserDataDir(); char *levelsetup_subdir = LEVELSETUP_DIRECTORY; - if (levelsetup_dir) - free(levelsetup_dir); + checked_free(levelsetup_dir); if (level_subdir != NULL) levelsetup_dir = getPath3(data_dir, levelsetup_subdir, level_subdir); @@ -149,8 +146,7 @@ static char *getLevelDirFromTreeInfo(TreeInfo *node) if (node == NULL) return options.level_directory; - if (level_dir) - free(level_dir); + checked_free(level_dir); level_dir = getPath2((node->user_defined ? getUserLevelDir(NULL) : options.level_directory), node->fullpath); @@ -169,8 +165,7 @@ static char *getTapeDir(char *level_subdir) char *data_dir = getUserDataDir(); char *tape_subdir = TAPES_DIRECTORY; - if (tape_dir) - free(tape_dir); + checked_free(tape_dir); if (level_subdir != NULL) tape_dir = getPath3(data_dir, tape_subdir, level_subdir); @@ -186,8 +181,7 @@ static char *getSolutionTapeDir() char *data_dir = getCurrentLevelDir(); char *tape_subdir = TAPES_DIRECTORY; - if (tape_dir) - free(tape_dir); + checked_free(tape_dir); tape_dir = getPath2(data_dir, tape_subdir); @@ -201,8 +195,7 @@ static char *getDefaultGraphicsDir(char *graphics_subdir) if (graphics_subdir == NULL) return options.graphics_directory; - if (graphics_dir) - free(graphics_dir); + checked_free(graphics_dir); graphics_dir = getPath2(options.graphics_directory, graphics_subdir); @@ -216,8 +209,7 @@ static char *getDefaultSoundsDir(char *sounds_subdir) if (sounds_subdir == NULL) return options.sounds_directory; - if (sounds_dir) - free(sounds_dir); + checked_free(sounds_dir); sounds_dir = getPath2(options.sounds_directory, sounds_subdir); @@ -231,8 +223,7 @@ static char *getDefaultMusicDir(char *music_subdir) if (music_subdir == NULL) return options.music_directory; - if (music_dir) - free(music_dir); + checked_free(music_dir); music_dir = getPath2(options.music_directory, music_subdir); @@ -290,8 +281,7 @@ static char *getSetupArtworkDir(TreeInfo *ti) { static char *artwork_dir = NULL; - if (artwork_dir != NULL) - free(artwork_dir); + checked_free(artwork_dir); artwork_dir = getPath2(ti->basepath, ti->fullpath); @@ -309,8 +299,7 @@ char *setLevelArtworkDir(TreeInfo *ti) artwork_path_ptr = &(LEVELDIR_ARTWORK_PATH(leveldir_current, ti->type)); artwork_set_ptr = &(LEVELDIR_ARTWORK_SET( leveldir_current, ti->type)); - if (*artwork_path_ptr != NULL) - free(*artwork_path_ptr); + checked_free(*artwork_path_ptr); if ((level_artwork = getTreeInfoFromIdentifier(ti, *artwork_set_ptr))) *artwork_path_ptr = getStringCopy(getSetupArtworkDir(level_artwork)); @@ -325,8 +314,7 @@ char *setLevelArtworkDir(TreeInfo *ti) char *dir = getPath2(getCurrentLevelDir(), ARTWORK_DIRECTORY(ti->type)); - if (*artwork_set_ptr != NULL) - free(*artwork_set_ptr); + checked_free(*artwork_set_ptr); if (fileExists(dir)) { @@ -366,8 +354,7 @@ char *getLevelFilename(int nr) static char *filename = NULL; char basename[MAX_FILENAME_LEN]; - if (filename != NULL) - free(filename); + checked_free(filename); if (nr < 0) sprintf(basename, "template.%s", LEVELFILE_EXTENSION); @@ -384,8 +371,7 @@ char *getTapeFilename(int nr) static char *filename = NULL; char basename[MAX_FILENAME_LEN]; - if (filename != NULL) - free(filename); + checked_free(filename); sprintf(basename, "%03d.%s", nr, TAPEFILE_EXTENSION); filename = getPath2(getTapeDir(leveldir_current->filename), basename); @@ -398,8 +384,7 @@ char *getSolutionTapeFilename(int nr) static char *filename = NULL; char basename[MAX_FILENAME_LEN]; - if (filename != NULL) - free(filename); + checked_free(filename); sprintf(basename, "%03d.%s", nr, TAPEFILE_EXTENSION); filename = getPath2(getSolutionTapeDir(), basename); @@ -412,8 +397,7 @@ char *getScoreFilename(int nr) static char *filename = NULL; char basename[MAX_FILENAME_LEN]; - if (filename != NULL) - free(filename); + checked_free(filename); sprintf(basename, "%03d.%s", nr, SCOREFILE_EXTENSION); filename = getPath2(getScoreDir(leveldir_current->filename), basename); @@ -425,8 +409,7 @@ char *getSetupFilename() { static char *filename = NULL; - if (filename != NULL) - free(filename); + checked_free(filename); filename = getPath2(getSetupDir(), SETUP_FILENAME); @@ -437,8 +420,7 @@ char *getEditorSetupFilename() { static char *filename = NULL; - if (filename != NULL) - free(filename); + checked_free(filename); filename = getPath2(getSetupDir(), EDITORSETUP_FILENAME); @@ -449,8 +431,7 @@ char *getHelpAnimFilename() { static char *filename = NULL; - if (filename != NULL) - free(filename); + checked_free(filename); filename = getPath2(getCurrentLevelDir(), HELPANIM_FILENAME); @@ -461,8 +442,7 @@ char *getHelpTextFilename() { static char *filename = NULL; - if (filename != NULL) - free(filename); + checked_free(filename); filename = getPath2(getCurrentLevelDir(), HELPTEXT_FILENAME); @@ -488,8 +468,7 @@ char *getLevelSetInfoFilename() for (i = 0; basenames[i] != NULL; i++) { - if (filename != NULL) - free(filename); + checked_free(filename); filename = getPath2(getCurrentLevelDir(), basenames[i]); if (fileExists(filename)) @@ -518,8 +497,7 @@ static char *getCorrectedArtworkBasename(char *basename) { static char *msdos_filename = NULL; - if (msdos_filename != NULL) - free(msdos_filename); + checked_free(msdos_filename); msdos_filename = getStringCopy(basename_corrected); strncpy(&msdos_filename[8], &basename[strlen(basename) - (1+3)], 1+3 +1); @@ -537,8 +515,7 @@ char *getCustomImageFilename(char *basename) static char *filename = NULL; boolean skip_setup_artwork = FALSE; - if (filename != NULL) - free(filename); + checked_free(filename); basename = getCorrectedArtworkBasename(basename); @@ -596,8 +573,7 @@ char *getCustomSoundFilename(char *basename) static char *filename = NULL; boolean skip_setup_artwork = FALSE; - if (filename != NULL) - free(filename); + checked_free(filename); basename = getCorrectedArtworkBasename(basename); @@ -655,8 +631,7 @@ char *getCustomMusicFilename(char *basename) static char *filename = NULL; boolean skip_setup_artwork = FALSE; - if (filename != NULL) - free(filename); + checked_free(filename); basename = getCorrectedArtworkBasename(basename); @@ -730,8 +705,7 @@ char *getCustomArtworkLevelConfigFilename(int type) { static char *filename = NULL; - if (filename != NULL) - free(filename); + checked_free(filename); filename = getPath2(getLevelArtworkDir(type), ARTWORKINFO_FILENAME(type)); @@ -743,8 +717,7 @@ char *getCustomMusicDirectory(void) static char *directory = NULL; boolean skip_setup_artwork = FALSE; - if (directory != NULL) - free(directory); + checked_free(directory); if (!setup.override_level_music) { @@ -1268,12 +1241,12 @@ void freeSetupFileList(SetupFileList *list) if (list == NULL) return; - if (list->token) - free(list->token); - if (list->value) - free(list->value); + checked_free(list->token); + checked_free(list->value); + if (list->next) freeSetupFileList(list->next); + free(list); } @@ -1295,8 +1268,7 @@ SetupFileList *setListEntry(SetupFileList *list, char *token, char *value) if (strcmp(list->token, token) == 0) { - if (list->value) - free(list->value); + checked_free(list->value); list->value = getStringCopy(value); @@ -1805,40 +1777,26 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent) static void freeTreeInfo(TreeInfo *ldi) { - if (ldi->filename) - free(ldi->filename); - if (ldi->fullpath) - free(ldi->fullpath); - if (ldi->basepath) - free(ldi->basepath); - if (ldi->identifier) - free(ldi->identifier); - - if (ldi->name) - free(ldi->name); - if (ldi->name_sorting) - free(ldi->name_sorting); - if (ldi->author) - free(ldi->author); - - if (ldi->class_desc) - free(ldi->class_desc); + checked_free(ldi->filename); + checked_free(ldi->fullpath); + checked_free(ldi->basepath); + checked_free(ldi->identifier); + + checked_free(ldi->name); + checked_free(ldi->name_sorting); + checked_free(ldi->author); + + checked_free(ldi->class_desc); if (ldi->type == TREE_TYPE_LEVEL_DIR) { - if (ldi->graphics_set) - free(ldi->graphics_set); - if (ldi->sounds_set) - free(ldi->sounds_set); - if (ldi->music_set) - free(ldi->music_set); - - if (ldi->graphics_path) - free(ldi->graphics_path); - if (ldi->sounds_path) - free(ldi->sounds_path); - if (ldi->music_path) - free(ldi->music_path); + checked_free(ldi->graphics_set); + checked_free(ldi->sounds_set); + checked_free(ldi->music_set); + + checked_free(ldi->graphics_path); + checked_free(ldi->sounds_path); + checked_free(ldi->music_path); } } @@ -1872,8 +1830,7 @@ void setSetupInfo(struct TokenInfo *token_info, break; case TYPE_STRING: - if (*(char **)setup_value != NULL) - free(*(char **)setup_value); + checked_free(*(char **)setup_value); *(char **)setup_value = getStringCopy(token_value); break; @@ -2437,8 +2394,7 @@ static TreeInfo *getDummyArtworkInfo(int type) artwork_new->fullpath = getStringCopy(UNDEFINED_FILENAME); artwork_new->basepath = getStringCopy(UNDEFINED_FILENAME); - if (artwork_new->name != NULL) - free(artwork_new->name); + checked_free(artwork_new->name); artwork_new->identifier = getStringCopy(UNDEFINED_FILENAME); artwork_new->name = getStringCopy(UNDEFINED_FILENAME); diff --git a/src/libgame/sound.c b/src/libgame/sound.c index ea4e8463..a70ea3ac 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -569,8 +569,7 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl) &setup.override_level_sounds : &setup.override_level_music); - if (set_identifier) - free(set_identifier); + checked_free(set_identifier); set_identifier = checked_malloc(snd_ctrl->data_len); @@ -579,16 +578,12 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl) if (ti == NULL) ti = *ti_ptr = checked_calloc(sizeof(TreeInfo)); - if (leveldir_current->fullpath != NULL) - free(leveldir_current->fullpath); - if (leveldir_current->sounds_path != NULL) - free(leveldir_current->sounds_path); - if (leveldir_current->music_path != NULL) - free(leveldir_current->music_path); - if (ti->basepath != NULL) - free(ti->basepath); - if (ti->fullpath != NULL) - free(ti->fullpath); + + checked_free(leveldir_current->fullpath); + checked_free(leveldir_current->sounds_path); + checked_free(leveldir_current->music_path); + checked_free(ti->basepath); + checked_free(ti->fullpath); if (read(audio.mixer_pipe[0], set_identifier, snd_ctrl->data_len) != snd_ctrl->data_len || @@ -2387,8 +2382,7 @@ void FreeSound(void *ptr) #endif } - if (sound->source_filename) - free(sound->source_filename); + checked_free(sound->source_filename); free(sound); } diff --git a/src/libgame/system.c b/src/libgame/system.c index 1c33deb6..9934650f 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -370,8 +370,7 @@ inline static void FreeBitmapPointers(Bitmap *bitmap) X11FreeBitmapPointers(bitmap); #endif - if (bitmap->source_filename) - free(bitmap->source_filename); + checked_free(bitmap->source_filename); bitmap->source_filename = NULL; } diff --git a/src/main.h b/src/main.h index 186b7ef9..9484a5c6 100644 --- a/src/main.h +++ b/src/main.h @@ -1089,7 +1089,7 @@ #define PROGRAM_VERSION_MAJOR 3 #define PROGRAM_VERSION_MINOR 0 #define PROGRAM_VERSION_PATCH 8 -#define PROGRAM_VERSION_BUILD 2 +#define PROGRAM_VERSION_BUILD 3 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" diff --git a/src/tools.c b/src/tools.c index a54b64d4..6b8ae646 100644 --- a/src/tools.c +++ b/src/tools.c @@ -2025,7 +2025,7 @@ boolean Request(char *text, unsigned int req_state) for (ty = 0; ty < MAX_REQUEST_LINES; ty++) { char text_line[max_request_line_len + 1]; - int tx, tl, tc; + int tx, tl, tc = 0; if (!*text) break; -- 2.34.1