static int add_private_name(lua_State * L) { int nargs = lua_gettop(L); optional<unsigned> h; if (nargs > 2) h = lua_tonumber(L, 3); auto p = add_private_name(to_environment(L, 1), to_name_ext(L, 2), h); push_environment(L, p.first); push_name(L, p.second); return 2; }
static int value_of(lua_State * L) { auto it = value_of(to_token_table(L, 1)); if (it) { push_boolean(L, it->is_command()); push_name(L, it->value()); push_integer(L, it->expr_precedence()); return 3; } else { push_nil(L); return 1; } }
static int for_each(lua_State * L) { token_table const & t = to_token_table(L, 1); luaL_checktype(L, 2, LUA_TFUNCTION); // user-fun for_each(t, [&](char const * k, token_info const & info) { lua_pushvalue(L, 2); lua_pushstring(L, k); lua_pushboolean(L, info.is_command()); push_name(L, info.value()); lua_pushinteger(L, info.expr_precedence()); pcall(L, 4, 0, 0); }); return 0; }
void traverse_dirs( char * parent_dir, char * include) { DIR *d; struct dirent *f; struct stat finfo; char *dirname, *newname = NULL; char *newbase = NULL; dev_t parent_dev = (dev_t)0; int i; size_t l; size_t parent_len; int has_exclude; char *aparent; if(parent_dir == NULL || include == NULL) return; has_exclude = !is_empty_sl(exclude_sl) && (use_gtar_excl || use_star_excl); aparent = g_strjoin(NULL, parent_dir, "/", include, NULL); /* We (may) need root privs for the *stat() calls here. */ set_root_privs(1); if(stat(parent_dir, &finfo) != -1) parent_dev = finfo.st_dev; parent_len = strlen(parent_dir); push_name(aparent); for(; (dirname = pop_name()) != NULL; free(dirname)) { if(has_exclude && calc_check_exclude(dirname+parent_len+1)) { continue; } if((d = opendir(dirname)) == NULL) { perror(dirname); continue; } l = strlen(dirname); if(l > 0 && dirname[l - 1] != '/') { g_free(newbase); newbase = g_strconcat(dirname, "/", NULL); } else { g_free(newbase); newbase = g_strdup(dirname); } while((f = readdir(d)) != NULL) { int is_symlink = 0; int is_dir; int is_file; if(is_dot_or_dotdot(f->d_name)) { continue; } g_free(newname); newname = g_strconcat(newbase, f->d_name, NULL); if(lstat(newname, &finfo) == -1) { g_fprintf(stderr, "%s/%s: %s\n", dirname, f->d_name, strerror(errno)); continue; } if(finfo.st_dev != parent_dev) continue; #ifdef S_IFLNK is_symlink = ((finfo.st_mode & S_IFMT) == S_IFLNK); #endif is_dir = ((finfo.st_mode & S_IFMT) == S_IFDIR); is_file = ((finfo.st_mode & S_IFMT) == S_IFREG); if (!(is_file || is_dir || is_symlink)) { continue; } { int is_excluded = -1; for(i = 0; i < ndumps; i++) { add_file_name(i, newname); if(is_file && (time_t)finfo.st_ctime >= dumpdate[i]) { if(has_exclude) { if(is_excluded == -1) is_excluded = calc_check_exclude(newname+parent_len+1); if(is_excluded == 1) { i = ndumps; continue; } } add_file(i, &finfo); } } if(is_dir) { if(has_exclude && calc_check_exclude(newname+parent_len+1)) continue; push_name(newname); } } } #ifdef CLOSEDIR_VOID closedir(d); #else if(closedir(d) == -1) perror(dirname); #endif } /* drop root privs -- we're done with the permission-sensitive calls */ set_root_privs(0); amfree(newbase); amfree(newname); amfree(aparent); }
static int name_generator_prefix(lua_State * L) { return push_name(L, to_name_generator(L, 1).prefix()); }
static int name_generator_next(lua_State * L) { return push_name(L, to_name_generator(L, 1).next()); }
void scope_push(const std::string &scope_name = "") { table.push_back(scope_type(push_name(scope_name))); }
static int sep(lua_State * L) { check_action(L, 1, { action_kind::Exprs }); return push_name(L, to_notation_action(L, 1).get_sep()); }
static int check_id_next(lua_State * L) { return push_name(L, gparser.check_id_next(lua_tostring(L, 1))); }