Esempio n. 1
0
bool CFile::OpenForWrite(const CURL& url, bool bOverWrite)
{
  m_fileSize = 0;

  Close();
  smb.Init();
  // we can't open files like smb://file.f or smb://server/file.f
  // if a file matches the if below return false, it can't exist on a samba share.
  if (!IsValidFile(url.GetFileName())) return false;

  CStdString strFileName = GetAuthenticatedPath(url);
  CLockObject lock(smb);

  if (bOverWrite)
  {
    XBMC->Log(LOG_WARNING, "FileSmb::OpenForWrite() called with overwriting enabled! - %s", strFileName.c_str());
    m_fd = smbc_creat(strFileName.c_str(), 0);
  }
  else
  {
    m_fd = smbc_open(strFileName.c_str(), O_RDWR, 0);
  }

  if (m_fd == -1)
  {
    // write error to logfile
    XBMC->Log(LOG_ERROR, "FileSmb->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", strFileName.c_str(), errno, strerror(errno));
    return false;
  }

  // We've successfully opened the file!
  return true;
}
Esempio n. 2
0
void AddToPlaylist(HWND hWnd, PSZ pszFilespec)
{
   HDIR           hFind          = HDIR_SYSTEM;
   FILEFINDBUF3   FindBuffer     = {0};
   ULONG          ulResultBufLen = sizeof(FILEFINDBUF3);
   ULONG          ulFindCount    = 1;
   APIRET         rc             = NO_ERROR;
   ULONG          flAtttribute   = FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN | FILE_READONLY;
   PSZ            pszFilepath = new char[CCHMAXPATH];
   PSZ            pTemp = NULL;

   MakePathFromFilepath(pszFilepath, pszFilespec);
   pTemp = pszFilepath + strlen(pszFilepath);

   rc = DosFindFirst(pszFilespec, &hFind, flAtttribute, &FindBuffer, ulResultBufLen, &ulFindCount, FIL_STANDARD);
   while(rc == NO_ERROR)
   {
      strcpy(pTemp, FindBuffer.achName);
      if(IsValidFile(pszFilepath))
      {
         plAddEntry(hWnd, pszFilepath);
         WinSetWindowText(WinQueryWindow(hWnd, QW_PARENT), pTemp);
      }
      ulFindCount = 1;
      rc = DosFindNext(hFind, &FindBuffer, ulResultBufLen, &ulFindCount);
   }
   DosFindClose(hFind);

   delete pszFilepath;
}
Esempio n. 3
0
void PushMRUFile(TCHAR* fname)
{
    int i;
    DWORD   rv;
    TCHAR full_file_name[MAX_PATH+1];

    if(!fname || fname[0] == _T('\0') || fname[0] == _T('/') || fname[0] == _T('-')) {
        return;
    }

    memset(full_file_name,0,sizeof(full_file_name));
    rv = GetFullPathName(fname,COUNTOF(full_file_name),full_file_name,NULL);
    if (rv == 0) {
        return;
    }

    if(IsValidFile(full_file_name)) {
        PopMRUFile(full_file_name);
        for(i = MRU_LIST_SIZE - 2; i >= 0; i--) {
            lstrcpy(g_mru_list[i+1], g_mru_list[i]);
        }
        lstrcpy(g_mru_list[0],full_file_name);
        BuildMRUMenus();
    }
}
Esempio n. 4
0
void cg_disasm_window::dragMoveEvent(QDragMoveEvent* ev)
{
	if (IsValidFile(*ev->mimeData()))
	{
		ev->accept();
	}
}
Esempio n. 5
0
void* OpenForWrite(VFSURL* url, bool bOverWrite)
{ 
  CSMB2::Get().Init();
  // we can't open files like smb://file.f or smb://server/file.f
  // if a file matches the if below return false, it can't exist on a samba share.
  if (!IsValidFile(url->filename))
    return NULL;

  std::string strFileName = GetAuthenticatedPath(url);
  PLATFORM::CLockObject lock(CSMB2::Get());

  SMBContext* result = new SMBContext;
  if (bOverWrite)
  {
    XBMC->Log(ADDON::LOG_INFO, "FileSmb::OpenForWrite() called with overwriting enabled! - %s", strFileName.c_str());
    result->fd = smbc_creat(strFileName.c_str(), 0);
  }
  else
  {
    result->fd = smbc_open(strFileName.c_str(), O_RDWR, 0);
  }

  if (result->fd == -1)
  {
    // write error to logfile
    XBMC->Log(ADDON::LOG_ERROR, "FileSmb->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", strFileName.c_str(), errno, strerror(errno));
    delete result;
    return NULL;
  }

  // We've successfully opened the file!
  return result;
}
Esempio n. 6
0
void cg_disasm_window::dropEvent(QDropEvent* ev)
{
	if (IsValidFile(*ev->mimeData(), true))
	{
		ShowDisasm();
	}
}
Esempio n. 7
0
void PushMRUFile(char* fname)
{
    int i;
    char buf[MAX_PATH+1];
    DWORD   rv;
    char*  file_part;
    char full_file_name[MAX_PATH+1];

    if(!fname || fname[0] == '\0' || fname[0] == '/' || fname[0] == '-') {
        return;
    }

    if(fname[0] == '"') {
        fname++;
    }

    lstrcpy(buf,fname);
    if(buf[lstrlen(buf)-1] == '"') {
        buf[lstrlen(buf)-1] = '\0';
    }
    my_memset(full_file_name,0,sizeof(full_file_name));
    rv = GetFullPathName(buf,sizeof(full_file_name),full_file_name,&file_part);
    if (rv == 0) {
        return;
    }

    if(IsValidFile(full_file_name)) {
        PopMRUFile(full_file_name);
        for(i = MRU_LIST_SIZE - 2; i >= 0; i--) {
            lstrcpy(g_mru_list[i+1], g_mru_list[i]);
        }
        lstrcpy(g_mru_list[0],full_file_name);
        BuildMRUMenus();
    }
}
Esempio n. 8
0
BOOL WINAPI MAP_GetId3TagFile(HANDLE hLib, LPCTSTR pszFile, ID3TAGV1* pTag)
{
	CPlayer* pPlayer = (CPlayer*) hLib;
	if (pPlayer->PlugInGetId3TagFile(pszFile, pTag))
		return TRUE;

	if (pPlayer->OvGetId3TagFile(pszFile, pTag))
		return TRUE;

	if (!IsValidFile(pszFile))
		return FALSE;

	return GetId3Tag(pszFile, pTag);
}
Esempio n. 9
0
void LoadMRUFile(int position)
{
    if (!g_sdata.thread && position >=0 && position < MRU_LIST_SIZE && g_mru_list[position][0]) {
        SetScript(g_mru_list[position]);
        if(IsValidFile(g_mru_list[position])) {
            PushMRUFile(g_mru_list[position]);
        }
        else {
            PopMRUFile(g_mru_list[position]);
            BuildMRUMenus();
        }
        ResetObjects();
        CompileNSISScript();
    }
}
Esempio n. 10
0
void LoadMRUFile(int position)
{
    if (!g_sdata.thread && position >=0 && position < MRU_LIST_SIZE && g_mru_list[position][0]) {
        g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(g_mru_list[position])+3);
        wsprintf(g_sdata.script,"\"%s\"",g_mru_list[position]);
        if(IsValidFile(g_mru_list[position])) {
            PushMRUFile(g_mru_list[position]);
        }
        else {
            PopMRUFile(g_mru_list[position]);
            BuildMRUMenus();
        }
        ResetObjects();
        CompileNSISScript();
    }
}
Esempio n. 11
0
BOOL WINAPI MAP_IsValidStream(HANDLE hLib, LPCTSTR pszFile)
{
	CPlayer* pPlayer = (CPlayer*) hLib;

	if (IsValidFile(pszFile))
		return TRUE;

	if (pPlayer->OvIsValidFile(pszFile))
		return TRUE;

	if (pPlayer->WavIsValidFile(pszFile))
		return TRUE;

	if (pPlayer->PlugInIsValidFile(pszFile))
		return TRUE;

	return FALSE;
}
Esempio n. 12
0
bool CMatch::MatchFileNoExt()
{
	LPCWSTR pszLine = m_SrcLine.ms_Val;
	if (!pszLine || !*pszLine || (mn_SrcFrom < 0) || (mn_SrcLength <= mn_SrcFrom))
		return false;

	const wchar_t szLatin[] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_";

	mn_MatchLeft = mn_SrcFrom;
	if (wcschr(szLatin, pszLine[mn_MatchLeft]))
	{
		while ((mn_MatchLeft > 0) && wcschr(szLatin, pszLine[mn_MatchLeft-1]))
		{
			mn_MatchLeft--;
		}
	}
	else
	{
		while (((mn_MatchLeft+1) < mn_SrcLength) && wcschr(szLatin, pszLine[mn_MatchLeft+1]))
		{
			mn_MatchLeft++;
		}
	}

	mn_MatchRight = mn_MatchLeft;
	while (((mn_MatchRight+1) < mn_SrcLength) && wcschr(szLatin, pszLine[mn_MatchRight+1]))
	{
		mn_MatchRight++;
	}

	int nNakedFileLen = 0;
	if (!IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft, mn_MatchRight - mn_MatchLeft + 1, gszBreak, gszSpacing, nNakedFileLen))
		return false;

	mn_MatchRight = mn_MatchLeft + nNakedFileLen - 1;
	StoreMatchText(NULL, NULL);
	m_Type = etr_File;
	return true;
}
Esempio n. 13
0
bool Exists(VFSURL* url)
{
  // we can't open files like smb://file.f or smb://server/file.f
  // if a file matches the if below return false, it can't exist on a samba share.
  if (!IsValidFile(url->filename))
    return false;

  CSMB2::Get().Init();
  std::string strFileName = GetAuthenticatedPath(url);

  struct stat info;

  CSMB2& smb = CSMB2::Get();

  PLATFORM::CLockObject lock(smb);
  int iResult = smbc_stat(strFileName.c_str(), &info);

  if (iResult < 0)
    return false;

  return true;
}
Esempio n. 14
0
void* Open(VFSURL* url)
{
  CSMB2::Get().Init();
  CSMB2::Get().AddActiveConnection();
  if (!IsValidFile(url->filename))
  {
    XBMC->Log(ADDON::LOG_INFO, "FileSmb->Open: Bad URL : '%s'",url->redacted);
    return NULL;
  }
  int fd = -1;
  std::string filename = GetAuthenticatedPath(url);
  PLATFORM::CLockObject lock(CSMB2::Get());
  fd = smbc_open(filename.c_str(), O_RDONLY, 0);
  if (fd == -1)
  {
    XBMC->Log(ADDON::LOG_INFO, "FileSmb->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", url->redacted, errno, strerror(errno));
    return NULL;
  }
  XBMC->Log(ADDON::LOG_DEBUG,"CSMB2File::Open - opened %s, fd=%d", url->filename, fd);
  struct stat tmpBuffer;
  if (smbc_stat(filename.c_str(), &tmpBuffer) < 0)
  {
    smbc_close(fd);
    return NULL;
  }
  int64_t ret = smbc_lseek(fd, 0, SEEK_SET);
  if (ret < 0)
  {
    smbc_close(fd);
    return NULL;
  }
  SMBContext* result = new SMBContext;
  result->fd = fd;
  result->size = tmpBuffer.st_size;
  return result;
}
Esempio n. 15
0
bool CMatch::MatchAny()
{
	bool bFound = false;

	// В именах файлов недопустимы: "/\:|*?<>~t~r~n а для простоты - учитываем и рамки
	const wchar_t* pszBreak = gszBreak;
	const wchar_t* pszSpacing = gszSpacing; // Пробел, таб, остальные для режима "Show white spaces" в редакторе фара
	const wchar_t* pszSeparat = L" \t:(";
	const wchar_t* pszTermint = L":)],";
	const wchar_t* pszDigits  = L"0123456789";
	const wchar_t* pszSlashes = L"/\\";
	const wchar_t* pszUrl = L":/\\:%#ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;?@&=+$,-_.!~*'()0123456789";
	const wchar_t* pszUrlTrimRight = L".,;";
	const wchar_t* pszProtocol = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_+-.";
	const wchar_t* pszEMail = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_+-.";
	const wchar_t* pszUrlDelim = L"\\\"<>{}[]^`'\r\n" MATCH_SPACINGS;
	const wchar_t* pszUrlFileDelim = L"\"<>^\r\n" MATCH_SPACINGS;
	const wchar_t* pszEndBrackets = L">])}";
	const wchar_t* pszPuctuators = L".,:;…!?";
	int nColons = 0;
	bool bUrlMode = false, bMaybeMail = false;
	SHORT MailX = -1;
	bool bDigits = false, bLineNumberFound = false, bWasSeparator = false;
	bool bWasPunctuator = false;
	bool bNakedFile = false;
	int nNakedFileLen = 0;
	enum {
		ef_NotFound = 0,
		ef_DotFound = 1,
		ef_ExtFound = 2,
	} iExtFound = ef_NotFound;
	int iBracket = 0;
	int iSpaces = 0;
	int iQuotStart = -1;
	const wchar_t* pszTest;

	mn_MatchLeft = mn_MatchRight = mn_SrcFrom;

	// Курсор над знаком препинания и за ним пробел? Допускать только ':' - это для строк/колонок с ошибками
	if ((wcschr(L";,.", m_SrcLine.ms_Val[mn_SrcFrom])) && (((mn_SrcFrom+1) >= mn_SrcLength) || wcschr(pszSpacing, m_SrcLine.ms_Val[mn_SrcFrom+1])))
	{
		MatchTestAlert();
		goto wrap;
	}

	// Курсор над протоколом? (http, etc)
	if (!CheckValidUrl(mn_MatchLeft, mn_MatchRight, bUrlMode, pszUrlDelim, pszUrl, pszProtocol, m_SrcLine.ms_Val, mn_SrcLength))
	{
		MatchTestAlert();
		goto wrap;
	}

	if (!bUrlMode)
	{
		// Not URL mode, restart searching
		mn_MatchLeft = mn_MatchRight = mn_SrcFrom;

		// Курсор над комментарием?
		// Попробуем найти начало имени файла
		if (!FindRangeStart(mn_MatchLeft, mn_MatchRight, bUrlMode, pszBreak, pszUrlDelim, pszSpacing, pszUrl, pszProtocol, m_SrcLine.ms_Val, mn_SrcLength))
		{
			MatchTestAlert();
			goto wrap;
		}

		// Try again with URL?
		if (mn_MatchLeft < mn_SrcFrom)
		{
			if (!CheckValidUrl(mn_MatchLeft, mn_MatchRight, bUrlMode, pszUrlDelim, pszUrl, pszProtocol, m_SrcLine.ms_Val, mn_SrcLength))
			{
				MatchTestAlert();
				goto wrap;
			}
		}
	}

	// Starts with quotation?
	if ((pszTest = wcschr(gszQuotStart, m_SrcLine.ms_Val[mn_MatchLeft])) != NULL)
	{
		iQuotStart = (int)(pszTest - gszQuotStart);
	}

	// Чтобы корректно флаги обработались (типа наличие расширения и т.п.)
	mn_MatchRight = mn_MatchLeft;

	// Теперь - найти конец.
	// Считаем, что для файлов конец это двоеточие, после которого идет описание ошибки
	// Для протоколов (http/...) - первый недопустимый символ

	TODO("Можно бы и просто открытие файлов прикрутить, без требования 'строки с ошибкой'");

	// -- VC
	// 1>c:\sources\conemu\realconsole.cpp(8104) : error C2065: 'qqq' : undeclared identifier
	// DefResolve.cpp(18) : error C2065: 'sdgagasdhsahd' : undeclared identifier
	// DefResolve.cpp(18): warning: note xxx
	// -- GCC
	// ConEmuC.cpp:49: error: 'qqq' does not name a type
	// 1.c:3: some message
	// file.cpp:29:29: error
	// CPP Check
	// [common\PipeServer.h:1145]: (style) C-style pointer casting
	// Delphi
	// c:\sources\FarLib\FarCtrl.pas(1002) Error: Undeclared identifier: 'PCTL_GETPLUGININFO'
	// FPC
	// FarCtrl.pas(1002,49) Error: Identifier not found "PCTL_GETPLUGININFO"
	// PowerShell
	// Script.ps1:35 знак:23
	// -- Possible?
	// abc.py (3): some message
	// ASM - подсвечивать нужно "test.asasm(1,1)"
	// [email protected](1239): test.asasm(1,1):
	// Issue 1594
	// /src/class.c:123:m_func(...)
	// /src/class.c:123: m_func(...)

	// -- URL's
	// file://c:\temp\qqq.html
	// http://www.farmanager.com
	// $ http://www.KKK.ru - левее слеша - не срабатывает
	// C:\ConEmu>http://www.KKK.ru - ...
	// -- False detects
	// 29.11.2011 18:31:47
	// C:\VC\unicode_far\macro.cpp  1251 Ln 5951/8291 Col 51 Ch 39 0043h 13:54
	// InfoW1900->SettingsControl(sc.Handle, SCTL_FREE, 0, 0);

	// Нас на интересуют строки типа "11.05.2010 10:20:35"
	// В имени файла должна быть хотя бы одна буква (расширение), причем английская
	// Поехали
	if (bUrlMode)
	{
		LPCWSTR pszDelim = (wcsncmp(m_SrcLine.ms_Val+mn_MatchLeft, L"file://", 7) == 0) ? pszUrlFileDelim : pszUrlDelim;
		while (((mn_MatchRight+1) < mn_SrcLength) && !wcschr(pszDelim, m_SrcLine.ms_Val[mn_MatchRight+1]))
			mn_MatchRight++;
		DEBUGTEST(int i4break = 0);
	}
	else while ((mn_MatchRight+1) < mn_SrcLength)
	{
		if ((m_SrcLine.ms_Val[mn_MatchRight] == L'/') && ((mn_MatchRight+1) < mn_SrcLength) && (m_SrcLine.ms_Val[mn_MatchRight+1] == L'/')
			&& !((mn_MatchRight > 1) && (m_SrcLine.ms_Val[mn_MatchRight] == L':'))) // и НЕ URL адрес
		{
			MatchTestAlert();
			goto wrap; // Не оно (комментарий в строке)
		}

		if (bWasSeparator // " \t:("
			&& (isDigit(m_SrcLine.ms_Val[mn_MatchRight])
				|| (bDigits && (m_SrcLine.ms_Val[mn_MatchRight] == L',')))) // FarCtrl.pas(1002,49) Error:
		{
			if (!bDigits && (mn_MatchLeft < mn_MatchRight) /*&& (m_SrcLine.ms_Val[mn_MatchRight-1] == L':')*/)
			{
				bDigits = true;
				// Если перед разделителем был реальный файл - сразу выставим флажок "номер строки найден"
				if (IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft, mn_MatchRight - mn_MatchLeft - 1, pszBreak, pszSpacing, nNakedFileLen))
				{
					bLineNumberFound = true;
				}
				// Skip leading quotation mark?
				else if ((iQuotStart >= 0)
					&& IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft+1, mn_MatchRight - mn_MatchLeft - 2, pszBreak, pszSpacing, nNakedFileLen))
				{
					mn_MatchLeft++;
					bLineNumberFound = true;
				}
			}
		}
		else if (bWasSeparator && bLineNumberFound
			&& wcschr(L":)] \t", m_SrcLine.ms_Val[mn_MatchRight]))
		{
			//// gcc такие строки тоже может выкинуть
			//// file.cpp:29:29: error
			//mn_MatchRight--;
			break;
		}
		else
		{
			if (iExtFound != ef_ExtFound)
			{
				if (iExtFound == ef_NotFound)
				{
					if (m_SrcLine.ms_Val[mn_MatchRight] == L'.')
						iExtFound = ef_ExtFound;
				}
				else
				{
					// Не особо заморачиваясь с точками и прочим. Просто небольшая страховка от ложных срабатываний...
					if ((m_SrcLine.ms_Val[mn_MatchRight] >= L'a' && m_SrcLine.ms_Val[mn_MatchRight] <= L'z') || (m_SrcLine.ms_Val[mn_MatchRight] >= L'A' && m_SrcLine.ms_Val[mn_MatchRight] <= L'Z'))
					{
						iExtFound = ef_ExtFound;
						iBracket = 0;
					}
				}
			}

			if (iExtFound == 2)
			{
				if (m_SrcLine.ms_Val[mn_MatchRight] == L'.')
				{
					iExtFound = ef_DotFound;
					iBracket = 0;
				}
				else if (wcschr(pszSlashes, m_SrcLine.ms_Val[mn_MatchRight]) != NULL)
				{
					// Был слеш, значит расширения - еще нет
					iExtFound = ef_NotFound;
					iBracket = 0;
					bWasSeparator = false;
				}
				else if (wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight]) && wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight-1]))
				{
					// Слишком много пробелов
					iExtFound = ef_NotFound;
					iBracket = 0;
					bWasSeparator = false;
				}
				// Stop on naked file if we found space after it
				else if (!bLineNumberFound && !bMaybeMail && wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight])
					// But don't stop if there is a line number: "abc.py (3): ..."
					&& !(((mn_MatchRight+3) < mn_SrcLength)
							&& (m_SrcLine.ms_Val[mn_MatchRight+1] == L'(')
							&& isDigit(m_SrcLine.ms_Val[mn_MatchRight+2]))
					// Is this a file without digits (line/col)?
					&& IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft, mn_MatchRight - mn_MatchLeft + 1, pszBreak, pszSpacing, nNakedFileLen))
				{
					// File without digits, just for opening in the editor
					bNakedFile = true;
					break;
				}
				// Stop if after colon there is another letter but a digit
				else if (!bLineNumberFound && !bMaybeMail
					&& (m_SrcLine.ms_Val[mn_MatchRight] == L':')
							&& (((mn_MatchRight+1) >= mn_SrcLength)
								|| !isDigit(m_SrcLine.ms_Val[mn_MatchRight+1]))
					// Is this a file without digits (line/col)?
					&& IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft, mn_MatchRight - mn_MatchLeft, pszBreak, pszSpacing, nNakedFileLen))
				{
					// File without digits, just for opening in the editor
					bNakedFile = true;
					mn_MatchRight--;
					break;
				}
				else
				{
					bWasSeparator = (wcschr(pszSeparat, m_SrcLine.ms_Val[mn_MatchRight]) != NULL);
				}
			}

			if ((iQuotStart >= 0) && (m_SrcLine.ms_Val[mn_MatchRight] == gszQuotEnd[iQuotStart]))
			{
				bNakedFile = IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft+1, mn_MatchRight - mn_MatchLeft - 1, pszBreak, pszSpacing, nNakedFileLen);
				if (bNakedFile || bMaybeMail)
				{
					mn_MatchLeft++;
					mn_MatchRight--;
					break;
				}
			}

			if (bWasPunctuator && !bLineNumberFound)
			{
				if (bMaybeMail)
				{
					// Если после мейла нашли что-то кроме точки
					if ((m_SrcLine.ms_Val[mn_MatchRight-1] != L'.')
						// или после точки - пробельный символ
						|| wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight]))
					{
						break;
					}
				}
				else if (wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight]))
				{
					bNakedFile = IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft, mn_MatchRight - mn_MatchLeft - 1, pszBreak, pszSpacing, nNakedFileLen);
					if (bNakedFile)
					{
						mn_MatchRight--;
						break;
					}
				}
			}

			bWasPunctuator = (wcschr(pszPuctuators, m_SrcLine.ms_Val[mn_MatchRight]) != NULL);

			// Рассчитано на закрывающие : или ) или ] или ,
			_ASSERTE(pszTermint[0]==L':' && pszTermint[1]==L')' && pszTermint[2]==L']' && pszTermint[3]==L',' && pszTermint[4]==0);
			// Script.ps1:35 знак:23
			if (bDigits && IsFileLineTerminator(m_SrcLine.ms_Val+mn_MatchRight, pszTermint))
			{
				// Validation
				if (((m_SrcLine.ms_Val[mn_MatchRight] == L':' || m_SrcLine.ms_Val[mn_MatchRight] == L' ')
						// Issue 1594: /src/class.c:123:m_func(...)
						/* && (wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight+1])
							|| wcschr(pszDigits, m_SrcLine.ms_Val[mn_MatchRight+1]))*/)
				// Если номер строки обрамлен скобками - скобки должны быть сбалансированы
				|| ((m_SrcLine.ms_Val[mn_MatchRight] == L')') && (iBracket == 1)
						&& ((m_SrcLine.ms_Val[mn_MatchRight+1] == L':')
							|| wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight+1])
							|| wcschr(pszDigits, m_SrcLine.ms_Val[mn_MatchRight+1])))
				// [file.cpp:1234]: (cppcheck)
				|| ((m_SrcLine.ms_Val[mn_MatchRight] == L']') && (m_SrcLine.ms_Val[mn_MatchRight+1] == L':'))
					)
				{
					//_ASSERTE(bLineNumberFound==false);
					//bLineNumberFound = true;
					break; // found?
				}
			}

			// Issue 1758: Support file/line format for php: C:\..\test.php:28
			if (bDigits && !wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight]))
			{
				bDigits = false;
			}

			switch (m_SrcLine.ms_Val[mn_MatchRight])
			{
			// Пока регулярок нет...
			case L'(': iBracket++; break;
			case L')': iBracket--; break;
			case L'/': case L'\\': iBracket = 0; break;
			case L'@':
				if (MailX != -1)
				{
					bMaybeMail = false;
				}
				else if (((mn_MatchRight > 0) && wcschr(pszEMail, m_SrcLine.ms_Val[mn_MatchRight-1]))
					&& (((mn_MatchRight+1) < mn_SrcLength) && wcschr(pszEMail, m_SrcLine.ms_Val[mn_MatchRight+1])))
				{
					bMaybeMail = true;
					MailX = mn_MatchRight;
				}
				break;
			}

			if (m_SrcLine.ms_Val[mn_MatchRight] == L':')
				nColons++;
			else if (m_SrcLine.ms_Val[mn_MatchRight] == L'\\' || m_SrcLine.ms_Val[mn_MatchRight] == L'/')
				nColons = 0;
		}

		if (nColons >= 2)
			break;

		mn_MatchRight++;
		if (wcschr(pszBreak, m_SrcLine.ms_Val[mn_MatchRight]))
		{
			if (bMaybeMail)
				break;
			if ((bLineNumberFound) || !IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft, mn_MatchRight - mn_MatchLeft + 1, pszBreak, pszSpacing, nNakedFileLen))
			{
				MatchTestAlert();
				goto wrap; // Не оно
			}
			// File without digits, just for opening in the editor
			_ASSERTE(!bLineNumberFound);
			bNakedFile = true;
			break;
		}
		else if (wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight]))
		{
			if ((++iSpaces) > 1)
			{
				if ((bLineNumberFound) || !IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft, mn_MatchRight - mn_MatchLeft + 1, pszBreak, pszSpacing, nNakedFileLen))
				{
					if (!bLineNumberFound && bMaybeMail)
						break;
					MatchTestAlert();
					goto wrap; // Не оно?
				}
				// File without digits, just for opening in the editor
				_ASSERTE(!bLineNumberFound);
				bNakedFile = true;
				break;
			}
		}
		else
		{
			iSpaces = 0;
		}
	} // end of 'while ((mn_MatchRight+1) < mn_SrcLength)'

	if (bUrlMode)
	{
		// Считаем, что OK
		bMaybeMail = false;
		// Cut off ending punctuators
		if (wcschr(pszPuctuators, m_SrcLine.ms_Val[mn_MatchRight]))
			mn_MatchRight--;
		// Cut off ending bracket if it is
		if (wcschr(pszEndBrackets, m_SrcLine.ms_Val[mn_MatchRight]))
			mn_MatchRight--;
	}
	else
	{
		if (!bNakedFile && !bMaybeMail && ((mn_MatchRight+1) == mn_SrcLength) && !bLineNumberFound && (iExtFound == ef_ExtFound))
		{
			bNakedFile = IsValidFile(m_SrcLine.ms_Val+mn_MatchLeft, mn_MatchRight - mn_MatchLeft + 1, pszBreak, pszSpacing, nNakedFileLen);
		}

		if (bLineNumberFound)
			bMaybeMail = false;

		if (bNakedFile)
		{
			// correct the end pos
			mn_MatchRight = mn_MatchLeft + nNakedFileLen - 1;
			_ASSERTE(mn_MatchRight > mn_MatchLeft);
			// and no need to check for colon
		}
		else if (bMaybeMail)
		{
			// no need to check for colon
		}
		else if ((m_SrcLine.ms_Val[mn_MatchRight] != L':'
				&& m_SrcLine.ms_Val[mn_MatchRight] != L' '
				&& !((m_SrcLine.ms_Val[mn_MatchRight] == L')') && iBracket == 1)
				&& !((m_SrcLine.ms_Val[mn_MatchRight] == L']') && (m_SrcLine.ms_Val[mn_MatchRight+1] == L':'))
			)
			|| !bLineNumberFound || (nColons > 2))
		{
			MatchTestAlert();
			goto wrap;
		}

		if (bMaybeMail || (!bMaybeMail && !bNakedFile && m_SrcLine.ms_Val[mn_MatchRight] != L')'))
			mn_MatchRight--;

		// Откатить ненужные пробелы
		while ((mn_MatchLeft < mn_MatchRight) && wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchLeft]))
			mn_MatchLeft++;
		while ((mn_MatchRight > mn_MatchLeft) && wcschr(pszSpacing, m_SrcLine.ms_Val[mn_MatchRight]))
			mn_MatchRight--;

		if (bMaybeMail)
		{
			// Для мейлов - проверяем допустимые символы (чтобы пробелов не было и прочего мусора)
			int x = MailX - 1; _ASSERTE(x>=0);
			while ((x > 0) && wcschr(pszEMail, m_SrcLine.ms_Val[x-1]))
				x--;
			mn_MatchLeft = x;
			x = MailX + 1; _ASSERTE(x<mn_SrcLength);
			while (((x+1) < mn_SrcLength) && wcschr(pszEMail, m_SrcLine.ms_Val[x+1]))
				x++;
			mn_MatchRight = x;
		}
		else if (bNakedFile)
		{
			// ???
		}
		else
		{
			if ((mn_MatchLeft + 4) > mn_MatchRight) // 1.c:1: //-V112
			{
				// Слишком коротко, считаем что не оно
				MatchTestAlert();
				goto wrap;
			}

			// Проверить, чтобы был в наличии номер строки
			if (!(m_SrcLine.ms_Val[mn_MatchRight] >= L'0' && m_SrcLine.ms_Val[mn_MatchRight] <= L'9') // ConEmuC.cpp:49:
				&& !(m_SrcLine.ms_Val[mn_MatchRight] == L')' && (m_SrcLine.ms_Val[mn_MatchRight-1] >= L'0' && m_SrcLine.ms_Val[mn_MatchRight-1] <= L'9'))) // ConEmuC.cpp(49) :
			{
				MatchTestAlert();
				goto wrap; // Номера строки нет
			}
			// [file.cpp:1234]: (cppcheck) ?
			if ((m_SrcLine.ms_Val[mn_MatchRight+1] == L']') && (m_SrcLine.ms_Val[mn_MatchLeft] == L'['))
				mn_MatchLeft++;
			// Чтобы даты ошибочно не подсвечивать:
			// 29.11.2011 18:31:47
			{
				bool bNoDigits = false;
				for (int i = mn_MatchLeft; i <= mn_MatchRight; i++)
				{
					if (m_SrcLine.ms_Val[i] < L'0' || m_SrcLine.ms_Val[i] > L'9')
					{
						bNoDigits = true;
					}
				}
				if (!bNoDigits)
				{
					MatchTestAlert();
					goto wrap;
				}
			}
			// -- уже включены // Для красивости в VC включить скобки
			//if ((m_SrcLine.ms_Val[mn_MatchRight] == L')') && (m_SrcLine.ms_Val[mn_MatchRight+1] == L':'))
			//	mn_MatchRight++;
		}
	} // end "else / if (bUrlMode)"

	// Check mouse pos, it must be inside region
	if ((mn_SrcFrom < mn_MatchLeft) || (mn_MatchRight < mn_SrcFrom))
	{
		MatchTestAlert();
		goto wrap;
	}

	// Ok
	if (mn_MatchRight >= mn_MatchLeft)
	{
		bFound = true;

		_ASSERTE(!bMaybeMail || !bUrlMode); // Одновременно - флаги не могут быть выставлены!
		LPCWSTR pszPrefix = (bMaybeMail && !bUrlMode) ? L"mailto:" : NULL;
		if (bMaybeMail && !bUrlMode)
			bUrlMode = true;

		StoreMatchText(pszPrefix, bUrlMode ? pszUrlTrimRight : NULL);

		#ifdef _DEBUG
		if (!bUrlMode && wcsstr(ms_Match.ms_Val, L"//")!=NULL)
		{
			_ASSERTE(FALSE);
		}
		#endif
	}

	if (bUrlMode)
		m_Type = etr_Url;
	else
		m_Type = (bLineNumberFound ? etr_FileRow : etr_File);

wrap:
	return bFound;
}