home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP4 / H2NAME.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-25  |  2.9 KB  |  99 lines

  1. /***************************************************************
  2.  *
  3.  *     H2NAME.C - Jim Kyle
  4.  *
  5.  *  Compile only with large memory model:
  6.  *        tcc -ml h2name
  7.  *        cl -AL h2name.c
  8.  *
  9.  ***************************************************************/
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <dos.h>
  13. #ifdef __TURBOC__
  14. #include <mem.h>
  15. #else
  16. #include <memory.h>
  17. #endif
  18.  
  19. #ifndef MK_FP
  20. #define MK_FP(s,o) ((void far *)\
  21.     (((unsigned long)(s) << 16) | (unsigned)(o)))
  22. #endif
  23.  
  24. char * h2name( unsigned psp, int h )
  25. { static char name[15];  /* will hold file's name           */
  26.   char far * htbl;
  27.   unsigned far *ptr, nmofs;
  28.   char far *sptr;
  29.   int sftn, sftsize;
  30.   union REGS regs;
  31.   struct SREGS sregs;
  32.  
  33.   memset( name, 0, 15 ); /* blank out the static name       */
  34.   
  35.   /* create pointer to handle table (JFT)                   */
  36.   htbl = *((char far * far *) MK_FP(psp, 0x34));
  37.  
  38.   regs.h.ah = 0x52;      /* set up initial SFT pointer      */
  39.   segread( &sregs );
  40.   intdosx( ®s, ®s, &sregs );
  41.   ptr = *((unsigned far * far *) MK_FP( sregs.es, regs.x.bx + 4 ));
  42.  
  43.   switch( _osmajor )     /* switch sizes, offsets for ver   */
  44.     { case 2: sftsize = 0x28;
  45.               nmofs = 4; /* offset of 11-byte name area     */
  46.               break;
  47.  
  48.       case 3: sftsize = 0x35;
  49.               nmofs = 0x20;   /* offset of name area        */
  50.               break;
  51.  
  52.       case 4: 
  53.       case 5: sftsize = 0x3B;
  54.               nmofs = 0x20;   /* offset of name area        */
  55.               break;
  56.  
  57.       default: return name;   /* returns null string        */
  58.     }
  59.  
  60.   if (htbl[h] >= 0)           /* now if handle is valid...  */
  61.     { sftn = htbl[h];         /* get index into SFT list    */
  62.       while ( FP_OFF(ptr) != 0xFFFF )
  63.         { if (ptr[2] > sftn)  /* then target is here        */
  64.             { sptr = (unsigned char far *)&ptr[3];
  65.               while (sftn--)  /* so skip down to it         */
  66.                 sptr += sftsize;
  67.               memcpy( name, &sptr[nmofs], 11 );
  68.               return name;    /* found and copied, done     */
  69.             }
  70.           sftn -= ptr[2];     /* not here, reduce index     */
  71.           ptr = (unsigned int far *) MK_FP( ptr[1], ptr[0] );
  72.         }
  73.     }
  74.   strcpy( name, "UNKNOWN" );
  75.   return name;                /* reached only by error      */
  76. }
  77.  
  78. void main( int argc, char *argv[] )
  79.     unsigned psp;
  80.     int max_files;
  81.     int i;
  82.     
  83.     if (argc < 2)
  84.         psp = _psp;              /* display files for this program */
  85.     else
  86.         sscanf(argv[1], "%X", &psp); /* take PSP from command line */
  87.     
  88.     if (_osmajor >= 3)
  89.         max_files = *((unsigned far *) MK_FP(psp, 0x32));
  90.     else
  91.         max_files = 20;
  92.     
  93.     fprintf(stderr, "Files for %04X\n", psp);
  94.     
  95.     for (i=0; i<max_files; i++)
  96.         fprintf(stderr, "%2d ==> %s\n", i, h2name(psp, i));
  97. }
  98.