Getting ellipses function parameters without an initial argument

Posted by Tox1k on Stack Overflow See other posts from Stack Overflow or by Tox1k
Published on 2012-10-27T04:10:51Z Indexed on 2012/10/27 5:02 UTC
Read the original article Hit count: 206

Filed under:
|
|
|

So I've been making a custom parser for a scripting language, and I wanted to be able to pass only ellipses arguments. I don't need or want an initial variable, however Microsoft and C seem to want something else. FYI, see bottom for info.

I've looked at the va_* definitions

#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap)      ( ap = (va_list)0 )

and the part I don't want is the v in va_start. As a little background I'm competent in goasm and I know how the stack works so I know what's happening here. I was wondering if there is a way to get the function stack base without having to use inline assembly.

Ideas I've had:

#define im_va_start(ap) (__asm { mov [ap], ebp })

and etc... but really I feel like that's messy and I'm doing it wrong.

struct function_table {
    const char* fname;
    (void)(*fptr)(...);
    unsigned char maxArgs;
};
function_table mytable[] = {
{ "MessageBox", &tMessageBoxA, 4 } };

... some function that sorts through a const char* passed to it to find the matching function in mytable and calls tMessageBoxA with the params. Also, the maxArgs argument is just so I can check that a valid number of parameters is being sent. I have personal reasons for not wanting to send it in the function, but in the meantime we can just say it's because I'm curious.

This is just an example; custom libraries are what I would be implementing so it wouldn't just be calling WinAPI stuff.

void tMessageBoxA(...) {
// stuff to load args passed
MessageBoxA(arg1, arg2, arg3, arg4);
}

I'm using the __cdecl calling convention and I've looked up ways to reliably get a pointer to the base of the stack (not the top) but I can't seem to find any. Also, I'm not worried about function security or typechecking.

© Stack Overflow or respective owner

Related posts about c++

Related posts about parsing