186 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Modula-2
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Modula-2
		
	
	
	
	
	
| This file is echo.def, from which is created echo.c.
 | |
| It implements the builtin "echo" in Bash.
 | |
| 
 | |
| Copyright (C) 1987-2002 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Bash, the Bourne Again SHell.
 | |
| 
 | |
| Bash is free software; you can redistribute it and/or modify it under
 | |
| the terms of the GNU General Public License as published by the Free
 | |
| Software Foundation; either version 2, or (at your option) any later
 | |
| version.
 | |
| 
 | |
| Bash is distributed in the hope that it will be useful, but WITHOUT ANY
 | |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | |
| FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | |
| for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License along
 | |
| with Bash; see the file COPYING.  If not, write to the Free Software
 | |
| Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
 | |
| 
 | |
| $PRODUCES echo.c
 | |
| #include <config.h>
 | |
| 
 | |
| #if defined (HAVE_UNISTD_H)
 | |
| #  include <unistd.h>
 | |
| #endif
 | |
| 
 | |
| #include "../bashansi.h"
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include "../shell.h"
 | |
| 
 | |
| #include "common.h"
 | |
| 
 | |
| $BUILTIN echo
 | |
| $FUNCTION echo_builtin
 | |
| $DEPENDS_ON V9_ECHO
 | |
| $SHORT_DOC echo [-neE] [arg ...]
 | |
| Output the ARGs.  If -n is specified, the trailing newline is
 | |
| suppressed.  If the -e option is given, interpretation of the
 | |
| following backslash-escaped characters is turned on:
 | |
| 	\a	alert (bell)
 | |
| 	\b	backspace
 | |
| 	\c	suppress trailing newline
 | |
| 	\E	escape character
 | |
| 	\f	form feed
 | |
| 	\n	new line
 | |
| 	\r	carriage return
 | |
| 	\t	horizontal tab
 | |
| 	\v	vertical tab
 | |
| 	\\	backslash
 | |
| 	\0nnn	the character whose ASCII code is NNN (octal).  NNN can be
 | |
| 		0 to 3 octal digits
 | |
| 
 | |
| You can explicitly turn off the interpretation of the above characters
 | |
| with the -E option.
 | |
| $END
 | |
| 
 | |
| $BUILTIN echo
 | |
| $FUNCTION echo_builtin
 | |
| $DEPENDS_ON !V9_ECHO
 | |
| $SHORT_DOC echo [-n] [arg ...]
 | |
| Output the ARGs.  If -n is specified, the trailing newline is suppressed.
 | |
| $END
 | |
| 
 | |
| #if defined (V9_ECHO)
 | |
| #  define VALID_ECHO_OPTIONS "neE"
 | |
| #else /* !V9_ECHO */
 | |
| #  define VALID_ECHO_OPTIONS "n"
 | |
| #endif /* !V9_ECHO */
 | |
| 
 | |
| /* System V machines already have a /bin/sh with a v9 behaviour.  We
 | |
|    give Bash the identical behaviour for these machines so that the
 | |
|    existing system shells won't barf.  Regrettably, the SUS v2 has
 | |
|    standardized the Sys V echo behavior.  This variable is external
 | |
|    so that we can have a `shopt' variable to control it at runtime. */
 | |
| #if defined (DEFAULT_ECHO_TO_XPG) || defined (STRICT_POSIX)
 | |
| int xpg_echo = 1;
 | |
| #else
 | |
| int xpg_echo = 0;
 | |
| #endif /* DEFAULT_ECHO_TO_XPG */
 | |
| 
 | |
| extern int posixly_correct;
 | |
| 
 | |
| /* Print the words in LIST to standard output.  If the first word is
 | |
|    `-n', then don't print a trailing newline.  We also support the
 | |
|    echo syntax from Version 9 Unix systems. */
 | |
| int
 | |
| echo_builtin (list)
 | |
|      WORD_LIST *list;
 | |
| {
 | |
|   int display_return, do_v9, i, len;
 | |
|   char *temp, *s;
 | |
| 
 | |
|   do_v9 = xpg_echo;
 | |
|   display_return = 1;
 | |
| 
 | |
|   if (posixly_correct && xpg_echo)
 | |
|     goto just_echo;
 | |
| 
 | |
|   for (; list && (temp = list->word->word) && *temp == '-'; list = list->next)
 | |
|     {
 | |
|       /* If it appears that we are handling options, then make sure that
 | |
| 	 all of the options specified are actually valid.  Otherwise, the
 | |
| 	 string should just be echoed. */
 | |
|       temp++;
 | |
| 
 | |
|       for (i = 0; temp[i]; i++)
 | |
| 	{
 | |
| 	  if (strchr (VALID_ECHO_OPTIONS, temp[i]) == 0)
 | |
| 	    break;
 | |
| 	}
 | |
| 
 | |
|       /* echo - and echo -<nonopt> both mean to just echo the arguments. */
 | |
|       if (*temp == 0 || temp[i])
 | |
| 	break;
 | |
| 
 | |
|       /* All of the options in TEMP are valid options to ECHO.
 | |
| 	 Handle them. */
 | |
|       while (i = *temp++)
 | |
| 	{
 | |
| 	  switch (i)
 | |
| 	    {
 | |
| 	    case 'n':
 | |
| 	      display_return = 0;
 | |
| 	      break;
 | |
| #if defined (V9_ECHO)
 | |
| 	    case 'e':
 | |
| 	      do_v9 = 1;
 | |
| 	      break;
 | |
| 	    case 'E':
 | |
| 	      do_v9 = 0;
 | |
| 	      break;
 | |
| #endif /* V9_ECHO */
 | |
| 	    default:
 | |
| 	      goto just_echo;	/* XXX */
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
| just_echo:
 | |
| 
 | |
|   clearerr (stdout);	/* clear error before writing and testing success */
 | |
| 
 | |
|   while (list)
 | |
|     {
 | |
|       i = len = 0;
 | |
|       temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
 | |
| 		   : 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 && temp)
 | |
| 	free (temp);
 | |
|       list = list->next;
 | |
|       if (i)
 | |
| 	{
 | |
| 	  display_return = 0;
 | |
| 	  break;
 | |
| 	}
 | |
|       if (list)
 | |
| 	putchar(' ');
 | |
|     }
 | |
| 
 | |
|   if (display_return)
 | |
|     putchar ('\n');
 | |
|   fflush (stdout);
 | |
|   if (ferror (stdout))
 | |
|     {
 | |
|       sh_wrerror ();
 | |
|       clearerr (stdout);
 | |
|       return (EXECUTION_FAILURE);
 | |
|     }
 | |
|   return (EXECUTION_SUCCESS);
 | |
| }
 | 
