From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/getdcwd.c | 74 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/getdcwd.c (limited to 'reference/C/CONTRIB/SNIP/getdcwd.c') diff --git a/reference/C/CONTRIB/SNIP/getdcwd.c b/reference/C/CONTRIB/SNIP/getdcwd.c new file mode 100755 index 0000000..4b5ac6d --- /dev/null +++ b/reference/C/CONTRIB/SNIP/getdcwd.c @@ -0,0 +1,74 @@ +/* +** GETDCWD.C - returns the current working directory for a specific drive +** +** public domain by Bob Jarvis, modified by Bob Stout +*/ + +#if defined(__ZTC__) + #define GetDrive(d) dos_getdrive(&d) + #define FAR _far +#elif defined(__TURBOC__) + #define GetDrive(d) ((d) = getdisk() + 1) + #define FAR far +#else /* assume MSC */ + #define GetDrive(d) _dos_getdrive(&d) + #define FAR _far +#endif + +#include +#include +#include +#include + +char *getdcwd(unsigned int drive) /* 0 = current, 1 = A, 2 = B, etc */ +{ + union REGS regs; + struct SREGS sregs; + char *retptr; + + retptr = calloc(FILENAME_MAX + 4, sizeof(char)); + if(retptr == NULL) + return NULL; + + if(drive == 0) /* figure out which drive is current */ + { + GetDrive(drive); + drive += 1; + } + + *retptr = (char)((drive-1) + 'A'); + *(retptr+1) = ':'; + *(retptr+2) = '\\'; + + segread(&sregs); + regs.h.ah = 0x47; + regs.h.dl = (unsigned char)drive; + sregs.ds = FP_SEG((void FAR *)retptr); + regs.x.si = FP_OFF((void FAR *)retptr) + 3; + + intdosx(®s, ®s, &sregs); + if (15 == regs.x.ax) /* drive number invalid */ + { + free(retptr); + return NULL; + } + else return retptr; +} + +#ifdef TEST + +void main(int argc, char *argv[]) +{ + char *curpath; + unsigned int n; + + if(argc > 1) + n = (tolower(*argv[1]) - 'a') + 1; + else GetDrive(n); + + printf("curpath = '%s'\n", curpath = getdcwd(n)); + if (curpath) + free(curpath); +} + +#endif -- cgit v1.2.3-54-g00ecf