home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frostbyte's 1980s DOS Shareware Collection
/
floppyshareware.zip
/
floppyshareware
/
BOUT
/
SNIP9-91.ZIP
/
WB_FCOPY.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-11-01
|
2KB
|
72 lines
/*
** by: Walter Bright via Usenet C newsgroup
**
** modified by: Bob Stout based on a recommendation by Ray Gardner
**
** There is no point in going to asm to get high speed file copies. Since it
** is inherently disk-bound, there is no sense (unless tiny code size is
** the goal). Here's a C version that you'll find is as fast as any asm code
** for files larger than a few bytes (the trick is to use large disk buffers):
*/
#if Afilecopy
int file_copy(from,to)
#else
int file_append(from,to)
#endif
char *from,*to;
{ int fdfrom,fdto;
int bufsiz;
fdfrom = open(from,O_RDONLY,0);
if (fdfrom < 0)
return 1;
#if Afileappe
/* Open R/W by owner, R by everyone else */
fdto = open(to,O_WRONLY,0644);
if (fdto < 0)
{ fdto = creat(to,0);
if (fdto < 0)
goto err;
}
else
if (lseek(fdto,0L,SEEK_END) == -1) /* to end of file */
goto err2;
#else
fdto = creat(to,0);
if (fdto < 0)
goto err;
#endif
/* Use the largest buffer we can get */
for (bufsiz = 0x4000; bufsiz >= 128; bufsiz >>= 1)
{ register char *buffer;
buffer = (char *) malloc(bufsiz);
if (buffer)
{ while (1)
{ register int n;
n = read(fdfrom,buffer,bufsiz);
if (n == -1) /* if error */
break;
if (n == 0) /* if end of file */
{ free(buffer);
close(fdto);
close(fdfrom);
return 0; /* success */
}
if (n != write(fdto,buffer,(unsigned) n))
break;
}
free(buffer);
break;
}
}
err2: close(fdto);
remove(to); /* delete any partial file */
err: close(fdfrom);
return 1;
}