Hello !

I have the code bellow that I want to manually allocate to use in runtime code, because I declared the payload "buf[1]" the compiler complains about index out of bounds then I managed to do this "*(&tmp.buf + tmp.used++) = c;" instead of "tmp.buf[tmp.used++] = c;" as is done usually i "C" there is another easy way to achieve the same result in "D" (remember manual memory allocation) ?

Cheers !

--------Code

struct lua_char_buffer_st {
    size_t size, used;
    char buf[1];
};

private enum MIN_ALLOC_SIZE = 2048;
private size_t NEW_SIZE(size_t sz) {return (((sz/MIN_ALLOC_SIZE)+1)*MIN_ALLOC_SIZE);}

lua_char_buffer_st *lua_new_char_buffer(size_t size){
        lua_char_buffer_st *b;
        size_t n = NEW_SIZE(size);
b = cast(lua_char_buffer_st*)malloc(lua_char_buffer_st.sizeof + n);
        if(b is null) return null;
        b.size = n;
        b.used = 0;
        return b;
}

int lua_char_buffer_add_char(ref LuaMatchState ms, lua_char_buffer_st **b, char c){
    lua_char_buffer_st *tmp = *b;
    if(tmp.used+1 >= tmp.size){
        size_t new_size = tmp.size+MIN_ALLOC_SIZE;
tmp = cast(lua_char_buffer_st*)realloc(tmp, lua_char_buffer_st.sizeof + new_size);
        if(tmp is null){
            ms.error = "not enough memory when reallocating";
            return 0;
        }
        *b = tmp;
        tmp.size = new_size;
    }
    *(&tmp.buf + tmp.used++) = c;
    return 1;
}


int lua_char_buffer_add_str(ref LuaMatchState ms, lua_char_buffer_st **b, const(char) *str, ptrdiff_t len){
    lua_char_buffer_st *tmp = *b;
    if(len < 0) len = strlen(str);
    if(tmp.used+len >= tmp.size){
        size_t new_size = tmp.size + NEW_SIZE(len);
tmp = cast(lua_char_buffer_st*)realloc(tmp, lua_char_buffer_st.sizeof + new_size);
        if(tmp is null){
            ms.error = "not enough memory when reallocating";
            return 0;
        }
        *b = tmp;
        tmp.size = new_size;
    }
    memcpy(&tmp.buf + tmp.used, str, len);
    tmp.used += len;
    return 1;
}

Reply via email to