summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/fcopy.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/fcopy.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/fcopy.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/fcopy.c b/reference/C/CONTRIB/SNIP/fcopy.c
new file mode 100755
index 0000000..6617d6b
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/fcopy.c
@@ -0,0 +1,55 @@
+/*
+ * FCOPY.C - copy one file to another. Returns the (positive)
+ * number of bytes copied, or -1 if an error occurred.
+ * by: Bob Jarvis
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BUFFER_SIZE 1024
+
+long fcopy(char *dest, char *source)
+{
+ FILE *d, *s;
+ char *buffer;
+ size_t incount;
+ long totcount = 0L;
+
+ s = fopen(source, "rb");
+ if(s == NULL)
+ return -1L;
+
+ d = fopen(dest, "wb");
+ if(d == NULL)
+ {
+ fclose(s);
+ return -1L;
+ }
+
+ buffer = malloc(BUFFER_SIZE);
+ if(buffer == NULL)
+ {
+ fclose(s);
+ fclose(d);
+ return -1L;
+ }
+
+ incount = fread(buffer, sizeof(char), BUFFER_SIZE, s);
+
+ while(!feof(s))
+ {
+ totcount += (long)incount;
+ fwrite(buffer, sizeof(char), incount, d);
+ incount = fread(buffer, sizeof(char), BUFFER_SIZE, s);
+ }
+
+ totcount += (long)incount;
+ fwrite(buffer, sizeof(char), incount, d);
+
+ free(buffer);
+ fclose(s);
+ fclose(d);
+
+ return totcount;
+}