bool js_util_DirectoryUtils_walkDirs(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); js_proxy_t *proxy = jsb_get_js_proxy(obj); auto cobj = (Utils::DirectoryUtils *)(proxy ? proxy->ptr : NULL); JSB_PRECONDITION2( cobj, cx, false, "js_util_DirectoryUtils_walkDirs : Invalid Native Object"); if (argc == 3) { std::string arg0; bool arg1; Utils::DirectoryUtils::walkCallback arg2; bool ok = true; do { ok = jsval_to_std_string(cx, args.get(0), &arg0); if (!ok) break; ok = jsval_to_bool(cx, args.get(1), &arg1); if (!ok) break; ok = JS_TypeOfValue(cx, args.get(2)) == JSTYPE_FUNCTION; if (!ok) break; JSObject* thisObj = JS_THIS_OBJECT(cx, vp); // TODO 其它用法 std::shared_ptr<JSFunctionWrapper> func(new JSFunctionWrapper(cx, thisObj, args.get(2))); arg2 = [=](const char* arg0, const char* arg1, const char* arg2) -> void { JS::RootedValue rval(cx); JS::AutoValueVector args(cx); args.reserve(3); args.append(STRING_TO_JSVAL(c_str_to_js_str(cx, arg0))); args.append(STRING_TO_JSVAL(c_str_to_js_str(cx, arg1))); args.append(STRING_TO_JSVAL(c_str_to_js_str(cx, arg2))); bool ok = func->invoke(args, &rval); if (!ok && JS_IsExceptionPending(cx)) { JS_ReportPendingException(cx); } }; cobj->walkDirs(arg0.c_str(), arg1, arg2); } while (0); JSB_PRECONDITION2(ok, cx, false, "js_util_DirectoryUtils_walkDirs : Error processing arguments"); args.rval().setUndefined(); return true; } JS_ReportError(cx, "js_util_DirectoryUtils_walkDirs : wrong number of arguments"); return false; }
int walkDirs(char *input_dir, char *output_dir) { char partname[256]; struct stat stats; printf("Processing directory %s\n", input_dir); #ifdef HAVE_DIRENT_H DIR *dir; struct dirent *dirent; if ((dir = opendir(input_dir)) != NULL) { while ((dirent = readdir(dir))) { char dirname[256]; if (dirent->d_name[0] == '.') continue; snprintf(dirname, sizeof(dirname), "%s/%s", input_dir, dirent->d_name); if (stat(dirname, &stats) == 0) { if (S_ISDIR(stats.st_mode)) { walkDirs(dirname, output_dir); } } } closedir(dir); } #endif snprintf(partname, sizeof(partname), "%s/-part.txt", input_dir); if (stat(partname, &stats) == 0) { if (access(partname, 4) == 0) // have read access mergeDir(input_dir, output_dir); else printf("WARNING: skipping unreadable directory %s\n", partname); } return(0); }
int main (int argc, char * argv []) { char c, *input_dir = NULL, *output_dir = NULL; #if defined(_WIN32) && defined(_MSC_VER) // don't have getopt on windows input_dir = argv[1]; output_dir = argv[2]; #else while ((c = getopt (argc, argv, "hvi:o:d")) != -1) { switch(c) { case 'd': dump_mode = true; break; case 'h': help(); break; case 'i': input_dir = strdup(optarg); break; case 'o': output_dir = strdup(optarg); break; } } #endif if ((!input_dir) || (!output_dir)) help(); printf("Searching FastBit dirs on %s...\n", input_dir); walkDirs(input_dir, output_dir); printf("Merged %u records into directory %s...\n", tot_records, output_dir); printf("Leaving...\n"); exit(0); }