| diff -ur a/tclreadline.c b/tclreadline.c |
| --- a/tclreadline.c 2000-09-20 19:44:34.000000000 +0200 |
| +++ b/tclreadline.c 2013-11-18 10:35:13.889610060 +0100 |
| @@ -343,7 +343,9 @@ |
| return TCL_ERROR; |
| } else if (3 == objc) { |
| - if (tclrl_custom_completer) |
| + if (tclrl_custom_completer) { |
| - FREE(tclrl_custom_completer); |
| + free(tclrl_custom_completer); |
| + tclrl_custom_completer = NULL; |
| + } |
| if (!blank_line(Tcl_GetStringFromObj(objv[2], 0))) |
| tclrl_custom_completer = |
| stripwhite(strdup(Tcl_GetStringFromObj(objv[2], 0))); |
| @@ -378,7 +380,9 @@ |
| return TCL_ERROR; |
| } else if (3 == objc) { |
| - if (tclrl_eof_string) |
| + if (tclrl_eof_string) { |
| - FREE(tclrl_eof_string); |
| + free(tclrl_eof_string); |
| + tclrl_eof_string = NULL; |
| + } |
| if (!blank_line(Tcl_GetStringFromObj(objv[2], 0))) |
| tclrl_eof_string = |
| stripwhite(strdup(Tcl_GetStringFromObj(objv[2], 0))); |
| @@ -506,10 +510,16 @@ |
| if (status >= 1) { |
| /* TODO: make this a valid tcl output */ |
| printf("%s\n", expansion); |
| + free(ptr); |
| + free(expansion); |
| + return; |
| } else if (-1 == status) { |
| Tcl_AppendResult |
| (tclrl_interp, "error in history expansion\n", (char*) NULL); |
| TclReadlineTerminate(TCL_ERROR); |
| + free(ptr); |
| + free(expansion); |
| + return; |
| } |
| /** |
| * TODO: status == 2 ... |
| @@ -544,8 +554,8 @@ |
| * tell the calling routines to terminate. |
| */ |
| TclReadlineTerminate(LINE_COMPLETE); |
| - FREE(ptr); |
| - FREE(expansion); |
| + free(ptr); |
| + free(expansion); |
| } |
| } |
| |
| @@ -673,7 +683,7 @@ |
| strcpy(rl_line_buffer, expansion); |
| rl_end = strlen(expansion); |
| rl_point += strlen(expansion) - oldlen; |
| - FREE(expansion); |
| + free(expansion); |
| /* |
| * TODO: |
| * because we return 0 == matches, |
| @@ -682,7 +690,8 @@ |
| */ |
| return matches; |
| } |
| - FREE(expansion); |
| + free(expansion); |
| + expansion = NULL; |
| } |
| |
| if (tclrl_custom_completer) { |
| @@ -699,15 +710,19 @@ |
| state = Tcl_VarEval(tclrl_interp, tclrl_custom_completer, |
| " \"", quoted_text, "\" ", start_s, " ", end_s, |
| " \"", quoted_rl_line_buffer, "\"", (char*) NULL); |
| - FREE(quoted_text); |
| - FREE(quoted_rl_line_buffer); |
| if (TCL_OK != state) { |
| Tcl_AppendResult (tclrl_interp, " `", tclrl_custom_completer, |
| " \"", quoted_text, "\" ", start_s, " ", end_s, |
| " \"", quoted_rl_line_buffer, "\"' failed.", (char*) NULL); |
| TclReadlineTerminate(state); |
| + free(quoted_text); |
| + free(quoted_rl_line_buffer); |
| return matches; |
| } |
| + free(quoted_text); |
| + quoted_text = NULL; |
| + free(quoted_rl_line_buffer); |
| + quoted_rl_line_buffer = NULL; |
| obj = Tcl_GetObjResult(tclrl_interp); |
| status = Tcl_ListObjGetElements(tclrl_interp, obj, &objc, &objv); |
| if (TCL_OK != status) |
| @@ -715,12 +732,12 @@ |
| |
| if (objc) { |
| int i, length; |
| - matches = (char**) MALLOC(sizeof(char*) * (objc + 1)); |
| + matches = (char**) malloc(sizeof(char*) * (objc + 1)); |
| for (i = 0; i < objc; i++) { |
| matches[i] = strdup(Tcl_GetStringFromObj(objv[i], &length)); |
| if (1 == objc && !strlen(matches[i])) { |
| - FREE(matches[i]); |
| + free(matches[i]); |
| - FREE(matches); |
| + free(matches); |
| Tcl_ResetResult(tclrl_interp); /* clear result space */ |
| return (char**) NULL; |
| } |
| @@ -735,7 +752,7 @@ |
| */ |
| if (2 == objc && !strlen(matches[1])) { |
| i--; |
| - FREE(matches[1]); |
| + free(matches[1]); |
| rl_completion_append_character = '\0'; |
| } |
| |