Я программирую на C против сторонней библиотеки (в HP / Mercury Loadrunner), которая допускает список аргументов переменного размера в стиле varargs для одной из своих функций. Я хочу вызвать эту функцию, но я не знаю заранее, сколько аргументов у меня будет.
Есть функция, созданная одним из моих предшественников, которая несколько служит, но проблема здесь в том, что эта функция предполагает сценарий наихудшего случая (более 3000 аргументов) и коды для этого.
Чтобы осветить, вот (начало) кода. Функция, которую мы вызываем, web_submit_data()
. Это HTTP отправит набор данных формы. Эта реализация возникла при работе с динамически генерируемыми формами с произвольным числом полей.
(Немного почищен от оригинала, который также вручную кодирует индексы ..)
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]);
}
Теперь я нашел внешнюю библиотеку, которая могла бы работать (http://www.dyncall.org), но я бы предпочел не а) полностью зависеть от процессора и б) попытаться научить Loadrunner ссылкам во внешних источниках.
Edit:
Оригинальная функция использовала жестко закодированные индексы вместо использования переменной. Можно все же вернуться к этому, если окажется слишком непредсказуемым. Однако, поскольку я вряд ли смогу запустить это с другим компилятором или оборудованием / ОС, я сомневаюсь, что это действительно того стоит.
Также: у меня нет контроля над реализацией web_submit_data (). Таким образом, просто отодвинуть проблему вниз на один уровень не удастся ее урезать.
Еще один момент, на который следует обратить внимание: спецификация для web_submit_data()
использует константу с именем LAST, чтобы отметить конец списка аргументов. Оригинальная реализация не использует его. Предположительно, это место звонка ..