home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / borhot / redtogl.c < prev    next >
C/C++ Source or Header  |  1991-11-28  |  7KB  |  176 lines

  1. /* ------------------------------------------------------ */
  2. /*                    REDTOGL.C                           */
  3. /* A redirection example that toggles redirection between */
  4. /* standard out (STDOUT) and another output channel       */
  5. /* (NUL, CON, PRN, AUX or a file).                        */
  6. /*            (c) 1990 Borland International              */
  7. /*                 All rights reserved.                   */
  8. /* ------------------------------------------------------ */
  9. /*  veröffentlicht in: DOS toolbox 1'91/92                */
  10. /* ------------------------------------------------------ */
  11.  
  12. #include <process.h>        // for system()
  13. #include <bios.h>           // for biosprint()
  14. #include <errno.h>          // for errno
  15. #include <stdio.h>          // for printf()
  16. #include <fcntl.h>          // for O_RDWR, O_TRUNC and
  17.                             // O_CREAT
  18. #include <string.h>         // for strlen()
  19. #include <sys\stat.h>       // for S_IWRITE
  20. #include <io.h>             // for open(), close(),
  21.                             // dup() and dup2()
  22.  
  23. #define PSTATUS 2           // biosprint(): return printer
  24.                             //              status cmd
  25. #define PNUM    0           // biosprint(): 0 = LPT1:,
  26.                             //              1 = LPT2:, etc.
  27.  
  28. int redtogl(char *redstr);  // Toggle redirect rtn prototype
  29.  
  30. // ------------------------------------------------------- *
  31. void main(void)
  32. {
  33.   int status, abyte = 0;
  34.  
  35.   status = system("DIR *.C");
  36.  
  37.   printf("Output going to twilight zone (i.e., 'NUL').\n");
  38.   if (redtogl(NULL) == -1)
  39.     printf("REDIRECT ERROR: %s\n", strerror(errno));
  40.   status = system("DIR *.C");
  41.   if (redtogl(NULL) == -1)
  42.     printf("REDIRECT ERROR: %s\n", strerror(errno));
  43.  
  44.   printf("Output going to file 'JUNK'....\n");
  45.   if (redtogl("JUNK") == -1)
  46.                     // Redirect output to file called "JUNK"
  47.     printf("REDIRECT ERROR: %s\n", strerror(errno));
  48.   status = system("DIR *.C");
  49.   if (redtogl(NULL) == -1)
  50.                     // Parameter is ignored; restore STDOUT
  51.     printf("REDIRECT ERROR: %s\n", strerror(errno));
  52.  
  53.   /*
  54.     'PRN' (printer) and 'CON' (console) are standard DOS
  55.     devices. Since output to 'CON' has same effect as output
  56.     to 'STDOUT' we won't bother demonstrating it.
  57.  
  58.     Because trying to output to a non-existent or
  59.     non-selectable printer would cause DOS to display the
  60.     infamous "Abort, Retry, Fail" error message, we'll
  61.     use the 'biosprint()' function to skip redirected output
  62.     if the printer can't be used
  63.     (not selected, out of paper, etc.)
  64.   */
  65.  
  66.   printf("Will attempt to send output to PRN.\n");
  67.   status = biosprint(PSTATUS, abyte, PNUM);
  68.   if ((status & 0xBF) == 0x90) {
  69.     if (redtogl("PRN") == -1)
  70.                        // Try redirecting to DOS List device
  71.       printf("REDIRECT ERROR: %s\n", strerror(errno));
  72.         status = system("DIR *.C");
  73.       if (redtogl("PRN") == -1)
  74.                        // ignore parameter & restore STDOUT
  75.         printf("REDIRECT ERROR: %s\n", strerror(errno));
  76.   }
  77.   else {
  78.     printf("PRN not ready.");
  79.     printf("Skipping redirected output to PRN.\n");
  80.   }
  81.   printf("End of program.\n");
  82. }  // end of main()
  83.  
  84. /* ------------------------------------------------------ */
  85. /* redtogl - Alternates (toggles) standard output between */
  86. /*           the 'NUL' or user specified output device    */
  87. /*           and the currently set standard output device */
  88. /*           (in handle 1). If a null (zero-length)       */
  89. /*           string is passed to this routine on even     */
  90. /*           numbered calls, output is sent to 'NUL'      */
  91. /*           which effectively suppresses output. If a    */
  92. /*           valid DOS device name (CON, PRN, AUX, NUL)   */
  93. /*           or a file name is passed to the routine      */
  94. /*           output is redirected to the named device.    */
  95. /*                                                        */
  96. /*           Odd numbered calls restores (toggles) output */
  97. /*           back to the device that was set on the last  */
  98. /*           call to the routine (probably the DOS        */
  99. /*           console device, i.e., 'CON').                */
  100. /*                                                        */
  101. /*   SYNOPSIS: redtogl(tostring)                          */
  102. /*             char *tostring                             */
  103. /*             - destination of redirected output or NULL */
  104. /*                                                        */
  105. /*   RETURNS : Current standard output handle if          */
  106. /*             successful or -1 on failure and one of the */
  107. /*             following in global 'errno' variable:      */
  108. /*                                                        */
  109. /*             ENOENT  - no such file or directory        */
  110. /*             EMFILE  - too many open files              */
  111. /*             EACCES  - permission denied                */
  112. /*             EINVACC - invalid access code              */
  113. /*             EBADF   - bad file number                  */
  114. /* ------------------------------------------------------ */
  115. int redtogl(char *redstr)
  116. {
  117.   /*
  118.     NOTE: 'oldstdout' is static because we have to retain
  119.            it until the next call to 'redtogl' when it is
  120.            used to restore the original output device, that
  121.            is, so the routine can toggle redirection.
  122.   */
  123.  
  124.   static int oldstdout;    // handle of std output device
  125.          int nul;          // handle for redirect device
  126.  
  127. #define STDOUT  1
  128.  
  129. /*
  130.   'oldstdout' is static so we can depend on the compiler to
  131.   initialize it to 0. Subsequent calls to redtogl() assure
  132.   it is maintained so we can safely disable the 'Possible
  133.   use of oldstdout before definition' warning. Note,
  134.   however, that you should always clearly understand why a
  135.   warning is being generated before disabling it!
  136. */
  137.  
  138. #pragma warn -def
  139.  
  140.   if (!oldstdout) {
  141.     if (!strlen(redstr))
  142.       nul = open("NUL", O_RDWR);
  143.     else
  144.       nul = open(redstr, O_CREAT|O_TRUNC|O_RDWR, S_IWRITE);
  145.  
  146.     if (nul < 0) {
  147.       close(nul);
  148.       return(-1);
  149.     }
  150.     else {
  151.       oldstdout = dup(STDOUT);
  152.       dup2(nul, STDOUT);
  153.       close(nul);
  154.     }
  155.   }
  156.   else {
  157.     dup2(oldstdout, STDOUT);
  158.     oldstdout = close(oldstdout);
  159.   }
  160.   return(nul);
  161.  
  162. /*
  163.   This restores the 'possible use of xxxx before
  164.   definition' warning to its state before it was disabled
  165.   it; i.e., if it was on it is enabled else it is left
  166.   disabled. This assures that later occurances of such
  167.   warnings aren't missed.
  168. */
  169.  
  170. #pragma warn .def
  171.  
  172. }  // end of redtogl()
  173. /* ------------------------------------------------------ */
  174. /*                  Ende von REDTOGL.C                    */
  175.  
  176.