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; } }
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(); }
ktap_string *ktapc_ts_newlstr(const char *str, size_t l) { return kp_tstring_newlstr(NULL, str, l); }