Выбрать главу

// ...

}

*

Определить тип параметра. Если строка начинается с дефиса (-), это одна из опций { h, d, v, l, o}. В противном случае это может быть либо значение, ассоциированное с опцией (максимальный размер для -l, имя выходного файла для -o), либо имя входного файла. Чтобы определить, начинается ли строка с дефиса, используем инструкцию switch:

switch ( pchar[ 0 ] ) {

case '-': {

// -h, -d, -v, -l, -o

}

default: {

// обработаем максимальный размер для опции -1

// имя выходного файла для -o

// имена входных файлов ...

}

}

*

Реализуем обработку двух случаев пункта 2.

Если строка начинается с дефиса, мы используем switch по следующему символу для определения конкретной опции. Вот общая схема этой части программы:

case '-': {

switch( pchar[ 1 ] )

{

case 'd':

// обработка опции debug

break;

case 'v':

// обработка опции version

break;

case 'h':

// обработка опции help

break;

case 'o':

// приготовимся обработать выходной файл

break;

case 'l':

// приготовимся обработать макс.размер

break;

default:

// неопознанная опция:

// сообщить об ошибке и завершить выполнение

}

}

Опция -d задает необходимость отладки. Ее обработка заключается в присваивании переменной с объявлением

bool debug_on = false;

значения true:

case 'd':

debug_on = true;

break;

В нашу программу может входить код следующего вида:

if ( debug_on )

display_state_elements( obj );

Опция -v выводит номер версии программы и завершает исполнение:

case 'v':

cout program_name "::"

program_version endl;

return 0;

Опция -h запрашивает информацию о синтаксисе запуска и завершает исполнение. Вывод сообщения и выход из программы выполняется функцией usage():

case 'h':

// break не нужен: usage() вызывает exit()

usage();

Опция -o сигнализирует о том, что следующая строка содержит имя выходного файла. Аналогично опция -l говорит, что за ней указан максимальный размер. Как нам обработать эти ситуации?

Если в строке параметра нет дефиса, возможны три варианта: параметр содержит имя выходного файла, максимальный размер или имя входного файла. Чтобы различать эти случаи, присвоим true переменным, отражающим внутреннее состояние:

// если ofi1e_on==true,

// следующий параметр - имя выходного файла

bool ofi1e_on = false;

// если ofi1e_on==true,

// следующий параметр - максимальный размер

bool limit_on = false;

Вот обработка опций -l и -o в нашей инструкции switch:

case 'l':

limit_on = true;

break;

case 'o':

ofile_on = true;

break;

Встретив строку, не начинающуюся с дефиса, мы с помощью переменных состояния можем узнать ее содержание:

// обработаем максимальный размер для опции -1

// имя выходного файла для -o

// имена входных файлов ...

default: {

// ofile_on включена, если -o встречалась

if ( ofile_on ) {

// обработаем имя выходного файла

// выключим ofile_on

}

else if ( limit_on ) { // если -l встречалась

// обработаем максимальный размер

// выключим limit_on

} else {

// обработаем имя входного файла

}

}

Если аргумент является именем выходного файла, сохраним это имя и выключим ofile_on:

if ( ofile_on ) {

ofile_on = false;

ofile = pchar;

}

Если аргумент задает максимальный размер, мы должны преобразовать строку встроенного типа в представляемое ею число. Сделаем это с помощью стандартной функции atoi(), которая принимает строку в качестве аргумента и возвращает int (также существует функция atof(), возвращающая double). Для использования atoi() включим заголовочный файл ctype.h. Нужно проверить, что значение максимального размера неотрицательно и выключить limit_on:

// int limit;

else

if ( limit_on ) {

limit_on = false;

limit = atoi( pchar );

if ( limit 0 ) {

cerr program_name "::"

program_version " : error: "

"negative value for limit.\n\n";

usage( -2 );

}