home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / snippets / addhndls.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  3KB  |  108 lines

  1. /*
  2. **  ADDHNDLS.C
  3. **
  4. **  A compilation of public domain sources originally written by
  5. **  Doug Burger and Bob Jarvis
  6. **
  7. **  Collected and modified for Zortech, Microsoft, and Borland by Bob Stout
  8. **
  9. **  Demonstrates relocating the file handle table under DOS 3.x
  10. **  for having more than the usual 20 files open in a single
  11. **  program
  12. */
  13.  
  14. #include <stdio.h>
  15. #include <dos.h>
  16. #include <io.h>
  17. #include <fcntl.h>
  18.  
  19. #define TABLE_SIZE 255        /* NOTE: *Must* be <= FILES in CONFIG.SYS */
  20.  
  21. #ifdef TEST
  22.  #if defined(_MSC_VER)
  23.   #include <stdlib.h>
  24.   #if !defined(MK_FP)
  25.    #define MK_FP(seg,offset) \
  26.          ((void far *)(((unsigned long)(seg)<<16) | (unsigned)(offset)))
  27.   #endif 
  28.  
  29.   /* MSC's open() is funny - this code only works with _dos_open()      */
  30.  
  31.   int open(const char *name, int mode, ...)
  32.   {
  33.           int hdl;
  34.  
  35.           if (0 == _dos_open(name, mode, &hdl))
  36.                   return hdl;
  37.           else    return -1;
  38.   }
  39.  #endif /* MSC */
  40. #endif /* TEST */
  41.  
  42. unsigned char handle_table[TABLE_SIZE];     /* table of file DOS handles    */
  43. unsigned char far * far * handle_ptr;       /* ptr to DOS's ptr to hand.    */
  44. unsigned int far *handle_count;             /* ptr to handle count          */
  45.  
  46. int relocate(void)
  47. {
  48.     switch (_osmajor)
  49.     {
  50.     case 2:
  51.         return -1;
  52.     case 3:
  53.         if (3 > _osminor)
  54.         {                                       /* by Doug Burger           */
  55.             unsigned int i;
  56.  
  57.             handle_count = MK_FP(_psp, 0x32);   /* handle count at PSP:32h  */
  58.             handle_ptr = MK_FP(_psp, 0x34);     /* table ptr at PSP:34h     */
  59.             for (i = 0; i < *handle_count; i++) /* relocate exiting table   */
  60.                 handle_table[i] = (*handle_ptr)[i];
  61.             for (i = *handle_count; i < TABLE_SIZE; i++)    /* init. rest   */
  62.                 handle_table[i] = 255;
  63.             *handle_ptr = handle_table;         /* set pointer to new table */
  64.             *handle_count = TABLE_SIZE;         /* set new table size       */
  65.             return 0;
  66.         }
  67.         else
  68.     default:                                    /* DOS 4+                   */
  69.         {                                       /* by Bob Jarvis            */
  70.             union REGS regs;
  71.  
  72.             regs.h.ah = 0x67;
  73.             regs.x.bx = TABLE_SIZE | 1;         /* has to be an odd number  */
  74.  
  75.             intdos(®s, ®s);
  76.  
  77.             if(regs.x.cflag)                    /* error                    */
  78.                 return -1;
  79.             else
  80.                 return 0;
  81.         }
  82.     }
  83. }   /*  relocate()  */
  84.  
  85. /*
  86. **  Test code
  87. */
  88.  
  89. #ifdef TEST
  90.  
  91. main()
  92. {
  93.     int c, h;
  94.  
  95.     relocate();
  96.  
  97.     c = 0;
  98.     while ((h = open("CON", O_RDONLY)) >= 0)        /* DOS closes files */
  99.     {
  100.         c++;                                        /* on exit, so I    */
  101.         printf("handle = %d\n", h);                 /* don't bother     */
  102.     }                                               /* saving handles   */
  103.     printf("total opened files = %d\n", c);
  104.     return 0;
  105. }   /*  ADDHNDLS.C  */
  106.  
  107. #endif /* TEST */
  108.