curdir.c
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:2k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. /* return text of current directory
  2.  *
  3.  *  Modifications:
  4.  *
  5.  * 29-Oct-1986 mz Lower case output
  6.  * 09-Dec-1986 bw Added DOS 5 support.
  7.  * 30-Oct-1987 bw Change 'DOS5' to 'OS2'
  8.  * 20-Nov-1987 bw Set errno to 19 for invalid drive
  9.  * 03-Mar-1989 bw Set C RTL _doserrno in OS/2.
  10.  * 05-Jul-1989 bw use MAXPATHLEN
  11.  *
  12.  */
  13. #if defined(NT)
  14. #define INCL_DOSERRORS
  15. #include <windows.h>
  16. #elif defined(OS2)
  17. #define INCL_DOSERRORS
  18. #include <os2.h>
  19. #elif defined(DOS)
  20. #include <dos.h>
  21. #endif
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include "..htools.h"
  25. int curdir (
  26. char *buf,
  27. char drive
  28. ) {
  29. #if defined(DOS)
  30.     union REGS regs;
  31. #if ( defined(M_I86CM) || defined (M_I86LM) || defined (M_I86HM) )
  32.     struct SREGS sregs;
  33. #endif
  34.     /* stick in drive */
  35.     if (drive == 0) {
  36. regs.h.ah = 0x19;
  37. intdos (&regs, &regs);
  38. drive = (char) (regs.h.al + 1);
  39. }
  40.     *buf++ = (char) ('a' + drive - 1);
  41.     *buf++ = ':';
  42.     if (fSwitChr ('/')) *buf++ = '\' ; else *buf++ =  '/';
  43.     // *buf++ = fSwitChr ('/') ? '\' : '/';
  44.     // Get current dir. intdosx(), segread() are used to
  45.     // correctly load segment registers (ds) depending upon
  46.     // the "model".
  47.     regs.h.ah = 0x47;
  48.     regs.h.dl = drive;
  49. #if (defined(M_I86CM) || defined(M_I86LM) || defined(M_I86LM))
  50.     segread( &sregs);
  51.     sregs.ds = FP_SEG(buf);
  52.     regs.x.si = FP_OFF(buf);
  53.     intdosx(&regs, &regs, &sregs);
  54. #else
  55.     regs.x.si = (unsigned) buf;
  56.     intdos (&regs, &regs);
  57. #endif
  58.     if (!regs.x.cflag)
  59. strlwr (buf);
  60.     else
  61. errno = 19;
  62.     return regs.x.cflag;
  63. #elif defined(OS2)
  64.     int  DirPathLen = MAXPATHLEN;
  65.     long LogicalDriveMap;
  66.     if (drive == 0)
  67.     {
  68. DosQCurDisk( (PUSHORT)&drive , (PULONG)&LogicalDriveMap );
  69.     }
  70.     *buf++ = (char) ('a' + drive - 1);
  71.     *buf++ = ':';
  72.     if (fSwitChr ('/')) *buf++ = '\' ; else *buf++ =  '/';
  73.     // *buf++ = fSwitChr ('/') ? '\' : '/';
  74.     if (_doserrno = DosQCurDir( drive, buf, (PUSHORT)&DirPathLen ))
  75.     {
  76. switch (_doserrno) {
  77.     case ERROR_INVALID_DRIVE:
  78. errno = 19;
  79. break;
  80.     case ERROR_BUFFER_OVERFLOW:
  81. errno = 33;
  82. break;
  83.     default:
  84. break;
  85.     }
  86. return 1;
  87.     }
  88.     pname (buf - 3);
  89.     return 0;
  90. #elif defined(NT)
  91.     DWORD dwLength;
  92.     //assert( !drive );
  93.     drive; //NT doesn't use the concept internally
  94.     dwLength = GetCurrentDirectory( MAXPATHLEN, (LPSTR)buf );
  95.     return( !dwLength );
  96. #endif
  97. }