LINUX.ORG.RU

Кошерная обработка параметров командной строки

 


0

3

Знаю, вопрос уже избитый. Но вот никак ничего подходящего для меня не могу найти. Отсюда (перечень гнутых утилит для обработки параметров) "в сыром виде" ничего не подходит.

Когда-то я накатал себе такую штуку, позволяющую легко при помощи одной структуры парсить опции, заполняя глобальные параметры, а также формировать строку помощи.

Но вот понадобилось мне реализовать возможность задания определенных параметров несколько раз. И пришлось ваять это (почти весь день сегодня убил, благо, полдня ЛОР лежал и ничто не отвлекало). (на ЖЖшке).

Вот что получается при запуске:

./myopt_example -a 1e-5 -f type=as:xsz=5s something -a 3e-9 -f type=med:ysz=15 some_more -s again -f xsz=5 -s more -M diam=8:foc=10 -vvvv
Globals:
S_dev = 8 (default)
randAmp[0]: 1e-05
randAmp[1]: 3e-09
meet str args:
str[0] = again
str[1] = more
S_interp = 100
S_image = 1000
N_phot = 10000
randMask = 0
Mirror =
	D = 8
	F = 10
	Zincl = 0
	Aincl = 0
rewrite_ifexists = 0
verbose = 4
There's also 2 free parameters:
	   0: something
	   1: some_more
filter parameters:
0:
Wrong argument "5s" of parameter "xsz"
	bad params
1:
	filtertype = med, sizes: 3x15
2:
	filtertype = (null), sizes: 5x3
Т.е. есть переменные с инкрементом (-v — чем больше раз встречается, тем больше число), массивы (randAmp, str), обработка по порядку свободных параметров (something, some_more), предварительная (до передачи управления обратно в вызвавшую parce_args функцию) обработка вложенных аргументов и постобработка вложенных аргументов (filter parameters) — уже вне велосипеда.

Однако, скажем, ffmpeg умеет делать такие сложные вещи, как определение групп параметров между одноименными ключами. Как бы и мне сделать так, чтобы, скажем,

./myopt_example -f filt1:xzs=10 -h 10 -v 20 -f filt2:ysz=20 -s par -f filt3
Автоматом бы связывал каким-то образом параметры, чтобы при обработке первого -f к нему же были привязаны -h, -v; при обработке второго — -s?

Есть ли вообще библиотеки, умеющие сложный парсинг аргументов командной строки без съезжания крыши у пишущего код? А то я со своим-то велосипедом чуть не рехнулся с этими двойными и тройными указателями!

☆☆☆☆☆

Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

Я вот вечерком на работе полистал pdf'ку. Так и не понял, чем же мне луа в данном случае поможет! Обычный ЯП, не имеющий никаких преимуществ перед С.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

ну, это как посмотреть. на lua-то покороче скриптики будут, чем на сишечке. возни меньше, расход мозгового вещества меньше, скорость разработки выше. при этом lua довольно шустрый и, в отличие от питона, лёгкий и не жрёт ресурсы. к тому же на lua может писать почти любой ламер и можно выносить из Си некоторые логические части, которые могут изменяться юзером и подгружаться на ходу. например, мы так делали загрузку тарифов в телекоме: логику тарификации невозможно было заранее предугадать или как-то классифицировать в удобный для программирования вид, хардкодить было некомильфо, и тут подгрузка lua скриптов оказалась очень кстати. сишный сервре дёргал логику, написанную на lua. мы легко и быстро могли добавлять или менять логику любых хитрожопых тарифов, даже не останавливая сервер. есть ещё лисп такой, который в Си встраивается. но лисп более специфичен и реже встречается в проектах.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Eddy_Em

Я вот вечерком на работе полистал pdf

:-) я как-то тоже полистал аналогичную pdf-ку :-)

результатом стал эпичный попадос.. очень простой язык, но плохо совместимый сам-с-собой от версии к версии и без подобия стандартных библиотек. Идеалогия «всё что юзер может сделать на С пусть делает сам» ведёт к тому что в проект попадают скрипты написанные на lua и к ним расширения lua написанные на C. Зверский венигрет.

MKuznetsov ★★★★★
()
Ответ на: комментарий от Eddy_Em

ну, просто был опыт применения конкретно lua в разных ситуациях. на мейнфреймовых серверах, где крутился софт для обслуживания миллионов сессий. и наоборот, в мелких эмбеддед девайсах, где на всё про всё 32 метра памяти и 2 метра флэша. на мой взгляд, lua показал себя неплохо и я против него ничего не имею. на нём даже сайты писать можно. коряво, но можно.
хотя у lua нет изящества и гибкости сишечки. это не инструмент для художественной работы. это чисто такой канцелярский ножичек для всякой рутины. вполне себе удобный, но без изысков.

Iron_Bug ★★★★★
()
Ответ на: комментарий от anonymous

В общем очень годная штука с маленьким рантаймом

Анонимус только забыл раскрыть тему численных типов в LUA. До версии 5.3 целочисленных типов просто не было: только double со всеми вытекающими (например, массив — это всегда хеш-таблица, потому что целочисленных типов для индексов не завезли).

kawaii_neko ★★★★
()
Ответ на: комментарий от Iron_Bug

Луа это скриптинг; игроделов, которые делают на нём развесистое поведение, я не понимаю. Микроскриптинг, во. И конфиги. Скажем, описать расположение на экране (экранах) каких-нибудь окон с информацией. Или порядок наложения фильтров на сигнал и их параметры. Для этого луа хорош

Deleted
()
Ответ на: комментарий от Eddy_Em

Я конвертирую в void* именно из-за того, что могу любые типы данных разгребать. А не только строки!

