if (demo_header_read(fp, d))
{
- strncpy(d->filename, path, MAXSTR - 1);
- strncpy(d->name, base_name_sans(d->filename, ".nbr"), PATHMAX - 1);
- d->name[PATHMAX - 1] = '\0';
+ SAFECPY(d->filename, path);
+ SAFECPY(d->name, base_name_sans(d->filename, ".nbr"));
}
else
{
return fs_exists(demo_path(name));
}
-#define MAXSTRLEN(a) (sizeof ((a)) - 1)
-
const char *demo_format_name(const char *fmt,
const char *set,
const char *level)
return name;
}
-#undef MAXSTRLEN
-
/*---------------------------------------------------------------------------*/
int demo_play_init(const char *name, const struct level *level,
memset(&demo, 0, sizeof (demo));
- strncpy(demo.filename, demo_path(name), sizeof (demo.filename) - 1);
- strncpy(demo.player, config_get_s(CONFIG_PLAYER), sizeof (demo.player) - 1);
- strncpy(demo.shot, level_shot(level), PATHMAX - 1);
- strncpy(demo.file, level_file(level), PATHMAX - 1);
+ SAFECPY(demo.filename, demo_path(name));
+ SAFECPY(demo.player, config_get_s(CONFIG_PLAYER));
+ SAFECPY(demo.shot, level_shot(level));
+ SAFECPY(demo.file, level_file(level));
demo.mode = mode;
demo.date = time(NULL);
demo_exists(USER_REPLAY_FILE) &&
strcmp(name, USER_REPLAY_FILE) != 0)
{
- strncpy(src, demo_path(USER_REPLAY_FILE), sizeof (src) - 1);
- strncpy(dst, demo_path(name), sizeof (dst) - 1);
+ SAFECPY(src, demo_path(USER_REPLAY_FILE));
+ SAFECPY(dst, demo_path(name));
fs_rename(src, dst);
}
{
struct level level;
- strncpy(demo_replay.filename, name, MAXSTR - 1);
- strncpy(demo_replay.name,
- base_name_sans(demo_replay.filename, ".nbr"),
- PATHMAX - 1);
+ SAFECPY(demo_replay.filename, name);
+ SAFECPY(demo_replay.name,
+ base_name_sans(demo_replay.filename, ".nbr"));
if (level_load(demo_replay.file, &level))
{
#include <math.h>
#include <assert.h>
+#include "common.h"
#include "solid.h"
#include "config.h"
#include "level.h"
char *v = fp->av + fp->dv[i].aj;
if (strcmp(k, "message") == 0)
- strncpy(l->message, v, MAXSTR - 1);
+ SAFECPY(l->message, v);
else if (strcmp(k, "song") == 0)
- strncpy(l->song, v, PATHMAX - 1);
+ SAFECPY(l->song, v);
else if (strcmp(k, "shot") == 0)
- strncpy(l->shot, v, PATHMAX - 1);
+ SAFECPY(l->shot, v);
else if (strcmp(k, "goal") == 0)
{
l->goal = atoi(v);
}
}
else if (strcmp(k, "version") == 0)
- strncpy(l->version, v, MAXSTR - 1);
+ SAFECPY(l->version, v);
else if (strcmp(k, "author") == 0)
- strncpy(l->author, v, MAXSTR - 1);
+ SAFECPY(l->author, v);
else if (strcmp(k, "bonus") == 0)
l->is_bonus = atoi(v) ? 1 : 0;
}
return 0;
}
- strncpy(level->file, filename, PATHMAX - 1);
+ SAFECPY(level->file, filename);
score_init_hs(&level->scores[SCORE_TIME], 59999, 0);
score_init_hs(&level->scores[SCORE_GOAL], 59999, 0);
int coin_rank,
const char *player)
{
- strncpy(l->scores[SCORE_TIME].player[time_rank], player, MAXNAM - 1);
- strncpy(l->scores[SCORE_GOAL].player[goal_rank], player, MAXNAM - 1);
- strncpy(l->scores[SCORE_COIN].player[coin_rank], player, MAXNAM - 1);
+ SAFECPY(l->scores[SCORE_TIME].player[time_rank], player);
+ SAFECPY(l->scores[SCORE_GOAL].player[goal_rank], player);
+ SAFECPY(l->scores[SCORE_COIN].player[coin_rank], player);
}
/*---------------------------------------------------------------------------*/
#include <string.h>
#include "score.h"
+#include "common.h"
/*---------------------------------------------------------------------------*/
char player[MAXNAM];
int tmp;
- strncpy(player, S->player[i], MAXNAM - 1);
- strncpy(S->player[i], S->player[j], MAXNAM - 1);
- strncpy(S->player[j], player, MAXNAM - 1);
+ SAFECPY(player, S->player[i]);
+ SAFECPY(S->player[i], S->player[j]);
+ SAFECPY(S->player[j], player);
tmp = S->timer[i];
S->timer[i] = S->timer[j];
static void score_insert(struct score *s, int i,
const char *player, int timer, int coins)
{
- strncpy(s->player[i], player, MAXNAM - 1);
+ SAFECPY(s->player[i], player);
s->timer[i] = timer;
s->coins[i] = coins;
score_init_hs(&s->time_score, 359999, 0);
score_init_hs(&s->coin_score, 359999, 0);
- strncpy(s->file, filename, PATHMAX - 1);
+ SAFECPY(s->file, filename);
if (read_line(&s->name, fin) &&
read_line(&s->desc, fin) &&
{
struct set *s = SET_GET(sets, curr);
- strncpy(s->coin_score.player[score_rank], player, MAXNAM - 1);
- strncpy(s->time_score.player[times_rank], player, MAXNAM - 1);
+ SAFECPY(s->coin_score.player[score_rank], player);
+ SAFECPY(s->time_score.player[times_rank], player);
}
/*---------------------------------------------------------------------------*/
{
int i;
- strncpy(ball_file, config_get_s(CONFIG_BALL_FILE), sizeof (ball_file) - 1);
+ SAFECPY(ball_file, config_get_s(CONFIG_BALL_FILE));
if ((balls = fs_dir_scan("ball", has_ball_sols)))
{
#include <string.h>
#include <ctype.h>
+#include "common.h"
#include "gui.h"
#include "util.h"
#include "audio.h"
int goto_name(struct state *ok, struct state *cancel, unsigned int back)
{
- strncpy(player, config_get_s(CONFIG_PLAYER), sizeof (player) - 1);
+ SAFECPY(player, config_get_s(CONFIG_PLAYER));
ok_state = ok;
cancel_state = cancel;
set_id(curr_set()),
level_name(curr_level()));
- strncpy(filename, name, sizeof (filename) - 1);
+ SAFECPY(filename, name);
ok_state = ok;
cancel_state = cancel;
if (path_is_abs(CONFIG_DATA))
return CONFIG_DATA;
- strncpy(dir, fs_base_dir(), sizeof (dir) - 1);
- strncat(dir, "/", sizeof (dir) - strlen(dir) - 1);
- strncat(dir, CONFIG_DATA, sizeof (dir) - strlen(dir) - 1);
+ SAFECPY(dir, fs_base_dir());
+ SAFECAT(dir, "/");
+ SAFECAT(dir, CONFIG_DATA);
return dir;
}
/* Remove the directory part. */
- strncpy(base, base_name(name), sizeof (base) - 1);
+ SAFECPY(base, base_name(name));
/* Remove the suffix. */
char *sep;
- strncpy(buff, name, sizeof (buff) - 1);
+ SAFECPY(buff, name);
if ((sep = (char *) path_last_sep(buff)))
{
if (path_is_abs(rel))
{
- strncpy(new, rel, sizeof (new) - 1);
+ SAFECPY(new, rel);
return new;
}
- strncpy(new, dir_name(ref), sizeof (new) - 1);
- strncat(new, "/", sizeof (new) - strlen(new) - 1);
- strncat(new, rel, sizeof (new) - strlen(new) - 1);
+ SAFECPY(new, dir_name(ref));
+ SAFECAT(new, "/");
+ SAFECAT(new, rel);
return new;
}
#endif
#define ARRAYSIZE(a) (sizeof (a) / sizeof ((a)[0]))
+#define MAXSTRLEN(a) (sizeof (a) - 1)
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#define SAFECPY(dst, src) (strncpy((dst), (src), MAXSTRLEN(dst)))
+#define SAFECAT(dst, src) (strncat((dst), \
+ (src), \
+ MAX(0, MAXSTRLEN(dst) - strlen(dst))))
+
int read_line(char **, fs_file);
char *strip_newline(char *);