Greg Obleshchuk wrote:

Hi Chris,
Thanks for your reply. I do have a different way of handling it in C# but I am passing the call on to the sqlite_vmprintf function (in printf.c and that accepts a va_list)
The way around it that I use is having a switch statement and if the use passes one parameter the I calls sqlite_vmprintf with one parame , if two it calls it with two and so on. If I could build a va_list then I would built it and just call sqlite_vmprintf once.

Hi Greg,


it *might* work building up a (CPU-)stack-like structure holding all the parameters, which, of course should be only int's and const char*. To outline this, have a look at this example, which is C++:

struct value {
        enum Type { Int, String } type;
        int i;
        std::string s;
};

typedef vector<value> Values;

void run_vprintf(const char* fmt, const Values& v)
{
        //
        // The size of a single element
        unsigned el = max(sizeof(int), sizeof(char*);

        //
        // allocate a memory block for all values in v.
        // Will be freed automatically on return
        char* p = (char*) alloca(v.size() * el);
        
        //
        // The stack, as we are used to it, grows downwards.
        // If it wouldn't we had to use begin()/end() here.
        Values::const_reverse_iterator it = v.rbegin();
        Values::const_reverse_iterator end = v.rend();

        while(it != end) {
                switch(it->type) {
                case value::Int:
                        *(int*)d = it->i;
                        break;
                case value::String:
                        *(char*)d = it->s.c_str();
                        break;
                }
                ++it;
        }

        // now we put the values on to a pseudo "stack".
        // Create a va_arg for the first parameter. In the downward
        // growing scenario this is at p + (v.size()-1)*el
        va_list ap;
        va_start(ap, (int&)(p + (v.size()-1)*el));

        // now do whatever you want...
}

well, above code is what I would try... and of course, it is fully
nonportable. Maybe I would consider not using sqlite_vmprintf)( at all.

/eno


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to