Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. /* stdhandl.c */
  2. /*****************************************************************************/
  3. /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
  4. /*                                                                           */
  5. /* AS-Portierung                                                             */
  6. /*                                                                           */
  7. /* Bereitstellung von fuer AS benoetigten Handle-Funktionen                  */
  8. /*                                                                           */
  9. /* Historie:  5. 4.1996 Grundsteinlegung                                     */
  10. /*                                                                           */
  11. /*****************************************************************************/
  12.  
  13. #include "stdinc.h"
  14. #include <string.h>
  15. #include <sys/stat.h>
  16. #include "stdhandl.h"
  17.  
  18. #if defined ( __EMX__ ) || defined ( __IBMC__ )
  19. #include <os2.h>
  20. #endif
  21.  
  22. #ifdef __TURBOC__
  23. #include <io.h>
  24. #endif
  25.  
  26. #ifndef S_ISCHR
  27. #ifdef __IBMC__
  28. #define S_ISCHR(m)    ((m) & S_IFCHR)
  29. #else
  30. #define S_ISCHR(m)    (((m) & S_IFMT) == S_IFCHR)
  31. #endif
  32. #endif
  33. #ifndef S_ISREG
  34. #ifdef __IBMC__
  35. #define S_ISREG(m)    ((m) & S_IFREG)
  36. #else
  37. #define S_ISREG(m)    (((m) & S_IFMT) == S_IFREG)
  38. #endif
  39. #endif
  40.  
  41. TRedirected Redirected;
  42.  
  43. static void AssignHandle(FILE **ppFile, Word Num)
  44. {
  45.   switch (Num)
  46.   {
  47.     case NumStdIn:
  48.       *ppFile = stdin;
  49.       break;
  50.     case NumStdOut:
  51.       *ppFile = stdout;
  52.       break;
  53.     case NumStdErr:
  54.       *ppFile = stderr;
  55.       break;
  56.     default:
  57.       *ppFile = NULL;
  58.   }
  59. }
  60.  
  61. /* Eine Datei unter Beruecksichtigung der Standardkanaele oeffnen */
  62.  
  63. void OpenWithStandard(FILE **ppFile, const char *Path)
  64. {
  65.   if ((strlen(Path) == 2) && (Path[0] == '!') && (Path[1] >= '0') && (Path[1] <= '2'))
  66.     AssignHandle(ppFile, Path[1] - '0');
  67.   else
  68.     *ppFile = fopen(Path, "w");
  69. }
  70.  
  71. void CloseIfOpen(FILE **ppFile)
  72. {
  73.   if (*ppFile)
  74.   {
  75.     if ((*ppFile != stdin) && (*ppFile != stdout) && (*ppFile != stderr))
  76.       fclose(*ppFile);
  77.     *ppFile = NULL;
  78.   }
  79. }
  80.  
  81. void stdhandl_init(void)
  82. {
  83. #ifdef __EMX__
  84.   ULONG HandType,DevAttr;
  85.  
  86. #else
  87. #ifdef __TURBOC__
  88.   int HandErg;
  89.  
  90. #else
  91.   struct stat stdout_stat;
  92.  
  93. #endif
  94. #endif
  95.  
  96.    /* wohin zeigt die Standardausgabe ? */
  97.  
  98. #ifdef __EMX__
  99.   DosQueryHType(1, &HandType, &DevAttr);
  100.   if ((HandType & 0xff) == FHT_DISKFILE)
  101.     Redirected = RedirToFile;
  102.   else if ((DevAttr & 2) == 0)
  103.     Redirected = RedirToDevice;
  104.   else
  105.     Redirected = NoRedir;
  106.  
  107. #else
  108. #ifdef __TURBOC__
  109.   HandErg = ioctl(1, 0x00);
  110.   if ((HandErg & 2) == 2)
  111.     Redirected = NoRedir;
  112.   else if ((HandErg & 0x8000) == 0)
  113.     Redirected = RedirToFile;
  114.   else
  115.     Redirected = RedirToDevice;
  116.  
  117. #else
  118.   fstat(NumStdOut, &stdout_stat);
  119.   if (S_ISREG(stdout_stat.st_mode))
  120.     Redirected = RedirToFile;
  121. # ifdef S_ISFIFO
  122.   else if (S_ISFIFO(stdout_stat.st_mode))
  123.     Redirected = RedirToDevice;
  124. # endif
  125.   else
  126.     Redirected = NoRedir;
  127.  
  128. #endif
  129. #endif
  130. }
  131.