Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
0
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);
}
Beispiel #4
0
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;
}