From 54e5294e7d09e7da7300706892fcc61346f85e92 Mon Sep 17 00:00:00 2001 From: Paul Tucker Date: Tue, 21 Mar 2000 21:52:38 +0000 Subject: [PATCH] Updates for Diskspace related functions --- harbour/ChangeLog | 15 ++++++++++++ harbour/include/hbapi.h | 7 ++++++ harbour/source/rtl/diskspac.c | 2 +- harbour/source/tools/io.c | 44 ++++------------------------------- harbour/tests/tstdspac.prg | 35 ++++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 40 deletions(-) create mode 100644 harbour/tests/tstdspac.prg diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 7a16ecff99..de55251d09 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,18 @@ +20000321-16:45 EST Paul Tucker + * source/rtl/diskspac.c + * Modified code since math wasn't working in '32 bit' mode + * reworked to be consistant amongst platforms. + + hb_DiskSpace() does the grunt work for all supported platforms + * DiskSpace() calls hb_diskSpace() + * source/tools/io.c + * DiskFree(), DiskUsed, DiskFull() now call hb_DiskSpace() + * include/hbapi.c + + #define HB_DISK_.... + + declaration for hb_DiskSpace() + ! Disk...() functions return a double. + + tests/tstdspac.prg + * tests for diskspace related functions + 20000321-15:08 GMT+1 Victor Szakats * source/rtl/diskspac.c diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index 19a3df3b46..433cb66d94 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -97,6 +97,13 @@ #define PCOUNT hb_pcount() #define ALENGTH( n ) hb_parinfa( n, 0 ) +/* used by DiskSpace(), etc. */ +#define HB_DISK_FREE 1 +#define HB_DISK_AVAIL 2 +#define HB_DISK_TOTAL 4 +#define HB_DISK_USED 8 +extern double hb_DiskSpace( USHORT, USHORT ); + /* forward declarations */ struct _HB_CODEBLOCK; struct _HB_BASEARRAY; diff --git a/harbour/source/rtl/diskspac.c b/harbour/source/rtl/diskspac.c index 4c40b8c387..03b58c537f 100644 --- a/harbour/source/rtl/diskspac.c +++ b/harbour/source/rtl/diskspac.c @@ -122,7 +122,7 @@ HB_FUNC( DISKSPACE ) ( PULARGE_INTEGER ) &i64TotalBytes, ( PULARGE_INTEGER ) &i64FreeBytes ) ) - dSpaceFree = ( double ) i64FreeBytesToCaller.QuadPart ; + dSpaceFree = ( double ) (unsigned)i64FreeBytesToCaller.QuadPart ; } else { diff --git a/harbour/source/tools/io.c b/harbour/source/tools/io.c index a5631378d2..80a77d3e24 100644 --- a/harbour/source/tools/io.c +++ b/harbour/source/tools/io.c @@ -39,51 +39,17 @@ HB_FUNC( RD ) HB_FUNC( DISKUSED ) { -#if defined(HB_OS_DOS) - struct diskfree_t disk; - long bytsfree, bytsfull; - - _dos_getdiskfree( 0, &disk ); - - bytsfree = ( long ) disk.avail_clusters * - ( long ) disk.sectors_per_cluster * - ( long ) disk.bytes_per_sector; - bytsfull = ( long ) disk.total_clusters * - ( long ) disk.sectors_per_cluster * - ( long ) disk.bytes_per_sector; - - hb_retnl( bytsfull - bytsfree ); -#else - hb_retnl( 0 ); -#endif + hb_retnd( hb_DiskSpace( ISNUM( 1 ) ? hb_parni( 1 ) : 0, HB_DISK_USED )); } + HB_FUNC( DISKFREE ) { -#if defined(HB_OS_DOS) - struct diskfree_t disk; - - _dos_getdiskfree( 0, &disk ); - - hb_retnl( ( long ) disk.avail_clusters * - ( long ) disk.sectors_per_cluster * - ( long ) disk.bytes_per_sector ); -#else - hb_retnl( 0 ); -#endif + hb_retnd( hb_DiskSpace( ISNUM( 1 ) ? hb_parni( 1 ) : 0, HB_DISK_FREE )); } + HB_FUNC( DISKFULL ) { -#if defined(HB_OS_DOS) - struct diskfree_t disk; - - _dos_getdiskfree( 0, &disk ); - - hb_retnl( ( long ) disk.total_clusters * - ( long ) disk.sectors_per_cluster * - ( long ) disk.bytes_per_sector ); -#else - hb_retnl( 0 ); -#endif + hb_retnd( hb_DiskSpace( ISNUM( 1 ) ? hb_parni( 1 ) : 0, HB_DISK_TOTAL )); } diff --git a/harbour/tests/tstdspac.prg b/harbour/tests/tstdspac.prg new file mode 100644 index 0000000000..da8b544a13 --- /dev/null +++ b/harbour/tests/tstdspac.prg @@ -0,0 +1,35 @@ +/* + + $Id$ + + tstdspac + + This program demonstrates that the 4 diskspace related functions work + correctly for disks of any size. + + Certain os's may allow limits to the amount of disk space available to + a user. If that is the case, you should see a difference between + the return value of DiskSpace() and DiskFree(). + + Currently, Disk quota's are only implimented for NT. + + NOTE: Unlike Clipper, these functions return a floating point number! + + Written by Paul Tucker {ptucker@sympatico.ca> + www - http://www.harbour-project.org + + This test program placed in the public domain +*/ + + +proc main( cDisk ) + if empty( cDisk ) + cDisk := "0" + Endif + cDisk := Val( cDisk ) + +? "Bytes available on disk: " + Transform( diskspace(cDisk),"999,999,999,999") +? "Bytes available for use: " + Transform( diskfree(cDisk),"999,999,999,999") +? " Bytes used: " + Transform( diskused(cDisk),"999,999,999,999") +? " Total bytes on disk "+PadL(cDisk,2)+": " + Transform( diskFull(cDisk),"999,999,999,999") +