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); } } } }
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; }
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); } } }
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); } } }
// Заменить в строке 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; }
/*! ファイル内容を確認して、分割が必要かどうか確認する @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; }
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; }
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; } } }
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; }
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); }
/*! ファイルを確保 @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を開く場合、�の部分をどうにかせんといかん 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; }
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; }
/*! ユーザ定義のアレを読み込む @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を開く場合、�の部分をどうにかせんといかん 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; }
// // 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; }
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; } } } }