struct heap * _pbcH_new(int pagesize) { int cap = 1024; while(cap < pagesize) { cap *= 2; } struct heap * h = (struct heap *)_pbcM_malloc(sizeof(struct heap)); h->current = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + cap); h->size = cap; h->used = 0; h->current->next = NULL; return h; }
void* _pbcH_alloc(struct heap *h, int size) { size = (size + 3) & ~3; if (h->size - h->used < size) { struct heap_page * p; if (size < h->size) { p = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + h->size); } else { p = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + size); } p->next = h->current; h->current = p; h->used = size; return (p+1); } else { char * buffer = (char *)(h->current + 1); buffer += h->used; h->used += size; return buffer; } }
static void _register_enum(struct pbc_env *p, struct _stringpool *pool, struct pbc_rmessage * enum_type, const char *prefix, int prefix_sz) { int field_count = pbc_rmessage_size(enum_type, "value"); struct map_kv *table =(struct map_kv *) _pbcM_malloc(field_count * sizeof(struct map_kv)); int i; for (i=0;i<field_count;i++) { struct pbc_rmessage * value = pbc_rmessage_message(enum_type, "value", i); int enum_name_sz; const char *enum_name = pbc_rmessage_string(value , "name" , 0 , &enum_name_sz); table[i].pointer = (void *)_pbcS_build(pool, enum_name , enum_name_sz); table[i].id = pbc_rmessage_integer(value , "number", 0 , 0); } int name_sz; const char * name = pbc_rmessage_string(enum_type, "name", 0 , &name_sz); const char *temp = _concat_name(pool, prefix , prefix_sz , name , name_sz, NULL); _pbcP_push_enum(p,temp,table,field_count); free(table); }
int pbc_register(struct pbc_env * p, struct pbc_slice *slice) { //dump((uint8_t *)slice->buffer, slice->len); struct pbc_rmessage * message = pbc_rmessage_new(p, "google.protobuf.FileDescriptorSet", slice); if (message == NULL) { p->lasterror = "register open google.protobuf.FileDescriptorSet fail"; return 1; } int n = pbc_rmessage_size(message, "file"); struct pbc_rmessage ** files = (struct pbc_rmessage **)_pbcM_malloc(n*(sizeof(struct pbc_rmessage *))); int i; int r = n; if (n == 0) { p->lasterror = "register empty"; goto _error; } for (i=0;i<n;i++) { files[i] = pbc_rmessage_message(message, "file", i); if (files[i] == NULL) { p->lasterror = "register open fail"; goto _error; } } do { int rr = _register_no_dependency(p,files , n); if (rr == r) { p->lasterror = "register dependency error"; goto _error; } r = rr; } while (r>0); pbc_rmessage_delete(message); free(files); return 0; _error: pbc_rmessage_delete(message); free(files); return 1; }