Skip to content

Commit

Permalink
add missing readDir function to SyNodeBinding_fs to be used inside fs…
Browse files Browse the repository at this point in the history
….readdirSync
  • Loading branch information
pavel.mash committed Sep 20, 2017
1 parent f3adb25 commit 72627db
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 2 deletions.
70 changes: 70 additions & 0 deletions SyNode/SyNodeBinding_fs.pas
Expand Up @@ -299,7 +299,76 @@ function fs_internalModuleStat(cx: PJSContext; argc: uintN; var vp: jsargRec): B
JSError(cx, E);
end;
end;
end;

/// read content of directory. return array of file names witout started from dot '.'
/// in case of includeDirNames - return sub direcrory with trailing slash
function fs_readDir(cx: PJSContext; argc: uintN; var vp: jsargRec): Boolean; cdecl;
var
in_argv: PjsvalVector;
aValue: jsval;
dir, founded: TFileName;
F: TSearchRec;
jsarr: PJSObject;
cNum, searchAttr: integer;
includeSubDir: boolean;
const
USAGE = 'usage: readDir(dirPath: String; [includeDirNames: boolean = false]): Array';
begin
try
in_argv := vp.argv;
{$POINTERMATH ON}
if (argc < 1) or not in_argv[0].isString then
raise ESMException.Create(USAGE);
if (argc = 2) and in_argv[1].isBoolean then
includeSubDir := in_argv[1].asBoolean
else
includeSubDir := false;

dir := in_argv[0].asJSString.ToSynUnicode(cx);
{$POINTERMATH OFF}
if not DirectoryExists(Dir) then
begin
vp.rval := JSVAL_NULL;
Exit(true);
end;

jsarr := cx.NewArrayObject(0);
vp.rval := jsarr.ToJSValue; //root it for not GC
Dir := IncludeTrailingPathDelimiter(Dir);


{$WARN SYMBOL_PLATFORM OFF}
searchAttr := faAnyFile;
if not includeSubDir then
searchAttr := searchAttr - faDirectory;
if FindFirst(Dir + '*.*', searchAttr, F) = 0 then
begin
cNum := 0;
repeat
if {(F.Attr and (faDirectory+faHidden)=0) and } (F.Name[1] <> '.') then
begin
founded := F.Name;
if (F.Attr and faDirectory) <> 0 then
founded := IncludeTrailingPathDelimiter(founded);

aValue := cx.NewJSString(founded).ToJSVal;
jsarr.SetElement(cx, cNum, aValue);
inc(cNum);
end;
until FindNext(F) <> 0;
end;
{$WARN SYMBOL_PLATFORM ON}
System.SysUtils.FindClose(F);
Result := True;
except
on E: Exception do
begin
Result := False;
vp.rval := JSVAL_VOID;
JSError(cx, E);
end;
end;
end;

function SyNodeBindingProc_fs(const Engine: TSMEngine;
Expand All @@ -318,6 +387,7 @@ function SyNodeBindingProc_fs(const Engine: TSMEngine;
obj.ptr.DefineFunction(cx, 'fileExists', fs_fileExists, 1, JSPROP_READONLY or JSPROP_PERMANENT);
obj.ptr.DefineFunction(cx, 'internalModuleReadFile', fs_internalModuleReadFile, 1, JSPROP_READONLY or JSPROP_PERMANENT);
obj.ptr.DefineFunction(cx, 'internalModuleStat', fs_internalModuleStat, 1, JSPROP_READONLY or JSPROP_PERMANENT);
obj.ptr.DefineFunction(cx, 'readDir', fs_readDir, 2, JSPROP_READONLY or JSPROP_PERMANENT);

Result := obj.ptr.ToJSValue;
finally
Expand Down
3 changes: 1 addition & 2 deletions SyNode/core_modules/node_modules/fs.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 72627db

Please sign in to comment.