твою функцию get_aptr надо показывать студентам, и пока они не найдут 5 недостатков, зачет по программированию не ставить (а вообще там вроде их 8, но я уже со счета сбился)

касательно void* — в си можно сделать что-то похожее и на шаблоны с++ (на препроцессоре), и на ооп, и тогда там void* не нужен

вообще, эдди, не пиши *такое* на си — пиши фильтры

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Pavval

Клинический случай. А почему компилятору не передавать всю программу через командную строку? А то файлы еще какие выдумали...

eddycc -istdio.h --function=main::int --call=printf -p"Hello World" --endfunction

не путай «файлы vs. комстрока» и «нормальный язык программирования vs. язык опций»

безфайловый вариант

eddycc -e 'printf("Hello World")'

кое-где полезен

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Deleted

я никогда не занималась играми. но в целом представляю себе, что на серверных приложениях на lua удобно писать логику, которая может меняться, причём внезапно и в неожиданную сторону. то, что нельзя заранее предсказать и заложить в логику работы сервера. подгружаемая логика, которую легко изменять и можно подгружать на ходу - это практично для серверов, которые работают под высокой нагрузкой и которые нельзя передёргивать и отрубать без особо важных причин. может, писатели игр имеют такие же требования и используют lua.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Eddy_Em

Эдак с такой тенденцией ты сама начнешь первой меня к тиклю склонять

да может даже и тикль — если умеешь на нем писать, то интерфейс к твоим фильтрам можно сделать много быстрее 3 дней

но если речь об интерфейсах зашла — я бы предложил html (может+js), в котором генерится строка длинных опций для фильтров

а удобство коротких опций, которого ты добиваешься, возможно совсем не окупает труд, на него требующийся

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Iron_Bug

может, писатели игр имеют такие же требования и используют lua

думаю, там совсем иная причина — обезьянок людей, пишущих игру поверх движка, подпускать к указателям нельзя, да и вообще надо всячески контролировать

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Eddy_Em

к тиклю

кстаааааати... а есть ли такой getopt, который умеет генерить хтмл-страницы с формами (а затем, понятное дело, парсить ответ)?

ну и тикль можно было бы генерить... хотя и не очень нужно на самом деле

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от Deleted

Микроскриптинг, во.

меня что в луа *совсем* не устраивает — так это отсутствие собственных операторов (скажем «<=>»)

интересный вопрос — а существует ли в природе хорошая «заготовка для языка» — такой вот слегка расширенный луа, не навязывающий своих решений?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Да я уже добавил конвейер обработки параметров. Сейчас буду писать собственно реализацию. Сами фильтры (точнее, приличная часть: кое-какие вещи я еще не доделал) уже есть: медиана, адаптивная медиана, фильтры свертки через БПФ (лапласиан гауссианы, гауссиана, Собели/Прюитты/Щарры), из попиксельных пока только постеризацию запилил, но в загашнике уже давно есть еще и сегментация (сделал свою реализацию для 4- и 8-связанных областей, т.к. в лептонике медленно и неудобно) и построение изофот (методом шагающих квадратов с вычислением нормальных замкнутых изофот, а не каляканием картинок).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Вы хочите веб-морды?

я хочу чтобы веб-морда *автоматически* генерилась из *того же самого* описания, что и опции ком-строки

мне бы такая getopt пригодилась, да думаю и весьма многим

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

твою функцию get_aptr надо показывать студентам, и пока они не найдут 5 недостатков, зачет по программированию не ставить (а вообще там вроде их 8, но я уже со счета сбился)

касательно void* — в си можно сделать что-то похожее и на шаблоны с++ (на препроцессоре), и на ооп, и тогда там void* не нужен

слово «там» означало «в get_aptr», а не «в си» — в си без void* вообще говоря не обойтись

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Его, волшебным образом, намного больше! Да и на кой хрен генерить хытымль, если можно запустить CGI и через веб-морду работать с GUI?

Была бы у меня возможность GUI сделать, я бы так не парился! Но этой возможности нет, т.к. веб-морда в данном случае не подходит (слишком большие объемы данных гонять придется — браузер сдохнет нафиг), а для локальной GUI еще ни одной подобающей библиотеки нет. Было что-то на OpenGL, но давным-давно и уже вряд ли чем-нибудь поддерживается, а распылять свои ресурсы на написание GUI-библиотеки пока не хочется.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Да и на кой хрен генерить хытымль, если можно запустить CGI и через веб-морду работать с GUI?

ты, похоже, совсем не понял о чем я говорю, даже со второго раза

думай

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Я и с третьего не пойму, т.к. не Ванга!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от www_linux_org_ru

Что-то ты так и не написал, что там плохого. А между тем версия 0.0.1 уже работает!

Еще, конечно, дофига чего добавлять нужно, но уже даже этим велосипедом можно делать первичную обработку фитсов!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от www_linux_org_ru

ну да. есть такое. хотя я лично против того, чтобы из-за тупости программистов разработчики соглашались на деградацию производительности или на архитектурные костыли. надо наоборот, дотягивать недоразвитых до нужного уровня, а не снижать планку требований к софту. стараюсь, по мере сил, нести знания в массы и искореняю указателефобию, боязнь многопоточности и разного рода говнокод. с переменным успехом.

Iron_Bug ★★★★★
()
Ответ на: комментарий от anonymous

Позор на мою седую голову! Перед следующим коммитом обязательно пройдусь sed'ом, да и файл переименую s/parce/parse/g

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Iron_Bug

У китайцев и наоборот бывает. Я когда «вольтметры» на STM8 реверсил, просто офонарел: эти кони сначала развели «как удобно», а потом фигней маялись совершенно извращенской. Чего стоит только выдумывание программного I2C при существующем аппаратном! Только известное изречение Лаврова процитировать остается…

Eddy_Em ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.