home · contact · privacy
Improved and defined more precisely textfile_sizes().
authorChristian Heller <c.heller@plomlompom.de>
Wed, 4 Sep 2013 01:25:34 +0000 (03:25 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Wed, 4 Sep 2013 01:25:34 +0000 (03:25 +0200)
src/command_db.c
src/keybindings.c
src/map_objects.c
src/misc.c
src/misc.h
src/wincontrol.c

index d5af5c27f8bdf8f6944f384f790e931168bc3d45..bdcdcd1fa83a49faa343231360f4f72add0b4bcf 100644 (file)
@@ -87,12 +87,12 @@ extern void init_command_db(struct World * world)
     exit_err(NULL == file, world, err_o);
     uint16_t lines, linemax;
     exit_err(textfile_sizes(file, &linemax, &lines), world, err_s);
+    char line[linemax + 1];
 
-    char line[linemax];
     struct Command * cmds = malloc(lines * sizeof(struct Command));
     exit_err(NULL == line, world, err_m);
     uint8_t i = 0;
-    while (fgets(line, linemax, file))
+    while (fgets(line, linemax + 1, file))
     {
         cmds[i].id = atoi(strtok(line, " "));
         copy_tokenized_string(world, &cmds[i].dsc_short, " ", err_m);
index 121304bdadd9ed2d773adf6eed374f4c8a034bd4..8b01958c940d5079f4d5157b6034a92f918a056e 100644 (file)
@@ -21,7 +21,7 @@ extern void init_keybindings(struct World * world)
     char * err = "textfile_sizes() in init_keybindings() returns error.";
     exit_err(textfile_sizes(file, &linemax, &lines), world, err);
     struct KeyBinding * keybindings = malloc(lines * sizeof(struct KeyBinding));
-    char * command = malloc(linemax);
+    char * command = malloc(linemax + 1);
     uint16_t commcount = 0;
     char * cmdptr;
     while (fgets(command, linemax + 1, file))
index 8b84ac136fcd5a07589ebf591b92227fbed805d1..f623801d01114e2ab2e159f270c6e98175a9df0b 100644 (file)
@@ -107,10 +107,10 @@ extern void init_map_object_defs(struct World * world, char * filename)
     world->monster_def = 0;
     struct ItemDef    * * p_p_id  = &world->item_def;
     struct MonsterDef * * p_p_md  = &world->monster_def;
-    char defline[linemax];
+    char defline[linemax + 1];
     char * line_p;
     char * delim = " ";
-    while (fgets(defline, linemax, file))
+    while (fgets(defline, linemax + 1, file))
     {
         mod.next    = 0;
         mod.id      = atoi(strtok(defline, delim));
index 496c58549461370c8e100f28d60737f5edbd9770..4b25f65f5c05b387d3bfc359e76018411c30676f 100644 (file)
 extern uint8_t textfile_sizes(FILE * file, uint16_t * linemax_p,
                               uint16_t * n_lines_p)
 {
-    uint16_t n_lines = 0;
     int c = 0;
-    uint16_t linemax = 0;
     uint16_t c_count = 0;
-    while (EOF != c)
+    uint16_t n_lines = 0;
+    uint16_t linemax = 0;
+    while (1)
     {
-        c_count++;
         c = getc(file);
+        if (EOF == c)
+        {
+            break;
+        }
+        c_count++;
         if ('\n' == c)
         {
             if (c_count > linemax)
             {
-                linemax = c_count + 1;
+                linemax = c_count;
             }
             c_count = 0;
             if (n_lines_p)
@@ -41,6 +45,11 @@ extern uint8_t textfile_sizes(FILE * file, uint16_t * linemax_p,
             }
         }
     }
+    if (0 == linemax && 0 < c_count) /* Handle files that consist of only one */
+    {                                /* line / lack newline chars.            */
+        linemax = c_count;
+    }
+
     if (-1 == fseek(file, 0, SEEK_SET))
     {
         return 1;
index 5c9d3c4f3244027f7ba0985aa422648d8a20236d..568c56d432c5d9d572fb37c4f22f2025a86ac825 100644 (file)
@@ -17,10 +17,12 @@ struct Map;
 
 
 
-/* Learn from "file" the largest line length (pointed to by "linemax_p") and
- * (pointed to by "n_lines_p" if it is not set to NULL) the number of lines.
+/* Learn from "file" the largest line length (pointed to by "linemax_p"; length
+ * includes newline chars) and (pointed to by "n_lines_p" if it is not set to
+ * NULL) the number of lines (= number of newline chars).
  *
- * Returns 0 on success, 1 on fseek() error.
+ * Returns 0 on success, 1 on error of fseek() (called to return to initial file
+ * reading position).
  */
 extern uint8_t textfile_sizes(FILE * file, uint16_t * linemax_p,
                               uint16_t * n_lines_p);
index b4a8640809ff484fb252f8a7648a770351e4a7ce..10a9382d832e9cfb88d6cfbdc8100f503a1871ab 100644 (file)
@@ -93,23 +93,22 @@ static void init_winconf_from_file(struct World * world, char id)
     FILE * file = fopen(path, "r");
     exit_err(NULL == file, world, err_o);
     free(path);
-
     uint16_t linemax;
     exit_err(textfile_sizes(file, &linemax, NULL), world, err_s);
-    char line[linemax];
+    char line[linemax + 1];
 
     struct WinConf * winconf = get_winconf_by_id(world, id);
-    exit_err(NULL == fgets(line, linemax, file), world, err_g);
+    exit_err(NULL == fgets(line, linemax + 1, file), world, err_g);
     exit_err(NULL == (winconf->title = malloc(strlen(line))), world, err_m);
     memcpy(winconf->title, line, strlen(line) - 1); /* Eliminate newline char */
     winconf->title[strlen(line) - 1] = '\0';        /* char at end of string. */
-    exit_err(NULL == fgets(line, linemax, file), world, err_g);
+    exit_err(NULL == fgets(line, linemax + 1, file), world, err_g);
     winconf->height = atoi(line);
     if (0 >= winconf->height)
     {
         winconf->height_type = 1;
     }
-    exit_err(NULL == fgets(line, linemax, file), world, err_g);
+    exit_err(NULL == fgets(line, linemax + 1, file), world, err_g);
     winconf->width = atoi(line);
     if (0 >= winconf->width)
     {
@@ -308,16 +307,15 @@ extern void sorted_wintoggle(struct World * world)
     char * path = "config/windows/toggle_order";
     FILE * file = fopen(path, "r");
     exit_err(NULL == file, world, err_o);
-
     uint16_t linemax;
     exit_err(textfile_sizes(file, &linemax, NULL), world, err_s);
+    char win_order[linemax + 1];
 
-    char win_order[linemax];
-    exit_err(NULL == fgets(win_order, linemax, file), world, err_g);
+    exit_err(NULL == fgets(win_order, linemax + 1, file), world, err_g);
     exit_err(fclose(file), world, err_c);
 
     uint8_t i = 0;
-    for (; i < linemax - 2; i++)
+    for (; i < linemax - 1; i++)
     {
         toggle_window(world->wmeta, get_win_by_id(world, win_order[i]));
     }