summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/flopcopy.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/flopcopy.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/flopcopy.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/flopcopy.c b/reference/C/CONTRIB/SNIP/flopcopy.c
new file mode 100755
index 0000000..18b16d7
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/flopcopy.c
@@ -0,0 +1,120 @@
+/*
+** FLOPCOPY.C
+**
+** Copy a floppy to a hard disk directory with directory recursion
+** Public domain, uses functions from SNIPPETS.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <io.h>
+#include <fcntl.h>
+
+#ifdef __TURBOC__
+ #include <dir.h>
+ #include <dos.h>
+ #define _dos_findfirst(f,a,b) findfirst(f,b,a)
+ #define _dos_findnext(b) findnext(b)
+ #define find_t ffblk
+ #define _A_SUBDIR FA_DIREC
+ #define attrib ff_attrib
+ #define name ff_name
+#else
+ #include <direct.h>
+ #ifdef __ZTC__
+ #include <dos.h>
+ #ifndef _A_SUBDIR
+ #define _A_SUBDIR FA_DIREC
+ #endif
+ #else /* assume MSC/QC */
+ #include <dos.h>
+ #include <errno.h>
+ #include <sys\types.h>
+ #endif
+#endif
+
+#include <sys\stat.h>
+
+#undef SUCCESS
+#define SUCCESS 0
+
+#undef NUL
+#define NUL '\0'
+
+#define LAST_CHAR(s) (((char *)s)[strlen(s) - 1])
+
+int file_copy(char *,char *); /* In Wb_Fcopy.C */
+void do_dir(char *, char *);
+
+/*
+** Copy a floppy to an HD subdirectory
+*/
+
+int main(int argc, char *argv[])
+{
+ char fdrv[4] = "A:\\", target[FILENAME_MAX];
+
+ if (3 > argc)
+ {
+ puts("Usage: FLOPCOPY drive_letter subdir");
+ puts("where: drive_letter is \"A\" or \"B\" (colon optional)");
+ puts(" subdir is drive:dir target, e.g. \"C:\\FLOPSTUF\"");
+ return EXIT_FAILURE;
+ }
+ *fdrv = *argv[1];
+ strcpy(target, argv[2]);
+ if ('\\' != LAST_CHAR(target))
+ strcat(target, "\\");
+
+ do_dir(fdrv, target);
+}
+
+/*
+** Process a directory (SNIPPETS: Treedir.C, modified)
+*/
+
+void do_dir(char *from, char *to)
+{
+ char search[FILENAME_MAX], new[FILENAME_MAX], newto[FILENAME_MAX];
+ struct find_t ff;
+
+ strcat(strcpy(search, from), "*.*");
+ if (SUCCESS == _dos_findfirst(to, 0xff, &ff))
+ {
+ if (0 == (ff.attrib & _A_SUBDIR))
+ {
+ printf("*** %s Exists and is not a directory!\n", to);
+ return;
+ }
+ }
+ else
+ {
+ strcpy(newto, to);
+ if ('\\' == LAST_CHAR(newto))
+ LAST_CHAR(newto) = NUL;
+ mkdir(newto);
+ }
+ if (SUCCESS == _dos_findfirst(search, 0xff, &ff)) do
+ {
+ if (ff.attrib & _A_SUBDIR && '.' != *ff.name)
+ {
+ strcat(strcat(strcpy(new, from), ff.name), "\\");
+ strcat(strcat(strcpy(newto, to), ff.name), "\\");
+ do_dir(new, newto);
+ }
+ else
+ {
+ char file1[FILENAME_MAX], file2[FILENAME_MAX];
+
+ if ((ff.attrib & (_A_SUBDIR | _A_VOLID)) || '.' == *ff.name)
+ continue;
+ strcat(strcpy(file1, from), ff.name);
+ strcat(strcpy(file2, to), ff.name);
+ if (SUCCESS != file_copy(file1, file2))
+ printf("*** Unable to copy %s to %s\n", file1, file2);
+ else printf("Copied %s to %s\n", file1, file2);
+ }
+ } while (SUCCESS == _dos_findnext(&ff));
+}