TextFile
| 590 | // TextFile |
| 591 | // |
| 592 | bool TextFile::_Open(LPCTSTR aFileSpec, DWORD &aFlags) |
| 593 | { |
| 594 | _Close(); |
| 595 | DWORD dwDesiredAccess, dwShareMode, dwCreationDisposition; |
| 596 | switch (aFlags & ACCESS_MODE_MASK) { |
| 597 | case READ: |
| 598 | dwDesiredAccess = GENERIC_READ; |
| 599 | dwCreationDisposition = OPEN_EXISTING; |
| 600 | break; |
| 601 | case WRITE: |
| 602 | dwDesiredAccess = GENERIC_WRITE; |
| 603 | dwCreationDisposition = CREATE_ALWAYS; |
| 604 | break; |
| 605 | case APPEND: |
| 606 | case UPDATE: |
| 607 | dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; |
| 608 | dwCreationDisposition = OPEN_ALWAYS; |
| 609 | break; |
| 610 | case USEHANDLE: |
| 611 | if (!GetFileType((HANDLE)aFileSpec)) |
| 612 | return false; |
| 613 | mFile = (HANDLE)aFileSpec; |
| 614 | return true; |
| 615 | } |
| 616 | dwShareMode = ((aFlags >> 8) & (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)); |
| 617 | |
| 618 | if (*aFileSpec == '*') |
| 619 | { |
| 620 | // v1.1.17: Allow FileOpen("*", "r|w") to open stdin/stdout/stderr ("**" for stderr). |
| 621 | // Can also be used to read script text from stdin, by passing "*" as the filename. |
| 622 | DWORD nStdHandle = 0; |
| 623 | switch (aFlags & ACCESS_MODE_MASK) |
| 624 | { |
| 625 | case APPEND: |
| 626 | // Allow FileAppend to write to stdout/stderr via TextStream. |
| 627 | aFlags = (aFlags & ~ACCESS_MODE_MASK) | READ; |
| 628 | case WRITE: |
| 629 | if (!aFileSpec[1]) |
| 630 | nStdHandle = STD_OUTPUT_HANDLE; |
| 631 | else if (aFileSpec[1] == '*' && !aFileSpec[2]) |
| 632 | nStdHandle = STD_ERROR_HANDLE; |
| 633 | break; |
| 634 | case READ: |
| 635 | if (!aFileSpec[1]) |
| 636 | nStdHandle = STD_INPUT_HANDLE; |
| 637 | break; |
| 638 | } |
| 639 | if (nStdHandle) // It was * or ** and not something invalid like *Somefile. |
| 640 | { |
| 641 | HANDLE hstd = GetStdHandle(nStdHandle); |
| 642 | if (hstd == NULL)// || !DuplicateHandle(GetCurrentProcess(), hstd, GetCurrentProcess(), &hstd, 0, FALSE, DUPLICATE_SAME_ACCESS)) |
| 643 | { |
| 644 | SetLastError(ERROR_INVALID_HANDLE); // Avoid "The operation completed successfully". |
| 645 | return false; |
| 646 | } |
| 647 | aFlags = (aFlags & ~ACCESS_MODE_MASK) | USEHANDLE; // Avoid calling CloseHandle(), since we don't own it. |
| 648 | mFile = hstd; // Only now that we know it's not NULL. |
| 649 | return true; |
nothing calls this directly
no outgoing calls
no test coverage detected