static const struct eu_metadata *add_member_2( const struct eu_struct_metadata *md, char *s, struct eu_string_ref buf, const char *more, const char *more_end, void **value_out) { size_t more_len = more_end - more; size_t name_len = buf.len + more_len; size_t i; char *name_copy; void *value; for (i = 0; i < md->n_members; i++) { const struct eu_struct_member *m = &md->members[i]; if (m->name_len != name_len) continue; if (!memcmp(m->name, buf.chars, buf.len) && !memcmp(m->name + buf.len, more, more_len)) { if (m->presence_offset >= 0) s[m->presence_offset] |= m->presence_bit; *value_out = s + m->offset; return m->metadata; } } name_copy = malloc(name_len); if (!name_copy) return NULL; memcpy(name_copy, buf.chars, buf.len); memcpy(name_copy + buf.len, more, more_len); value = add_extra(md, s, name_copy, name_len); if (value) { *value_out = value; return md->extra_value_metadata; } return NULL; }
static void *get_extra(const struct eu_struct_metadata *md, char *s, struct eu_string_ref name) { struct eu_generic_members *extras = (void *)(s + md->extras_offset); char *member; char *name_copy; size_t i; for (i = 0, member = extras->members; i < extras->len; i++, member += md->extra_member_size) /* The name is always the first field in the member struct */ if (eu_string_ref_equal(*(struct eu_string_ref *)member, name)) return member + md->extra_member_value_offset; name_copy = malloc(name.len); if (name_copy) { memcpy(name_copy, name.chars, name.len); return add_extra(md, s, name_copy, name.len); } return NULL; }
/* * parse acc extra element in form of * <backend>:<tag1>=<value1>;<tag2>=<value2>[;] * last semicolon may miss * all tags shall be added (if not present) to the tag list * and be linked to all extra structures in acc_extra lists by * the index in the vector * * @param string to be parsed(char*) * @return 0(success) / < 0 (error) */ static int parse_acc_list_generic(void* val, str2bkend str2bk, tag_t** tag_arr, int* tags_len) { str sent={(char*)val, strlen((char*)val)}; str tok_list_s, backend_s; str token, tag, value; struct acc_extra** bkend_list; char* end; if ((end=q_memchr(sent.s, ':', sent.len)) == NULL) { LM_ERR("Missing backend separator ':'!\n"); return -1; } backend_s.s = sent.s; backend_s.len = end-sent.s; str_trim_spaces_lr(backend_s); if ((bkend_list = str2bk(&backend_s)) == NULL) { LM_ERR("Invalid backend <%.*s>\n", backend_s.len, backend_s.s); return -1; } tok_list_s.s = end+1; tok_list_s.len = sent.len - (end - sent.s + 1); do { end=q_memchr(tok_list_s.s, ';', tok_list_s.len); /* get key=value parameter */ token.s = tok_list_s.s; if (end != NULL) { token.len = end-tok_list_s.s; tok_list_s.len = tok_list_s.len - (end - tok_list_s.s + 1); tok_list_s.s = end + 1; } else { token.len = tok_list_s.len; } /* we reached the end or there are probably some trailing spaces * after the last ';' */ str_trim_spaces_lr(token); if (!token.len) break; if (parse_extra_token(&token, &tag, &value) < 0) { LM_ERR("failed to parse token!\n"); return -1; } if (add_extra(&tag, &value, bkend_list, tag_arr, tags_len) < 0) { LM_ERR("failed to add extra!\n"); return -1; } } while (end); return 0; }
int main (int argc, char* argv[]) { #ifdef LUA_VERSION_NUM /* lua 5.1 */ lua_State* L = luaL_newstate(); luaL_openlibs(L); #else lua_State* L = lua_open(); luaopen_base(L); luaopen_io(L); luaopen_string(L); luaopen_table(L); luaopen_math(L); luaopen_debug(L); #endif lua_pushstring(L,TOLUA_VERSION); lua_setglobal(L,"TOLUA_VERSION"); lua_pushstring(L,LUA_VERSION); lua_setglobal(L,"TOLUA_LUA_VERSION"); if (argc==1) { help(); return 0; } else { int i, t; lua_newtable(L); lua_setglobal(L, "_extra_parameters"); lua_newtable(L); lua_pushvalue(L,-1); lua_setglobal(L,"flags"); t = lua_gettop(L); for (i=1; i<argc; ++i) { if (*argv[i] == '-') { switch (argv[i][1]) { case 'v': version(); return 0; case 'h': help(); return 0; case 'p': setfield(L,t,"p",""); break; case 'P': setfield(L,t,"P",""); break; case 'o': setfield(L,t,"o",argv[++i]); break; case 'n': setfield(L,t,"n",argv[++i]); break; case 'H': setfield(L,t,"H",argv[++i]); break; case 'S': setfield(L,t,"S",""); break; case '1': setfield(L,t,"1",""); break; case 'L': setfield(L,t,"L",argv[++i]); break; case 'D': setfield(L,t,"D",""); break; case 'W': setfield(L,t,"W",""); break; case 'C': setfield(L,t,"C",""); break; case 'E': add_extra(L,argv[++i]); break; case 't': setfield(L,t,"t",""); break; default: error(argv[i]); break; } } else { setfield(L,t,"f",argv[i]); break; } } lua_pop(L,1); } /* #define TOLUA_SCRIPT_RUN */ #ifndef TOLUA_SCRIPT_RUN { int tolua_tolua_open (lua_State* L); tolua_tolua_open(L); } #else { char* p; char path[BUFSIZ]; strcpy(path,argv[0]); p = strrchr(path,'/'); if (p==NULL) p = strrchr(path,'\\'); p = (p==NULL) ? path : p+1; sprintf(p,"%s","../src/bin/lua/"); lua_pushstring(L,path); lua_setglobal(L,"path"); strcat(path,"all.lua"); lua_dofile(L,path); } #endif return 0; }