Автоматично викане на C функция от командния ред
Да кажем че имаме 1 или повече C функции със скаларни аргументи. Има ли инструмент/библиотека (нещо готово) което да wrap-не този код и да получим готов инструмент за командния ред?
В смисъл нещо което да хване типовете на аргументите, да формулира подходящ синтаксис за командния ред, да направи main() който да обработи argv/argc и/или stdin/std:cin (scanf-подобно) и да повика първоначалната функция? Може да е скрипт, код генератор и магия на модерно cpp.
Use case-а е примерно за тестване - ако имаме някакъв тонаж готови функции и трябва да се дадат на маймунки да ги тестват. Или ако има ценни алгоритми които да могат да се закачат на команден ред (pipe-ване) и да си работят.
Някаква аналогия са FFI подходите за връзки между различни езици, или RPC с разните IDL описания.
Идеята идва от една щуротия, с която се занимавах скоро - docopt парсер за командния ред:
https://github.com/docopt/docopt.cppПринципно първото ми ровене беше в друга посока и ще питам и него да не пускам друга тема. Търся добра библиотека за cpp (най-добре само хедър) за правене разни инструментчета от команден ред. Това има два аспекта:
- обработка на аргументите (argv/argc) - тук за момента тоя docopt ме радва, има и други идейни неща (CLI11)
- по-важното - работа със стандартния вход std:cin и сие - говоря за инструменти които мога да се закачат към дълъг стрийм от входни данни - примерно cat testcases.csv >> mytool.exe >> mynexttool.exe; в тоя файл може да има хиляди редове примерно, или файла да идва директно от изхода на curl/wget, или пък от tar на някакъв мулти-гигабатен файл
Това второто иска да се парсират по някакъв обявен формат/граматика идващите данни (примерно от оня csv файл, но може и да е нещо бинарно). Очакваният формат в някаква степен си е определен от функцията (или функциите) които са в тоя тул, но за просота да кажем че е само една функция.
Какво в C мога и трябва да интегрирам библиотечни функции и да ги викам в някакъв flow, така искам да мога лесно да го имам и на командния ред.
Та оттам идва и първото ми питане - както при RPC целта е да се хване прототипа и да се знае как да се повика, та и тук търся нещо подобно. Общо взето всеки формат за сериализиране на данни си има приложение за RPC - независимо дали ще е protobuf, msgpack, cbor или по-дървените xml. json.
Със сигурност има дълъг път в който да се анализира C-то, да се извади описание, да се кодгенерира нещо - ама се надявам че "модерното" cpp има нещо хитро в арсенала...
Edit: да допълня - очаквам "нещото" като си знае синтаксиса от прототипа да парсира stdin-а, като намери очаквания ред с данни за викането да викне моя код (синхронно - блокиращо), след което да си продължи да лапа байтовете от stdin-а и пак да се обади като обработи следващия ред и т.н. Т.е. event парсер по подобие на SAX.
Преди време рових доста по темата и бях набелязал няколко подходящи неща, но тогава приоритет беше парсирането на бинарни данни и тия "находки" съм ги затрил. Едното беше Kaitai struct, имаше и разните ANTLR и подобни.