int SinglePacketBuffer_Init (SinglePacketBuffer *o, PacketRecvInterface *input, PacketPassInterface *output, BPendingGroup *pg) { ASSERT(PacketPassInterface_GetMTU(output) >= PacketRecvInterface_GetMTU(input)) // init arguments o->input = input; o->output = output; // init input PacketRecvInterface_Receiver_Init(o->input, (PacketRecvInterface_handler_done)input_handler_done, o); // init output PacketPassInterface_Sender_Init(o->output, (PacketPassInterface_handler_done)output_handler_done, o); // init buffer if (!(o->buf = BAlloc(PacketRecvInterface_GetMTU(o->input)))) { goto fail1; } // schedule receive PacketRecvInterface_Receiver_Recv(o->input, o->buf); DebugObject_Init(&o->d_obj); return 1; fail1: return 0; }
static int func_globalinit (struct NCDInterpModuleGroup *group, const struct NCDModuleInst_iparams *params) { // allocate global state structure struct global *g = BAlloc(sizeof(*g)); if (!g) { BLog(BLOG_ERROR, "BAlloc failed"); return 0; } // set group state pointer group->group_state = g; // init instances list LinkedList1_Init(&g->instances); return 1; }
static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new_params *params) { struct instance *o = vo; o->i = i; // read arguments NCDValRef delimiter_arg; NCDValRef input_arg; NCDValRef limit_arg = NCDVal_NewInvalid(); if (!NCDVal_ListRead(params->args, 2, &delimiter_arg, &input_arg) && !NCDVal_ListRead(params->args, 3, &delimiter_arg, &input_arg, &limit_arg)) { ModuleLog(i, BLOG_ERROR, "wrong arity"); goto fail0; } if (!NCDVal_IsString(delimiter_arg) || !NCDVal_IsString(input_arg) || (!NCDVal_IsInvalid(limit_arg) && !NCDVal_IsString(limit_arg))) { ModuleLog(i, BLOG_ERROR, "wrong type"); goto fail0; } size_t limit = SIZE_MAX; if (!NCDVal_IsInvalid(limit_arg)) { uintmax_t n; if (!ncd_read_uintmax(limit_arg, &n) || n == 0) { ModuleLog(i, BLOG_ERROR, "bad limit argument"); goto fail0; } n--; limit = (n <= SIZE_MAX ? n : SIZE_MAX); } const char *del_data = NCDVal_StringData(delimiter_arg); size_t del_len = NCDVal_StringLength(delimiter_arg); if (del_len == 0) { ModuleLog(i, BLOG_ERROR, "delimiter must be nonempty"); goto fail0; } size_t *table = BAllocArray(del_len, sizeof(table[0])); if (!table) { ModuleLog(i, BLOG_ERROR, "ExpArray_init failed"); goto fail0; } build_substring_backtrack_table(del_data, del_len, table); if (!ExpArray_init(&o->arr, sizeof(struct substring), 8)) { ModuleLog(i, BLOG_ERROR, "ExpArray_init failed"); goto fail1; } o->num = 0; const char *data = NCDVal_StringData(input_arg); size_t len = NCDVal_StringLength(input_arg); while (1) { size_t start; int is_end = 0; if (limit == 0 || !find_substring(data, len, del_data, del_len, table, &start)) { start = len; is_end = 1; } if (!ExpArray_resize(&o->arr, o->num + 1)) { ModuleLog(i, BLOG_ERROR, "ExpArray_init failed"); goto fail2; } struct substring *elem = &((struct substring *)o->arr.v)[o->num]; if (!(elem->data = BAlloc(start))) { ModuleLog(i, BLOG_ERROR, "BAlloc failed"); goto fail2; } memcpy(elem->data, data, start); elem->len = start; o->num++; if (is_end) { break; } data += start + del_len; len -= start + del_len; limit--; } BFree(table); // signal up NCDModuleInst_Backend_Up(i); return; fail2: while (o->num-- > 0) { BFree(((struct substring *)o->arr.v)[o->num].data); } free(o->arr.v); fail1: BFree(table); fail0: NCDModuleInst_Backend_DeadError(i); }
int main () { uint16_t a = 17501; uint64_t c = 82688926; uint16_t d1 = 1517; uint16_t d2 = 1518; uint8_t e = 72; const char *f = "hello world"; const char *g = "helo"; // encode message int len = msg1_SIZEa + msg1_SIZEc + msg1_SIZEd + msg1_SIZEd + msg1_SIZEe + msg1_SIZEf(strlen(f)) + msg1_SIZEg; uint8_t *msg = (uint8_t *)BAlloc(len); ASSERT_FORCE(msg) msg1Writer writer; msg1Writer_Init(&writer, msg); msg1Writer_Adda(&writer, a); msg1Writer_Addc(&writer, c); msg1Writer_Addd(&writer, d1); msg1Writer_Addd(&writer, d2); msg1Writer_Adde(&writer, e); uint8_t *f_dst = msg1Writer_Addf(&writer, strlen(f)); memcpy(f_dst, f, strlen(f)); uint8_t *g_dst = msg1Writer_Addg(&writer); memcpy(g_dst, g, strlen(g)); int len2 = msg1Writer_Finish(&writer); ASSERT_EXECUTE(len2 == len) // parse message msg1Parser parser; ASSERT_EXECUTE(msg1Parser_Init(&parser, msg, len)) // check parse results uint16_t p_a; uint64_t p_c; uint16_t p_d1; uint16_t p_d2; uint8_t p_e; uint8_t *p_f; int p_f_len; uint8_t *p_g; ASSERT_EXECUTE(msg1Parser_Geta(&parser, &p_a)) ASSERT_EXECUTE(msg1Parser_Getc(&parser, &p_c)) ASSERT_EXECUTE(msg1Parser_Getd(&parser, &p_d1)) ASSERT_EXECUTE(msg1Parser_Getd(&parser, &p_d2)) ASSERT_EXECUTE(msg1Parser_Gete(&parser, &p_e)) ASSERT_EXECUTE(msg1Parser_Getf(&parser, &p_f, &p_f_len)) ASSERT_EXECUTE(msg1Parser_Getg(&parser, &p_g)) ASSERT(p_a == a) ASSERT(p_c == c) ASSERT(p_d1 == d1) ASSERT(p_d2 == d2) ASSERT(p_e == e) ASSERT(p_f_len == strlen(f) && !memcmp(p_f, f, p_f_len)) ASSERT(!memcmp(p_g, g, strlen(g))) ASSERT(msg1Parser_GotEverything(&parser)) BFree(msg); return 0; }