1 /* make_cmd.c -- Functions for making instances of the various
4 /* Copyright (C) 1989 Free Software Foundation, Inc.
6 This file is part of GNU Bash, the Bourne Again SHell.
8 Bash is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 1, or (at your option) any later
13 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License along
19 with Bash; see the file COPYING. If not, write to the Free Software
20 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
25 #include "bashtypes.h"
29 #if defined (HAVE_UNISTD_H)
38 #include "variables.h"
43 #if defined (JOB_CONTROL)
47 extern int line_number, current_command_line_count;
48 extern int disallow_filename_globbing;
51 make_bare_word (string)
56 temp = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
58 temp->word = savestring (string);
61 temp->word = xmalloc (1);
70 make_word_flags (w, string)
76 for (s = string; *s; s++)
80 w->flags |= W_HASDOLLAR;
83 break; /* continue the loop */
99 temp = make_bare_word (string);
100 return (make_word_flags (temp, string));
103 #ifdef INCLUDE_UNUSED
105 make_word_from_token (token)
110 tokenizer[0] = token;
113 return (make_word (tokenizer));
118 make_word_list (word, link)
124 temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
131 add_string_to_list (string, list)
137 temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
138 temp->word = make_word (string);
144 make_command (type, pointer)
145 enum command_type type;
150 temp = (COMMAND *)xmalloc (sizeof (COMMAND));
152 temp->value.Simple = pointer;
153 temp->value.Simple->flags = temp->flags = 0;
154 temp->redirects = (REDIRECT *)NULL;
159 command_connect (com1, com2, connector)
160 COMMAND *com1, *com2;
165 temp = (CONNECTION *)xmalloc (sizeof (CONNECTION));
166 temp->connector = connector;
169 return (make_command (cm_connection, (SIMPLE_COM *)temp));
173 make_for_or_select (type, name, map_list, action)
174 enum command_type type;
181 temp = (FOR_COM *)xmalloc (sizeof (FOR_COM));
184 temp->map_list = map_list;
185 temp->action = action;
186 return (make_command (type, (SIMPLE_COM *)temp));
190 make_for_command (name, map_list, action)
195 return (make_for_or_select (cm_for, name, map_list, action));
199 make_select_command (name, map_list, action)
204 #if defined (SELECT_COMMAND)
205 return (make_for_or_select (cm_select, name, map_list, action));
210 make_group_command (command)
215 temp = (GROUP_COM *)xmalloc (sizeof (GROUP_COM));
216 temp->command = command;
217 return (make_command (cm_group, (SIMPLE_COM *)temp));
221 make_case_command (word, clauses)
223 PATTERN_LIST *clauses;
227 temp = (CASE_COM *)xmalloc (sizeof (CASE_COM));
230 temp->clauses = REVERSE_LIST (clauses, PATTERN_LIST *);
231 return (make_command (cm_case, (SIMPLE_COM *)temp));
235 make_pattern_list (patterns, action)
241 temp = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST));
242 temp->patterns = REVERSE_LIST (patterns, WORD_LIST *);
243 temp->action = action;
249 make_if_command (test, true_case, false_case)
250 COMMAND *test, *true_case, *false_case;
254 temp = (IF_COM *)xmalloc (sizeof (IF_COM));
257 temp->true_case = true_case;
258 temp->false_case = false_case;
259 return (make_command (cm_if, (SIMPLE_COM *)temp));
263 make_until_or_while (which, test, action)
264 enum command_type which;
265 COMMAND *test, *action;
269 temp = (WHILE_COM *)xmalloc (sizeof (WHILE_COM));
272 temp->action = action;
273 return (make_command (which, (SIMPLE_COM *)temp));
277 make_while_command (test, action)
278 COMMAND *test, *action;
280 return (make_until_or_while (cm_while, test, action));
284 make_until_command (test, action)
285 COMMAND *test, *action;
287 return (make_until_or_while (cm_until, test, action));
291 make_bare_simple_command ()
296 command = (COMMAND *)xmalloc (sizeof (COMMAND));
297 command->value.Simple = temp = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
300 temp->line = line_number;
301 temp->words = (WORD_LIST *)NULL;
302 temp->redirects = (REDIRECT *)NULL;
304 command->type = cm_simple;
305 command->redirects = (REDIRECT *)NULL;
311 /* Return a command which is the connection of the word or redirection
312 in ELEMENT, and the command * or NULL in COMMAND. */
314 make_simple_command (element, command)
318 /* If we are starting from scratch, then make the initial command
319 structure. Also note that we have to fill in all the slots, since
320 malloc doesn't return zeroed space. */
322 command = make_bare_simple_command ();
326 WORD_LIST *tw = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
327 tw->word = element.word;
328 tw->next = command->value.Simple->words;
329 command->value.Simple->words = tw;
333 REDIRECT *r = element.redirect;
334 /* Due to the way <> is implemented, there may be more than a single
335 redirection in element.redirect. We just follow the chain as far
336 as it goes, and hook onto the end. */
339 r->next = command->value.Simple->redirects;
340 command->value.Simple->redirects = element.redirect;
345 /* Because we are Bourne compatible, we read the input for this
346 << or <<- redirection now, from wherever input is coming from.
347 We store the input read into a WORD_DESC. Replace the text of
348 the redirectee.word with the new input text. If <<- is on,
349 then remove leading TABS from each line. */
351 make_here_document (temp)
354 int kill_leading, redir_len;
355 char *redir_word, *document, *full_line;
356 int document_index, document_size, delim_unquoted;
358 if (temp->instruction != r_deblank_reading_until &&
359 temp->instruction != r_reading_until)
361 internal_error ("make_here_document: bad instruction type %d", temp->instruction);
365 kill_leading = temp->instruction == r_deblank_reading_until;
367 document = (char *)NULL;
368 document_index = document_size = 0;
370 /* Quote removal is the only expansion performed on the delimiter
371 for here documents, making it an extremely special case. */
372 redir_word = string_quote_removal (temp->redirectee.filename->word, 0);
374 /* redirection_expand will return NULL if the expansion results in
375 multiple words or no words. Check for that here, and just abort
376 this here document if it does. */
378 redir_len = strlen (redir_word);
381 temp->here_doc_eof = xmalloc (1);
382 temp->here_doc_eof[0] = '\0';
386 free (temp->redirectee.filename->word);
387 temp->here_doc_eof = redir_word;
389 /* Read lines from wherever lines are coming from.
390 For each line read, if kill_leading, then kill the
391 leading tab characters.
392 If the line matches redir_word exactly, then we have
393 manufactured the document. Otherwise, add the line to the
394 list of lines in the document. */
396 /* If the here-document delimiter was quoted, the lines should
397 be read verbatim from the input. If it was not quoted, we
398 need to perform backslash-quoted newline removal. */
399 delim_unquoted = (temp->redirectee.filename->flags & W_QUOTED) == 0;
400 while (full_line = read_secondary_line (delim_unquoted))
408 if (kill_leading && *line)
410 /* Hack: To be compatible with some Bourne shells, we
411 check the word before stripping the whitespace. This
412 is a hack, though. */
413 if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
416 while (*line == '\t')
423 if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
427 if (len + document_index >= document_size)
429 document_size = document_size ? 2 * (document_size + len) : 1000;
430 document = xrealloc (document, document_size);
433 /* len is guaranteed to be > 0 because of the check for line
434 being an empty string before the call to strlen. */
435 FASTCOPY (line, document + document_index, len);
436 document_index += len;
441 document[document_index] = '\0';
444 document = xmalloc (1);
447 temp->redirectee.filename->word = document;
450 /* Generate a REDIRECT from SOURCE, DEST, and INSTRUCTION.
451 INSTRUCTION is the instruction type, SOURCE is a file descriptor,
452 and DEST is a file descriptor or a WORD_DESC *. */
454 make_redirection (source, instruction, dest_and_filename)
456 enum r_instruction instruction;
457 REDIRECTEE dest_and_filename;
459 REDIRECT *temp = (REDIRECT *)xmalloc (sizeof (REDIRECT));
461 /* First do the common cases. */
462 temp->redirector = source;
463 temp->redirectee = dest_and_filename;
464 temp->instruction = instruction;
466 temp->next = (REDIRECT *)NULL;
471 case r_output_direction: /* >foo */
472 case r_output_force: /* >| foo */
473 case r_err_and_out: /* command &>filename */
474 temp->flags = O_TRUNC | O_WRONLY | O_CREAT;
477 case r_appending_to: /* >>foo */
478 temp->flags = O_APPEND | O_WRONLY | O_CREAT;
481 case r_input_direction: /* <foo */
482 case r_inputa_direction: /* foo & makes this. */
483 temp->flags = O_RDONLY;
486 case r_input_output: /* <>foo */
487 temp->flags = O_RDWR | O_CREAT;
490 case r_deblank_reading_until: /* <<-foo */
491 case r_reading_until: /* << foo */
492 case r_close_this: /* <&- */
493 case r_duplicating_input: /* 1<&2 */
494 case r_duplicating_output: /* 1>&2 */
495 case r_duplicating_input_word: /* 1<&$foo */
496 case r_duplicating_output_word: /* 1>&$foo */
500 programming_error ("make_redirection: redirection instruction `%d' out of range", instruction);
508 make_function_def (name, command, lineno, lstart)
515 temp = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF));
516 temp->command = command;
520 command->line = lstart;
521 return (make_command (cm_function_def, (SIMPLE_COM *)temp));
524 /* Reverse the word list and redirection list in the simple command
525 has just been parsed. It seems simpler to do this here the one
526 time then by any other method that I can think of. */
528 clean_simple_command (command)
531 if (command->type != cm_simple)
532 programming_error ("clean_simple_command: bad command type `%d'", command->type);
535 command->value.Simple->words =
536 REVERSE_LIST (command->value.Simple->words, WORD_LIST *);
537 command->value.Simple->redirects =
538 REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
544 /* The Yacc grammar productions have a problem, in that they take a
545 list followed by an ampersand (`&') and do a simple command connection,
546 making the entire list effectively asynchronous, instead of just
547 the last command. This means that when the list is executed, all
548 the commands have stdin set to /dev/null when job control is not
549 active, instead of just the last. This is wrong, and needs fixing
550 up. This function takes the `&' and applies it to the last command
551 in the list. This is done only for lists connected by `;'; it makes
552 `;' bind `tighter' than `&'. */
554 connect_async_list (command, command2, connector)
555 COMMAND *command, *command2;
558 COMMAND *t, *t1, *t2;
561 t = command->value.Connection->second;
563 if (!t || (command->flags & CMD_WANT_SUBSHELL) ||
564 command->value.Connection->connector != ';')
566 t = command_connect (command, command2, connector);
570 /* This is just defensive programming. The Yacc precedence rules
571 will generally hand this function a command where t points directly
572 to the command we want (e.g. given a ; b ; c ; d &, t1 will point
573 to the `a ; b ; c' list and t will be the `d'). We only want to do
574 this if the list is not being executed as a unit in the background
575 with `( ... )', so we have to check for CMD_WANT_SUBSHELL. That's
576 the only way to tell. */
577 while (((t->flags & CMD_WANT_SUBSHELL) == 0) && t->type == cm_connection &&
578 t->value.Connection->connector == ';')
581 t = t->value.Connection->second;
583 /* Now we have t pointing to the last command in the list, and
584 t1->value.Connection->second == t. */
585 t2 = command_connect (t, command2, connector);
586 t1->value.Connection->second = t2;