Add a macro for copying strings to static arrays
authorparasti <parasti@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Mon, 1 Nov 2010 13:41:08 +0000 (13:41 +0000)
committerparasti <parasti@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Mon, 1 Nov 2010 13:41:08 +0000 (13:41 +0000)
Yay for macros.
Yay for false sense of security.

git-svn-id: https://s.snth.net/svn/neverball/trunk@3348 78b8d119-cf0a-0410-b17c-f493084dd1d7

ball/demo.c
ball/level.c
ball/score.c
ball/set.c
ball/st_ball.c
ball/st_name.c
ball/st_save.c
share/base_config.c
share/common.c
share/common.h

index cd4a0da..dee90e8 100644 (file)
@@ -145,9 +145,8 @@ struct demo *demo_load(const char *path)
 
         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
         {
@@ -182,8 +181,6 @@ int demo_exists(const char *name)
     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)
@@ -272,8 +269,6 @@ const char *demo_format_name(const char *fmt,
     return name;
 }
 
-#undef MAXSTRLEN
-
 /*---------------------------------------------------------------------------*/
 
 int demo_play_init(const char *name, const struct level *level,
@@ -283,10 +278,10 @@ 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);
@@ -343,8 +338,8 @@ void demo_rename(const char *name)
         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);
     }
@@ -404,10 +399,9 @@ int demo_replay_init(const char *name, int *g, int *m, int *b, int *s, int *tt)
         {
             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))
             {
index 60929fe..d6ba97e 100644 (file)
@@ -18,6 +18,7 @@
 #include <math.h>
 #include <assert.h>
 
+#include "common.h"
 #include "solid.h"
 #include "config.h"
 #include "level.h"
@@ -42,11 +43,11 @@ static void scan_level_attribs(struct level *l, const struct s_file *fp)
         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);
@@ -91,9 +92,9 @@ static void scan_level_attribs(struct level *l, const struct s_file *fp)
             }
         }
         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;
     }
@@ -134,7 +135,7 @@ int level_load(const char *filename, struct level *level)
         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);
@@ -250,9 +251,9 @@ void level_rename_player(struct level *l,
                          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);
 }
 
 /*---------------------------------------------------------------------------*/
index 0d33318..a7daa67 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <string.h>
 #include "score.h"
+#include "common.h"
 
 /*---------------------------------------------------------------------------*/
 
@@ -44,9 +45,9 @@ static void score_swap(struct score *S, int i, int j)
     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];
@@ -62,7 +63,7 @@ static void score_swap(struct score *S, int i, int 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;
index 706fe0a..c834944 100644 (file)
@@ -210,7 +210,7 @@ static int set_load(struct set *s, const char *filename)
     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) &&
@@ -480,8 +480,8 @@ void set_rename_player(int score_rank, int times_rank, const char *player)
 {
     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);
 }
 
 /*---------------------------------------------------------------------------*/
index baa6ff8..43f2acf 100644 (file)
@@ -82,7 +82,7 @@ static void scan_balls(void)
 {
     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)))
     {
index 06fb8db..0ad4cbd 100644 (file)
@@ -15,6 +15,7 @@
 #include <string.h>
 #include <ctype.h>
 
+#include "common.h"
 #include "gui.h"
 #include "util.h"
 #include "audio.h"
@@ -41,7 +42,7 @@ static unsigned int draw_back;
 
 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;
index 603a09e..6106484 100644 (file)
@@ -44,7 +44,7 @@ int goto_save(struct state *ok, struct 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;
index 221d544..8334407 100644 (file)
@@ -41,9 +41,9 @@ static const char *pick_data_path(const char *arg_data_path)
     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;
 }
index 6c84be8..2dced7e 100644 (file)
@@ -243,7 +243,7 @@ const char *base_name_sans(const char *name, const char *suffix)
 
     /* Remove the directory part. */
 
-    strncpy(base, base_name(name), sizeof (base) - 1);
+    SAFECPY(base, base_name(name));
 
     /* Remove the suffix. */
 
@@ -268,7 +268,7 @@ const char *dir_name(const char *name)
 
     char *sep;
 
-    strncpy(buff, name, sizeof (buff) - 1);
+    SAFECPY(buff, name);
 
     if ((sep = (char *) path_last_sep(buff)))
     {
@@ -294,13 +294,13 @@ char *path_resolve(const char *ref, const char *rel)
 
     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;
 }
index 5ec7cbc..fedb939 100644 (file)
 #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 *);