Книга: Системное программирование в среде Windows

Дополнительные служебные программы

Дополнительные служебные программы

Имеются три дополнительных программы, а именно, Options, SkipArg и GetArgs, которые достаточно полезны, чтобы привести здесь их листинги. В то же время, ни одна из этих программ не привязана жестко к Win32. 

Options.с

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

Программа А.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 (*р != '' && *р != TSPACE && *р != TAB) p++;
 /* Пропустить символы табуляции и пробела и перейти к следующему аргументу. */
 while (*р != '' && (*р == 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] = '';
  while (ic < _tcslen(Command) && (Command[ic] == TSPACE || Command[ic] == TAB)) ic++;
  icm = 0;
 }
 if (pArgc != NULL) *pArgc = i;
 return;
}
 

Оглавление книги


Генерация: 5.281. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз