понедельник, 9 ноября 2009 г.

Create argc+argv from string

очередной быстро сделаный велосипед. Такой себе переходничек из обычной С-шной строки в пару argc/argc. Понадобился когда по-быстрому переходил с использования коммандрой строки на конфиг файл.

input - исходная строка содержащая разделеный пробелами значения
buffer - память используемая под значения в output
char** output - собственно результат (argv, argc вернется как возвращаемое значение ф-ции)
+ константы максимального размера буфера
ф-ция возвращаес количество слов в output
/**
* create int arc + char** arv from a sting
*/

int
prepare_prog_options(const char* input,

char
* buffer,
int
buffer_size,
char
** output,
int
output_buff_size)
{


int
buffer_pos = 0;
int
argc = 0;

char
* word_start = buffer;
--
buffer_size;//we need one cell for last zero
--output_buff_size;

while
(buffer_size > buffer_pos &&
output_buff_size > argc){
if
(' ' == *input || 0 == *input){

if
(word_start != buffer + buffer_pos){
//current word have symbols
buffer[buffer_pos] = 0;

buffer_pos++;
output[argc] = word_start;
output[argc+1] = NULL;
++
argc;

word_start = buffer + buffer_pos;
}
++
input;
if
(0 == *input)

break
;
continue
;
}

buffer[buffer_pos] = *input;
buffer[buffer_pos+1] = 0;
++
buffer_pos;
++
input;
}


return
argc;
}


Пример использования:
char* str = " --test --hname mainHost --t 125";

char
buffer[1024];
char
* argv2[15];
int
argc = prepare_prog_options(str, buffer, 1024,argv2,15);


зы: если кто надумет использовать - делать это вдумчиво, код писался ночью и еще не проверялся со всеми вариантами(и не будет, в моем случае строки очень простые)

6 коммент.:

bialix комментирует...

Нафига нужны велосипеды, если на винде есть функция CommandLineToArgvW, а на посиксе shlex-split?

А по сути ваша функция огребёт проблемы на аргументах, взятых в кавычки.

cencio комментирует...

виндовс в данном случае абсолютно не актуален. а где в посиксе есть shlex_split? это питоновска фича

bialix комментирует...

да, это питоновская фича, но должна быть и библиотечная функция, иначе как бы это всё работало?

cencio комментирует...

может и есть(но это что-то вполне может быть на питоне написано), но попробуй ее найти. Точней всередине что-то есть, но оно наружу не выведено. Писать такой год быстрей чем гуглить

Max комментирует...

Из-за игнорирования кавычек это полурешение - велосипед без колес. два бала.
как минимум надо такое описывать.

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

cencio комментирует...

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