Программа А.7. Функция Options

/* Служебная функция для извлечения флагов опций из командной строки. */

#include "EvryThng.h"

#include <stdarg.h>

DWORD Options(int argc, LPCTSTR argv[], LPCTSTR OptStr, ...)

/* argv — командная строка. Параметры (опции), если они нужны, начинаются с символа '-' в argv[1], argv[2], ….

OptStr — текстовая строка, содержащая все возможные параметры, находящиеся во взаимно-однозначном соответствии с адресами булевских переменных в списке аргументов (...). Эти флаги устанавливаются тогда и только тогда, когда символ соответствующей опции встречается в argv[1], argv[2], …Возвращаемым значением является индекс (в argv) первого аргумента, указанного вслед за опциями. */

{

va_list pFlagList;

LPBOOL pFlag;

int iFlag = 0, iArg;

va_start(pFlagList, OptStr);

while ((pFlag = va_arg(pFlagList, LPBOOL)) != NULL && iFlag < (int)_tcslen(OptStr)) {

*pFlag = FALSE;

for (iArg = 1; !(*pFlag) && iArg < argc && argv[iArg][0] == '-'; iArg++) *pFlag = _memtchr(argv[iArg], OptStr[iFlag], _tcslen(argv[iArg])) != NULL;

iFlag++;

}

va_end(pFlagList);

for (iArg = 1; iArg < argc && argv[iArg][0] == '-'; iArg++);

return iArg;

}

SkipArg.с

Эта функция обрабатывает командную строку, пропуская одно поле, отделенное пробельным символом. Впервые используется в программе timep (программа 6.2).

Программа А.8. Функция SkipArg

/* SkipArg.с

Пропуск одного аргумента командной строки – символы табуляции и пробела пропускаются. */

#include "EvryThng.h"

LPTSTR SkipArg(LPCTSTR targv) {

LPTSTR p;

p = (LPTSTR)targv;

/* Перейти к следующему символу табуляции или пробела. */

while (*р != '\0' && *р != TSPACE && *р != TAB) p++;

/* Пропустить символы табуляции и пробела и перейти к следующему аргументу. */

while (*р != '\0' && (*р == TSPACE || *р == TAB)) p++;

return р;

}

GetArgs.с

Эта функция просматривает строку, отыскивая слова, разделенные символами пробелов или табуляции, и помещает результат в массив строк, передаваемый функции. Эта функция может пригодиться для преобразования командной строки в массив argv[] и впервые используется в программе JobShell в главе 6. Функция Win32 CommandLineToArgW решает ту же задачу, но сфера ее применимости ограничивается символами Unicode.

Программа А.9. Функция GetArgs

/* GetArgs. Преобразует командную строку к виду argc/argv. */

#include "EvryThng.h"

VOID GetArgs(LPCTSTR Command, int *pArgc, LPTSTR argstr[]) {

int i, icm = 0;

DWORD ic = 0;

for (i = 0; ic < _tcslen(Command); i++) {

while (ic < _tcslen(Command) && Command[ic] != TSPACE && Command [ic] != TAB) {

argstr[i][icm] = Command[ic];

ic++;

icm++;

}

argstr[i][icm] = '\0';

while (ic < _tcslen(Command) && (Command[ic] == TSPACE || Command[ic] == TAB)) ic++;

icm = 0;

}

if (pArgc != NULL) *pArgc = i;

return;

}

ПРИЛОЖЕНИЕ Б

Наши рекомендации