MCPcopy Create free account
hub / github.com/AutoHotkey/AutoHotkey / _Open

Method _Open

source/TextIO.cpp:592–661  ·  view source on GitHub ↗

TextFile

Source from the content-addressed store, hash-verified

590// TextFile
591//
592bool 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;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected