forked from cloudwu/pbc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_addressbook.c
121 lines (95 loc) · 2.81 KB
/
test_addressbook.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "pbc.h"
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
static void
read_file (const char *filename , struct pbc_slice *slice) {
FILE *f = fopen(filename, "rb");
if (f == NULL) {
slice->buffer = NULL;
slice->len = 0;
return;
}
fseek(f,0,SEEK_END);
slice->len = ftell(f);
fseek(f,0,SEEK_SET);
slice->buffer = malloc(slice->len);
fread(slice->buffer, 1 , slice->len , f);
fclose(f);
}
static void
dump(uint8_t *buffer, int sz) {
int i , j;
for (i=0;i<sz;i++) {
printf("%02X ",buffer[i]);
if (i % 16 == 15) {
for (j = 0 ;j <16 ;j++) {
char c = buffer[i/16 * 16+j];
if (c>=32 && c<127) {
printf("%c",c);
} else {
printf(".");
}
}
printf("\n");
}
}
printf("\n");
}
static void
test_rmessage(struct pbc_env *env, struct pbc_slice *slice) {
struct pbc_rmessage * m = pbc_rmessage_new(env, "tutorial.Person", slice);
printf("name = %s\n", pbc_rmessage_string(m , "name" , 0 , NULL));
printf("id = %d\n", pbc_rmessage_integer(m , "id" , 0 , NULL));
printf("email = %s\n", pbc_rmessage_string(m , "email" , 0 , NULL));
int phone_n = pbc_rmessage_size(m, "phone");
int i;
for (i=0;i<phone_n;i++) {
struct pbc_rmessage * p = pbc_rmessage_message(m , "phone", i);
printf("\tnumber[%d] = %s\n",i,pbc_rmessage_string(p , "number", i ,NULL));
printf("\ttype[%d] = %s\n",i,pbc_rmessage_string(p, "type", i, NULL));
}
int n = pbc_rmessage_size(m , "test");
for (i=0;i<n;i++) {
printf("test[%d] = %d\n",i, pbc_rmessage_integer(m , "test" , i , NULL));
}
printf("tutorial.Ext.test = %d\n", pbc_rmessage_integer(m,"tutorial.Ext.test",0,NULL));
pbc_rmessage_delete(m);
}
static struct pbc_wmessage *
test_wmessage(struct pbc_env * env)
{
struct pbc_wmessage * msg = pbc_wmessage_new(env, "tutorial.Person");
pbc_wmessage_string(msg, "name", "Alice", -1);
pbc_wmessage_integer(msg, "id" , 12345, 0);
pbc_wmessage_string(msg, "email", "alice@unkown", -1);
struct pbc_wmessage * phone = pbc_wmessage_message(msg , "phone");
pbc_wmessage_string(phone , "number", "87654321" , -1);
phone = pbc_wmessage_message(msg , "phone");
pbc_wmessage_string(phone , "number", "13901234567" , -1);
pbc_wmessage_string(phone , "type" , "MOBILE" , 0);
pbc_wmessage_integer(msg, "test", -123,0);
pbc_wmessage_integer(msg, "test", 12345,0);
pbc_wmessage_integer(msg, "test", 1234567,0);
pbc_wmessage_integer(msg, "tutorial.Ext.test", 54321 , 0);
return msg;
}
int
main()
{
struct pbc_slice slice;
read_file("addressbook.pb", &slice);
if (slice.buffer == NULL)
return 1;
struct pbc_env * env = pbc_new();
pbc_register(env, &slice);
free(slice.buffer);
struct pbc_wmessage *msg = test_wmessage(env);
pbc_wmessage_buffer(msg, &slice);
dump(slice.buffer, slice.len);
test_rmessage(env, &slice);
pbc_wmessage_delete(msg);
pbc_delete(env);
return 0;
}