示例#1
0
文件: loader.c 项目: rousya/ktap
static ktap_string *load_string(struct load_state *S)
{
	ktap_string *ts;
	size_t size;

	size = READ_INT(S);

	if (!size)
		return NULL;
	else {
		char *s = GET_CURRENT(S);
		ADD_POS(S, size);
		/* remove trailing '\0' */
		ts = kp_tstring_newlstr(S->ks, s, size - 1);
		return ts;
	}
}
示例#2
0
文件: vm.c 项目: joelagnel/ktap
static void ktap_concat(ktap_state *ks, int start, int end)
{
	int i, len = 0;
	StkId top = ks->ci->u.l.base;
	ktap_string *ts;
	char *ptr, *buffer;

	for (i = start; i <= end; i++) {
		if (!ttisstring(top + i)) {
			kp_error(ks, "cannot concat non-string\n");
			setnilvalue(top + start);
			return;
		}

		len += rawtsvalue(top + i)->tsv.len;
	}

	if (len >= KTAP_PERCPU_BUFFER_SIZE) {
		kp_error(ks, "Error: too long string concatenation\n");
		return;
	}

	preempt_disable_notrace();

	buffer = kp_percpu_data(KTAP_PERCPU_DATA_BUFFER);
	ptr = buffer;

	for (i = start; i <= end; i++) {
		int len = rawtsvalue(top + i)->tsv.len;
		strncpy(ptr, svalue(top + i), len);
		ptr += len;
	}
	ts = kp_tstring_newlstr(ks, buffer, len);
	setsvalue(top + start, ts);

	preempt_enable_notrace();
}
示例#3
0
文件: main.c 项目: cfregly/ktap
ktap_string *ktapc_ts_newlstr(const char *str, size_t l)
{
	return kp_tstring_newlstr(NULL, str, l);
}