Option.c ?? please explain me this one. I need only the while portion of it.
/* Utility function to extract option flags from the command line. */
cat.c // I understood this one. Just to show how Options.c is implementedCode://Option.c #include "Everything.h" #include <stdarg.h> DWORD Options (int argc, LPCTSTR argv [], LPCTSTR OptStr, ...) /* argv is the command line. The options, if any, start with a '-' in argv[1], argv[2], ... OptStr is a text string containing all possible options, in one-to-one correspondence with the addresses of Boolean variables in the variable argument list (...). These flags are set if and only if the corresponding option character occurs in argv [1], argv [2], ... The return value is the argv index of the first argument beyond the options. */ { 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] == _T('-'); iArg++) *pFlag = _memtchr (argv [iArg], OptStr [iFlag], _tcslen (argv [iArg])) != NULL; iFlag++; } va_end (pFlagList); for (iArg = 1; iArg < argc && argv [iArg] [0] == _T('-'); iArg++); return iArg; }
Code:/* cat [options] [files] Only the -s option is used. Others are ignored. -s suppresses error report when a file does not exist */ #include "Everything.h" #define BUF_SIZE 0x200 static VOID CatFile (HANDLE, HANDLE); int _tmain (int argc, LPTSTR argv []) { HANDLE hInFile, hStdIn = GetStdHandle (STD_INPUT_HANDLE); HANDLE hStdOut = GetStdHandle (STD_OUTPUT_HANDLE); BOOL dashS; int iArg, iFirstFile; /* dashS will be set only if "-s" is on the command line. */ /* iFirstFile is the argv [] index of the first input file. */ iFirstFile = Options (argc, argv, _T("s"), &dashS, NULL); if (iFirstFile == argc) { /* No files in arg list. */ CatFile (hStdIn, hStdOut); return 0; } /* Process the input files. */ for (iArg = iFirstFile; iArg < argc; iArg++) { hInFile = CreateFile (argv [iArg], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hInFile == INVALID_HANDLE_VALUE) { if (!dashS) ReportError (_T ("Cat Error: File does not exist."), 0, TRUE); } else { CatFile (hInFile, hStdOut); if (GetLastError() != 0 && !dashS) { ReportError (_T ("Cat Error: Could not process file completely."), 0, TRUE); } CloseHandle (hInFile); } } return 0; } static VOID CatFile (HANDLE hInFile, HANDLE hOutFile) { DWORD nIn, nOut; BYTE buffer [BUF_SIZE]; while (ReadFile (hInFile, buffer, BUF_SIZE, &nIn, NULL) && (nIn != 0) && WriteFile (hOutFile, buffer, nIn, &nOut, NULL)); return; }



1Likes
LinkBack URL
About LinkBacks



