]> git.ipfire.org Git - thirdparty/bash.git/blob - make_cmd.c
Imported from ../bash-2.02.tar.gz.
[thirdparty/bash.git] / make_cmd.c
1 /* make_cmd.c -- Functions for making instances of the various
2 parser constructs. */
3
4 /* Copyright (C) 1989 Free Software Foundation, Inc.
5
6 This file is part of GNU Bash, the Bourne Again SHell.
7
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
11 version.
12
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
16 for more details.
17
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. */
21
22 #include "config.h"
23
24 #include <stdio.h>
25 #include "bashtypes.h"
26 #ifndef _MINIX
27 # include <sys/file.h>
28 #endif
29 #include "filecntl.h"
30 #include "bashansi.h"
31 #if defined (HAVE_UNISTD_H)
32 # include <unistd.h>
33 #endif
34
35 #include "command.h"
36 #include "general.h"
37 #include "error.h"
38 #include "flags.h"
39 #include "make_cmd.h"
40 #include "variables.h"
41 #include "subst.h"
42 #include "input.h"
43 #include "externs.h"
44
45 #if defined (JOB_CONTROL)
46 #include "jobs.h"
47 #endif
48
49 extern int line_number, current_command_line_count;
50 extern int disallow_filename_globbing;
51
52 WORD_DESC *
53 make_bare_word (string)
54 char *string;
55 {
56 WORD_DESC *temp;
57
58 temp = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
59 if (*string)
60 temp->word = savestring (string);
61 else
62 {
63 temp->word = xmalloc (1);
64 temp->word[0] = '\0';
65 }
66
67 temp->flags = 0;
68 return (temp);
69 }
70
71 WORD_DESC *
72 make_word_flags (w, string)
73 WORD_DESC *w;
74 char *string;
75 {
76 register char *s;
77
78 for (s = string; *s; s++)
79 switch (*s)
80 {
81 case '$':
82 w->flags |= W_HASDOLLAR;
83 break;
84 case '\\':
85 break; /* continue the loop */
86 case '\'':
87 case '`':
88 case '"':
89 w->flags |= W_QUOTED;
90 break;
91 }
92 return (w);
93 }
94
95 WORD_DESC *
96 make_word (string)
97 char *string;
98 {
99 WORD_DESC *temp;
100
101 temp = make_bare_word (string);
102 return (make_word_flags (temp, string));
103 }
104
105 WORD_DESC *
106 make_word_from_token (token)
107 int token;
108 {
109 char tokenizer[2];
110
111 tokenizer[0] = token;
112 tokenizer[1] = '\0';
113
114 return (make_word (tokenizer));
115 }
116
117 WORD_LIST *
118 make_word_list (word, link)
119 WORD_DESC *word;
120 WORD_LIST *link;
121 {
122 WORD_LIST *temp;
123
124 temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
125 temp->word = word;
126 temp->next = link;
127 return (temp);
128 }
129
130 WORD_LIST *
131 add_string_to_list (string, list)
132 char *string;
133 WORD_LIST *list;
134 {
135 WORD_LIST *temp;
136
137 temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
138 temp->word = make_word (string);
139 temp->next = list;
140 return (temp);
141 }
142
143 COMMAND *
144 make_command (type, pointer)
145 enum command_type type;
146 SIMPLE_COM *pointer;
147 {
148 COMMAND *temp;
149
150 temp = (COMMAND *)xmalloc (sizeof (COMMAND));
151 temp->type = type;
152 temp->value.Simple = pointer;
153 temp->value.Simple->flags = temp->flags = 0;
154 temp->redirects = (REDIRECT *)NULL;
155 return (temp);
156 }
157
158 COMMAND *
159 command_connect (com1, com2, connector)
160 COMMAND *com1, *com2;
161 int connector;
162 {
163 CONNECTION *temp;
164
165 temp = (CONNECTION *)xmalloc (sizeof (CONNECTION));
166 temp->connector = connector;
167 temp->first = com1;
168 temp->second = com2;
169 return (make_command (cm_connection, (SIMPLE_COM *)temp));
170 }
171
172 static COMMAND *
173 make_for_or_select (type, name, map_list, action)
174 enum command_type type;
175 WORD_DESC *name;
176 WORD_LIST *map_list;
177 COMMAND *action;
178 {
179 FOR_COM *temp;
180
181 temp = (FOR_COM *)xmalloc (sizeof (FOR_COM));
182 temp->flags = 0;
183 temp->name = name;
184 temp->map_list = map_list;
185 temp->action = action;
186 return (make_command (type, (SIMPLE_COM *)temp));
187 }
188
189 COMMAND *
190 make_for_command (name, map_list, action)
191 WORD_DESC *name;
192 WORD_LIST *map_list;
193 COMMAND *action;
194 {
195 return (make_for_or_select (cm_for, name, map_list, action));
196 }
197
198 COMMAND *
199 make_select_command (name, map_list, action)
200 WORD_DESC *name;
201 WORD_LIST *map_list;
202 COMMAND *action;
203 {
204 #if defined (SELECT_COMMAND)
205 return (make_for_or_select (cm_select, name, map_list, action));
206 #endif
207 }
208
209 COMMAND *
210 make_group_command (command)
211 COMMAND *command;
212 {
213 GROUP_COM *temp;
214
215 temp = (GROUP_COM *)xmalloc (sizeof (GROUP_COM));
216 temp->command = command;
217 return (make_command (cm_group, (SIMPLE_COM *)temp));
218 }
219
220 COMMAND *
221 make_case_command (word, clauses)
222 WORD_DESC *word;
223 PATTERN_LIST *clauses;
224 {
225 CASE_COM *temp;
226
227 temp = (CASE_COM *)xmalloc (sizeof (CASE_COM));
228 temp->flags = 0;
229 temp->word = word;
230 temp->clauses = REVERSE_LIST (clauses, PATTERN_LIST *);
231 return (make_command (cm_case, (SIMPLE_COM *)temp));
232 }
233
234 PATTERN_LIST *
235 make_pattern_list (patterns, action)
236 WORD_LIST *patterns;
237 COMMAND *action;
238 {
239 PATTERN_LIST *temp;
240
241 temp = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST));
242 temp->patterns = REVERSE_LIST (patterns, WORD_LIST *);
243 temp->action = action;
244 temp->next = NULL;
245 return (temp);
246 }
247
248 COMMAND *
249 make_if_command (test, true_case, false_case)
250 COMMAND *test, *true_case, *false_case;
251 {
252 IF_COM *temp;
253
254 temp = (IF_COM *)xmalloc (sizeof (IF_COM));
255 temp->flags = 0;
256 temp->test = test;
257 temp->true_case = true_case;
258 temp->false_case = false_case;
259 return (make_command (cm_if, (SIMPLE_COM *)temp));
260 }
261
262 static COMMAND *
263 make_until_or_while (which, test, action)
264 enum command_type which;
265 COMMAND *test, *action;
266 {
267 WHILE_COM *temp;
268
269 temp = (WHILE_COM *)xmalloc (sizeof (WHILE_COM));
270 temp->flags = 0;
271 temp->test = test;
272 temp->action = action;
273 return (make_command (which, (SIMPLE_COM *)temp));
274 }
275
276 COMMAND *
277 make_while_command (test, action)
278 COMMAND *test, *action;
279 {
280 return (make_until_or_while (cm_while, test, action));
281 }
282
283 COMMAND *
284 make_until_command (test, action)
285 COMMAND *test, *action;
286 {
287 return (make_until_or_while (cm_until, test, action));
288 }
289
290 COMMAND *
291 make_arith_command (exp)
292 WORD_LIST *exp;
293 {
294 #if defined (DPAREN_ARITHMETIC)
295 COMMAND *command;
296 ARITH_COM *temp;
297
298 command = (COMMAND *)xmalloc (sizeof (COMMAND));
299 command->value.Arith = temp = (ARITH_COM *)xmalloc (sizeof (ARITH_COM));
300
301 temp->flags = 0;
302 temp->line = line_number;
303 temp->exp = exp;
304
305 command->type = cm_arith;
306 command->redirects = (REDIRECT *)NULL;
307 command->flags = 0;
308
309 return (command);
310 #else
311 return ((COMMAND *)NULL);
312 #endif
313 }
314
315 #if defined (COND_COMMAND)
316 struct cond_com *
317 make_cond_node (type, op, left, right)
318 int type;
319 WORD_DESC *op;
320 struct cond_com *left, *right;
321 {
322 COND_COM *temp;
323
324 temp = (COND_COM *)xmalloc (sizeof (COND_COM));
325 temp->flags = 0;
326 temp->line = line_number;
327 temp->type = type;
328 temp->op = op;
329 temp->left = left;
330 temp->right = right;
331
332 return (temp);
333 }
334 #endif
335
336 COMMAND *
337 make_cond_command (cond_node)
338 COND_COM *cond_node;
339 {
340 #if defined (COND_COMMAND)
341 COMMAND *command;
342
343 command = (COMMAND *)xmalloc (sizeof (COMMAND));
344 command->value.Cond = cond_node;
345
346 command->type = cm_cond;
347 command->redirects = (REDIRECT *)NULL;
348 command->flags = 0;
349
350 return (command);
351 #else
352 return ((COMMAND *)NULL);
353 #endif
354 }
355
356 COMMAND *
357 make_bare_simple_command ()
358 {
359 COMMAND *command;
360 SIMPLE_COM *temp;
361
362 command = (COMMAND *)xmalloc (sizeof (COMMAND));
363 command->value.Simple = temp = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
364
365 temp->flags = 0;
366 temp->line = line_number;
367 temp->words = (WORD_LIST *)NULL;
368 temp->redirects = (REDIRECT *)NULL;
369
370 command->type = cm_simple;
371 command->redirects = (REDIRECT *)NULL;
372 command->flags = 0;
373
374 return (command);
375 }
376
377 /* Return a command which is the connection of the word or redirection
378 in ELEMENT, and the command * or NULL in COMMAND. */
379 COMMAND *
380 make_simple_command (element, command)
381 ELEMENT element;
382 COMMAND *command;
383 {
384 /* If we are starting from scratch, then make the initial command
385 structure. Also note that we have to fill in all the slots, since
386 malloc doesn't return zeroed space. */
387 if (!command)
388 command = make_bare_simple_command ();
389
390 if (element.word)
391 {
392 WORD_LIST *tw = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
393 tw->word = element.word;
394 tw->next = command->value.Simple->words;
395 command->value.Simple->words = tw;
396 }
397 else
398 {
399 REDIRECT *r = element.redirect;
400 /* Due to the way <> is implemented, there may be more than a single
401 redirection in element.redirect. We just follow the chain as far
402 as it goes, and hook onto the end. */
403 while (r->next)
404 r = r->next;
405 r->next = command->value.Simple->redirects;
406 command->value.Simple->redirects = element.redirect;
407 }
408 return (command);
409 }
410
411 /* Because we are Bourne compatible, we read the input for this
412 << or <<- redirection now, from wherever input is coming from.
413 We store the input read into a WORD_DESC. Replace the text of
414 the redirectee.word with the new input text. If <<- is on,
415 then remove leading TABS from each line. */
416 void
417 make_here_document (temp)
418 REDIRECT *temp;
419 {
420 int kill_leading, redir_len;
421 char *redir_word, *document, *full_line;
422 int document_index, document_size, delim_unquoted;
423
424 if (temp->instruction != r_deblank_reading_until &&
425 temp->instruction != r_reading_until)
426 {
427 internal_error ("make_here_document: bad instruction type %d", temp->instruction);
428 return;
429 }
430
431 kill_leading = temp->instruction == r_deblank_reading_until;
432
433 document = (char *)NULL;
434 document_index = document_size = 0;
435
436 /* Quote removal is the only expansion performed on the delimiter
437 for here documents, making it an extremely special case. */
438 redir_word = string_quote_removal (temp->redirectee.filename->word, 0);
439
440 /* redirection_expand will return NULL if the expansion results in
441 multiple words or no words. Check for that here, and just abort
442 this here document if it does. */
443 if (redir_word)
444 redir_len = strlen (redir_word);
445 else
446 {
447 temp->here_doc_eof = xmalloc (1);
448 temp->here_doc_eof[0] = '\0';
449 goto document_done;
450 }
451
452 free (temp->redirectee.filename->word);
453 temp->here_doc_eof = redir_word;
454
455 /* Read lines from wherever lines are coming from.
456 For each line read, if kill_leading, then kill the
457 leading tab characters.
458 If the line matches redir_word exactly, then we have
459 manufactured the document. Otherwise, add the line to the
460 list of lines in the document. */
461
462 /* If the here-document delimiter was quoted, the lines should
463 be read verbatim from the input. If it was not quoted, we
464 need to perform backslash-quoted newline removal. */
465 delim_unquoted = (temp->redirectee.filename->flags & W_QUOTED) == 0;
466 while (full_line = read_secondary_line (delim_unquoted))
467 {
468 register char *line;
469 int len;
470
471 line = full_line;
472 line_number++;
473
474 if (kill_leading && *line)
475 {
476 /* Hack: To be compatible with some Bourne shells, we
477 check the word before stripping the whitespace. This
478 is a hack, though. */
479 if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
480 goto document_done;
481
482 while (*line == '\t')
483 line++;
484 }
485
486 if (*line == 0)
487 continue;
488
489 if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
490 goto document_done;
491
492 len = strlen (line);
493 if (len + document_index >= document_size)
494 {
495 document_size = document_size ? 2 * (document_size + len) : 1000;
496 document = xrealloc (document, document_size);
497 }
498
499 /* len is guaranteed to be > 0 because of the check for line
500 being an empty string before the call to strlen. */
501 FASTCOPY (line, document + document_index, len);
502 document_index += len;
503 }
504
505 document_done:
506 if (document)
507 document[document_index] = '\0';
508 else
509 {
510 document = xmalloc (1);
511 document[0] = '\0';
512 }
513 temp->redirectee.filename->word = document;
514 }
515
516 /* Generate a REDIRECT from SOURCE, DEST, and INSTRUCTION.
517 INSTRUCTION is the instruction type, SOURCE is a file descriptor,
518 and DEST is a file descriptor or a WORD_DESC *. */
519 REDIRECT *
520 make_redirection (source, instruction, dest_and_filename)
521 int source;
522 enum r_instruction instruction;
523 REDIRECTEE dest_and_filename;
524 {
525 REDIRECT *temp = (REDIRECT *)xmalloc (sizeof (REDIRECT));
526
527 /* First do the common cases. */
528 temp->redirector = source;
529 temp->redirectee = dest_and_filename;
530 temp->instruction = instruction;
531 temp->flags = 0;
532 temp->next = (REDIRECT *)NULL;
533
534 switch (instruction)
535 {
536
537 case r_output_direction: /* >foo */
538 case r_output_force: /* >| foo */
539 case r_err_and_out: /* command &>filename */
540 temp->flags = O_TRUNC | O_WRONLY | O_CREAT;
541 break;
542
543 case r_appending_to: /* >>foo */
544 temp->flags = O_APPEND | O_WRONLY | O_CREAT;
545 break;
546
547 case r_input_direction: /* <foo */
548 case r_inputa_direction: /* foo & makes this. */
549 temp->flags = O_RDONLY;
550 break;
551
552 case r_input_output: /* <>foo */
553 temp->flags = O_RDWR | O_CREAT;
554 break;
555
556 case r_deblank_reading_until: /* <<-foo */
557 case r_reading_until: /* << foo */
558 case r_close_this: /* <&- */
559 case r_duplicating_input: /* 1<&2 */
560 case r_duplicating_output: /* 1>&2 */
561 case r_duplicating_input_word: /* 1<&$foo */
562 case r_duplicating_output_word: /* 1>&$foo */
563 break;
564
565 default:
566 programming_error ("make_redirection: redirection instruction `%d' out of range", instruction);
567 abort ();
568 break;
569 }
570 return (temp);
571 }
572
573 COMMAND *
574 make_function_def (name, command, lineno, lstart)
575 WORD_DESC *name;
576 COMMAND *command;
577 int lineno, lstart;
578 {
579 FUNCTION_DEF *temp;
580
581 temp = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF));
582 temp->command = command;
583 temp->name = name;
584 temp->line = lineno;
585 temp->flags = 0;
586 command->line = lstart;
587 return (make_command (cm_function_def, (SIMPLE_COM *)temp));
588 }
589
590 /* Reverse the word list and redirection list in the simple command
591 has just been parsed. It seems simpler to do this here the one
592 time then by any other method that I can think of. */
593 COMMAND *
594 clean_simple_command (command)
595 COMMAND *command;
596 {
597 if (command->type != cm_simple)
598 programming_error ("clean_simple_command: bad command type `%d'", command->type);
599 else
600 {
601 command->value.Simple->words =
602 REVERSE_LIST (command->value.Simple->words, WORD_LIST *);
603 command->value.Simple->redirects =
604 REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
605 }
606
607 return (command);
608 }
609
610 /* The Yacc grammar productions have a problem, in that they take a
611 list followed by an ampersand (`&') and do a simple command connection,
612 making the entire list effectively asynchronous, instead of just
613 the last command. This means that when the list is executed, all
614 the commands have stdin set to /dev/null when job control is not
615 active, instead of just the last. This is wrong, and needs fixing
616 up. This function takes the `&' and applies it to the last command
617 in the list. This is done only for lists connected by `;'; it makes
618 `;' bind `tighter' than `&'. */
619 COMMAND *
620 connect_async_list (command, command2, connector)
621 COMMAND *command, *command2;
622 int connector;
623 {
624 COMMAND *t, *t1, *t2;
625
626 t1 = command;
627 t = command->value.Connection->second;
628
629 if (!t || (command->flags & CMD_WANT_SUBSHELL) ||
630 command->value.Connection->connector != ';')
631 {
632 t = command_connect (command, command2, connector);
633 return t;
634 }
635
636 /* This is just defensive programming. The Yacc precedence rules
637 will generally hand this function a command where t points directly
638 to the command we want (e.g. given a ; b ; c ; d &, t1 will point
639 to the `a ; b ; c' list and t will be the `d'). We only want to do
640 this if the list is not being executed as a unit in the background
641 with `( ... )', so we have to check for CMD_WANT_SUBSHELL. That's
642 the only way to tell. */
643 while (((t->flags & CMD_WANT_SUBSHELL) == 0) && t->type == cm_connection &&
644 t->value.Connection->connector == ';')
645 {
646 t1 = t;
647 t = t->value.Connection->second;
648 }
649 /* Now we have t pointing to the last command in the list, and
650 t1->value.Connection->second == t. */
651 t2 = command_connect (t, command2, connector);
652 t1->value.Connection->second = t2;
653 return command;
654 }