Я программирую на 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 обложению во внешних источниках.
Изменить: Исходная функция использовала жестко кодированные индексы вместо использования переменной. Может все же вернуться к этому, если окажется слишком непредсказуемым. Однако, поскольку я вряд ли буду запускать это с помощью другого компилятора или оборудования/ОС, я сомневаюсь, что это действительно того стоит.
Также: у меня нет контроля над реализацией web_submit_data(). Так что просто нажатие проблемы на один уровень не собирается сокращать ее.
Еще одно замечание: спецификация для web_submit_data()
использует константу LAST для обозначения конца списка аргументов. Исходная реализация не использует его. Предположительно, callsite делает..