enhance to generate encode routine to be more robust to encode NULL
This commit is contained in:
parent
3425f75440
commit
07e2126e25
4 changed files with 17 additions and 1 deletions
|
|
@ -1256,7 +1256,11 @@ void mk_struct_ptr_encoder(capnp_ctx_t *ctx, struct node *n) {
|
||||||
n->name.str, n->name.str, buf);
|
n->name.str, n->name.str, buf);
|
||||||
str_addf(&(ctx->SRC), "\t%s_ptr ptr;\n", n->name.str);
|
str_addf(&(ctx->SRC), "\t%s_ptr ptr;\n", n->name.str);
|
||||||
str_addf(&(ctx->SRC), "\tstruct %s d;\n", n->name.str);
|
str_addf(&(ctx->SRC), "\tstruct %s d;\n", n->name.str);
|
||||||
|
str_addf(&(ctx->SRC), "\t%s zero_ = {0}; \n", buf);
|
||||||
str_addf(&(ctx->SRC), "\tptr = new_%s(cs);\n", n->name.str);
|
str_addf(&(ctx->SRC), "\tptr = new_%s(cs);\n", n->name.str);
|
||||||
|
str_addf(&(ctx->SRC), "\tif (s == NULL) {\n");
|
||||||
|
str_addf(&(ctx->SRC), "\t\ts = &zero_;\n");
|
||||||
|
str_addf(&(ctx->SRC), "\t}\n");
|
||||||
str_addf(&(ctx->SRC), "\tencode_%s(cs, &d, s);\n", n->name.str);
|
str_addf(&(ctx->SRC), "\tencode_%s(cs, &d, s);\n", n->name.str);
|
||||||
str_addf(&(ctx->SRC), "\twrite_%s(&d, ptr);\n", n->name.str);
|
str_addf(&(ctx->SRC), "\twrite_%s(&d, ptr);\n", n->name.str);
|
||||||
str_addf(&(ctx->SRC), "\t(*p) = ptr;\n");
|
str_addf(&(ctx->SRC), "\t(*p) = ptr;\n");
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,17 @@ struct Publish $C.mapname("publish_t") {
|
||||||
isbn @0: UInt64;
|
isbn @0: UInt64;
|
||||||
year @1: UInt32;
|
year @1: UInt32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Nulldata $C.mapname("nulldata_t") {
|
||||||
|
null @0: UInt32 $C.mapname("null_");
|
||||||
|
}
|
||||||
|
|
||||||
struct Book $C.mapname("book_t") {
|
struct Book $C.mapname("book_t") {
|
||||||
title @0: Text;
|
title @0: Text;
|
||||||
authors @1: List(Text) $C.mapname("authors") $C.maplistcount("n_authors");
|
authors @1: List(Text) $C.mapname("authors") $C.maplistcount("n_authors");
|
||||||
chapters @5: List(Chapter) $C.mapname("chapters_") $C.maplistcount("n_chapters");
|
chapters @5: List(Chapter) $C.mapname("chapters_") $C.maplistcount("n_chapters");
|
||||||
publish @6: Publish;
|
publish @6: Publish;
|
||||||
|
nulldata @7: Nulldata;
|
||||||
magic1 @2: List(UInt32) $C.mapname("magic_1") $C.maplistcount("n_magic1");
|
magic1 @2: List(UInt32) $C.mapname("magic_1") $C.maplistcount("n_magic1");
|
||||||
acquire :union $C.mapuniontag("acquire_method") {
|
acquire :union $C.mapuniontag("acquire_method") {
|
||||||
buy @3: Text;
|
buy @3: Text;
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,10 @@ typedef struct {
|
||||||
uint32_t year;
|
uint32_t year;
|
||||||
} publish_t;
|
} publish_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int null_;
|
||||||
|
} nulldata_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *title;
|
char *title;
|
||||||
int n_authors;
|
int n_authors;
|
||||||
|
|
@ -23,6 +27,7 @@ typedef struct {
|
||||||
int n_chapters;
|
int n_chapters;
|
||||||
chapter_t *chapters_;
|
chapter_t *chapters_;
|
||||||
publish_t *publish;
|
publish_t *publish;
|
||||||
|
nulldata_t *nulldata;
|
||||||
int n_magic1;
|
int n_magic1;
|
||||||
uint32_t *magic_1;
|
uint32_t *magic_1;
|
||||||
int acquire_method;
|
int acquire_method;
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,8 @@ int encode() {
|
||||||
book.authors = authors;
|
book.authors = authors;
|
||||||
book.n_chapters = 3;
|
book.n_chapters = 3;
|
||||||
book.chapters_ = &chapters[0];
|
book.chapters_ = &chapters[0];
|
||||||
book.publish = &publish;
|
book.publish = &publish ;
|
||||||
|
book.nulldata = NULL;
|
||||||
book.n_magic1 = 2;
|
book.n_magic1 = 2;
|
||||||
book.magic_1 = &magic1[0];
|
book.magic_1 = &magic1[0];
|
||||||
book.acquire_method = Book_acquire_buy;
|
book.acquire_method = Book_acquire_buy;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue