Appeler dynamiquement une fonction C avec un argument varargs

Je suis à la programmation en C à l'encontre d'un tiers de la bibliothèque (en HP/Mercury Loadrunner) qui permet à un varargs style de taille variable de la liste d'arguments pour l'un de ses fonctions. Je tiens à appeler cette fonction, mais je ne sais pas à l'avant combien d'arguments, je vais avoir.

Il y a une fonction faite par un de mes prédécesseurs qui sert un peu, mais le problème est que cette fonction suppose que le scénario du pire des cas (plus de 3000 arguments) et de la main-codes pour.

Pour éclairer, voici le (début du) du code. La fonction nous l'appelons, est web_submit_data(). Il HTTP post un ensemble de données de formulaire. Cette mise en œuvre est venu à propos, lorsque l'on traite avec générées dynamiquement les formulaires avec un nombre arbitraire de champs.
(Nettoyé un peu juste de l'original, la main qui codé de l'index de la main ainsi..)


web_submit_data_buffer_gazillion_items( const char *bufferName, const char *bufferValue)
{
    const int size = 129;
    int i = 0;
    int j = 11;

    web_submit_data(&bufferName[i++ * size], //"some form"
                &bufferName[i++ * size], //"Action=https://blah.blah/form");
                &bufferName[i++ * size], //"Method=POST");
                &bufferName[i++ * size], //"TargetFrame=");
                &bufferName[i++ * size], //"RecContentType=text/html");
                &bufferName[i++ * size], //"Referer=https://blah.blah/index.html");
                &bufferName[i++ * size], //"Snapshot=t1.inf");
                &bufferName[i++ * size], //"Mode=HTML");
                ITEMDATA,  //missing in action: indexes 8 through 10
                &bufferName[j * size],&bufferValue[j++ * size], ENDITEM, 
                &bufferName[j * size],&bufferValue[j++ * size], ENDITEM, 
                &bufferName[j * size],&bufferValue[j++ * size], ENDITEM, 
..
(repeat the last 3 lines ad nauseum)
..
                &bufferName[j * size],&bufferValue[j++ * size], ENDITEM,
                &bufferName[j * size]);  
}

Maintenant, j'ai trouvé une bibliothèque externe qui pourrait fonctionner ( http://www.dyncall.org ), mais je préférerais ne pas) être complètement processeur personne à charge, et b) d'enseigner Loadrunner sur la liaison dans des sources externes..

Edit:
La fonction d'origine utilisé codé en dur index au lieu d'utiliser une variable. Pouvez toujours y revenir si il s'avère être trop imprévisible. Cependant, comme je suis peu probable pour exécuter ce avec un compilateur différent ou de matériel /OS je doute que ce est vraiment la peine.

Aussi: je n'ai pas de contrôle sur la mise en œuvre de web_submit_data(). Donc, juste repousser le problème à plus d'un niveau ne va pas le couper..

Une autre chose à noter: La spec pour web_submit_data() utilise une constante appelée DERNIER pour marquer la fin de la liste d'arguments. La mise en œuvre originale ne l'utilise pas. Sans doute le callsite n' ..

source d'informationauteur Randakar