home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / c / csh4.zip / CAT.C < prev    next >
C/C++ Source or Header  |  1985-09-04  |  1KB  |  72 lines

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <setjmp.h>
  4.  
  5. void (*signal())();
  6.  
  7. FILE *fd1,*fd2;
  8.  
  9. void (*oldsig)();
  10.  
  11. jmp_buf catenv;
  12. catintr()
  13. {
  14.     signal(SIGINT,oldsig);            /* restore shell interrupt */
  15.     fclose(fd1);
  16.     fclose(fd2);
  17.     longjmp(catenv,-1);
  18. }
  19.  
  20. cat(argc,argv)
  21.     char *argv[];
  22. {
  23.     char *intmsg = "Interrupt received\n";
  24.  
  25.     FILE *fdopen(), *fopen();
  26.     if (-1==setjmp(catenv))
  27.     {
  28.         write(2,intmsg,strlen(intmsg));
  29.         return -1;
  30.     }
  31.     oldsig = signal(SIGINT,catintr);    /* trap interrupts from keyboard */
  32.     /* get standard output opened for business */
  33.     if (NULL == (fd2 = fdopen(1,"w")))
  34.     {
  35.         perror("cat : Can't open stdout");
  36.     }
  37.  
  38.     /* handle pipes */
  39.     if (argc == 1)
  40.     {
  41.         if (NULL == (fd1 = fdopen(0,"r")))
  42.         {
  43.             perror("cat : Can't open stdin");
  44.         }
  45.         _cat();
  46.         fclose(fd1);fclose(fd2);
  47.     }
  48.     /* handle specified files */
  49.     else
  50.     {
  51.         while(--argc)
  52.         {
  53.             if (NULL == (fd1 = fopen(*(++argv),"r")))
  54.             {
  55.                 fprintf(stderr,"can't open %s\n",*argv);
  56.                 continue;
  57.             }
  58.             _cat();
  59.             fclose(fd1);
  60.         }
  61.     }
  62.     fclose(fd2);
  63.     signal(SIGINT,oldsig);                /* restore old int catcher        */
  64. }
  65.  
  66. _cat()
  67. {
  68.     char buffer[512];
  69.     while (NULL != fgets(buffer,512,fd1))
  70.         fputs(buffer,fd2);
  71. }
  72.