static ssize_t struct_machine_pack(machine_t *machine, request_t *request){ ssize_t ret; size_t struct_size; data_t *buffer; request_t *values; struct_userdata *userdata = (struct_userdata *)machine->userdata; switch(userdata->values){ case STRUCT_VALUES_WHOLE: values = request; break; case STRUCT_VALUES_ONE: hash_data_get(ret, TYPE_HASHT, values, request, userdata->key_values); if(ret != 0) return error("hash with keys not supplied"); break; }; if(userdata->lazy == 1){ request_t r_next[] = { { userdata->buffer, DATA_STRUCTT(userdata->structure, values) }, hash_next(request) }; return machine_pass(machine, r_next); }else{ buffer = hash_data_find(request, userdata->buffer); if(buffer != NULL){ if( (struct_size = struct_pack(userdata->structure, values, buffer)) == 0) return error("struct_pack failed"); request_t new_request[] = { { userdata->size, DATA_SIZET(struct_size) }, hash_next(request) }; return machine_pass(machine, new_request); } return machine_pass(machine, request); } }
{ HK(key1), DATA_UINT32T(100) }, { HK(key2), DATA_OFFT(10) }, { HK(key3), DATA_UINT32T(0) }, hash_end }; ssize_t ret; char test[100] = {0}; char orig[] = "\x64\x00\x00\x00" "\x0A\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00" "hello\x00"; data_t test_data = DATA_RAW(test, 100); ret = struct_pack(structure, values, &test_data); fail_unless(ret > 0, "struct_pack failed"); fail_unless(memcmp(test, orig, sizeof(orig)) == 0, "struct_pack data failed"); uint32_t test1; off_t test2; char *test3 = malloc(100); memset(test3, 0x41, 99); test3[99] = 0; request_t query[] = { { HK(key4), DATA_STRING(test3) }, { HK(key1), DATA_UINT32T(0) }, { HK(key2), DATA_OFFT(0) }, hash_end };