Example #1
0
void SetCompressorStats()
{
    DWORD line_count, i;
    TCHAR buf[1024];
    bool found = false;

    line_count = SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_GETLINECOUNT, 0, 0);
    for(i=0; i<line_count; i++) {
        *((LPWORD)buf) = sizeof(buf);
        SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_GETLINE, (WPARAM)i, (LPARAM)buf);
        if(found) {
            DWORD len = lstrlen(TOTAL_SIZE_COMPRESSOR_STAT);
            lstrcat(g_sdata.compressor_stats,buf);

            if(!StrCmpN(buf,TOTAL_SIZE_COMPRESSOR_STAT,len)) {
                break;
            }
        }
        else {
            DWORD len = lstrlen(EXE_HEADER_COMPRESSOR_STAT);
            if(!StrCmpN(buf,EXE_HEADER_COMPRESSOR_STAT,len)) {
                found = true;
                lstrcpy(g_sdata.compressor_stats,_T("\n\n"));
                lstrcat(g_sdata.compressor_stats,buf);
            }
        }
    }
}
Example #2
0
HRESULT CNodeFactory::ApplyNamespace(XML_NODE_INFO *pNodeInfo, LPWSTR *ppwzTokenNS,
                                     DWORD dwFlags)
{
    HRESULT                                  hr = S_OK;
    LPWSTR                                   pwzToken = NULL;

    ASSERT(pNodeInfo && ppwzTokenNS);

    if (!StrCmpN(pNodeInfo->pwcText, XML_NAMESPACE_TAG, XML_NAMESPACE_TAG_LEN)) {
        hr = S_FALSE;
        goto Exit;
    }

    pwzToken = NEW(WCHAR[pNodeInfo->ulLen + 1]);
    if (!pwzToken) {
        hr = E_OUTOFMEMORY;
        goto Exit;
    }

    StrCpyNW(pwzToken, pNodeInfo->pwcText, pNodeInfo->ulLen + 1);

    hr = _nsmgr.Map(pwzToken, ppwzTokenNS, dwFlags);
    if (FAILED(hr)) {
        goto Exit;
    }

Exit:
    SAFEDELETEARRAY(pwzToken);

    return hr;
}
Example #3
0
void NormalizeSymlinkName(string &strLinkName)
{
	if (!StrCmpN(strLinkName,L"\\??\\",4))
	{
		LPWSTR LinkName=strLinkName.GetBuffer();
		LinkName[1]=L'\\';
		strLinkName.ReleaseBuffer();
		PATH_TYPE Type = ParsePath(strLinkName);
		if(Type == PATH_DRIVELETTERUNC)
		{
			strLinkName.LShift(4);
		}
	}
}
Example #4
0
void NormalizeSymlinkName(string &strLinkName)
{
	if (!StrCmpN(strLinkName,L"\\??\\",4))
	{
		if (IsNetworkPath(strLinkName) || IsLocalVolumePath(strLinkName))
		{
			LPWSTR LinkName=strLinkName.GetBuffer();
			LinkName[1]=L'\\';
			strLinkName.ReleaseBuffer();
		}
		else
		{
			strLinkName.LShift(4);
		}
	}
}
Example #5
0
// Заменить в строке Str Count вхождений подстроки FindStr на подстроку ReplStr
// Если Count < 0 - заменять "до полной победы"
// Return - количество замен
int ReplaceStrings(string &strStr,const wchar_t *FindStr,const wchar_t *ReplStr,int Count,BOOL IgnoreCase)
{
	const int LenFindStr=StrLength(FindStr);
	if ( !LenFindStr || !Count )
		return 0;
	const int LenReplStr=StrLength(ReplStr);
	size_t L=strStr.GetLength();

	const int Delta = LenReplStr-LenFindStr;
	const int AllocDelta = Delta > 0 ? Delta*10 : 0;

	size_t I=0;
	int J=0;
	while (I+LenFindStr <= L)
	{
		int Res=IgnoreCase?StrCmpNI(&strStr[I], FindStr, LenFindStr):StrCmpN(&strStr[I], FindStr, LenFindStr);

		if (!Res)
		{
			wchar_t *Str;
			if (L+Delta+1 > strStr.GetSize())
				Str = strStr.GetBuffer(L+AllocDelta);
			else
				Str = strStr.GetBuffer();

			if (Delta > 0)
				wmemmove(Str+I+Delta,Str+I,L-I+1);
			else if (Delta < 0)
				wmemmove(Str+I,Str+I-Delta,L-I+Delta+1);

			wmemcpy(Str+I,ReplStr,LenReplStr);
			I += LenReplStr;

			L+=Delta;
			strStr.ReleaseBuffer(L);

			if (++J == Count && Count > 0)
				break;
		}
		else
		{
			I++;
		}
	}

	return J;
}
Example #6
0
/*!
	ファイル内容を確認して、分割が必要かどうか確認する
	@param[in]	ptStr	対象文字列へのポインター
	@param[in]	cchSize	その文字列の文字数
	@return	0なにもしない 1分割モード 2読込中止
*/
UINT DocFileHugeCheck( LPTSTR ptStr, UINT_PTR cchSize )
{
	LPTSTR		ptBuff;
//	UINT_PTR	d;
	UINT_PTR	dCount;
	UINT		dRslt;

	//	ASTなら何もする必要は無い
	if( 0 == StrCmpN( AST_SEPARATERW , ptStr, 4 ) ){	return 0;	}

	ptBuff = StrStr( ptStr, MLT_SEPARATERW );	//	セパレータを探す
	if( ptBuff ){	return 0;	}	//	有るなら問題無い

	//	行数を確認・100行以上あるなら分割が必要とみなす
	dCount = 0;

	do{
		ptBuff = StrStr( ptStr , TEXT("\r\n") );	//	改行を探す
		if( ptBuff ){	dCount++;	}else{	break;	}

		ptStr = ptBuff+2;	//	改行分進んだ位置が必要
	}while( ptBuff );

	//	改行がなく1000文字以上もある場合はエラーとする
	if( 0 == dCount && 1000 <= cchSize )
	{
		DocHugeFileTreatment( 2 );
		return 2;
	}

	if( 100 >= dCount ){	return 0;	}	//	100行以下なら問題無い

	//	ここで、大型ファイルなのでどうするかの確認・そのまま/分割/やめる
	dRslt = DocHugeFileTreatment( 1 );

	return dRslt;
}
Example #7
0
string& WINAPI FarFormatText(const wchar_t *SrcText,     // источник
                             int Width,               // заданная ширина
                             string &strDestText,          // приемник
                             const wchar_t* Break,       // брик, если = nullptr, то принимается '\n'
                             DWORD Flags)             // один из FFTM_*
{
	const wchar_t *breakchar;
	breakchar = Break?Break:L"\n";

	if (!SrcText || !*SrcText)
	{
		strDestText.Clear();
		return strDestText;
	}

	string strSrc = SrcText; //copy string in case of SrcText == strDestText

	if (!wcspbrk(strSrc,breakchar) && strSrc.GetLength() <= static_cast<size_t>(Width))
	{
		strDestText = strSrc;
		return strDestText;
	}

	long i=0, l=0, pgr=0, last=0;
	wchar_t *newtext;
	const wchar_t *text= strSrc;
	long linelength = Width;
	int breakcharlen = StrLength(breakchar);
	int docut = Flags&FFTM_BREAKLONGWORD?1:0;
	/* Special case for a single-character break as it needs no
	   additional storage space */

	if (breakcharlen == 1 && !docut)
	{
		newtext = xf_wcsdup(text);

		if (!newtext)
		{
			strDestText.Clear();
			return strDestText;
		}

		while (newtext[i] != L'\0')
		{
			/* prescan line to see if it is greater than linelength */
			l = 0;

			while (newtext[i+l] != breakchar[0])
			{
				if (newtext[i+l] == L'\0')
				{
					l--;
					break;
				}

				l++;
			}

			if (l >= linelength)
			{
				pgr = l;
				l = linelength;

				/* needs breaking; work backwards to find previous word */
				while (l >= 0)
				{
					if (newtext[i+l] == L' ')
					{
						newtext[i+l] = breakchar[0];
						break;
					}

					l--;
				}

				if (l == -1)
				{
					/* couldn't break is backwards, try looking forwards */
					l = linelength;

					while (l <= pgr)
					{
						if (newtext[i+l] == L' ')
						{
							newtext[i+l] = breakchar[0];
							break;
						}

						l++;
					}
				}
			}

			i += l+1;
		}
	}
	else
	{
		/* Multiple character line break */
		newtext = (wchar_t*)xf_malloc((strSrc.GetLength() * (breakcharlen+1)+1)*sizeof(wchar_t));

		if (!newtext)
		{
			strDestText.Clear();
			return strDestText;
		}

		newtext[0] = L'\0';
		i = 0;

		while (text[i] != L'\0')
		{
			/* prescan line to see if it is greater than linelength */
			l = 0;

			while (text[i+l] != L'\0')
			{
				if (text[i+l] == breakchar[0])
				{
					if (breakcharlen == 1 || !StrCmpN(text+i+l, breakchar, breakcharlen))
						break;
				}

				l++;
			}

			if (l >= linelength)
			{
				pgr = l;
				l = linelength;

				/* needs breaking; work backwards to find previous word */
				while (l >= 0)
				{
					if (text[i+l] == L' ')
					{
						wcsncat(newtext, text+last, i+l-last);
						wcscat(newtext, breakchar);
						last = i + l + 1;
						break;
					}

					l--;
				}

				if (l == -1)
				{
					/* couldn't break it backwards, try looking forwards */
					l = linelength - 1;

					while (l <= pgr)
					{
						if (!docut)
						{
							if (text[i+l] == L' ')
							{
								wcsncat(newtext, text+last, i+l-last);
								wcscat(newtext, breakchar);
								last = i + l + 1;
								break;
							}
						}

						if (docut == 1)
						{
							if (text[i+l] == L' ' || l > i-last)
							{
								wcsncat(newtext, text+last, i+l-last+1);
								wcscat(newtext, breakchar);
								last = i + l + 1;
								break;
							}
						}

						l++;
					}
				}

				i += l+1;
			}
			else
			{
				i += (l ? l : 1);
			}
		}

		if (i+l > last)
		{
			wcscat(newtext, text+last);
		}
	}

	strDestText = newtext;
	xf_free(newtext);
	return strDestText;
}
Example #8
0
void TextToViewSettings(const string& ColumnTitles,const string& ColumnWidths, std::vector<column>& Columns)
{
	// BUGBUG, add error checking

	const wchar_t *TextPtr=ColumnTitles.data();

	Columns.clear();

	for (;;)
	{
		string strArgName;
		TextPtr = GetCommaWord(TextPtr, strArgName);
		if (!TextPtr)
			break;

		Columns.emplace_back(VALUE_TYPE(Columns)());

		string strArgOrig = strArgName;
		ToUpper(strArgName);

		if (strArgName.front() == L'N')
		{
			unsigned __int64 &ColumnType = Columns.back().type;
			ColumnType = NAME_COLUMN;
			const wchar_t *Ptr = strArgName.data() + 1;

			while (*Ptr)
			{
				switch (*Ptr)
				{
				case L'M':
					ColumnType |= COLUMN_MARK;
					break;
				case L'D':
					ColumnType |= COLUMN_MARK_DYNAMIC;
					break;
				case L'O':
					ColumnType |= COLUMN_NAMEONLY;
					break;
				case L'R':
					ColumnType |= COLUMN_RIGHTALIGN;
					break;
				case L'F':
					ColumnType |= COLUMN_RIGHTALIGNFORCE;
					break;
				case L'N':
					ColumnType |= COLUMN_NOEXTENSION;
					break;
				}

				Ptr++;
			}
		}
		else if (strArgName.front() == L'S' || strArgName.front() == L'P' || strArgName.front() == L'G')
		{
			unsigned __int64 &ColumnType = Columns.back().type;
			ColumnType = (strArgName.front() == L'S') ? SIZE_COLUMN : (strArgName.front() == L'P') ? PACKED_COLUMN : STREAMSSIZE_COLUMN;
			const wchar_t *Ptr = strArgName.data() + 1;

			while (*Ptr)
			{
				switch (*Ptr)
				{
				case L'C':
					ColumnType |= COLUMN_COMMAS;
					break;
				case L'E':
					ColumnType |= COLUMN_ECONOMIC;
					break;
				case L'F':
					ColumnType |= COLUMN_FLOATSIZE;
					break;
				case L'T':
					ColumnType |= COLUMN_THOUSAND;
					break;
				}

				Ptr++;
			}
		}
		else if (!StrCmpN(strArgName.data(), L"DM", 2) || !StrCmpN(strArgName.data(), L"DC", 2) || !StrCmpN(strArgName.data(), L"DA", 2) || !StrCmpN(strArgName.data(), L"DE", 2))
		{
			unsigned __int64 &ColumnType = Columns.back().type;

			switch (strArgName[1])
			{
			case L'M':
				ColumnType = WDATE_COLUMN;
				break;
			case L'C':
				ColumnType = CDATE_COLUMN;
				break;
			case L'A':
				ColumnType = ADATE_COLUMN;
				break;
			case L'E':
				ColumnType = CHDATE_COLUMN;
				break;
			}

			const wchar_t *Ptr = strArgName.data() + 2;

			while (*Ptr)
			{
				switch (*Ptr)
				{
				case L'B':
					ColumnType |= COLUMN_BRIEF;
					break;
				case L'M':
					ColumnType |= COLUMN_MONTH;
					break;
				}

				Ptr++;
			}
		}
		else if (strArgName.front() == L'O')
		{
			unsigned __int64 &ColumnType = Columns.back().type;
			ColumnType = OWNER_COLUMN;

			if (strArgName.size() > 1 && strArgName[1] == L'L')
				ColumnType |= COLUMN_FULLOWNER;
		}
		else if (strArgName.front() == L'X')
		{
			unsigned __int64 &ColumnType = Columns.back().type;
			ColumnType = EXTENSION_COLUMN;

			if (strArgName.size() > 1 && strArgName[1] == L'R')
				ColumnType |= COLUMN_RIGHTALIGN;
		}
		else if (strArgOrig.size() > 2 && strArgOrig.front() == L'<' && strArgOrig.back() == L'>')
		{
			Columns.back().title = strArgOrig.substr(1, strArgOrig.size() - 2);
			Columns.back().type = CUSTOM_COLUMN0;
		}
		else
		{
			auto ItemIterator = std::find_if(CONST_RANGE(ColumnInfo, i) { return strArgName == i.Symbol; });
			if (ItemIterator != std::cend(ColumnInfo))
				Columns.back().type = ItemIterator->Type;
			else if (strArgOrig.size() >= 2 && strArgOrig.size() <= 3 && strArgOrig.front() == L'C')
			{
				unsigned int num;
				if (1 == swscanf(strArgOrig.c_str()+1, L"%u", &num))
					Columns.back().type = CUSTOM_COLUMN0 + num;
			}
		}
	}
Example #9
0
static const wchar_t *_SubstFileName(const wchar_t *CurStr,TSubstData *PSubstData,string &strOut)
{
	// рассмотрим переключатели активности/пассивности панели.
	if (!StrCmpN(CurStr,L"!#",2))
	{
		CurStr+=2;
		PSubstData->PassivePanel=TRUE;
		return CurStr;
	}

	if (!StrCmpN(CurStr,L"!^",2))
	{
		CurStr+=2;
		PSubstData->PassivePanel=FALSE;
		return CurStr;
	}

	// !! символ '!'
	if (!StrCmpN(CurStr,L"!!",2) && CurStr[2] != L'?')
	{
		strOut += L"!";
		CurStr+=2;
		return CurStr;
	}

	// !.!      Длинное имя файла с расширением
	if (!StrCmpN(CurStr,L"!.!",3) && CurStr[3] != L'?')
	{
		if (PSubstData->PassivePanel)
			strOut += PSubstData->strAnotherName;
		else
			strOut += PSubstData->Name;

		CurStr+=3;
		return CurStr;
	}

	// !~       Короткое имя файла без расширения
	if (!StrCmpN(CurStr,L"!~",2))
	{
		strOut += PSubstData->PassivePanel ? PSubstData->strAnotherShortNameOnly : PSubstData->strShortNameOnly;
		CurStr+=2;
		return CurStr;
	}

	// !`  Длинное расширение файла без имени
	if (!StrCmpN(CurStr,L"!`",2))
	{
		const wchar_t *Ext;

		if (CurStr[2] == L'~')
		{
			Ext=wcsrchr((PSubstData->PassivePanel ? PSubstData->strAnotherShortName.CPtr():PSubstData->ShortName),L'.');
			CurStr+=3;
		}
		else
		{
			Ext=wcsrchr((PSubstData->PassivePanel ? PSubstData->strAnotherName.CPtr():PSubstData->Name),L'.');
			CurStr+=2;
		}

		if (Ext && *Ext)
			strOut += ++Ext;

		return CurStr;
	}

	// !& !&~  список файлов разделенных пробелом.
	if ((!StrCmpN(CurStr,L"!&~",3) && CurStr[3] != L'?') ||
	        (!StrCmpN(CurStr,L"!&",2) && CurStr[2] != L'?'))
	{
		string strFileNameL, strShortNameL;
		Panel *WPanel=PSubstData->PassivePanel?PSubstData->AnotherPanel:PSubstData->ActivePanel;
		DWORD FileAttrL;
		int ShortN0=FALSE;
		int CntSkip=2;

		if (CurStr[2] == L'~')
		{
			ShortN0=TRUE;
			CntSkip++;
		}

		WPanel->GetSelName(nullptr,FileAttrL);
		int First = TRUE;

		while (WPanel->GetSelName(&strFileNameL,FileAttrL,&strShortNameL))
		{
			if (ShortN0)
				strFileNameL = strShortNameL;
			else // в список все же должно попасть имя в кавычках.
				QuoteSpaceOnly(strFileNameL);

// Вот здесь фиг его знает - нужно/ненужно...
//   если будет нужно - раскомментируем :-)
//          if(FileAttrL & FILE_ATTRIBUTE_DIRECTORY)
//            AddEndSlash(FileNameL);
			// А нужен ли нам пробел в самом начале?
			if (First)
				First = FALSE;
			else
				strOut += L" ";

			strOut += strFileNameL;
		}

		CurStr+=CntSkip;
		return CurStr;
	}

	// !@  Имя файла, содержащего имена помеченных файлов
	// !$!      Имя файла, содержащего короткие имена помеченных файлов
	// Ниже идет совмещение кода для разбора как !@! так и !$!
	//Вообще-то (по исторической справедливости как бы) - в !$! нужно выбрасывать модификаторы Q и A
	// Но нафиг нада:)
	if (!StrCmpN(CurStr,L"!@",2) || !StrCmpN(CurStr,L"!$",2))
	{
		string *pListName;
		string *pAnotherListName;
		bool ShortN0 = FALSE;

		if (CurStr[1] == L'$')
			ShortN0 = TRUE;

		if (ShortN0)
		{
			pListName = PSubstData->pShortListName;
			pAnotherListName = PSubstData->pAnotherShortListName;
		}
		else
		{
			pListName = PSubstData->pListName;
			pAnotherListName = PSubstData->pAnotherListName;
		}

		wchar_t Modifers[32]=L"";
		const wchar_t *Ptr;

		if ((Ptr=wcschr(CurStr+2,L'!')) )
		{
			if (Ptr[1] != L'?')
			{
				xwcsncpy(Modifers,CurStr+2,Min(ARRAYSIZE(Modifers),static_cast<size_t>(Ptr-(CurStr+2)+1)));

				if (pListName)
				{
					if (PSubstData->PassivePanel && (!pAnotherListName->IsEmpty() || PSubstData->AnotherPanel->MakeListFile(*pAnotherListName,ShortN0,Modifers)))
					{
						if (ShortN0)
							ConvertNameToShort(*pAnotherListName, *pAnotherListName);

						strOut += *pAnotherListName;
					}

					if (!PSubstData->PassivePanel && (!pListName->IsEmpty() || PSubstData->ActivePanel->MakeListFile(*pListName,ShortN0,Modifers)))
					{
						if (ShortN0)
							ConvertNameToShort(*pListName,*pListName);

						strOut += *pListName;
					}
				}
				else
				{
					strOut += CurStr;
					strOut += Modifers;
					strOut += L"!";
				}

				CurStr+=Ptr-CurStr+1;
				return CurStr;
			}
		}
	}

	// !-!      Короткое имя файла с расширением
	if (!StrCmpN(CurStr,L"!-!",3) && CurStr[3] != L'?')
	{
		if (PSubstData->PassivePanel)
			strOut += PSubstData->strAnotherShortName;
		else
			strOut += PSubstData->ShortName;

		CurStr+=3;
		return CurStr;
	}

	// !+!      Аналогично !-!, но если длинное имя файла утеряно
	//          после выполнения команды, FAR восстановит его
	if (!StrCmpN(CurStr,L"!+!",3) && CurStr[3] != L'?')
	{
		if (PSubstData->PassivePanel)
			strOut += PSubstData->strAnotherShortName;
		else
			strOut += PSubstData->ShortName;

		CurStr+=3;
		PSubstData->PreserveLFN=TRUE;
		return CurStr;
	}

	// !:       Текущий диск
	if (!StrCmpN(CurStr,L"!:",2))
	{
		string strCurDir;
		string strRootDir;

		if (*PSubstData->Name && PSubstData->Name[1]==L':')
			strCurDir = PSubstData->Name;
		else if (PSubstData->PassivePanel)
			PSubstData->AnotherPanel->GetCurDir(strCurDir);
		else
			strCurDir = PSubstData->strCmdDir;

		GetPathRoot(strCurDir,strRootDir);
		DeleteEndSlash(strRootDir);
		strOut += strRootDir;
		CurStr+=2;
		return CurStr;
	}

	// !\       Текущий путь
	// !/       Короткое имя текущего пути
	// Ниже идет совмещение кода для разбора как !\ так и !/
	if (!StrCmpN(CurStr,L"!\\",2) || !StrCmpN(CurStr,L"!=\\",3) || !StrCmpN(CurStr,L"!/",2) || !StrCmpN(CurStr,L"!=/",3))
	{
		string strCurDir;
		bool ShortN0 = FALSE;
		int RealPath= CurStr[1]==L'='?1:0;

		if (CurStr[1] == L'/' || (RealPath && CurStr[2] == L'/'))
		{
			ShortN0 = TRUE;
		}

		if (PSubstData->PassivePanel)
			PSubstData->AnotherPanel->GetCurDir(strCurDir);
		else
			strCurDir = PSubstData->strCmdDir;

		if (RealPath)
		{
			_MakePath1(PSubstData->PassivePanel?KEY_ALTSHIFTBACKBRACKET:KEY_ALTSHIFTBRACKET,strCurDir,L"",ShortN0);
			Unquote(strCurDir);
		}

		if (ShortN0)
			ConvertNameToShort(strCurDir,strCurDir);

		AddEndSlash(strCurDir);

		CurStr+=2+RealPath;

		if (*CurStr==L'!')
		{
			if (wcspbrk(PSubstData->PassivePanel?PSubstData->strAnotherName.CPtr():PSubstData->Name,L"\\:"))
				strCurDir.Clear();
		}

		strOut +=  strCurDir;
		return CurStr;
	}

	// !?<title>?<init>!
	if (!StrCmpN(CurStr,L"!?",2) && wcschr(CurStr+2,L'!'))
	{
		int j;
		int i = IsReplaceVariable(CurStr);

		if (i == -1)  // if bad format string
		{             // skip 1 char
			j = 1;
		}
		else
		{
			j = i + 1;
		}

		strOut.Append(CurStr, j);
		CurStr += j;
		return CurStr;
	}

	// !        Длинное имя файла без расширения
	if (*CurStr==L'!')
	{
		strOut += PointToName(PSubstData->PassivePanel ? PSubstData->strAnotherNameOnly : PSubstData->strNameOnly);
		CurStr++;
	}

	return CurStr;
}
Example #10
0
static int IsReplaceVariable(const wchar_t *str,
                             int *scr,
                             int *end,
                             int *beg_scr_break,
                             int *end_scr_break,
                             int *beg_txt_break,
                             int *end_txt_break)
// все очень сложно - посл-иe 4 указателя - это смещения от str
// начало скобок в строке описания, конец этих скобок, начало скобок в строке начального заполнения, ну и соотв конец.
// Вообще при простом вызове (который я собираюсь юзать) это выглядит просто:
// i = IsReplaceVariable(str) - ведь нам надо только проверять семантику скобок и всяких ?!
// где  i - тот прыжок, который надо совершить, чтоб прыгнуть на конец ! структуры !??!
{
	const wchar_t *s      = str;
	const wchar_t *scrtxt = str;
	int count_scob = 0;
	int second_count_scob = 0;
	bool was_quest = false;         //  ?
	bool was_asterics = false;      //  !
	bool in_firstpart_was_scob = false;
	const wchar_t *beg_firstpart_scob = nullptr;
	const wchar_t *end_firstpart_scob = nullptr;
	bool in_secondpart_was_scob = false;
	const wchar_t *beg_secondpart_scob = nullptr;
	const wchar_t *end_secondpart_scob = nullptr;

	if (!s)
		return -1;

	if (!StrCmpN(s,L"!?",2))
		s = s + 2;
	else
		return -1;

	//
	for (;;)   // analize from !? to ?
	{
		if (!*s)
			return -1;

		if (*s == L'(')
		{
			if (in_firstpart_was_scob)
			{
				//return -1;
			}
			else
			{
				in_firstpart_was_scob = true;
				beg_firstpart_scob = s;     //remember where is first break
			}

			count_scob += 1;
		}
		else if (*s == L')')
		{
			count_scob -= 1;

			if (!count_scob)
			{
				if (!end_firstpart_scob)
					end_firstpart_scob = s;   //remember where is last break
			}
			else if (count_scob < 0)
				return -1;
		}
		else if ((*s == L'?') && ((!beg_firstpart_scob && !end_firstpart_scob) || (beg_firstpart_scob && end_firstpart_scob)))
		{
			was_quest = true;
		}

		s++;

		if (was_quest) break;
	}

	if (count_scob ) return -1;

	scrtxt = s - 1; //remember s for return

	for (;;)   //analize from ? or !
	{
		if (!*s)
			return -1;

		if (*s == L'(')
		{
			if (in_secondpart_was_scob)
			{
				//return -1;
			}
			else
			{
				in_secondpart_was_scob = true;
				beg_secondpart_scob = s;    //remember where is first break
			}

			second_count_scob += 1;
		}
		else if (*s == L')')
		{
			second_count_scob -= 1;

			if (!second_count_scob)
			{
				if (!end_secondpart_scob)
					end_secondpart_scob = s;  //remember where is last break
			}
			else if (second_count_scob < 0)
				return -1;
		}
		else if ((*s == L'!') && ((!beg_secondpart_scob && !end_secondpart_scob) || (beg_secondpart_scob && end_secondpart_scob)))
		{
			was_asterics = true;
		}

		s++;

		if (was_asterics) break;
	}

	if (second_count_scob ) return -1;

	//
	if (scr )
		*scr = (int)(scrtxt - str);

	if (end )
		*end = (int)(s - str) - 1;

	if (in_firstpart_was_scob)
	{
		if (beg_scr_break )
			*beg_scr_break = (int)(beg_firstpart_scob - str);

		if (end_scr_break )
			*end_scr_break = (int)(end_firstpart_scob - str);
	}
	else
	{
		if (beg_scr_break )
			*beg_scr_break = -1;

		if (end_scr_break )
			*end_scr_break = -1;
	}

	if (in_secondpart_was_scob)
	{
		if (beg_txt_break )
			*beg_txt_break = (int)(beg_secondpart_scob - str);

		if (end_txt_break )
			*end_txt_break = (int)(end_secondpart_scob - str);
	}
	else
	{
		if (beg_txt_break )
			*beg_txt_break = -1;

		if (end_txt_break )
			*end_txt_break = -1;
	}

	return (int)((s - str) - 1);
}
Example #11
0
/*!
	ファイルを確保
	@param[in]	ptFileName	指定されたファイル名で開く
	@return		LPARAM	0失敗 1〜成功
*/
LPARAM DocFileInflate( LPTSTR ptFileName )
{
	CONST WCHAR rtHead = 0xFEFF;	//	ユニコードテキストヘッダ
	WCHAR	rtUniBuf;

	HANDLE	hFile;
	DWORD	readed;

	LPVOID	pBuffer;	//	文字列バッファ用ポインター
	INT		iByteSize;

	LPTSTR	ptString;
	LPSTR	pcText;
	UINT_PTR	cchSize;

	LPARAM	dNumber;

#ifdef BIG_TEXT_SEPARATE	//	頁区切りのないTXTかどうかを確認する
	UINT	dSepRslt;
	LPTSTR	ptSepBuff;
#endif

#ifdef _DEBUG
	DWORD	dTcStart, dTcEnd;
#endif

	//TCHAR	atBuff[10];
	//ZeroMemory( atBuff, sizeof(atBuff) );

#ifdef _DEBUG
	dTcStart = GetTickCount(  );
#endif
	assert( ptFileName );	//	ファイル開けないのはバグ

	//	ファイル名が空っぽだったら自動的にアウツ!
	if( NULL == ptFileName[0] ){	return 0;	}

	//	レッツオーポン
	hFile = CreateFile( ptFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
	if( INVALID_HANDLE_VALUE == hFile ){	return 0;	}

	//InitLastOpen( INIT_SAVE, ptFileName );	//	複数ファイルでは意味が無い

	//	処理順番入替

	iByteSize = GetFileSize( hFile, NULL );
	pBuffer = malloc( iByteSize + 4 );	//	バッファは少し大きめに取る
	ZeroMemory( pBuffer, iByteSize + 4 );

	SetFilePointer( hFile, 0, NULL, FILE_BEGIN );
	ReadFile( hFile, pBuffer, iByteSize, &readed, NULL );
	CloseHandle( hFile );	//	内容全部取り込んだから開放

	//	ユニコードチェック
	CopyMemory( &rtUniBuf, pBuffer, 2 );
	if( rtHead == rtUniBuf )	//	ユニコードヘッダがあれば
	{
		ptString = (LPTSTR)pBuffer;
		ptString++;	//	ユニコードヘッダ分進めておく
	}
	else
	{
		pcText = (LPSTR)pBuffer;
		//	シフトJISを開く場合、&#0000;の部分をどうにかせんといかん
		ptString = SjisDecodeAlloc( pcText );	//	ファイルを開くとき

		FREE( pBuffer );	//	こっちで開放
		pBuffer = ptString;	//	ポイントするところを変更

	}

	StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize );

#ifdef BIG_TEXT_SEPARATE	//	頁区切りのないTXTかどうかを確認する
	dSepRslt = DocFileHugeCheck( ptString, cchSize );
	if(  1 == dSepRslt )	//	分割処理する
	{
		ptSepBuff = DocFileHugeSeparate( ptString, cchSize );
		if( !(ptSepBuff)  ){	return 0;	}	//	なんかミスってるなら中止

		FREE( pBuffer );	//	大本を一旦開放
		pBuffer = ptSepBuff;	//	最後に開放する領域としてポイントするところを変更
		ptString = ptSepBuff;	//	読込処理を続ける位置としてセット

		StringCchLength( ptString, STRSAFE_MAX_CCH , &cchSize );	//	サイズ読込直し
	}
	else if( 2 == dSepRslt )	//	読込中止
	{
		FREE( pBuffer );	//	大本を開放
		return 0;
	}
	//	0なら何もしない
#endif

	//	新しいファイル置き場の準備	2014/05/28↑にあったのを移動した
	dNumber = DocMultiFileCreate( NULL );	//	実際のファイルを開くとき
	if( 0 >= dNumber )	return 0;

	StringCchCopy( (*gitFileIt).atFileName, MAX_PATH, ptFileName );


	//	もしASTなら、先頭は[AA]になってるはず・分割は中でやる
	if( StrCmpN( AST_SEPARATERW, ptString, 4 ) )
	{
		DocStringSplitMLT( ptString , cchSize, DocPageLoad );
	}
	else
	{
		DocStringSplitAST( ptString , cchSize, DocPageLoad );
	}

	//	ファイル開いたらキャレットとかスクロールをリセットする
	ViewEditReset(  );

	FREE( pBuffer );	//	=ptString

	DocPageChange( 0  );	//	全部読み込んだので最初のページを表示する
	PageListViewChange( -1, -1 );	//	直前頁リセット

	AppTitleChange( ptFileName );

#ifdef _DEBUG
	dTcEnd = GetTickCount(  );
	TRACE( TEXT("LOAD START[%u]  END[%u]    ELAPSE[%u]"), dTcStart, dTcEnd, (dTcEnd - dTcStart) );
#endif

	return dNumber;
}
Example #12
0
int NumStrCmp(const wchar_t *s1, size_t n1, const wchar_t *s2, size_t n2, bool IgnoreCase)
{
	size_t l1 = 0;
	size_t l2 = 0;
	while (l1 < n1 && l2 < n2 && *s1 && *s2)
	{
		if (iswdigit(*s1) && iswdigit(*s2))
		{
			// skip leading zeroes
			while (l1 < n1 && *s1 == L'0')
			{
				s1++;
				l1++;
			}
			while (l2 < n2 && *s2 == L'0')
			{
				s2++;
				l2++;
			}

			// if end of string reached
			if (l1 == n1 || !*s1 || l2 == n2 || !*s2)
				break;

			// compare numbers
			int res = 0;
			while (l1 < n1 && l2 < n2 && iswdigit(*s1) && iswdigit(*s2))
			{
				if (!res && *s1 != *s2)
					res = *s1 < *s2 ? -1 : 1;

				s1++; s2++;
				l1++; l2++;
			}
			if ((l1 == n1 || !iswdigit(*s1)) && (l2 == n2 || !iswdigit(*s2)))
			{
				if (res)
					return res;
			}
			else if (l1 == n1 || !iswdigit(*s1))
				return -1;
			else if (l2 == n2 || !iswdigit(*s2))
				return 1;
		}
		else
		{
			int res = IgnoreCase ? StrCmpNI(s1, s2, 1) : StrCmpN(s1, s2, 1);
			if (res)
				return res;

			s1++; s2++;
			l1++; l2++;
		}
	}

	if ((l1 == n1 || !*s1) && (l2 == n2 || !*s2))
	{
		if (l1 < l2)
			return -1;
		else if (l1 == l2)
			return 0;
		else
			return 1;
	}
	else if (l1 == n1 || !*s1)
		return -1;
	else if (l2 == n2 || !*s2)
		return 1;

	assert(false);
	return 0;
}
Example #13
0
/*!
	ユーザ定義のアレを読み込む
	@param[in]	hWnd	メインウインドウハンドル
	@param[in]	bFirst	今回が最初であるか
	@return	非0中身取った処理した 0ファイルなかった
*/
INT UserDefInitialise( HWND hWnd, UINT bFirst )
{
	CONST WCHAR rtHead = 0xFEFF;	//	ユニコードテキストヘッダ
	WCHAR	rtUniBuf;

	HANDLE	hFile;
	DWORD	readed;

	LPVOID	pBuffer;	//	文字列バッファ用ポインター
	INT		iByteSize;

	LPTSTR	ptString;
	LPSTR	pcText;
	UINT	cchSize;

	if( bFirst )	//	最初ならパス作っておく
	{
		ZeroMemory( gatUsDfPath, sizeof(gatUsDfPath) );
		StringCchCopy( gatUsDfPath, MAX_PATH, ExePathGet() );
		PathAppend( gatUsDfPath, TEMPLATE_DIR );
		PathAppend( gatUsDfPath, USER_ITEM_FILE );
	}

	hFile = CreateFile( gatUsDfPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
	if( INVALID_HANDLE_VALUE == hFile ){	return 0;	}

	//	今の内容破棄
	UserDefObliterate( hWnd );

	iByteSize = GetFileSize( hFile, NULL );
	pBuffer = malloc( iByteSize + 2 );
	ZeroMemory( pBuffer, iByteSize + 2 );
	//	中身をいただく
	SetFilePointer( hFile, 0, NULL, FILE_BEGIN );
	ReadFile( hFile, pBuffer, iByteSize, &readed, NULL );
	CloseHandle( hFile );	//	内容全部取り込んだから開放

	//	ユニコードチャック
	CopyMemory( &rtUniBuf, pBuffer, 2 );
	if( rtHead == rtUniBuf )	//	ユニコードヘッダがあれば
	{
		ptString = (LPTSTR)pBuffer;
		ptString++;	//	ユニコードヘッダ分進めておく
	}
	else
	{
		pcText = (LPSTR)pBuffer;
		//	シフトJISを開く場合、&#0000;の部分をどうにかせんといかん
		ptString = SjisDecodeAlloc( pcText );	//	SJISの内容をユニコードにする

		FREE( pBuffer );	//	こっちで開放
		pBuffer = ptString;	//	ポイントするところを変更
	}

	StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize );

	//	ASTじゃなきゃダメ
	if( !( StrCmpN( AST_SEPARATERW, ptString, 4 ) ) )
	{
		DocStringSplitAST( ptString , cchSize, UserDefItemLoad );
	}

	FREE( pBuffer );

	UserDefAppendMenu( hWnd );

	return 1;
}
Example #14
0
//
// Initialize an exemption information context that will be passed up to the
// driver
//
PWEHNTRUST_EXEMPTION_INFO DriverClient::InitializeExemptionInfo(
		IN EXEMPTION_SCOPE Scope,
		IN EXEMPTION_TYPE Type,
		IN ULONG Flags,
		IN LPCTSTR ExemptionPath,
		IN BOOLEAN ExemptionPathIsNt,
		OUT LPDWORD ExemptionInfoSize)
{
	PWEHNTRUST_EXEMPTION_INFO ExemptionInfo = NULL;
	UNICODE_STRING            ExemptionNtPath = { 0 };
	DWORD                     Size = 0;

	//
	// Double check to see if the supplied path is an NT path
	//
	if (!StrCmpN(
			ExemptionPath,
			TEXT("\\??\\"),
			sizeof(TCHAR) * 4))
		ExemptionPathIsNt = TRUE;

	do
	{
		//
		// If we fail to acquire the NT path, break out
		//
		if (!GetNtPath(
				ExemptionPath,
				&ExemptionNtPath,
				ExemptionPathIsNt))
			break;

		Size = ExemptionNtPath.Length + sizeof(WEHNTRUST_EXEMPTION_INFO);

		//
		// If we fail to acquire storage for the exemption...
		//
		if (!(ExemptionInfo = (PWEHNTRUST_EXEMPTION_INFO)malloc(Size)))
			break;

		InitializeStructure(
				ExemptionInfo,
				sizeof(WEHNTRUST_EXEMPTION_INFO));

		ExemptionInfo->Type              = Type;
		ExemptionInfo->Scope             = Scope;
		ExemptionInfo->Flags             = Flags;
		ExemptionInfo->ExemptionPathSize = ExemptionNtPath.Length;

		memcpy(
				ExemptionInfo->ExemptionPath,
				ExemptionNtPath.Buffer,
				ExemptionNtPath.Length);

	} while (0);

	//
	// Free the NT path storage
	//
	if (ExemptionPathIsNt)
		free(
				ExemptionNtPath.Buffer);
	else
		FreeNtPath(
				&ExemptionNtPath);

	//
	// Set the out size
	//
	if (ExemptionInfoSize)
		*ExemptionInfoSize = Size;

	return ExemptionInfo;
}
Example #15
0
void TextToViewSettings(const wchar_t *ColumnTitles,const wchar_t *ColumnWidths,
						unsigned __int64 *ViewColumnTypes,int *ViewColumnWidths,int *ViewColumnWidthsTypes,int &ColumnCount)
{
	const wchar_t *TextPtr=ColumnTitles;
	//Maximus: для отладки
	_ASSERTE(ARRAYSIZE(ColumnTypeWidth)==ARRAYSIZE(ColumnSymbol));

	for (ColumnCount=0; ColumnCount < PANEL_COLUMNCOUNT; ColumnCount++)
	{
		string strArgName;

		if (!(TextPtr=GetCommaWord(TextPtr,strArgName)))
			break;

		strArgName.Upper();

		if (strArgName.At(0)==L'N')
		{
			unsigned __int64 &ColumnType=ViewColumnTypes[ColumnCount];
			ColumnType=NAME_COLUMN;
			const wchar_t *Ptr = strArgName.CPtr()+1;

			while (*Ptr)
			{
				switch (*Ptr)
				{
					case L'M':
						ColumnType|=COLUMN_MARK;
						break;
					case L'O':
						ColumnType|=COLUMN_NAMEONLY;
						break;
					case L'R':
						ColumnType|=COLUMN_RIGHTALIGN;
						break;
					case L'F':
						ColumnType|=COLUMN_RIGHTALIGNFORCE;
						break;
					case L'N':
						ColumnType|=COLUMN_NOEXTENSION;
						break;
				}

				Ptr++;
			}
		}
		else
		{
			if (strArgName.At(0)==L'S' || strArgName.At(0)==L'P' || strArgName.At(0)==L'G')
			{
				unsigned __int64 &ColumnType=ViewColumnTypes[ColumnCount];
				ColumnType=(strArgName.At(0)==L'S') ? SIZE_COLUMN:(strArgName.At(0)==L'P')?PACKED_COLUMN:STREAMSSIZE_COLUMN;
				const wchar_t *Ptr = strArgName.CPtr()+1;

				while (*Ptr)
				{
					switch (*Ptr)
					{
						case L'C':
							ColumnType|=COLUMN_COMMAS;
							break;
						case L'E':
							ColumnType|=COLUMN_ECONOMIC;
							break;
						case L'F':
							ColumnType|=COLUMN_FLOATSIZE;
							break;
						case L'T':
							ColumnType|=COLUMN_THOUSAND;
							break;
					}

					Ptr++;
				}
			}
			else
			{
				if (!StrCmpN(strArgName,L"DM",2) || !StrCmpN(strArgName,L"DC",2) || !StrCmpN(strArgName,L"DA",2) || !StrCmpN(strArgName,L"DE",2))
				{
					unsigned __int64 &ColumnType=ViewColumnTypes[ColumnCount];

					switch (strArgName.At(1))
					{
						case L'M':
							ColumnType=WDATE_COLUMN;
							break;
						case L'C':
							ColumnType=CDATE_COLUMN;
							break;
						case L'A':
							ColumnType=ADATE_COLUMN;
							break;
						case L'E':
							ColumnType=CHDATE_COLUMN;
							break;
					}

					const wchar_t *Ptr = strArgName.CPtr()+2;

					while (*Ptr)
					{
						switch (*Ptr)
						{
							case L'B':
								ColumnType|=COLUMN_BRIEF;
								break;
							case L'M':
								ColumnType|=COLUMN_MONTH;
								break;
						}

						Ptr++;
					}
				}
				else
				{
					if (strArgName.At(0)==L'O')
					{
						unsigned __int64 &ColumnType=ViewColumnTypes[ColumnCount];
						ColumnType=OWNER_COLUMN;

						if (strArgName.At(1)==L'L')
							ColumnType|=COLUMN_FULLOWNER;
					}
					else if (strArgName.At(0)==L'X')
					{
						unsigned __int64 &ColumnType=ViewColumnTypes[ColumnCount];
						ColumnType=EXTENSION_COLUMN;

						if (strArgName.At(1)==L'R')
							ColumnType|=COLUMN_RIGHTALIGN;
					}
					else
					{
						#if 0
						for (unsigned I=0; I<ARRAYSIZE(ColumnSymbol); I++)
						{
							if (!StrCmp(strArgName,ColumnSymbol[I]))
							{
								ViewColumnTypes[ColumnCount]=I;
								break;
							}
						}
						#else
						//Maximus: многострочная статусная область
						if (strArgName.At(0)==L'B')
						{
							unsigned __int64 &ColumnType=ViewColumnTypes[ColumnCount];
							ColumnType=LINEBREAK_COLUMN;
							const wchar_t *Ptr = strArgName.CPtr()+1;

							while (*Ptr)
							{
								switch (*Ptr)
								{
									case L'R':
										if (!(ColumnType & COLUMN_CENTERALIGN))
											ColumnType|=COLUMN_RIGHTALIGN;
										break;
									case L'C':
										if (!(ColumnType & COLUMN_RIGHTALIGN))
											ColumnType|=COLUMN_CENTERALIGN;
										break;
								}

								Ptr++;
							}
						}
						else
						{
							for (unsigned I=0; I<ARRAYSIZE(ColumnSymbol); I++)
							{
								if (!StrCmp(strArgName,ColumnSymbol[I]))
								{
									ViewColumnTypes[ColumnCount]=I;
									break;
								}
							}
						}
						#endif
					}
				}
			}
		}
	}

	TextPtr=ColumnWidths;

	for (int I=0; I<ColumnCount; I++)
	{
		string strArgName;

		if (!(TextPtr=GetCommaWord(TextPtr,strArgName)))
			break;

		ViewColumnWidths[I]=_wtoi(strArgName);
		ViewColumnWidthsTypes[I]=COUNT_WIDTH;

		if (strArgName.GetLength()>1)
		{
			switch (strArgName.At(strArgName.GetLength()-1))
			{
				case L'%':
					ViewColumnWidthsTypes[I]=PERCENT_WIDTH;
					break;
			}
		}
	}
}