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); }
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; }
/* 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); }
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); }
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; }