Cleanup memory usage
authorGlenn L McGrath <bug1@ihug.co.nz>
Sun, 14 Sep 2003 15:24:18 +0000 (15:24 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Sun, 14 Sep 2003 15:24:18 +0000 (15:24 -0000)
editors/sed.c

index 63d5581f0d0a3283117c6f4df5cb70c5403097ea..f0a3c028ff2858385eccc74c169a9144ad0b4004 100644 (file)
@@ -153,6 +153,10 @@ static void destroy_cmd_strs(void)
                        free(sed_cmd->sub_match);
                }
                free(sed_cmd->replace);
+               free(sed_cmd->editline);
+               free(sed_cmd->filename);
+               free(sed_cmd->translate);
+               free(sed_cmd->label);
                free(sed_cmd);
                sed_cmd = sed_cmd_next;
        }
@@ -803,7 +807,6 @@ static void process_file(FILE * file)
 
                /* Read one line in advance so we can act on the last line, the '$' address */
                next_line = bb_get_chomped_line_from_file(file);
-
                linenum++;
                altered = 0;
                force_print = 0;
@@ -981,10 +984,12 @@ static void process_file(FILE * file)
                                        next_line = NULL;
                                        break;
                                case 'n':       /* Read next line from input */
-                                       free(pattern_space);
-                                       pattern_space = next_line;
-                                       next_line = bb_get_chomped_line_from_file(file);
-                                       linenum++;
+                                       if (next_line) {
+                                               free(pattern_space);
+                                               pattern_space = next_line;
+                                               next_line = bb_get_chomped_line_from_file(file);
+                                               linenum++;
+                                       }
                                        break;
                                case 'N':       /* Append the next line to the current line */
                                        if (next_line) {
@@ -1043,17 +1048,25 @@ static void process_file(FILE * file)
                                        hold_space = strdup(pattern_space);
                                        break;
                                case 'H': {     /* Append newline and pattern space to hold space */
-                                       int hold_space_size = 0;
+                                       int hold_space_size = 2;
+                                       int pattern_space_size = 0;
+
                                        if (hold_space) {
-                                               hold_space_size = strlen(hold_space);
+                                               hold_space_size += strlen(hold_space);
                                        }
-                                       hold_space = xrealloc(hold_space, hold_space_size + strlen(pattern_space) + 2);
-                                       if (hold_space_size) {
-                                               strcat(hold_space, "\n");
+                                       if (pattern_space) {
+                                               pattern_space_size = strlen(pattern_space);
+                                       }
+                                       hold_space = xrealloc(hold_space, hold_space_size + pattern_space_size);
+
+                                       if (hold_space_size == 2) {
+                                               strcpy(hold_space, "\n");
                                        } else {
-                                               hold_space[0] = '\n';
+                                               strcat(hold_space, "\n");
+                                       }
+                                       if (pattern_space) {
+                                               strcat(hold_space, pattern_space);
                                        }
-                                       strcat(hold_space, pattern_space); 
                                        break;
                                }
                                case 'x':{
@@ -1116,10 +1129,12 @@ extern int sed_main(int argc, char **argv)
 {
        int opt, status = EXIT_SUCCESS;
 
+#if 0 /* This doesnt seem to be working */
 #ifdef CONFIG_FEATURE_CLEAN_UP
        /* destroy command strings on exit */
        if (atexit(destroy_cmd_strs) == -1)
                bb_perror_msg_and_die("atexit");
+#endif
 #endif
 
        /* do normal option parsing */
@@ -1129,10 +1144,7 @@ extern int sed_main(int argc, char **argv)
                        be_quiet++;
                        break;
                case 'e':{
-                       char *str_cmd = strdup(optarg);
-
-                       add_cmd_str(str_cmd);
-                       free(str_cmd);
+                       add_cmd_str(optarg);
                        break;
                }
                case 'f':
@@ -1149,7 +1161,7 @@ extern int sed_main(int argc, char **argv)
                if (argv[optind] == NULL)
                        bb_show_usage();
                else
-                       add_cmd_str(strdup(argv[optind++]));
+                       add_cmd_str(argv[optind++]);
        }
 
        /* argv[(optind)..(argc-1)] should be names of file to process. If no
@@ -1176,5 +1188,8 @@ extern int sed_main(int argc, char **argv)
                }
        }
 
+#ifdef CONFIG_FEATURE_CLEAN_UP
+       destroy_cmd_strs();
+#endif 
        return status;
 }