void luaopen_lev_process(lua_State *L) { luaL_newmetatable(L, "lev.process"); luaL_register(L, NULL, methods); lua_setfield(L, -1, "__index"); lua_createtable(L, 0, ARRAY_SIZE(functions) + PROPERTY_COUNT - 1); luaL_register(L, NULL, functions); /* properties */ process_pid(L); lua_setfield(L, -2, "pid"); process_title(L); lua_setfield(L, -2, "title"); lua_setfield(L, -2, "process"); }
//------------------------------------------------------------------- // PURPOSE: Parse script (script_source_str) for @xxx // PARAMETERS: fn - full path of script // RESULTS: script_title // script_params // script_params_order // script_loaded_params, conf.script_vars //------------------------------------------------------------------- static void script_scan(const char *fn) { register const char *ptr = script_source_str; register int i, j=0, n; char *c; if ( !ptr ) { ptr = lua_script_default; } // sanity check // Build title c=strrchr(fn, '/'); strncpy(script_title, (c)?c+1:fn, sizeof(script_title)); script_title[sizeof(script_title)-1]=0; // Reset everything for (i=0; i<SCRIPT_NUM_PARAMS; ++i) { conf.script_vars[i] = 0; script_loaded_params[i] = 0; script_params[i][0]=0; script_param_order[i]=0; script_range_values[i] = 0; if (script_named_values[i]) free(script_named_values[i]); script_named_values[i] = 0; if (script_named_strings[i]) free(script_named_strings[i]); script_named_strings[i] = 0; script_named_counts[i] = 0; } // Fillup order, defaults while (ptr[0]) { ptr = skip_whitespace(ptr); if (ptr[0]=='@') { if (strncmp("@title", ptr, 6)==0) { process_title(ptr+6); } else if (strncmp("@param", ptr, 6)==0) { n = process_param(ptr+6); // n=1 if '@param a' was processed, n=2 for 'b' ... n=26 for 'z'. n=0 if failed. if (n>0 && n<=SCRIPT_NUM_PARAMS) { script_param_order[j]=n; j++; } } else if (strncmp("@default", ptr, 8)==0) { process_default(ptr+8); } else if (strncmp("@range", ptr, 6)==0) { process_range(ptr+6); } else if (strncmp("@values", ptr, 7)==0) { process_values(ptr+7); } } ptr = skip_eol(ptr); } }
//------------------------------------------------------------------- // PURPOSE: Parse script (conf.script_file) for parameters and title //------------------------------------------------------------------- static void script_scan() { // Reset everything sc_param *p = script_params; while (p) { if (p->name) free(p->name); if (p->desc) free(p->desc); if (p->options) free(p->options); if (p->option_buf) free(p->option_buf); sc_param *l = p; p = p->next; free(l); } script_params = tail = 0; script_param_count = 0; parse_version(&script_version, "1.3.0.0", 0); script_has_version = 0; is_script_loaded = 0; // Load script file const char *buf=0; if (conf.script_file[0] != 0) buf = load_file_to_length(conf.script_file, 0, 1, 4096); // Assumes parameters are in first 4K of script file // Check file loaded if (buf == 0) { strcpy(script_title, "NO SCRIPT"); return; } // Build title from name (in case no title in script) const char *c = get_script_filename(); strncpy(script_title, c, sizeof(script_title)-1); script_title[sizeof(script_title)-1]=0; // Fillup order, defaults const char *ptr = buf; while (ptr[0]) { ptr = skip_whitespace(ptr); if (ptr[0] == '@') { if (strncmp("@title", ptr, 6)==0) { process_title(ptr+6); } else if (strncmp("@subtitle", ptr, 9)==0) { process_subtitle(ptr+9); } else if (strncmp("@param", ptr, 6)==0) { process_param(ptr+6); } else if (strncmp("@default", ptr, 8)==0) { process_default(ptr+8, 1); } else if (strncmp("@range", ptr, 6)==0) { process_range(ptr+6); } else if (strncmp("@values", ptr, 7)==0) { process_values(ptr+7); } else if (strncmp("@chdk_version", ptr, 13)==0) { ptr = skip_whitespace(ptr+13); parse_version(&script_version, ptr, 0); script_has_version = 1; } } else if (ptr[0] == '#') { process_single(ptr+1); } ptr = skip_eol(ptr); } free((void*)buf); is_script_loaded = 1; }