Ejemplo n.º 1
0
Archivo: cdata.c Proyecto: ktap/ktap
void kp_cdata_ptr_get(ktap_state_t *ks, ktap_cdata_t *cd,
		      ktap_val_t *key, ktap_val_t *val)
{
	ktap_number idx;
	csymbol *cs;
	size_t size;
	char *addr;
	csymbol_id cs_id;

	if (!is_number(key)) {
		kp_error(ks, "array index should be number\n");
		return;
	}
	idx = nvalue(key);
	if (unlikely(idx < 0 || (cd_ptr_nmemb(cd) >= 0
					&& idx >= cd_ptr_nmemb(cd)))) {
		kp_error(ks, "array index out of bound\n");
		return;
	}

	cs_id = csym_ptr_deref_id(cd_csym(ks, cd));
	cs = id_to_csym(ks, cs_id);
	size = csym_size(ks, cs);
	addr = cd_ptr(cd);
	addr += size * idx;

	kp_cdata_init(ks, val, addr, -1, cs_id);
	kp_cdata_pack(ks, val, addr, cs);
}
Ejemplo n.º 2
0
Archivo: cdata.c Proyecto: ktap/ktap
void kp_cdata_ptr_set(ktap_state_t *ks, ktap_cdata_t *cd,
		      ktap_val_t *key, ktap_val_t *val)
{
	ktap_number idx;
	csymbol *cs;
	size_t size;
	char *addr;

	if (!is_number(key)) {
		kp_error(ks, "array index should be number\n");
		return;
	}
	idx = nvalue(key);
	if (unlikely(idx < 0 || (cd_ptr_nmemb(cd) >= 0
					&& idx >= cd_ptr_nmemb(cd)))) {
		kp_error(ks, "array index out of bound\n");
		return;
	}

	cs = csym_ptr_deref(ks, cd_csym(ks, cd));
	if (kp_cdata_type_match(ks, cs, val)) {
		kp_error(ks, "array member should be %s type\n", csym_name(cs));
		return;
	}
	size = csym_size(ks, cs);
	addr = cd_ptr(cd);
	addr += size * idx;
	kp_cdata_unpack(ks, addr, cs, val);
}
Ejemplo n.º 3
0
Archivo: cdata.c Proyecto: ktap/ktap
void kp_cdata_dump(ktap_state_t *ks, ktap_cdata_t *cd)
{
	switch (cd_type(ks, cd)) {
	case FFI_UINT8:	case FFI_INT8:
		kp_printf(ks, "c int(0x%01x)", cd_int(cd));
		break;
	case FFI_UINT16:	case FFI_INT16:
		kp_printf(ks, "c int(0x%02x)", cd_int(cd));
		break;
	case FFI_UINT32:	case FFI_INT32:
		kp_printf(ks, "c int(0x%04x)", cd_int(cd));
		break;
	case FFI_UINT64:	case FFI_INT64:
		kp_printf(ks, "c int(0x%08x)", cd_int(cd));
		break;
	case FFI_PTR:
		kp_printf(ks, "c pointer(0x%p)", cd_ptr(cd));
		break;
	case FFI_STRUCT:
		kp_printf(ks, "c struct(0x%p)", cd_struct(cd));
		break;
	case FFI_UNION:
		kp_printf(ks, "c union(0x%p)", cd_union(cd));
		break;
	default:
		kp_printf(ks, "unsupported cdata type %d!\n", cd_type(ks, cd));
	}
}
Ejemplo n.º 4
0
Archivo: cdata.c Proyecto: ktap/ktap
static void kp_cdata_value(ktap_state_t *ks, ktap_val_t *val, void **out_addr,
			   size_t *out_size, void **temp)
{
	ktap_cdata_t *cd;
	csymbol *cs;
	ffi_type type;

	switch (ttypenv(val)) {
	case KTAP_TYPE_BOOLEAN:
		*out_addr = &bvalue(val);
		*out_size = sizeof(int);
		return;
	case KTAP_TYPE_LIGHTUSERDATA:
		*out_addr = pvalue(val);
		*out_size = sizeof(void *);
		return;
	case KTAP_TYPE_NUMBER:
		*out_addr = &nvalue(val);
		*out_size = sizeof(ktap_number);
		return;
	case KTAP_TYPE_STRING:
		*temp = (void *)svalue(val);
		*out_addr = temp;
		*out_size = sizeof(void *);
		return;
	}

	cd = cdvalue(val);
	cs = cd_csym(ks, cd);
	type = csym_type(cs);
	*out_size = csym_size(ks, cs);
	switch (type) {
	case FFI_VOID:
		kp_error(ks, "Error: Cannot copy data from void type\n");
		return;
	case FFI_UINT8:
	case FFI_INT8:
	case FFI_UINT16:
	case FFI_INT16:
	case FFI_UINT32:
	case FFI_INT32:
	case FFI_UINT64:
	case FFI_INT64:
		*out_addr = &cd_int(cd);
		return;
	case FFI_PTR:
		*out_addr = &cd_ptr(cd);
		return;
	case FFI_STRUCT:
	case FFI_UNION:
		*out_addr = cd_record(cd);
		return;
	case FFI_FUNC:
	case FFI_UNKNOWN:
		kp_error(ks, "Error: internal error for csymbol %s\n",
				csym_name(cs));
		return;
	}
}
Ejemplo n.º 5
0
void Shop::AddCD(const char* pTitle,
			   unsigned int unitPricePence,
			   unsigned int runningTimeMins,
			   unsigned int noOfTracks) {

    std::shared_ptr<CD> cd_ptr(new CD(pTitle, unitPricePence,
			   runningTimeMins,
			   noOfTracks));
    items.push_back(cd_ptr);
}
Ejemplo n.º 6
0
Archivo: cdata.c Proyecto: ktap/ktap
/* argument nmemb here indicates the length of array that is pointed to,
 * -1 for unknown */
ktap_cdata_t *kp_cdata_new_ptr(ktap_state_t *ks, void *addr,
			     int nmemb, csymbol_id id, int to_allocate)
{
	ktap_cdata_t *cd;
	size_t memb_size;
	csymbol_id deref_id;

	cd = kp_cdata_new(ks, id);

	if (to_allocate) {
		/* allocate new empty space */
		deref_id = csym_ptr_deref_id(id_to_csym(ks, id));
		memb_size = csym_size(ks, id_to_csym(ks, deref_id));
		cd_ptr(cd) = kp_rawobj_alloc(ks, memb_size * nmemb);
	} else {
		cd_ptr(cd) = addr;
	}

	cd_ptr_nmemb(cd) = nmemb;

	return cd;
}