summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/cdir.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/cdir.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/cdir.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/cdir.c b/reference/C/CONTRIB/SNIP/cdir.c
new file mode 100755
index 0000000..853cecb
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/cdir.c
@@ -0,0 +1,127 @@
+/*
+** CDIR.C
+**
+** Written By: Lynn R. Lively
+** Date Written: 9/18/91
+**
+** Purpose: To provide a change directory facility that will cross
+** drive/partition boundries. Never did understand why
+** MSDOS cd wouldn't do this already.
+**
+**-----------------------------------------------------------------
+** I hereby place this work into the Public Domain. It may be used
+** for any legal purpose public or private. Use this material at
+** your own risk. I accept no responsibility for the accuracy or
+** usability of the information contained herein. Neither do I
+** accept liability for any possible damage caused by use of this
+** material. However, should you have a problem, question, or
+** suggestion I would be glad to help in any way that I can. You
+** can reach me at (H) 713-893-7875 or (W) 713-591-6611 x 149.
+**-----------------------------------------------------------------
+*/
+
+/*
+** Change History
+**
+** Rev # Date By Description of change
+** 1.00 | 09/18/91 | LRL | Original Version
+** 1.01 | 09/18/91 | RBS | Added MSC, ZTC support for SNIPPETS
+**-----------------------------------------------------------------
+** Directory of initials:
+** Initials Name
+** LRL Lynn R. Lively
+** RBS Bob Stout
+*/
+
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef __TURBOC__
+ #include <dir.h>
+#else
+ #include <dos.h>
+ #include <direct.h>
+
+ #ifdef __ZTC__
+ #define _dos_getdrive(d) dos_getdrive(d)
+ #define _dos_setdrive(d,m) dos_setdrive(d,m)
+ #define drive_t unsigned
+ #else
+ #define drive_t int
+ #endif
+
+ drive_t getdisk(void)
+ {
+ drive_t drive;
+
+ _dos_getdrive(&drive);
+ return drive - 1;
+ }
+
+ drive_t setdisk(drive_t drive)
+ {
+ drive_t max_drives;
+
+ _dos_setdrive(drive + 1, &max_drives);
+ return max_drives - 1;
+ }
+#endif
+
+main (int argc, char * argv[])
+{
+ int d;
+ int max_d;
+
+ char wk_str[128];
+
+ if (argc > 1)
+ {
+ strupr (argv[1]);
+ if (argv[1][1] == ':')
+ {
+ /*
+ ** Find out what the maximum drive number can be.
+ */
+
+ max_d = getdisk ();
+ max_d = setdisk (max_d);
+
+ d = argv[1][0] - 'A';
+ if (d < max_d)
+ {
+ /*
+ ** If the drive specification was valid position to it
+ ** and then do a change directory.
+ */
+
+ setdisk (d);
+ chdir (argv[1]);
+ }
+ else
+ {
+ puts ("Invalid drive specification");
+ return -1;
+ }
+ }
+ else
+ {
+ /*
+ ** If the argument has no drive spec just do a regular
+ ** change directory.
+ */
+
+ chdir (argv[1]);
+ }
+ }
+ else
+ {
+ /*
+ ** If no arguments are passed, return the current working
+ ** directory path just like MSDOS cd does.
+ */
+
+ puts (getcwd (wk_str, sizeof (wk_str)));
+ }
+ return 0;
+}