コード例 #1
0
ファイル: structs.c プロジェクト: samuell/frozen
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);
	}
}
コード例 #2
0
		{ 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
	};