home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / gnu / perl-4.036.tar.gz / perl-4.036.tar / perl-4.036 / atarist / echo.c < prev    next >
C/C++ Source or Header  |  1993-02-08  |  2KB  |  99 lines

  1. /*
  2.  * echo args, globbing is necessary.
  3.  * usage:
  4.  *    echo [-n] [args ...]
  5.  * \n \r \b \c \v \\ \f \t \NNN escapes supported
  6.  * -n and \c mean dont echo the final newline.
  7.  *
  8.  * ++jrb  bammi@cadence.com
  9.  */
  10.  
  11. #include <stdio.h>
  12.  
  13. #if __STDC__
  14. # include <compiler.h>
  15. #else
  16. # define __PROTO(X) ()
  17. #endif
  18.  
  19. char    **glob __PROTO((char *patt, int decend_dir));
  20. int    contains_wild __PROTO((char *patt));
  21. void    free_all __PROTO((void));
  22.  
  23.  
  24. int final_newline = 1; /* turned off by -n or \c */
  25.  
  26. int main(argc, argv)
  27. int argc;
  28. char **argv;
  29. {
  30.     --argc; ++argv;
  31.     if((*argv)[0] == '-')
  32.     {
  33.     if ((*argv)[1] == 'n')
  34.         final_newline = 0;
  35.     else
  36.     {
  37.         fputs("usage: echo [-n] [arguement ... ]\n", stderr);
  38.         return 1;
  39.     }
  40.     --argc; ++argv;
  41.     }
  42.  
  43.     while(argc--)
  44.     {
  45.     char *word = *argv;
  46.     char **list;
  47.  
  48.     if(contains_wild(word) && (list = glob(word, 0)))
  49.     {
  50.         while(*list)
  51.         {
  52.         fputs(*list, stdout);
  53.             if(*++list) putchar(' ');
  54.         }
  55.         free_all();
  56.     }
  57.     else
  58.     {
  59.         char c;
  60.         for(c = *word; c; c = (*word)? *++word : 0)
  61.         {
  62.         if(c != '\\')
  63.             putchar(c);
  64.         else
  65.         {
  66.             switch(*++word)
  67.             {
  68.             case 'b':  putchar('\b'); break;
  69.             case 'f':  putchar('\f'); break;
  70.             case 'n':  putchar('\n'); break;
  71.             case 'r':  putchar('\r'); break;
  72.                 case 't':  putchar('\t'); break;
  73.             case 'v':  putchar('\v'); break;
  74.                 case '\\': putchar('\\'); break;
  75.             case 'c':  final_newline = 0; break;
  76.             default:   putchar(*word); /* ?? */
  77.             case '0':
  78.             {
  79.                 int n = 0;
  80.                 for(c = *++word; (c >= '0') && (c <= '7'); c = *++word)
  81.                 n = (n << 3) + (c - '0');
  82.                 putchar(n);
  83.             }
  84.             }
  85.         }
  86.         }
  87.     }
  88.     if(*++argv) putchar(' ');
  89.     }
  90.     if(final_newline) putchar('\n');
  91.     return 0;
  92. }
  93.  
  94.                   
  95.     
  96.     
  97.     
  98.     
  99.