示例#1
0
文件: struct.c 项目: dpw/euphemus
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;
}
示例#2
0
文件: struct.c 项目: dpw/euphemus
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;
}
示例#3
0
/*
 * 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;
}
示例#4
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;
}