Example #1
0
const char *
vp_decode(char *args)
{
    vp_stack_t stack;
    size_t len;
    char *str;
    char *p, *q;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_str(&stack, &str));

    len = strlen(str);
    if (len % 2 != 0) {
        return "vp_decode: invalid data length";
    }

    VP_RETURN_IF_FAIL(vp_stack_reserve(&_result,
            (_result.top - _result.buf) + (len / 2) + sizeof(VP_EOV_STR)));

    for (p = str, q = _result.top; p < str + len; ) {
        char hb, lb;

        hb = CHR2XD[(int)*(p++)];
        lb = CHR2XD[(int)*(p++)];
        if (hb != (char)-1 && lb != (char)-1) {
            *(q++) = (hb << 4) | lb;
        }
    }
    *(q++) = VP_EOV;
    *q = '\0';
    _result.top = q;

    return vp_stack_return(&_result);
}
Example #2
0
static const char *
vp_stack_push_str(vp_stack_t *stack, const char *str)
{
    size_t needsize;

    needsize = (stack->top - stack->buf) + strlen(str) + sizeof(VP_EOV_STR);
    VP_RETURN_IF_FAIL(vp_stack_reserve(stack, needsize));
    stack->top += sprintf(stack->top, "%s%c", str, VP_EOV);
    return NULL;
}
Example #3
0
/* push error message and return */
static const char *
vp_stack_return_error(vp_stack_t *stack, const char *fmt, ...)
{
    va_list ap;
    size_t needsize;

    needsize = (stack->top - stack->buf) + VP_ERRMSG_SIZE;
    if (vp_stack_reserve(stack, needsize) != NULL)
        return fmt;

    va_start(ap, fmt);
    stack->top += vsnprintf(stack->top,
            stack->size - (stack->top - stack->buf), fmt, ap);
    va_end(ap);
    return vp_stack_return(stack);
}
Example #4
0
const char *
vp_dlopen(char *args)
{
    vp_stack_t stack;
    char *path;
    void *handle;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_str(&stack, &path));
    VP_RETURN_IF_FAIL(vp_stack_reserve(&_result, VP_BUFSIZE));

    handle = dlopen(path, RTLD_LAZY);
    if (handle == NULL)
        return dlerror();
    vp_stack_push_num(&_result, "%p", handle);
    return vp_stack_return(&_result);
}
Example #5
0
static const char *
vp_stack_push_bin(vp_stack_t *stack, const char *buf, size_t size)
{
    size_t needsize;
    size_t i;
    char *bs;

    needsize = (stack->top - stack->buf) + (size * 2) + sizeof(VP_EOV_STR);
    VP_RETURN_IF_FAIL(vp_stack_reserve(stack, needsize));
    for (i = 0; i < size; ++i) {
        bs = (char *)&XD2CHR[(unsigned char)(buf[i]) * 2];
        *(stack->top++) = bs[0];
        *(stack->top++) = bs[1];
    }
    *(stack->top++) = VP_EOV;
    return NULL;
}