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'; }