1 /* print_command -- A way to make readable commands from a command tree. */
3 /* Copyright (C) 1989-2009 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
25 #if defined (HAVE_UNISTD_H)
27 # include <sys/types.h>
32 #if defined (PREFER_STDARG)
43 #include <y.tab.h> /* use <...> so we pick it up from the build directory */
47 #include "builtins/common.h"
50 extern int printf
__P((const char *, ...)); /* Yuck. Double yuck. */
53 extern int indirection_level
;
55 static int indentation
;
56 static int indentation_amount
= 4;
58 #if defined (PREFER_STDARG)
59 typedef void PFUNC
__P((const char *, ...));
61 static void cprintf
__P((const char *, ...)) __attribute__((__format__ (printf
, 1, 2)));
62 static void xprintf
__P((const char *, ...)) __attribute__((__format__ (printf
, 1, 2)));
64 #define PFUNC VFunction
65 static void cprintf ();
66 static void xprintf ();
69 static void reset_locals
__P((void));
70 static void newline
__P((char *));
71 static void indent
__P((int));
72 static void semicolon
__P((void));
73 static void the_printed_command_resize
__P((int));
75 static void make_command_string_internal
__P((COMMAND
*));
76 static void _print_word_list
__P((WORD_LIST
*, char *, PFUNC
*));
77 static void command_print_word_list
__P((WORD_LIST
*, char *));
78 static void print_case_clauses
__P((PATTERN_LIST
*));
79 static void print_redirection_list
__P((REDIRECT
*));
80 static void print_redirection
__P((REDIRECT
*));
81 static void print_heredoc_header
__P((REDIRECT
*));
82 static void print_heredoc_body
__P((REDIRECT
*));
83 static void print_heredocs
__P((REDIRECT
*));
84 static void print_deferred_heredocs
__P((const char *));
86 static void print_for_command
__P((FOR_COM
*));
87 #if defined (ARITH_FOR_COMMAND)
88 static void print_arith_for_command
__P((ARITH_FOR_COM
*));
90 #if defined (SELECT_COMMAND)
91 static void print_select_command
__P((SELECT_COM
*));
93 static void print_group_command
__P((GROUP_COM
*));
94 static void print_case_command
__P((CASE_COM
*));
95 static void print_while_command
__P((WHILE_COM
*));
96 static void print_until_command
__P((WHILE_COM
*));
97 static void print_until_or_while
__P((WHILE_COM
*, char *));
98 static void print_if_command
__P((IF_COM
*));
99 #if defined (COND_COMMAND)
100 static void print_cond_node
__P((COND_COM
*));
102 static void print_function_def
__P((FUNCTION_DEF
*));
104 #define PRINTED_COMMAND_INITIAL_SIZE 64
105 #define PRINTED_COMMAND_GROW_SIZE 128
107 char *the_printed_command
= (char *)NULL
;
108 int the_printed_command_size
= 0;
109 int command_string_index
= 0;
114 #define CHECK_XTRACE_FP xtrace_fp = (xtrace_fp ? xtrace_fp : stderr)
116 #define PRINT_DEFERRED_HEREDOCS(x) \
118 if (deferred_heredocs) \
119 print_deferred_heredocs (x); \
122 /* Non-zero means the stuff being printed is inside of a function def. */
123 static int inside_function_def
;
124 static int skip_this_indent
;
125 static int was_heredoc
;
126 static int printing_connection
;
127 static REDIRECT
*deferred_heredocs
;
129 /* The depth of the group commands that we are currently printing. This
130 includes the group command that is a function body. */
131 static int group_command_nesting
;
133 /* A buffer to indicate the indirection level (PS4) when set -x is enabled. */
134 static char indirection_string
[100];
136 /* Print COMMAND (a command tree) on standard output. */
138 print_command (command
)
141 command_string_index
= 0;
142 printf ("%s", make_command_string (command
));
145 /* Make a string which is the printed representation of the command
146 tree in COMMAND. We return this string. However, the string is
147 not consed, so you have to do that yourself if you want it to
150 make_command_string (command
)
153 command_string_index
= was_heredoc
= 0;
154 deferred_heredocs
= 0;
155 make_command_string_internal (command
);
156 return (the_printed_command
);
159 /* The internal function. This is the real workhorse. */
161 make_command_string_internal (command
)
170 if (skip_this_indent
)
173 indent (indentation
);
175 if (command
->flags
& CMD_TIME_PIPELINE
)
178 if (command
->flags
& CMD_TIME_POSIX
)
182 if (command
->flags
& CMD_INVERT_RETURN
)
185 switch (command
->type
)
188 print_for_command (command
->value
.For
);
191 #if defined (ARITH_FOR_COMMAND)
193 print_arith_for_command (command
->value
.ArithFor
);
197 #if defined (SELECT_COMMAND)
199 print_select_command (command
->value
.Select
);
204 print_case_command (command
->value
.Case
);
208 print_while_command (command
->value
.While
);
212 print_until_command (command
->value
.While
);
216 print_if_command (command
->value
.If
);
219 #if defined (DPAREN_ARITHMETIC)
221 print_arith_command (command
->value
.Arith
->exp
);
225 #if defined (COND_COMMAND)
227 print_cond_command (command
->value
.Cond
);
232 print_simple_command (command
->value
.Simple
);
238 printing_connection
++;
239 make_command_string_internal (command
->value
.Connection
->first
);
241 switch (command
->value
.Connection
->connector
)
246 char c
= command
->value
.Connection
->connector
;
252 print_deferred_heredocs (s
);
254 if (c
!= '&' || command
->value
.Connection
->second
)
263 print_deferred_heredocs (" && ");
264 if (command
->value
.Connection
->second
)
269 print_deferred_heredocs (" || ");
270 if (command
->value
.Connection
->second
)
275 if (deferred_heredocs
== 0)
277 if (was_heredoc
== 0)
283 print_deferred_heredocs (inside_function_def
? "" : ";");
285 if (inside_function_def
)
290 if (command
->value
.Connection
->second
)
296 cprintf (_("print_command: bad connector `%d'"),
297 command
->value
.Connection
->connector
);
301 make_command_string_internal (command
->value
.Connection
->second
);
302 if (deferred_heredocs
)
303 print_deferred_heredocs ("");
304 printing_connection
--;
307 case cm_function_def
:
308 print_function_def (command
->value
.Function_def
);
312 print_group_command (command
->value
.Group
);
318 make_command_string_internal (command
->value
.Subshell
->command
);
323 cprintf ("coproc %s ", command
->value
.Coproc
->name
);
325 make_command_string_internal (command
->value
.Coproc
->command
);
329 command_error ("print_command", CMDERR_BADTYPE
, command
->type
, 0);
334 if (command
->redirects
)
337 print_redirection_list (command
->redirects
);
343 _print_word_list (list
, separator
, pfunc
)
350 for (w
= list
; w
; w
= w
->next
)
351 (*pfunc
) ("%s%s", w
->word
->word
, w
->next
? separator
: "");
355 print_word_list (list
, separator
)
359 _print_word_list (list
, separator
, xprintf
);
367 if (fd
>= 0 && sh_validfd (fd
) == 0)
369 internal_error (_("xtrace_set: %d: invalid file descriptor"), fd
);
374 internal_error (_("xtrace_set: NULL file pointer"));
377 if (fd
>= 0 && fileno (fp
) != fd
)
378 internal_warning (_("xtrace fd (%d) != fileno xtrace fp (%d)"), fd
, fileno (fp
));
387 xtrace_set (-1, stderr
);
393 if (xtrace_fd
>= 0 && xtrace_fp
)
398 else if (xtrace_fd
>= 0)
413 /* Return a string denoting what our indirection level is. */
416 indirection_level_string ()
420 char ps4_firstc
[MB_LEN_MAX
+1];
421 int ps4_firstc_len
, ps4_len
;
423 indirection_string
[0] = '\0';
424 ps4
= get_string_value ("PS4");
426 if (ps4
== 0 || *ps4
== '\0')
427 return (indirection_string
);
429 change_flag ('x', FLAG_OFF
);
430 ps4
= decode_prompt_string (ps4
);
431 change_flag ('x', FLAG_ON
);
433 if (ps4
== 0 || *ps4
== '\0')
434 return (indirection_string
);
436 #if defined (HANDLE_MULTIBYTE)
437 ps4_len
= strnlen (ps4
, MB_CUR_MAX
);
438 ps4_firstc_len
= MBLEN (ps4
, ps4_len
);
439 if (ps4_firstc_len
== 1 || ps4_firstc_len
== 0 || MB_INVALIDCH (ps4_firstc_len
))
441 ps4_firstc
[0] = ps4
[0];
442 ps4_firstc
[ps4_firstc_len
= 1] = '\0';
445 memcpy (ps4_firstc
, ps4
, ps4_firstc_len
);
447 ps4_firstc
[0] = ps4
[0];
448 ps4_firstc
[ps4_firstc_len
= 1] = '\0';
451 for (i
= j
= 0; ps4_firstc
[0] && j
< indirection_level
&& i
< 99; i
+= ps4_firstc_len
, j
++)
453 if (ps4_firstc_len
== 1)
454 indirection_string
[i
] = ps4_firstc
[0];
456 memcpy (indirection_string
+i
, ps4_firstc
, ps4_firstc_len
);
459 for (j
= ps4_firstc_len
; *ps4
&& ps4
[j
] && i
< 99; i
++, j
++)
460 indirection_string
[i
] = ps4
[j
];
462 indirection_string
[i
] = '\0';
464 return (indirection_string
);
468 xtrace_print_assignment (name
, value
, assign_list
, xflags
)
470 int assign_list
, xflags
;
477 fprintf (xtrace_fp
, "%s", indirection_level_string ());
479 /* VALUE should not be NULL when this is called. */
480 if (*value
== '\0' || assign_list
)
482 else if (sh_contains_shell_metas (value
))
483 nval
= sh_single_quote (value
);
484 else if (ansic_shouldquote (value
))
485 nval
= ansic_quote (value
, 0, (int *)0);
490 fprintf (xtrace_fp
, "%s=(%s)\n", name
, nval
);
492 fprintf (xtrace_fp
, "%s=%s\n", name
, nval
);
500 /* A function to print the words of a simple command when set -x is on. */
502 xtrace_print_word_list (list
, xtflags
)
512 fprintf (xtrace_fp
, "%s", indirection_level_string ());
514 for (w
= list
; w
; w
= w
->next
)
517 if (t
== 0 || *t
== '\0')
518 fprintf (xtrace_fp
, "''%s", w
->next
? " " : "");
519 else if (sh_contains_shell_metas (t
))
521 x
= sh_single_quote (t
);
522 fprintf (xtrace_fp
, "%s%s", x
, w
->next
? " " : "");
525 else if (ansic_shouldquote (t
))
527 x
= ansic_quote (t
, 0, (int *)0);
528 fprintf (xtrace_fp
, "%s%s", x
, w
->next
? " " : "");
532 fprintf (xtrace_fp
, "%s%s", t
, w
->next
? " " : "");
534 fprintf (xtrace_fp
, "\n");
539 command_print_word_list (list
, separator
)
543 _print_word_list (list
, separator
, cprintf
);
547 print_for_command_head (for_command
)
548 FOR_COM
*for_command
;
550 cprintf ("for %s in ", for_command
->name
->word
);
551 command_print_word_list (for_command
->map_list
, " ");
555 xtrace_print_for_command_head (for_command
)
556 FOR_COM
*for_command
;
559 fprintf (xtrace_fp
, "%s", indirection_level_string ());
560 fprintf (xtrace_fp
, "for %s in ", for_command
->name
->word
);
561 xtrace_print_word_list (for_command
->map_list
, 0);
565 print_for_command (for_command
)
566 FOR_COM
*for_command
;
568 print_for_command_head (for_command
);
572 indentation
+= indentation_amount
;
573 make_command_string_internal (for_command
->action
);
574 PRINT_DEFERRED_HEREDOCS ("");
576 indentation
-= indentation_amount
;
581 #if defined (ARITH_FOR_COMMAND)
583 print_arith_for_command (arith_for_command
)
584 ARITH_FOR_COM
*arith_for_command
;
587 command_print_word_list (arith_for_command
->init
, " ");
589 command_print_word_list (arith_for_command
->test
, " ");
591 command_print_word_list (arith_for_command
->step
, " ");
594 indentation
+= indentation_amount
;
595 make_command_string_internal (arith_for_command
->action
);
597 indentation
-= indentation_amount
;
600 #endif /* ARITH_FOR_COMMAND */
602 #if defined (SELECT_COMMAND)
604 print_select_command_head (select_command
)
605 SELECT_COM
*select_command
;
607 cprintf ("select %s in ", select_command
->name
->word
);
608 command_print_word_list (select_command
->map_list
, " ");
612 xtrace_print_select_command_head (select_command
)
613 SELECT_COM
*select_command
;
616 fprintf (xtrace_fp
, "%s", indirection_level_string ());
617 fprintf (xtrace_fp
, "select %s in ", select_command
->name
->word
);
618 xtrace_print_word_list (select_command
->map_list
, 0);
622 print_select_command (select_command
)
623 SELECT_COM
*select_command
;
625 print_select_command_head (select_command
);
629 indentation
+= indentation_amount
;
630 make_command_string_internal (select_command
->action
);
632 indentation
-= indentation_amount
;
635 #endif /* SELECT_COMMAND */
638 print_group_command (group_command
)
639 GROUP_COM
*group_command
;
641 group_command_nesting
++;
644 if (inside_function_def
== 0)
648 /* This is a group command { ... } inside of a function
649 definition, and should be printed as a multiline group
650 command, using the current indentation. */
652 indentation
+= indentation_amount
;
655 make_command_string_internal (group_command
->command
);
657 if (inside_function_def
)
660 indentation
-= indentation_amount
;
661 indent (indentation
);
671 group_command_nesting
--;
675 print_case_command_head (case_command
)
676 CASE_COM
*case_command
;
678 cprintf ("case %s in ", case_command
->word
->word
);
682 xtrace_print_case_command_head (case_command
)
683 CASE_COM
*case_command
;
686 fprintf (xtrace_fp
, "%s", indirection_level_string ());
687 fprintf (xtrace_fp
, "case %s in\n", case_command
->word
->word
);
691 print_case_command (case_command
)
692 CASE_COM
*case_command
;
694 print_case_command_head (case_command
);
696 if (case_command
->clauses
)
697 print_case_clauses (case_command
->clauses
);
702 print_case_clauses (clauses
)
703 PATTERN_LIST
*clauses
;
705 indentation
+= indentation_amount
;
709 command_print_word_list (clauses
->patterns
, " | ");
711 indentation
+= indentation_amount
;
712 make_command_string_internal (clauses
->action
);
713 indentation
-= indentation_amount
;
714 if (clauses
->flags
& CASEPAT_FALLTHROUGH
)
716 else if (clauses
->flags
& CASEPAT_TESTNEXT
)
720 clauses
= clauses
->next
;
722 indentation
-= indentation_amount
;
726 print_while_command (while_command
)
727 WHILE_COM
*while_command
;
729 print_until_or_while (while_command
, "while");
733 print_until_command (while_command
)
734 WHILE_COM
*while_command
;
736 print_until_or_while (while_command
, "until");
740 print_until_or_while (while_command
, which
)
741 WHILE_COM
*while_command
;
744 cprintf ("%s ", which
);
746 make_command_string_internal (while_command
->test
);
748 cprintf (" do\n"); /* was newline ("do\n"); */
749 indentation
+= indentation_amount
;
750 make_command_string_internal (while_command
->action
);
751 indentation
-= indentation_amount
;
757 print_if_command (if_command
)
762 make_command_string_internal (if_command
->test
);
765 indentation
+= indentation_amount
;
766 make_command_string_internal (if_command
->true_case
);
767 indentation
-= indentation_amount
;
769 if (if_command
->false_case
)
773 indentation
+= indentation_amount
;
774 make_command_string_internal (if_command
->false_case
);
775 indentation
-= indentation_amount
;
781 #if defined (DPAREN_ARITHMETIC)
783 print_arith_command (arith_cmd_list
)
784 WORD_LIST
*arith_cmd_list
;
787 command_print_word_list (arith_cmd_list
, " ");
792 #if defined (COND_COMMAND)
794 print_cond_node (cond
)
797 if (cond
->flags
& CMD_INVERT_RETURN
)
800 if (cond
->type
== COND_EXPR
)
803 print_cond_node (cond
->left
);
806 else if (cond
->type
== COND_AND
)
808 print_cond_node (cond
->left
);
810 print_cond_node (cond
->right
);
812 else if (cond
->type
== COND_OR
)
814 print_cond_node (cond
->left
);
816 print_cond_node (cond
->right
);
818 else if (cond
->type
== COND_UNARY
)
820 cprintf ("%s", cond
->op
->word
);
822 print_cond_node (cond
->left
);
824 else if (cond
->type
== COND_BINARY
)
826 print_cond_node (cond
->left
);
828 cprintf ("%s", cond
->op
->word
);
830 print_cond_node (cond
->right
);
832 else if (cond
->type
== COND_TERM
)
834 cprintf ("%s", cond
->op
->word
); /* need to add quoting here */
839 print_cond_command (cond
)
843 print_cond_node (cond
);
849 debug_print_cond_command (cond
)
852 fprintf (stderr
, "DEBUG: ");
853 command_string_index
= 0;
854 print_cond_command (cond
);
855 fprintf (stderr
, "%s\n", the_printed_command
);
860 xtrace_print_cond_term (type
, invert
, op
, arg1
, arg2
)
866 command_string_index
= 0;
867 fprintf (xtrace_fp
, "%s", indirection_level_string ());
868 fprintf (xtrace_fp
, "[[ ");
870 fprintf (xtrace_fp
, "! ");
872 if (type
== COND_UNARY
)
874 fprintf (xtrace_fp
, "%s ", op
->word
);
875 fprintf (xtrace_fp
, "%s", (arg1
&& *arg1
) ? arg1
: "''");
877 else if (type
== COND_BINARY
)
879 fprintf (xtrace_fp
, "%s", (arg1
&& *arg1
) ? arg1
: "''");
880 fprintf (xtrace_fp
, " %s ", op
->word
);
881 fprintf (xtrace_fp
, "%s", (arg2
&& *arg2
) ? arg2
: "''");
884 fprintf (xtrace_fp
, " ]]\n");
888 #endif /* COND_COMMAND */
890 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
891 /* A function to print the words of an arithmetic command when set -x is on. */
893 xtrace_print_arith_cmd (list
)
899 fprintf (xtrace_fp
, "%s", indirection_level_string ());
900 fprintf (xtrace_fp
, "(( ");
901 for (w
= list
; w
; w
= w
->next
)
902 fprintf (xtrace_fp
, "%s%s", w
->word
->word
, w
->next
? " " : "");
903 fprintf (xtrace_fp
, " ))\n");
910 print_simple_command (simple_command
)
911 SIMPLE_COM
*simple_command
;
913 command_print_word_list (simple_command
->words
, " ");
915 if (simple_command
->redirects
)
918 print_redirection_list (simple_command
->redirects
);
923 print_heredocs (heredocs
)
929 for (hdtail
= heredocs
; hdtail
; hdtail
= hdtail
->next
)
931 print_redirection (hdtail
);
937 /* Print heredocs that are attached to the command before the connector
938 represented by CSTRING. The parsing semantics require us to print the
939 here-doc delimiters, then the connector (CSTRING), then the here-doc
940 bodies. We don't print the connector if it's a `;', but we use it to
941 note not to print an extra space after the last heredoc body and
944 print_deferred_heredocs (cstring
)
949 for (hdtail
= deferred_heredocs
; hdtail
; hdtail
= hdtail
->next
)
952 print_heredoc_header (hdtail
);
954 if (cstring
[0] != ';' || cstring
[1])
955 cprintf ("%s", cstring
);
956 if (deferred_heredocs
)
958 for (hdtail
= deferred_heredocs
; hdtail
; hdtail
= hdtail
->next
)
960 print_heredoc_body (hdtail
);
963 if (deferred_heredocs
)
965 if (cstring
&& cstring
[0] && (cstring
[0] != ';' || cstring
[1]))
966 cprintf (" "); /* make sure there's at least one space */
967 dispose_redirects (deferred_heredocs
);
970 deferred_heredocs
= (REDIRECT
*)NULL
;
974 print_redirection_list (redirects
)
977 REDIRECT
*heredocs
, *hdtail
, *newredir
;
979 heredocs
= (REDIRECT
*)NULL
;
985 /* Defer printing the here documents until we've printed the
986 rest of the redirections. */
987 if (redirects
->instruction
== r_reading_until
|| redirects
->instruction
== r_deblank_reading_until
)
989 newredir
= copy_redirect (redirects
);
990 newredir
->next
= (REDIRECT
*)NULL
;
993 hdtail
->next
= newredir
;
997 hdtail
= heredocs
= newredir
;
999 else if (redirects
->instruction
== r_duplicating_output_word
&& redirects
->redirector
.dest
== 1)
1001 /* Temporarily translate it as the execution code does. */
1002 redirects
->instruction
= r_err_and_out
;
1003 print_redirection (redirects
);
1004 redirects
->instruction
= r_duplicating_output_word
;
1007 print_redirection (redirects
);
1009 redirects
= redirects
->next
;
1014 /* Now that we've printed all the other redirections (on one line),
1015 print the here documents. */
1016 if (heredocs
&& printing_connection
)
1017 deferred_heredocs
= heredocs
;
1020 print_heredocs (heredocs
);
1021 dispose_redirects (heredocs
);
1026 print_heredoc_header (redirect
)
1032 kill_leading
= redirect
->instruction
== r_deblank_reading_until
;
1034 /* Here doc header */
1035 if (redirect
->rflags
& REDIR_VARASSIGN
)
1036 cprintf ("{%s}", redirect
->redirector
.filename
->word
);
1037 else if (redirect
->redirector
.dest
!= 0)
1038 cprintf ("%d", redirect
->redirector
.dest
);
1040 /* If the here document delimiter is quoted, single-quote it. */
1041 if (redirect
->redirectee
.filename
->flags
& W_QUOTED
)
1043 x
= sh_single_quote (redirect
->here_doc_eof
);
1044 cprintf ("<<%s%s", kill_leading
? "-" : "", x
);
1048 cprintf ("<<%s%s", kill_leading
? "-" : "", redirect
->here_doc_eof
);
1052 print_heredoc_body (redirect
)
1056 cprintf ("%s%s", redirect
->redirectee
.filename
->word
, redirect
->here_doc_eof
);
1060 print_redirection (redirect
)
1063 int kill_leading
, redirector
, redir_fd
;
1064 WORD_DESC
*redirectee
, *redir_word
;
1067 redirectee
= redirect
->redirectee
.filename
;
1068 redir_fd
= redirect
->redirectee
.dest
;
1070 redir_word
= redirect
->redirector
.filename
;
1071 redirector
= redirect
->redirector
.dest
;
1073 switch (redirect
->instruction
)
1075 case r_input_direction
:
1076 if (redirect
->rflags
& REDIR_VARASSIGN
)
1077 cprintf ("{%s}", redir_word
->word
);
1078 else if (redirector
!= 0)
1079 cprintf ("%d", redirector
);
1080 cprintf ("< %s", redirectee
->word
);
1083 case r_output_direction
:
1084 if (redirect
->rflags
& REDIR_VARASSIGN
)
1085 cprintf ("{%s}", redir_word
->word
);
1086 else if (redirector
!= 1)
1087 cprintf ("%d", redirector
);
1088 cprintf ("> %s", redirectee
->word
);
1091 case r_inputa_direction
: /* Redirection created by the shell. */
1095 case r_output_force
:
1096 if (redirect
->rflags
& REDIR_VARASSIGN
)
1097 cprintf ("{%s}", redir_word
->word
);
1098 else if (redirector
!= 1)
1099 cprintf ("%d", redirector
);
1100 cprintf (">|%s", redirectee
->word
);
1103 case r_appending_to
:
1104 if (redirect
->rflags
& REDIR_VARASSIGN
)
1105 cprintf ("{%s}", redir_word
->word
);
1106 else if (redirector
!= 1)
1107 cprintf ("%d", redirector
);
1108 cprintf (">> %s", redirectee
->word
);
1111 case r_input_output
:
1112 if (redirect
->rflags
& REDIR_VARASSIGN
)
1113 cprintf ("{%s}", redir_word
->word
);
1114 else if (redirector
!= 1)
1115 cprintf ("%d", redirector
);
1116 cprintf ("<> %s", redirectee
->word
);
1119 case r_deblank_reading_until
:
1120 case r_reading_until
:
1121 print_heredoc_header (redirect
);
1123 print_heredoc_body (redirect
);
1126 case r_reading_string
:
1127 if (redirect
->rflags
& REDIR_VARASSIGN
)
1128 cprintf ("{%s}", redir_word
->word
);
1129 else if (redirector
!= 0)
1130 cprintf ("%d", redirector
);
1131 if (ansic_shouldquote (redirect
->redirectee
.filename
->word
))
1134 x
= ansic_quote (redirect
->redirectee
.filename
->word
, 0, (int *)0);
1135 cprintf ("<<< %s", x
);
1139 cprintf ("<<< %s", redirect
->redirectee
.filename
->word
);
1142 case r_duplicating_input
:
1143 if (redirect
->rflags
& REDIR_VARASSIGN
)
1144 cprintf ("{%s}<&%d", redir_word
->word
, redir_fd
);
1146 cprintf ("%d<&%d", redirector
, redir_fd
);
1149 case r_duplicating_output
:
1150 if (redirect
->rflags
& REDIR_VARASSIGN
)
1151 cprintf ("{%s}>&%d", redir_word
->word
, redir_fd
);
1153 cprintf ("%d>&%d", redirector
, redir_fd
);
1156 case r_duplicating_input_word
:
1157 if (redirect
->rflags
& REDIR_VARASSIGN
)
1158 cprintf ("{%s}<&%s", redir_word
->word
, redirectee
->word
);
1160 cprintf ("%d<&%s", redirector
, redirectee
->word
);
1163 case r_duplicating_output_word
:
1164 if (redirect
->rflags
& REDIR_VARASSIGN
)
1165 cprintf ("{%s}>&%s", redir_word
->word
, redirectee
->word
);
1167 cprintf ("%d>&%s", redirector
, redirectee
->word
);
1171 if (redirect
->rflags
& REDIR_VARASSIGN
)
1172 cprintf ("{%s}<&%d-", redir_word
->word
, redir_fd
);
1174 cprintf ("%d<&%d-", redirector
, redir_fd
);
1178 if (redirect
->rflags
& REDIR_VARASSIGN
)
1179 cprintf ("{%s}>&%d-", redir_word
->word
, redir_fd
);
1181 cprintf ("%d>&%d-", redirector
, redir_fd
);
1184 case r_move_input_word
:
1185 if (redirect
->rflags
& REDIR_VARASSIGN
)
1186 cprintf ("{%s}<&%s-", redir_word
->word
, redirectee
->word
);
1188 cprintf ("%d<&%s-", redirector
, redirectee
->word
);
1191 case r_move_output_word
:
1192 if (redirect
->rflags
& REDIR_VARASSIGN
)
1193 cprintf ("{%s}>&%s-", redir_word
->word
, redirectee
->word
);
1195 cprintf ("%d>&%s-", redirector
, redirectee
->word
);
1199 if (redirect
->rflags
& REDIR_VARASSIGN
)
1200 cprintf ("{%s}>&-", redir_word
->word
);
1202 cprintf ("%d>&-", redirector
);
1206 cprintf ("&>%s", redirectee
->word
);
1209 case r_append_err_and_out
:
1210 cprintf ("&>>%s", redirectee
->word
);
1218 inside_function_def
= 0;
1220 printing_connection
= 0;
1221 deferred_heredocs
= 0;
1225 print_function_def (func
)
1229 REDIRECT
*func_redirects
;
1231 func_redirects
= NULL
;
1232 cprintf ("function %s () \n", func
->name
->word
);
1233 add_unwind_protect (reset_locals
, 0);
1235 indent (indentation
);
1238 inside_function_def
++;
1239 indentation
+= indentation_amount
;
1241 cmdcopy
= copy_command (func
->command
);
1242 if (cmdcopy
->type
== cm_group
)
1244 func_redirects
= cmdcopy
->redirects
;
1245 cmdcopy
->redirects
= (REDIRECT
*)NULL
;
1247 make_command_string_internal (cmdcopy
->type
== cm_group
1248 ? cmdcopy
->value
.Group
->command
1251 remove_unwind_protect ();
1252 indentation
-= indentation_amount
;
1253 inside_function_def
--;
1258 print_redirection_list (func_redirects
);
1259 cmdcopy
->redirects
= func_redirects
;
1264 dispose_command (cmdcopy
);
1267 /* Return the string representation of the named function.
1268 NAME is the name of the function.
1269 COMMAND is the function body. It should be a GROUP_COM.
1270 flags&FUNC_MULTILINE is non-zero to pretty-print, or zero for all on one line.
1271 flags&FUNC_EXTERNAL means convert from internal to external form
1274 named_function_string (name
, command
, flags
)
1280 int old_indent
, old_amount
;
1282 REDIRECT
*func_redirects
;
1284 old_indent
= indentation
;
1285 old_amount
= indentation_amount
;
1286 command_string_index
= was_heredoc
= 0;
1287 deferred_heredocs
= 0;
1290 cprintf ("%s ", name
);
1294 if ((flags
& FUNC_MULTILINE
) == 0)
1297 indentation_amount
= 0;
1302 indentation
+= indentation_amount
;
1305 inside_function_def
++;
1307 cprintf ((flags
& FUNC_MULTILINE
) ? "{ \n" : "{ ");
1309 cmdcopy
= copy_command (command
);
1310 /* Take any redirections specified in the function definition (which should
1311 apply to the function as a whole) and save them for printing later. */
1312 func_redirects
= (REDIRECT
*)NULL
;
1313 if (cmdcopy
->type
== cm_group
)
1315 func_redirects
= cmdcopy
->redirects
;
1316 cmdcopy
->redirects
= (REDIRECT
*)NULL
;
1318 make_command_string_internal (cmdcopy
->type
== cm_group
1319 ? cmdcopy
->value
.Group
->command
1322 indentation
= old_indent
;
1323 indentation_amount
= old_amount
;
1324 inside_function_def
--;
1329 print_redirection_list (func_redirects
);
1330 cmdcopy
->redirects
= func_redirects
;
1335 result
= the_printed_command
;
1337 if ((flags
& FUNC_MULTILINE
) == 0)
1341 for (i
= 0; result
[i
]; i
++)
1342 if (result
[i
] == '\n')
1344 strcpy (result
+ i
, result
+ i
+ 1);
1348 if (result
[2] == '\n') /* XXX -- experimental */
1349 strcpy (result
+ 2, result
+ 3);
1353 dispose_command (cmdcopy
);
1355 if (flags
& FUNC_EXTERNAL
)
1356 result
= remove_quoted_escapes (result
);
1366 indent (indentation
);
1367 if (string
&& *string
)
1368 cprintf ("%s", string
);
1371 static char *indentation_string
;
1372 static int indentation_size
;
1380 RESIZE_MALLOCED_BUFFER (indentation_string
, 0, amount
, indentation_size
, 16);
1382 for (i
= 0; amount
> 0; amount
--)
1383 indentation_string
[i
++] = ' ';
1384 indentation_string
[i
] = '\0';
1385 cprintf (indentation_string
);
1391 if (command_string_index
> 0 &&
1392 (the_printed_command
[command_string_index
- 1] == '&' ||
1393 the_printed_command
[command_string_index
- 1] == '\n'))
1398 /* How to make the string. */
1400 #if defined (PREFER_STDARG)
1401 cprintf (const char *control
, ...)
1403 cprintf (control
, va_alist
)
1404 const char *control
;
1408 register const char *s
;
1409 char char_arg
[2], *argp
, intbuf
[INT_STRLEN_BOUND (int) + 1];
1410 int digit_arg
, arg_len
, c
;
1413 SH_VA_START (args
, control
);
1415 arg_len
= strlen (control
);
1416 the_printed_command_resize (arg_len
+ 1);
1423 argp
= (char *)NULL
;
1424 if (c
!= '%' || !*s
)
1442 argp
= va_arg (args
, char *);
1443 arg_len
= strlen (argp
);
1447 /* Represent an out-of-range file descriptor with an out-of-range
1448 integer value. We can do this because the only use of `%d' in
1449 the calls to cprintf is to output a file descriptor number for
1451 digit_arg
= va_arg (args
, int);
1454 sprintf (intbuf
, "%u", (unsigned)-1);
1458 argp
= inttostr (digit_arg
, intbuf
, sizeof (intbuf
));
1459 arg_len
= strlen (argp
);
1463 char_arg
[0] = va_arg (args
, int);
1469 programming_error (_("cprintf: `%c': invalid format character"), c
);
1474 if (argp
&& arg_len
)
1476 the_printed_command_resize (arg_len
+ 1);
1477 FASTCOPY (argp
, the_printed_command
+ command_string_index
, arg_len
);
1478 command_string_index
+= arg_len
;
1482 the_printed_command
[command_string_index
] = '\0';
1485 /* Ensure that there is enough space to stuff LENGTH characters into
1486 THE_PRINTED_COMMAND. */
1488 the_printed_command_resize (length
)
1491 if (the_printed_command
== 0)
1493 the_printed_command_size
= (length
+ PRINTED_COMMAND_INITIAL_SIZE
- 1) & ~(PRINTED_COMMAND_INITIAL_SIZE
- 1);
1494 the_printed_command
= (char *)xmalloc (the_printed_command_size
);
1495 command_string_index
= 0;
1497 else if ((command_string_index
+ length
) >= the_printed_command_size
)
1500 new = command_string_index
+ length
+ 1;
1502 /* Round up to the next multiple of PRINTED_COMMAND_GROW_SIZE. */
1503 new = (new + PRINTED_COMMAND_GROW_SIZE
- 1) & ~(PRINTED_COMMAND_GROW_SIZE
- 1);
1504 the_printed_command_size
= new;
1506 the_printed_command
= (char *)xrealloc (the_printed_command
, the_printed_command_size
);
1510 #if defined (HAVE_VPRINTF)
1511 /* ``If vprintf is available, you may assume that vfprintf and vsprintf are
1512 also available.'' */
1515 #if defined (PREFER_STDARG)
1516 xprintf (const char *format
, ...)
1518 xprintf (format
, va_alist
)
1525 SH_VA_START (args
, format
);
1527 vfprintf (stdout
, format
, args
);
1534 xprintf (format
, arg1
, arg2
, arg3
, arg4
, arg5
)
1537 printf (format
, arg1
, arg2
, arg3
, arg4
, arg5
);
1540 #endif /* !HAVE_VPRINTF */