blob: d7c72cd31904e70109412d65aeab692532bde25d [file] [log] [blame]
diff -ur bash-4.3.30.dist/builtins/echo.def bash-4.3.30/builtins/echo.def
--- bash-4.3.30.dist/builtins/echo.def 2011-06-29 09:55:58.000000000 -0400
+++ bash-4.3.30/builtins/echo.def 2016-06-03 17:40:57.834915855 -0400
@@ -108,8 +108,10 @@
echo_builtin (list)
WORD_LIST *list;
{
- int display_return, do_v9, i, len;
- char *temp, *s;
+ int display_return, do_v9, i, j, len, malloc_len;
+ char *temp, *s, *m;
+ WORD_LIST *save_list;
+ ssize_t ret;
do_v9 = xpg_echo;
display_return = 1;
@@ -162,6 +164,30 @@
clearerr (stdout); /* clear error before writing and testing success */
terminate_immediately++;
+ malloc_len = 0;
+ m = NULL;
+ save_list = list;
+ while (list)
+ {
+ i = len = 0;
+ temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
+ : list->word->word;
+ if (!temp)
+ continue;
+ malloc_len += do_v9 ? len : strlen(temp);
+ if (do_v9)
+ free (temp);
+ list = list->next;
+ if (list)
+ malloc_len++;
+ }
+ if (display_return)
+ malloc_len++;
+ m = malloc(malloc_len);
+ if (m == NULL)
+ fatal_error ("echo: could not allocate %lu bytes", (unsigned long)malloc_len);
+ list = save_list;
+ j = 0;
while (list)
{
i = len = 0;
@@ -169,19 +195,13 @@
: list->word->word;
if (temp)
{
- if (do_v9)
- {
- for (s = temp; len > 0; len--)
- putchar (*s++);
- }
- else
- printf ("%s", temp);
-#if defined (SunOS5)
- fflush (stdout); /* Fix for bug in SunOS 5.5 printf(3) */
-#endif
+ if (!do_v9)
+ len = strlen(temp);
+ memmove(m + j, temp, len);
+ j += len;
+ if (do_v9)
+ free (temp);
}
- if (do_v9 && temp)
- free (temp);
list = list->next;
if (i)
{
@@ -189,11 +209,17 @@
break;
}
if (list)
- putchar(' ');
+ m[j++] = ' ';
}
-
if (display_return)
- putchar ('\n');
+ m[j++] = '\n';
+ ret = write(STDOUT_FILENO, m, j);
+ if (ret < j)
+ sh_wrerror();
+ free(m);
+#if defined (SunOS5)
+ fflush (stdout); /* Fix for bug in SunOS 5.5 printf(3) */
+#endif
terminate_immediately--;
return (sh_chkwrite (EXECUTION_SUCCESS));