home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP4 / TRUENAME.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-14  |  1.2 KB  |  61 lines

  1. /* 
  2. TRUENAME.C 
  3. revised from version in first and second printings of UNDOCUMENTED DOS, pp.
  4. 190-191.
  5.  
  6. To use in DOS 4 and higher (which have an undocumented TRUENAME internal
  7. command built into COMMAND.COM!), use .\TRUENAME rather than TRUENAME
  8. */
  9.  
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <ctype.h>
  13. #include <dos.h>
  14.  
  15. #ifdef __TURBOC__
  16. #define _asm asm
  17. #endif
  18.  
  19. void ret(char *s, int retval) { puts(s); exit(retval); }
  20.  
  21. char far *truename(char far *s, char far *d)
  22. {
  23.     char far *s2;
  24.     
  25.     /* INT 21h AH=60h doesn't like leading or trailing blanks */
  26.     while (isspace(*s))
  27.         s++;
  28.     s2 = s;
  29.     while (*s2) s2++;
  30.     s2--;
  31.     while (isspace(*s2))
  32.         *s2-- = 0;
  33.     
  34.     _asm push di
  35.     _asm push si
  36.     _asm les di, d
  37.     _asm lds si, s
  38.     _asm mov ah, 60h
  39.     _asm int 21h
  40.     _asm pop si
  41.     _asm pop di
  42.     _asm jc error
  43.     return d;
  44. error:
  45.     return (char far *) 0;
  46. }
  47.  
  48. main(int argc, char *argv[])
  49. {
  50.     char buf[128];
  51.     if (argc < 2)
  52.         ret("usage: truename <filename>", 1);
  53.     if (_osmajor < 3)
  54.         ret("requires DOS 3.0 or greater", 1);
  55.     
  56.     if (truename(argv[1], buf))
  57.         ret(buf, 0);
  58.     else
  59.         ret("invalid filename", 1);
  60. }
  61.