memory management for 'nomakedefs'
The nomakedefs struct starts out with static values, then if/when populate_nomakedefs() is called, the fields are given dynamic values. free_nomakedefs() needs to know what state it's in. A big chunk of this if just formatting for indentation.
This commit is contained in:
+19
-3
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.7 date.c $NHDT-Date: 1644524054 2022/02/10 20:14:14 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $ */
|
/* NetHack 3.7 date.c $NHDT-Date: 1645393645 2022/02/20 21:47:25 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $ */
|
||||||
/* Copyright (c) Michael Allison, 2021. */
|
/* Copyright (c) Michael Allison, 2021. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -17,6 +17,9 @@ extern char *version_id_string(char *, int, const char *);
|
|||||||
extern char *bannerc_string(char *, int, const char *);
|
extern char *bannerc_string(char *, int, const char *);
|
||||||
extern int case_insensitive_comp(const char *, const char *);
|
extern int case_insensitive_comp(const char *, const char *);
|
||||||
|
|
||||||
|
/* nomakedefs_populated: flag for whether 'nomakedefs' should be freed */
|
||||||
|
static int nomakedefs_populated = 0;
|
||||||
|
|
||||||
struct nomakedefs_s nomakedefs = {
|
struct nomakedefs_s nomakedefs = {
|
||||||
/* https://groups.google.com/forum/#!original/
|
/* https://groups.google.com/forum/#!original/
|
||||||
comp.sources.games/91SfKYg_xzI/dGnR3JnspFkJ */
|
comp.sources.games/91SfKYg_xzI/dGnR3JnspFkJ */
|
||||||
@@ -54,6 +57,7 @@ populate_nomakedefs(struct version_info *version)
|
|||||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||||
struct tm t = {0};
|
struct tm t = {0};
|
||||||
time_t timeresult;
|
time_t timeresult;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In a cross-compiled environment, you can't execute
|
* In a cross-compiled environment, you can't execute
|
||||||
* the target binaries during the build, so we can't
|
* the target binaries during the build, so we can't
|
||||||
@@ -73,8 +77,7 @@ populate_nomakedefs(struct version_info *version)
|
|||||||
* gcc, msvc, clang __TIME__ "23:59:01"
|
* gcc, msvc, clang __TIME__ "23:59:01"
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/* if (sizeof __DATE__ + sizeof __TIME__ + sizeof "123" <
|
|
||||||
sizeof tmpbuf1) */
|
|
||||||
Snprintf(tmpbuf1, sizeof tmpbuf1, "%s %s", __DATE__, __TIME__);
|
Snprintf(tmpbuf1, sizeof tmpbuf1, "%s %s", __DATE__, __TIME__);
|
||||||
/* "Feb 12 1996 23:59:01"
|
/* "Feb 12 1996 23:59:01"
|
||||||
01234567890123456789 */
|
01234567890123456789 */
|
||||||
@@ -122,11 +125,20 @@ populate_nomakedefs(struct version_info *version)
|
|||||||
#ifdef NETHACK_GIT_BRANCH
|
#ifdef NETHACK_GIT_BRANCH
|
||||||
nomakedefs.git_branch = dupstr(NETHACK_GIT_BRANCH);
|
nomakedefs.git_branch = dupstr(NETHACK_GIT_BRANCH);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
nomakedefs_populated = 1;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
free_nomakedefs(void)
|
free_nomakedefs(void)
|
||||||
{
|
{
|
||||||
|
/* can't just free non-Null values because they're initialized at
|
||||||
|
compile-time with static strings and won't have dynamic values
|
||||||
|
unless populate_nomakedefs() has been called */
|
||||||
|
if (!nomakedefs_populated)
|
||||||
|
return;
|
||||||
|
|
||||||
if (nomakedefs.build_date)
|
if (nomakedefs.build_date)
|
||||||
free((genericptr_t) nomakedefs.build_date),
|
free((genericptr_t) nomakedefs.build_date),
|
||||||
nomakedefs.build_date = 0;
|
nomakedefs.build_date = 0;
|
||||||
@@ -149,6 +161,10 @@ free_nomakedefs(void)
|
|||||||
free((genericptr_t) nomakedefs.git_branch),
|
free((genericptr_t) nomakedefs.git_branch),
|
||||||
nomakedefs.git_branch = 0;
|
nomakedefs.git_branch = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* values are Null now; dynamic vs static doesn't really matter anymore */
|
||||||
|
nomakedefs_populated = 0;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __DATE__ && __TIME__ */
|
#endif /* __DATE__ && __TIME__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user