131: }
132:
133: /* удалить определенную запись; имя передается в качестве
134: аргумента командной строки */
135: int delRecord(int argc, char ** argv) {
136: DEPOT * dp;
137: int rc;
138:
139: /* ожидается только один аргумент */
140: if (argc != 1) usage();
141:
142: /* открыть базу данных для обновления */
143: if (!(dp = openDatabase(1))) return 1;
144:
145: if (!(rc = dpout(dp, argv[0], -1))) {
146: if (dpecode == DP_ENOITEM)
147: fprintf(stderr, '%s не существует
', argv[0]);
148: else
149: fprintf(stderr, 'ошибка удаления элемента: %s
',
150: dperrmsg(dpecode));
151:
152: rc = 1;
153: }
154:
155: dpclose(dp);
156:
157: return rc;
158: }
159:
160: /* вывести список всех записей, имеющихся в базе данных */
161: int listRecords(void) {
162: DEPOT * dp;
163: char * key, * value;
164:
165: /* открыть базу данных только для чтения */
166: if (!(dp = openDatabase(0))) return 1;
167:
168: dpiterinit(dp);
169:
170: /* итерация по всем записям */
171: while ((key = dpiternext(dp, NULL))) {
172: value = dpget(dp, key, -1, 0, -1, NULL);
173: printf('%s %s
', key, value);
174: }
175:
176: dpclose(dp);
177:
178: return 0;
179: }
180:
181: int main(int argc, char ** argv) {
182: if (argc == 1) usage();
183:
184: /* найти флаг режима и вызвать соответствующую функцию
185: с остальными аргументами */
186: if (!strcmp(argv[1], '-а'))
187: return addRecord(argc - 2, argv + 2);
188: else if (!strcmp(argv[1], '-q'))
189: return queryRecord(argc - 2, argv + 2);
190: else if (!strcmp(argv[1], '-d'))
191: return delRecord(argc - 2, argv + 2);
192: else if (!strcmp(argv[1], '-l')) {
193: if (argc != 2) usage();
194: return listRecords();
195: }
196:
197: usage(); /* не обнаружено никаких параметров */
198: return 0; /* возврат */
199: }
Глава 26
Синтаксический анализ параметров командной строки
Многие Linux-программы позволяют задавать параметры командной строки. Эти параметры выполняют самые разнообразные функции, однако имеют практически одинаковую синтаксическую структуру. Короткие параметры состоят из символа -
, за которым следует один алфавитно-цифровой символ. Длинные параметры, обычные для утилит GNU, состоят из пары символов --
, за которыми следует строка, состоящая из букв, цифр и дефисов. После любого из этих параметров может стоять аргумент. Пробел отделяет короткий параметр от его аргументов, а пробел или знак равенства отделяют длинный параметр от аргумента.
Проверить синтаксис параметров командной строки можно многими способами. Наиболее популярным методом является проверка синтаксиса массива argv
, выполняемая вручную. Помочь в проверке синтаксиса параметров могут библиотечные функции getopt()
и getoptlong()
. Функция getopt()
присутствует во многих реализациях Unix, однако она поддерживает только короткие параметры. Функция getoptlong()
доступна в Linux и позволяет автоматически анализировать синтаксис коротких и длинных параметров[181].
Библиотека popt
предназначена специально для синтаксического анализа параметров. По сравнению с функциями getopt()
она обладает некоторыми преимуществами.
• В ней не используются глобальные переменные, что позволяет применять ее при многократных проходах, необходимых для синтаксического анализа argv
.
• Она может анализировать синтаксис произвольного массива, состоящего из элементов в стиле argv
. Поэтому библиотеку popt
можно применять для синтаксического анализа текстовых строк, представленных в стиле командной строки, из любого источника.