8966f1a20c6ffa94983b1fb3282f903b47e4c8f6
[akaros.git] / tools / sys-apps / bash / akaros-patches / 4.3.30 / 0002-echo.patch
1 diff -ur bash-4.3.30.dist/builtins/echo.def bash-4.3.30/builtins/echo.def
2 --- bash-4.3.30.dist/builtins/echo.def  2011-06-29 09:55:58.000000000 -0400
3 +++ bash-4.3.30/builtins/echo.def       2016-06-03 17:40:57.834915855 -0400
4 @@ -108,8 +108,9 @@
5  echo_builtin (list)
6       WORD_LIST *list;
7  {
8 -  int display_return, do_v9, i, len;
9 -  char *temp, *s;
10 +  int display_return, do_v9, i, j, len, malloc_len;
11 +  char *temp, *s, *m;
12 +  WORD_LIST *save_list;
13  
14    do_v9 = xpg_echo;
15    display_return = 1;
16 @@ -162,6 +163,30 @@
17    clearerr (stdout);   /* clear error before writing and testing success */
18  
19    terminate_immediately++;
20 +  malloc_len = 0;
21 +  m = NULL;
22 +  save_list = list;
23 +  while (list)
24 +    {
25 +      i = len = 0;
26 +      temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
27 +                  : list->word->word;
28 +      if (!temp)
29 +        continue;
30 +      malloc_len += do_v9 ? len : strlen(temp);
31 +      if (do_v9)
32 +       free (temp);
33 +      list = list->next;
34 +      if (list)
35 +        malloc_len++;
36 +    }
37 +  if (display_return)
38 +    malloc_len++;
39 +  m = malloc(malloc_len);
40 +  if (m == NULL)
41 +    fatal_error ("echo: could not allocate %lu bytes", (unsigned long)malloc_len);
42 +  list = save_list;
43 +  j = 0;
44    while (list)
45      {
46        i = len = 0;
47 @@ -169,19 +194,13 @@
48                    : list->word->word;
49        if (temp)
50         {
51 -         if (do_v9)
52 -           {
53 -             for (s = temp; len > 0; len--)
54 -               putchar (*s++);
55 -           }
56 -         else      
57 -           printf ("%s", temp);
58 -#if defined (SunOS5)
59 -         fflush (stdout);      /* Fix for bug in SunOS 5.5 printf(3) */
60 -#endif
61 +         if (!do_v9)
62 +              len = strlen(temp);
63 +          memmove(m + j, temp, len);
64 +          j += len;
65 +          if (do_v9)
66 +            free (temp);
67         }
68 -      if (do_v9 && temp)
69 -       free (temp);
70        list = list->next;
71        if (i)
72         {
73 @@ -189,11 +208,15 @@
74           break;
75         }
76        if (list)
77 -       putchar(' ');
78 +       m[j++] = ' ';
79      }
80 -
81    if (display_return)
82 -    putchar ('\n');
83 +    m[j++] = '\n';
84 +  write(STDOUT_FILENO, m, j);
85 +  free(m);
86 +#if defined (SunOS5)
87 +  fflush (stdout);     /* Fix for bug in SunOS 5.5 printf(3) */
88 +#endif
89  
90    terminate_immediately--;
91    return (sh_chkwrite (EXECUTION_SUCCESS));