|
From: <and...@us...> - 2006-04-11 20:11:37
|
Revision: 1249 Author: andreradke Date: 2006-04-11 13:11:18 -0700 (Tue, 11 Apr 2006) ViewCVS: http://svn.sourceforge.net/frontierkernel/?rev=1249&view=rev Log Message: ----------- Kernelize file.readWholeFile to improve performance, especially when reading large files. Modified Paths: -------------- Frontier/trunk/Common/headers/file.h Frontier/trunk/Common/resources/Mac/kernelverbs.r Frontier/trunk/Common/resources/Win32/kernelverbs.rc Frontier/trunk/Common/source/fileverbs.c Frontier/trunk/Common/source/findinfile.c Modified: Frontier/trunk/Common/headers/file.h =================================================================== --- Frontier/trunk/Common/headers/file.h 2006-04-10 16:59:33 UTC (rev 1248) +++ Frontier/trunk/Common/headers/file.h 2006-04-11 20:11:18 UTC (rev 1249) @@ -411,6 +411,8 @@ extern boolean fifreadhandle (const tyfilespec *, long, Handle *); +extern boolean fifreadfile (const tyfilespec *fs, Handle *x); /* 2006-04-11 aradke */ + extern boolean fifwritehandle (const tyfilespec *, Handle); extern boolean fifsetposition (const tyfilespec *, long); Modified: Frontier/trunk/Common/resources/Mac/kernelverbs.r =================================================================== --- Frontier/trunk/Common/resources/Mac/kernelverbs.r 2006-04-10 16:59:33 UTC (rev 1248) +++ Frontier/trunk/Common/resources/Mac/kernelverbs.r 2006-04-11 20:11:18 UTC (rev 1249) @@ -691,7 +691,8 @@ "getpathchar", "freespaceonvolumedouble", "volumesizedouble", - "getmp3info" + "getmp3info", + "readwholefile" /* 2006-04-11 aradke */ } } }; Modified: Frontier/trunk/Common/resources/Win32/kernelverbs.rc =================================================================== --- Frontier/trunk/Common/resources/Win32/kernelverbs.rc 2006-04-10 16:59:33 UTC (rev 1248) +++ Frontier/trunk/Common/resources/Win32/kernelverbs.rc 2006-04-11 20:11:18 UTC (rev 1249) @@ -664,7 +664,8 @@ "getpathchar\0", "freespaceonvolumedouble\0", "volumesizedouble\0", - "getmp3info\0" /*7.0b12 PBS: Andr\xE9's file.getMp3Info verb*/ + "getmp3info\0", /*7.0b12 PBS: Andr\xE9's file.getMp3Info verb*/ + "readwholefile\0" /* 2006-04-11 aradke */ END 1008 /*idrezverbs*/ EFP DISCARDABLE Modified: Frontier/trunk/Common/source/fileverbs.c =================================================================== --- Frontier/trunk/Common/source/fileverbs.c 2006-04-10 16:59:33 UTC (rev 1248) +++ Frontier/trunk/Common/source/fileverbs.c 2006-04-11 20:11:18 UTC (rev 1249) @@ -249,6 +249,8 @@ getmp3infofunc, + readwholefilefunc, /* 2006-04-11 aradke */ + ctfileverbs } tyfiletoken; @@ -2319,6 +2321,49 @@ } /*writelineverb*/ +static boolean readwholefileverb (hdltreenode hparam1, tyvaluerecord *v) { + + /* + Read the whole file into memory and return the data to the caller. + + 2006-04-11 aradke: Kernelized file.readWholeFile. Obsolete script code follows: + + on readWholeFile (f) { + \xAB10/31/97 at 1:02:04 PM by DW -- moved from toys.readWholeFile + local (s); + file.open (f); + s = file.read (f, infinity); + file.close (f); + return (s)} + + This kernel implementation is much more efficient than file.read because + it pre-allocates a handle large enough for the whole file. + */ + + tyfilespec fs; + Handle x; + boolean fl; + + flnextparamislast = true; + + if (!getpathvalue (hparam1, 1, &fs)) + return (false); + + if (!fifopenfile (&fs, currentprocess)) + return (false); + + fl = fifreadfile (&fs, &x); + + disablelangerror (); + + (void) fifclosefile (&fs); /* ignore return value, we got what we wanted */ + + enablelangerror (); + + return (fl && setbinaryvalue (x, '\?\?\?\?', v)); + } /*readwholefileverb*/ + + static boolean readverb (hdltreenode hparam1, tyvaluerecord *v) { tyfilespec fs; @@ -2608,6 +2653,8 @@ informative message instead of failing silently 5.0.2b16 dmb: added getpathcharfunc + + 2006-04-11 aradke: added readwholefilefunc */ register hdltreenode hp1 = hparam1; @@ -3578,6 +3625,9 @@ return (true); } + + case readwholefilefunc: /* 2006-04-11 aradke */ + return (readwholefileverb (hparam1, v)); #ifdef WIN95VERSION case newaliasfunc: Modified: Frontier/trunk/Common/source/findinfile.c =================================================================== --- Frontier/trunk/Common/source/findinfile.c 2006-04-10 16:59:33 UTC (rev 1248) +++ Frontier/trunk/Common/source/findinfile.c 2006-04-11 20:11:18 UTC (rev 1249) @@ -852,6 +852,54 @@ } /*fifreadhandle*/ +boolean fifreadfile (const tyfilespec *fs, Handle *x) { + + /* + read the whole file into memory and return the data to the caller. + we assume that the file pointer is still at the beginning of the file, + i.e. the file has just been opened but we haven't read from it yet. + on success, caller is responsible for disposing the returned handle. + + 2006-04-11 aradke: implemented for readwholefileverb in fileverbs.c + */ + + hdlopenfile hfile, hprev; + long ctbytes; + boolean fl; + Handle h; + + *x = nil; + + if (!findopenfile (fs, &hfile, &hprev)) { /*file isn't open*/ + + fifopenfileerror (fs); + + return (false); + } + + if (!filegeteof ((**hfile).fnum, &ctbytes)) + return (false); + + if (!newhandle (ctbytes, &h)) + return (false); + + lockhandle (h); + + fl = fileread ((**hfile).fnum, ctbytes, *h); + + unlockhandle (h); + + if (fl) { + *x = h; + } + else { + disposehandle (h); + } + + return (fl); + } /*fifreadfile*/ + + boolean fifwritehandle (const tyfilespec *fs, Handle x) { /* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |