Meteorite avatar Meteorite committed f05995e

GetDirFiles and GetDirSubdirs functions added to JS Engine

Comments (0)

Files changed (2)

AspectP/plugins/JS/JavaScriptDoc.txt

 не символьной ссылкой, не устройством и т.п.). В противном случае возвращает ложь.
 *)
 
+*( GetDirFiles(str_path)
+Возвращает массив строк с именами файлов, содержащихся в дирректории str_path.
+Если дирректория str_path не существует или не является дирректорией, то выбрасывает ошибку.
+*)
+
+*( GetDirSubdirs(str_path)
+Возвращает массив строк с именами поддирректорий, содержащихся в дирректории str_path.
+Если дирректория str_path не существует или не является дирректорией, то выбрасывает ошибку.
+*)
+
 *) чтение и запись файлов без отображения в Notepad++
 
 

PRGPlugin_Src/js_engine/simple_functions.cpp

 	return result;
 }
 
-JSBool returnJSString(const std::string& str, JSContext* cx, jsval* rval) {
+JSString* str2JSString(const std::string& str, JSContext* cx) {
 	char* buffer = reinterpret_cast<char*>(JS_malloc(cx, str.length() + 1));
 	memcpy(buffer, str.c_str(), str.length() + 1);
-	*rval = STRING_TO_JSVAL(JS_NewString(cx, buffer, str.length()));
+	return JS_NewString(cx, buffer, str.length());
+}
+
+JSBool returnJSString(const std::string& str, JSContext* cx, jsval* rval) {
+	*rval = STRING_TO_JSVAL(str2JSString(str, cx));
 	return JS_TRUE;
 }
 
 	}
 }
 
+//bool is_regular_file(file_status s);
+static JSBool GetDirContent(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval,
+							boost::function<bool (fs::file_status)> filter,
+							const char* func_name) {
+	if (argc > 0) {
+		fs::path dir = js_arg_to_string(cx, argv[0]);
+		if (fs::exists(dir)  &&  fs::is_directory(dir)) {
+			JSObject* arr = JS_NewArrayObject(cx, 0, NULL);
+			if (arr == NULL) {
+				return JS_FALSE;
+			}
+
+			jsint i = 0;
+			for (fs::directory_iterator it(dir), end;  it != end;  ++it) {
+				if (filter(it->status())) {
+					jsval val = STRING_TO_JSVAL(str2JSString(it->path().filename().string(), cx));
+					if (JS_SetElement(cx, arr, i++, &val) == JS_FALSE) {
+						return JS_FALSE;
+					}
+				}
+			}
+			*rval = OBJECT_TO_JSVAL(arr);
+			return JS_TRUE;
+		} else {
+			JS_ReportError(cx, "'%s' doesn't exist or is not a directory!", dir.string().c_str());
+			return JS_FALSE;
+		}
+	} else {
+		JS_ReportError(cx, "Not enough arguments to %s function!", func_name);
+		return JS_FALSE;
+	}
+}
+
+bool is_reg_file(fs::file_status s) { return fs::is_regular_file(s); }
+
+static JSBool GetDirFiles(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
+{
+	return GetDirContent(cx, obj, argc, argv, rval, is_reg_file, "GetDirFiles(dir_path)");
+}
+
+bool is_dir(fs::file_status s) { return fs::is_directory(s); }
+
+static JSBool GetDirSubdirs(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
+{
+	return GetDirContent(cx, obj, argc, argv, rval, is_dir, "GetDirSubdirs(dir_path)");
+}
+
 static JSBool Exec(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
 {
 	if (argc > 0) {
 	{ "ReadWholeFile",			ReadWholeFile,			1, 0, 0 },
 	{ "WriteWholeFile",			WriteWholeFile,			3, 0, 0 },
 	{ "FileExists",				FileExists,				1, 0, 0 },
+	{ "GetDirFiles",			GetDirFiles,			1, 0, 0 },
+	{ "GetDirSubdirs",			GetDirSubdirs,			1, 0, 0 },
 
 	{ "Exec",					Exec,					1, 0, 0 },
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.