/** * Apply the environment to the function on the top of the stack. * * The environment will be initialized for the first time if needed. * * The function will remain on the stack afterwards. */ void Env::SetupEnv() { lua_State *state = GetState(); // fn - The compiled function. // env - The table that will be the environment for the function. // Initial stack: fn PushEnv(); // fn env // Apply the environment to the function. // Compiled Lua functions have one upvalue, which is the environment // it will execute in. lua_setupvalue(state, -2, 1); // fn }
/* files. Then calls query () to perform the querying. */ int main (int argc, char **argv) { ProgTime StartTime; int decomp = 0; int ch; msg_prefix = argv[0]; GetTime (&StartTime); /* Initialise the environment with default values */ InitEnv (); read_mgrc_file (); OutFile = stdout; InFile = stdin; opterr = 0; while ((ch = getopt (argc, argv, "Df:d:h")) != -1) switch (ch) { case 'f': SetEnv ("mgname", optarg, NULL); break; case 'd': SetEnv ("mgdir", optarg, NULL); break; case 'D': decomp = 1; break; case 'h': case '?': fprintf (stderr, "usage: %s [-D] [-f base name of collection]" "[-d data directory] [collection]\n", argv[0]); exit (1); } PushEnv (); if (decomp == 0) { Init_ReadLine (); /* write a first prompt, let the user start thinking */ if (!BooleanEnv (GetEnv ("expert"), 0) && isatty (fileno (InFile))) { fprintf (stderr, "\n\n\t FULL TEXT RETRIEVAL QUERY PROGRAM\n"); fprintf (stderr, "%24s%s\n\n", "", *"30 Jul 1999" == '%' ? __DATE__ : "30 Jul 1999"); fprintf (stderr, "\n"); fprintf (stderr, " mgquery version " VERSION ", Copyright (C) 1994 Neil Sharman\n"); fprintf (stderr, " mgquery comes with ABSOLUTELY NO WARRANTY; for details type `.warranty'\n"); fprintf (stderr, " This is free software, and you are welcome to redistribute it\n"); fprintf (stderr, " under certain conditions; type `.conditions' for details.\n"); fprintf (stderr, "\n"); } } if (optind < argc) search_for_collection (argv[optind]); if (decomp == 0) { query (); } else { int i; InitQueryTimes iqt; query_data *qd; qd = InitQuerySystem (GetDefEnv ("mgdir", "./"), GetDefEnv ("mgname", ""), &iqt); if (!qd) FatalError (1, mg_errorstrs[mg_errno], mg_error_data); start_up_stats (qd, iqt); Display_Stats (stderr); for (i = 0; i < qd->td->cth.num_of_docs; i++) { RawDocOutput (qd, i + 1, stdout); putc ('\2', stdout); } Message ("%s", ElapsedTime (&StartTime, NULL)); FinishQuerySystem (qd); } UninitEnv (); exit (0); }