4.59 beta

This commit is contained in:
Igor Pavlov
2008-08-13 00:00:00 +00:00
committed by Kornel Lesiński
parent 3901bf0ab8
commit 173c07e166
781 changed files with 22124 additions and 13650 deletions

View File

@@ -9,7 +9,7 @@ template<class T> class CMyAutoPtr
public:
CMyAutoPtr(T *p = 0) : _p(p) {}
CMyAutoPtr(CMyAutoPtr<T>& p): _p(p.release()) {}
CMyAutoPtr<T>& operator=(CMyAutoPtr<T>& p)
CMyAutoPtr<T>& operator=(CMyAutoPtr<T>& p)
{
reset(p.release());
return (*this);

View File

@@ -6,7 +6,7 @@
#include "Defs.h"
template <class T> class CBuffer
{
{
protected:
size_t _capacity;
T *_items;

View File

@@ -2,8 +2,8 @@
#include "StdAfx.h"
extern "C"
{
extern "C"
{
#include "../../C/7zCrc.h"
}

View File

@@ -22,7 +22,7 @@ void SplitCommandLine(const UString &src, UString &dest1, UString &dest2)
i++;
break;
}
else
else
dest1 += c;
}
dest2 = src.Mid(i);
@@ -55,8 +55,8 @@ static const wchar_t kSwitchMinus = '-';
static const wchar_t *kStopSwitchParsing = L"--";
static bool IsItSwitchChar(wchar_t c)
{
return (c == kSwitchID1 /*|| c == kSwitchID2 */);
{
return (c == kSwitchID1 /*|| c == kSwitchID2 */);
}
CParser::CParser(int numSwitches):
@@ -70,7 +70,7 @@ CParser::~CParser()
delete []_switches;
}
void CParser::ParseStrings(const CSwitchForm *switchForms,
void CParser::ParseStrings(const CSwitchForm *switchForms,
const UStringVector &commandStrings)
{
int numCommandStrings = commandStrings.Size();
@@ -94,7 +94,7 @@ void CParser::ParseStrings(const CSwitchForm *switchForms,
bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms)
{
int len = s.Length();
if (len == 0)
if (len == 0)
return false;
int pos = 0;
if (!IsItSwitchChar(s[pos]))
@@ -109,7 +109,7 @@ bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms)
for(int switchIndex = 0; switchIndex < _numSwitches; switchIndex++)
{
int switchLen = MyStringLen(switchForms[switchIndex].IDString);
if (switchLen <= maxLen || pos + switchLen > len)
if (switchLen <= maxLen || pos + switchLen > len)
continue;
UString temp = s + pos;
@@ -166,8 +166,8 @@ bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms)
}
break;
}
case NSwitchType::kLimitedPostString:
case NSwitchType::kUnLimitedPostString:
case NSwitchType::kLimitedPostString:
case NSwitchType::kUnLimitedPostString:
{
int minLen = switchForm.MinLen;
if (tailSize < minLen)
@@ -205,7 +205,7 @@ const CSwitchResult& CParser::operator[](size_t index) const
/////////////////////////////////
// Command parsing procedures
int ParseCommand(int numCommandForms, const CCommandForm *commandForms,
int ParseCommand(int numCommandForms, const CCommandForm *commandForms,
const UString &commandString, UString &postString)
{
for(int i = 0; i < numCommandForms; i++)

View File

@@ -12,7 +12,7 @@ void SplitCommandLine(const UString &s, UStringVector &parts);
namespace NSwitchType {
enum EEnum
{
{
kSimple,
kPostMinus,
kLimitedPostString,
@@ -44,12 +44,12 @@ class CParser
{
int _numSwitches;
CSwitchResult *_switches;
bool ParseString(const UString &s, const CSwitchForm *switchForms);
bool ParseString(const UString &s, const CSwitchForm *switchForms);
public:
UStringVector NonSwitchStrings;
CParser(int numSwitches);
~CParser();
void ParseStrings(const CSwitchForm *switchForms,
void ParseStrings(const CSwitchForm *switchForms,
const UStringVector &commandStrings);
const CSwitchResult& operator[](size_t index) const;
};
@@ -64,7 +64,7 @@ struct CCommandForm
};
// Returns: Index of form and postString; -1, if there is no match
int ParseCommand(int numCommandForms, const CCommandForm *commandForms,
int ParseCommand(int numCommandForms, const CCommandForm *commandForms,
const UString &commandString, UString &postString);
}

View File

@@ -6,7 +6,7 @@
#include "Buffer.h"
template <class T> class CDynamicBuffer: public CBuffer<T>
{
{
void GrowLength(size_t size)
{
size_t delta;

View File

@@ -13,7 +13,7 @@ void ConvertUInt64ToString(UInt64 value, char *s, UInt32 base)
}
char temp[72];
int pos = 0;
do
do
{
int delta = (int)(value % base);
temp[pos++] = (char)((delta < 10) ? ('0' + delta) : ('a' + (delta - 10)));
@@ -30,13 +30,13 @@ void ConvertUInt64ToString(UInt64 value, wchar_t *s)
{
wchar_t temp[32];
int pos = 0;
do
do
{
temp[pos++] = (wchar_t)(L'0' + (int)(value % 10));
value /= 10;
}
while (value != 0);
do
do
*s++ = temp[--pos];
while(pos > 0);
*s = L'\0';

View File

@@ -105,7 +105,7 @@ bool CLang::Open(LPCWSTR fileName)
int CLang::FindItem(UInt32 value) const
{
int left = 0, right = _langPairs.Size();
int left = 0, right = _langPairs.Size();
while (left != right)
{
UInt32 mid = (left + right) / 2;

View File

@@ -28,11 +28,11 @@ public:
// T& operator*() const { return *_p; }
T** operator&() { return &_p; }
T* operator->() const { return _p; }
T* operator=(T* p)
{
T* operator=(T* p)
{
if (p != 0)
p->AddRef();
if (_p)
if (_p)
_p->Release();
_p = p;
return p;
@@ -116,8 +116,8 @@ public:
unsigned int Length() const { return ::SysStringLen(m_str); }
operator BSTR() const { return m_str; }
BSTR* operator&() { return &m_str; }
BSTR MyCopy() const
{
BSTR MyCopy() const
{
int byteLen = ::SysStringByteLen(m_str);
BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
memmove(res, m_str, byteLen);
@@ -149,7 +149,7 @@ public:
};
#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \
(REFGUID iid, void **outObject) {
(REFGUID iid, void **outObject) {
#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \
{ *outObject = (void *)(i *)this; AddRef(); return S_OK; }

View File

@@ -23,7 +23,7 @@ typedef struct {
#ifdef __cplusplus
inline int operator==(REFGUID g1, REFGUID g2)
{
{
for (int i = 0; i < (int)sizeof(g1); i++)
if (((unsigned char *)&g1)[i] != ((unsigned char *)&g2)[i])
return 0;

140
CPP/Common/MyMap.cpp Executable file
View File

@@ -0,0 +1,140 @@
// MyMap.cpp
#include "StdAfx.h"
#include "MyMap.h"
static const unsigned kNumBitsMax = sizeof(UInt32) * 8;
static UInt32 GetSubBits(UInt32 value, unsigned startPos, unsigned numBits)
{
if (startPos == sizeof(value) * 8)
return 0;
value >>= startPos;
if (numBits == sizeof(value) * 8)
return value;
return value & (((UInt32)1 << numBits) - 1);
}
static inline unsigned GetSubBit(UInt32 v, unsigned n) { return (unsigned)(v >> n) & 1; }
bool CMap32::Find(UInt32 key, UInt32 &valueRes) const
{
valueRes = (UInt32)(Int32)-1;
if (Nodes.Size() == 0)
return false;
if (Nodes.Size() == 1)
{
const CNode &n = Nodes[0];
if (n.Len == kNumBitsMax)
{
valueRes = n.Values[0];
return (key == n.Key);
}
}
int cur = 0;
unsigned bitPos = kNumBitsMax;
for (;;)
{
const CNode &n = Nodes[cur];
bitPos -= n.Len;
if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len))
return false;
unsigned bit = GetSubBit(key, --bitPos);
if (n.IsLeaf[bit])
{
valueRes = n.Values[bit];
return (key == n.Keys[bit]);
}
cur = (int)n.Keys[bit];
}
}
bool CMap32::Set(UInt32 key, UInt32 value)
{
if (Nodes.Size() == 0)
{
CNode n;
n.Key = n.Keys[0] = n.Keys[1] = key;
n.Values[0] = n.Values[1] = value;
n.IsLeaf[0] = n.IsLeaf[1] = 1;
n.Len = kNumBitsMax;
Nodes.Add(n);
return false;
}
if (Nodes.Size() == 1)
{
CNode &n = Nodes[0];
if (n.Len == kNumBitsMax)
{
if (key == n.Key)
{
n.Values[0] = n.Values[1] = value;
return true;
}
unsigned i = kNumBitsMax - 1;
for (;GetSubBit(key, i) == GetSubBit(n.Key, i); i--);
n.Len = (UInt16)(kNumBitsMax - (1 + i));
unsigned newBit = GetSubBit(key, i);
n.Values[newBit] = value;
n.Keys[newBit] = key;
return false;
}
}
int cur = 0;
unsigned bitPos = kNumBitsMax;
for (;;)
{
CNode &n = Nodes[cur];
bitPos -= n.Len;
if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len))
{
unsigned i = n.Len - 1;
for (; GetSubBit(key, bitPos + i) == GetSubBit(n.Key, bitPos + i); i--);
CNode e2(n);
e2.Len = (UInt16)i;
n.Len = (UInt16)(n.Len - (1 + i));
unsigned newBit = GetSubBit(key, bitPos + i);
n.Values[newBit] = value;
n.IsLeaf[newBit] = 1;
n.IsLeaf[1 - newBit] = 0;
n.Keys[newBit] = key;
n.Keys[1 - newBit] = Nodes.Size();
Nodes.Add(e2);
return false;
}
unsigned bit = GetSubBit(key, --bitPos);
if (n.IsLeaf[bit])
{
if (key == n.Keys[bit])
{
n.Values[bit] = value;
return true;
}
unsigned i = bitPos - 1;
for (;GetSubBit(key, i) == GetSubBit(n.Keys[bit], i); i--);
CNode e2;
unsigned newBit = GetSubBit(key, i);
e2.Values[newBit] = value;
e2.Values[1 - newBit] = n.Values[bit];
e2.IsLeaf[newBit] = e2.IsLeaf[1 - newBit] = 1;
e2.Keys[newBit] = key;
e2.Keys[1 - newBit] = e2.Key = n.Keys[bit];
e2.Len = (UInt16)(bitPos - (1 + i));
n.IsLeaf[bit] = 0;
n.Keys[bit] = Nodes.Size();
Nodes.Add(e2);
return false;
}
cur = (int)n.Keys[bit];
}
}

28
CPP/Common/MyMap.h Executable file
View File

@@ -0,0 +1,28 @@
// MyMap.h
#ifndef __COMMON_MYMAP_H
#define __COMMON_MYMAP_H
#include "MyVector.h"
#include "Types.h"
class CMap32
{
struct CNode
{
UInt32 Key;
UInt32 Keys[2];
UInt32 Values[2];
UInt16 Len;
Byte IsLeaf[2];
};
CRecordVector<CNode> Nodes;
public:
void Clear() { Nodes.Clear(); }
bool Find(UInt32 key, UInt32 &valueRes) const;
bool Set(UInt32 key, UInt32 value); // returns true, if there is such key already
};
#endif

View File

@@ -64,7 +64,7 @@ wchar_t * MyStringUpper(wchar_t *s)
}
wchar_t * MyStringLower(wchar_t *s)
{
{
if (s == 0)
return 0;
wchar_t *res = CharLowerW(s);
@@ -81,43 +81,43 @@ wchar_t * MyStringLower(wchar_t *s)
inline int ConvertCompareResult(int r) { return r - 2; }
int MyStringCollate(const wchar_t *s1, const wchar_t *s2)
{
{
int res = CompareStringW(
LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1);
LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1);
#ifdef _UNICODE
return ConvertCompareResult(res);
#else
if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
return ConvertCompareResult(res);
return MyStringCollate(UnicodeStringToMultiByte(s1),
return MyStringCollate(UnicodeStringToMultiByte(s1),
UnicodeStringToMultiByte(s2));
#endif
}
#ifndef _WIN32_WCE
int MyStringCollate(const char *s1, const char *s2)
{
{
return ConvertCompareResult(CompareStringA(
LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1));
LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1));
}
int MyStringCollateNoCase(const char *s1, const char *s2)
{
{
return ConvertCompareResult(CompareStringA(
LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1));
LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1));
}
#endif
int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2)
{
{
int res = CompareStringW(
LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1);
LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1);
#ifdef _UNICODE
return ConvertCompareResult(res);
#else
if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
return ConvertCompareResult(res);
return MyStringCollateNoCase(UnicodeStringToMultiByte(s1),
return MyStringCollateNoCase(UnicodeStringToMultiByte(s1),
UnicodeStringToMultiByte(s2));
#endif
}
@@ -132,7 +132,7 @@ wchar_t MyCharUpper(wchar_t c)
/*
int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2)
{
{
for (;;)
{
wchar_t c1 = *s1++;
@@ -150,7 +150,7 @@ int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2)
#endif
int MyStringCompare(const char *s1, const char *s2)
{
{
for (;;)
{
unsigned char c1 = (unsigned char)*s1++;
@@ -162,7 +162,7 @@ int MyStringCompare(const char *s1, const char *s2)
}
int MyStringCompare(const wchar_t *s1, const wchar_t *s2)
{
{
for (;;)
{
wchar_t c1 = *s1++;
@@ -174,7 +174,7 @@ int MyStringCompare(const wchar_t *s1, const wchar_t *s2)
}
int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2)
{
{
for (;;)
{
wchar_t c1 = *s1++;
@@ -192,7 +192,7 @@ int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2)
#ifdef _WIN32
int MyStringCompareNoCase(const char *s1, const char *s2)
{
{
return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2));
}
#endif

View File

@@ -14,7 +14,7 @@
template <class T>
inline int MyStringLen(const T *s)
{
{
int i;
for (i = 0; s[i] != '\0'; i++);
return i;
@@ -22,7 +22,7 @@ inline int MyStringLen(const T *s)
template <class T>
inline T * MyStringCopy(T *dest, const T *src)
{
{
T *destStart = dest;
while((*dest++ = *src++) != 0);
return destStart;
@@ -140,7 +140,7 @@ class CStringBase
}
void MoveItems(int destIndex, int srcIndex)
{
memmove(_chars + destIndex, _chars + srcIndex,
memmove(_chars + destIndex, _chars + srcIndex,
sizeof(T) * (_length - srcIndex + 1));
}
@@ -167,7 +167,7 @@ protected:
void SetCapacity(int newCapacity)
{
int realCapacity = newCapacity + 1;
if(realCapacity == _capacity)
if (realCapacity == _capacity)
return;
/*
const int kMaxStringSize = 0x20000000;
@@ -177,25 +177,21 @@ protected:
#endif
*/
T *newBuffer = new T[realCapacity];
if(_capacity > 0)
if (_capacity > 0)
{
for (int i = 0; i < (_length + 1); i++)
for (int i = 0; i < _length; i++)
newBuffer[i] = _chars[i];
delete []_chars;
_chars = newBuffer;
}
else
{
_chars = newBuffer;
_chars[0] = 0;
}
_chars = newBuffer;
_chars[_length] = 0;
_capacity = realCapacity;
}
void GrowLength(int n)
{
int freeSize = _capacity - _length - 1;
if (n <= freeSize)
if (n <= freeSize)
return;
int delta;
if (_capacity > 64)
@@ -216,8 +212,7 @@ protected:
}
public:
CStringBase(): _chars(0), _length(0), _capacity(0)
{ SetCapacity(16 - 1); }
CStringBase(): _chars(0), _length(0), _capacity(0) { SetCapacity(3); }
CStringBase(T c): _chars(0), _length(0), _capacity(0)
{
SetCapacity(1);
@@ -240,14 +235,14 @@ public:
}
~CStringBase() { delete []_chars; }
operator const T*() const { return _chars;}
operator const T*() const { return _chars;}
// The minimum size of the character buffer in characters.
// The minimum size of the character buffer in characters.
// This value does not include space for a null terminator.
T* GetBuffer(int minBufLength)
{
if(minBufLength >= _capacity)
SetCapacity(minBufLength + 1);
if (minBufLength >= _capacity)
SetCapacity(minBufLength);
return _chars;
}
void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); }
@@ -278,9 +273,9 @@ public:
int length = MyStringLen(chars);
SetCapacity(length);
MyStringCopy(_chars, chars);
_length = length;
_length = length;
return *this;
}
}
CStringBase& operator=(const CStringBase& s)
{
if(&s == this)
@@ -508,7 +503,7 @@ public:
while (pos < Length())
{
pos = Find(oldChar, pos);
if (pos < 0)
if (pos < 0)
break;
_chars[pos] = newChar;
pos++;
@@ -529,7 +524,7 @@ public:
while (pos < _length)
{
pos = Find(oldString, pos);
if (pos < 0)
if (pos < 0)
break;
Delete(pos, oldStringLength);
Insert(pos, newString);
@@ -556,7 +551,7 @@ CStringBase<T> operator+(const CStringBase<T>& s1, const CStringBase<T>& s2)
{
CStringBase<T> result(s1);
result += s2;
return result;
return result;
}
template <class T>
@@ -564,7 +559,7 @@ CStringBase<T> operator+(const CStringBase<T>& s, T c)
{
CStringBase<T> result(s);
result += c;
return result;
return result;
}
template <class T>
@@ -572,7 +567,7 @@ CStringBase<T> operator+(T c, const CStringBase<T>& s)
{
CStringBase<T> result(c);
result += s;
return result;
return result;
}
template <class T>
@@ -580,7 +575,7 @@ CStringBase<T> operator+(const CStringBase<T>& s, const T * chars)
{
CStringBase<T> result(s);
result += chars;
return result;
return result;
}
template <class T>
@@ -588,7 +583,7 @@ CStringBase<T> operator+(const T * chars, const CStringBase<T>& s)
{
CStringBase<T> result(chars);
result += s;
return result;
return result;
}
template <class T>

View File

@@ -9,7 +9,7 @@
#if (_WIN32_WCE > 300)
#include <basetyps.h>
#else
#define MIDL_INTERFACE(x) struct
#define MIDL_INTERFACE(x) struct
#endif
#else
#include <basetyps.h>
@@ -17,7 +17,7 @@
#include <unknwn.h>
#else
#else
#include "MyWindows.h"
#endif

View File

@@ -6,11 +6,12 @@
#include "MyVector.h"
CBaseRecordVector::~CBaseRecordVector() { Free(); }
CBaseRecordVector::~CBaseRecordVector() { ClearAndFree(); }
void CBaseRecordVector::Free()
{
delete []((unsigned char *)_items);
void CBaseRecordVector::ClearAndFree()
{
Clear();
delete []((unsigned char *)_items);
_capacity = 0;
_size = 0;
_items = 0;
@@ -24,39 +25,47 @@ void CBaseRecordVector::ReserveOnePosition()
{
if (_size != _capacity)
return;
int delta;
if (_capacity > 64)
delta = _capacity / 2;
else if (_capacity > 8)
int delta = 1;
if (_capacity >= 64)
delta = _capacity / 4;
else if (_capacity >= 8)
delta = 8;
else
delta = 4;
Reserve(_capacity + delta);
}
void CBaseRecordVector::Reserve(int newCapacity)
{
if (newCapacity <= _capacity)
// if (newCapacity <= _capacity)
if (newCapacity == _capacity)
return;
if ((unsigned)newCapacity >= ((unsigned)1 << (sizeof(unsigned) * 8 - 1)))
throw 1052353;
size_t newSize = (size_t)(unsigned)newCapacity * _itemSize;
if (newSize / _itemSize != (size_t)(unsigned)newCapacity)
throw 1052354;
unsigned char *p = new unsigned char[newSize];
if (p == 0)
throw 1052355;
int numRecordsToMove = _capacity;
memmove(p, _items, _itemSize * numRecordsToMove);
unsigned char *p = NULL;
if (newSize > 0)
{
p = new unsigned char[newSize];
if (p == 0)
throw 1052355;
int numRecordsToMove = _size;
memcpy(p, _items, _itemSize * numRecordsToMove);
}
delete [](unsigned char *)_items;
_items = p;
_capacity = newCapacity;
}
void CBaseRecordVector::ReserveDown()
{
Reserve(_size);
}
void CBaseRecordVector::MoveItems(int destIndex, int srcIndex)
{
memmove(((unsigned char *)_items) + destIndex * _itemSize,
((unsigned char *)_items) + srcIndex * _itemSize,
memmove(((unsigned char *)_items) + destIndex * _itemSize,
((unsigned char *)_items) + srcIndex * _itemSize,
_itemSize * (_size - srcIndex));
}

View File

@@ -17,15 +17,15 @@ protected:
void ReserveOnePosition();
void InsertOneItem(int index);
void TestIndexAndCorrectNum(int index, int &num) const
{ if (index + num > _size) num = _size - index; }
{ if (index + num > _size) num = _size - index; }
public:
CBaseRecordVector(size_t itemSize):
_capacity(0), _size(0), _items(0), _itemSize(itemSize) {}
CBaseRecordVector(size_t itemSize): _capacity(0), _size(0), _items(0), _itemSize(itemSize) {}
virtual ~CBaseRecordVector();
void Free();
void ClearAndFree();
int Size() const { return _size; }
bool IsEmpty() const { return (_size == 0); }
void Reserve(int newCapacity);
void ReserveDown();
virtual void Delete(int index, int num = 1);
void Clear();
void DeleteFrom(int index);
@@ -36,9 +36,8 @@ template <class T>
class CRecordVector: public CBaseRecordVector
{
public:
CRecordVector():CBaseRecordVector(sizeof(T)){};
CRecordVector(const CRecordVector &v):
CBaseRecordVector(sizeof(T)) { *this = v;}
CRecordVector(): CBaseRecordVector(sizeof(T)){};
CRecordVector(const CRecordVector &v): CBaseRecordVector(sizeof(T)) { *this = v; }
CRecordVector& operator=(const CRecordVector &v)
{
Clear();
@@ -68,9 +67,9 @@ public:
const T& operator[](int index) const { return ((T *)_items)[index]; }
T& operator[](int index) { return ((T *)_items)[index]; }
const T& Front() const { return operator[](0); }
T& Front() { return operator[](0); }
T& Front() { return operator[](0); }
const T& Back() const { return operator[](_size - 1); }
T& Back() { return operator[](_size - 1); }
T& Back() { return operator[](_size - 1); }
void Swap(int i, int j)
{
@@ -81,7 +80,7 @@ public:
int FindInSorted(const T& item) const
{
int left = 0, right = Size();
int left = 0, right = Size();
while (left != right)
{
int mid = (left + right) / 2;
@@ -98,7 +97,7 @@ public:
int AddToUniqueSorted(const T& item)
{
int left = 0, right = Size();
int left = 0, right = Size();
while (left != right)
{
int mid = (left + right) / 2;
@@ -115,7 +114,7 @@ public:
}
static void SortRefDown(T* p, int k, int size, int (*compare)(const T*, const T*, void *), void *param)
{
{
T temp = p[k];
for (;;)
{
@@ -126,10 +125,10 @@ public:
s++;
if (compare(&temp, p + s, param) >= 0)
break;
p[k] = p[s];
p[k] = p[s];
k = s;
}
p[k] = temp;
}
p[k] = temp;
}
void Sort(int (*compare)(const T*, const T*, void *), void *param)
@@ -165,21 +164,20 @@ template <class T>
class CObjectVector: public CPointerVector
{
public:
CObjectVector(){};
~CObjectVector() { Clear(); }
CObjectVector(const CObjectVector &objectVector)
{ *this = objectVector; }
CObjectVector& operator=(const CObjectVector &objectVector)
CObjectVector() {};
~CObjectVector() { Clear(); };
CObjectVector(const CObjectVector &v) { *this = v; }
CObjectVector& operator=(const CObjectVector &v)
{
Clear();
return (*this += objectVector);
return (*this += v);
}
CObjectVector& operator+=(const CObjectVector &objectVector)
CObjectVector& operator+=(const CObjectVector &v)
{
int size = objectVector.Size();
int size = v.Size();
Reserve(Size() + size);
for(int i = 0; i < size; i++)
Add(objectVector[i]);
Add(v[i]);
return *this;
}
const T& operator[](int index) const { return *((T *)CPointerVector::operator[](index)); }
@@ -188,10 +186,8 @@ public:
const T& Front() const { return operator[](0); }
T& Back() { return operator[](_size - 1); }
const T& Back() const { return operator[](_size - 1); }
int Add(const T& item)
{ return CPointerVector::Add(new T(item)); }
void Insert(int index, const T& item)
{ CPointerVector::Insert(index, new T(item)); }
int Add(const T& item) { return CPointerVector::Add(new T(item)); }
void Insert(int index, const T& item) { CPointerVector::Insert(index, new T(item)); }
virtual void Delete(int index, int num = 1)
{
TestIndexAndCorrectNum(index, num);
@@ -204,11 +200,11 @@ public:
for(int i = 0; i < Size(); i++)
if (item == (*this)[i])
return i;
return -1;
return -1;
}
int FindInSorted(const T& item) const
{
int left = 0, right = Size();
int left = 0, right = Size();
while (left != right)
{
int mid = (left + right) / 2;
@@ -224,7 +220,7 @@ public:
}
int AddToSorted(const T& item)
{
int left = 0, right = Size();
int left = 0, right = Size();
while (left != right)
{
int mid = (left + right) / 2;
@@ -243,7 +239,7 @@ public:
return right;
}
void Sort(int (*compare)(void *const *, void *const *, void *), void *param)
void Sort(int (*compare)(void *const *, void *const *, void *), void *param)
{ CPointerVector::Sort(compare, param); }
static int CompareObjectItems(void *const *a1, void *const *a2, void * /* param */)
@@ -251,4 +247,4 @@ public:
void Sort() { CPointerVector::Sort(CompareObjectItems, 0); }
};
#endif
#endif

View File

@@ -12,7 +12,7 @@ static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); }
static inline void FreeForBSTR(void *pv) { ::free(pv);}
static UINT MyStringLen(const wchar_t *s)
{
{
UINT i;
for (i = 0; s[i] != '\0'; i++);
return i;
@@ -81,7 +81,7 @@ HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src)
return res;
if (src->vt == VT_BSTR)
{
dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal,
dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal,
SysStringByteLen(src->bstrVal));
if (dest->bstrVal == 0)
return E_OUTOFMEMORY;

View File

@@ -85,9 +85,9 @@ typedef LONG SCODE;
#define E_INVALIDARG ((HRESULT)0x80070057L)
#ifdef _MSC_VER
#define STDMETHODCALLTYPE __stdcall
#define STDMETHODCALLTYPE __stdcall
#else
#define STDMETHODCALLTYPE
#define STDMETHODCALLTYPE
#endif
#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f
@@ -97,7 +97,7 @@ typedef LONG SCODE;
#define PURE = 0
#define MIDL_INTERFACE(x) struct
#define MIDL_INTERFACE(x) struct
#ifdef __cplusplus
@@ -163,7 +163,7 @@ typedef struct tagPROPVARIANT
PROPVAR_PAD1 wReserved1;
PROPVAR_PAD2 wReserved2;
PROPVAR_PAD3 wReserved3;
union
union
{
CHAR cVal;
UCHAR bVal;

209
CPP/Common/MyXml.cpp Executable file
View File

@@ -0,0 +1,209 @@
// MyXml.cpp
#include "StdAfx.h"
#include "MyXml.h"
static bool IsValidChar(char c)
{
return
c >= 'a' && c <= 'z' ||
c >= 'A' && c <= 'Z' ||
c >= '0' && c <= '9' ||
c == '-';
}
static bool IsSpaceChar(char c)
{
return (c == ' ' || c == '\t' || c == 0x0D || c == 0x0A);
}
#define SKEEP_SPACES(s, pos) while (IsSpaceChar(s[pos])) pos++;
static bool ReadProperty(const AString &s, int &pos, CXmlProp &prop)
{
prop.Name.Empty();
prop.Value.Empty();
for (; pos < s.Length(); pos++)
{
char c = s[pos];
if (!IsValidChar(c))
break;
prop.Name += c;
}
if (prop.Name.IsEmpty())
return false;
SKEEP_SPACES(s, pos);
if (s[pos++] != '=')
return false;
SKEEP_SPACES(s, pos);
if (s[pos++] != '\"')
return false;
while (pos < s.Length())
{
char c = s[pos++];
if (c == '\"')
return true;
prop.Value += c;
}
return false;
}
int CXmlItem::FindProperty(const AString &propName) const
{
for (int i = 0; i < Props.Size(); i++)
if (Props[i].Name == propName)
return i;
return -1;
}
AString CXmlItem::GetPropertyValue(const AString &propName) const
{
int index = FindProperty(propName);
if (index >= 0)
return Props[index].Value;
return AString();
}
bool CXmlItem::IsTagged(const AString &tag) const
{
return (IsTag && Name == tag);
}
int CXmlItem::FindSubTag(const AString &tag) const
{
for (int i = 0; i < SubItems.Size(); i++)
if (SubItems[i].IsTagged(tag))
return i;
return -1;
}
AString CXmlItem::GetSubString() const
{
if (SubItems.Size() == 1)
{
const CXmlItem &item = SubItems[0];
if (!item.IsTag)
return item.Name;
}
return AString();
}
AString CXmlItem::GetSubStringForTag(const AString &tag) const
{
int index = FindSubTag(tag);
if (index >= 0)
return SubItems[index].GetSubString();
return AString();
}
bool CXmlItem::ParseItems(const AString &s, int &pos, int numAllowedLevels)
{
if (numAllowedLevels == 0)
return false;
SubItems.Clear();
AString finishString = "</";
for (;;)
{
SKEEP_SPACES(s, pos);
if (s.Mid(pos, finishString.Length()) == finishString)
return true;
CXmlItem item;
if (!item.ParseItem(s, pos, numAllowedLevels - 1))
return false;
SubItems.Add(item);
}
}
bool CXmlItem::ParseItem(const AString &s, int &pos, int numAllowedLevels)
{
SKEEP_SPACES(s, pos);
int pos2 = s.Find('<', pos);
if (pos2 < 0)
return false;
if (pos2 != pos)
{
IsTag = false;
Name += s.Mid(pos, pos2 - pos);
pos = pos2;
return true;
}
IsTag = true;
pos++;
SKEEP_SPACES(s, pos);
for (; pos < s.Length(); pos++)
{
char c = s[pos];
if (!IsValidChar(c))
break;
Name += c;
}
if (Name.IsEmpty() || pos == s.Length())
return false;
int posTemp = pos;
for (;;)
{
SKEEP_SPACES(s, pos);
if (s[pos] == '/')
{
pos++;
// SKEEP_SPACES(s, pos);
return (s[pos++] == '>');
}
if (s[pos] == '>')
{
if (!ParseItems(s, ++pos, numAllowedLevels))
return false;
AString finishString = AString("</") + Name + AString(">");
if (s.Mid(pos, finishString.Length()) != finishString)
return false;
pos += finishString.Length();
return true;
}
if (posTemp == pos)
return false;
CXmlProp prop;
if (!ReadProperty(s, pos, prop))
return false;
Props.Add(prop);
posTemp = pos;
}
}
bool SkeepHeader(const AString &s, int &pos, const AString &startString, const AString &endString)
{
SKEEP_SPACES(s, pos);
if (s.Mid(pos, startString.Length()) == startString)
{
pos = s.Find(endString, pos);
if (pos < 0)
return false;
pos += endString.Length();
SKEEP_SPACES(s, pos);
}
return true;
}
bool CXml::Parse(const AString &s)
{
int pos = 0;
if (!SkeepHeader(s, pos, "<?xml", "?>"))
return false;
if (!SkeepHeader(s, pos, "<!DOCTYPE", ">"))
return false;
if (!Root.ParseItem(s, pos, 1000))
return false;
SKEEP_SPACES(s, pos);
return (pos == s.Length() && Root.IsTag);
}

40
CPP/Common/MyXml.h Executable file
View File

@@ -0,0 +1,40 @@
// MyXml.h
#ifndef __MYXML_H
#define __MYXML_H
#include "MyString.h"
struct CXmlProp
{
AString Name;
AString Value;
};
class CXmlItem
{
bool ParseItems(const AString &s, int &pos, int numAllowedLevels);
public:
AString Name;
bool IsTag;
CObjectVector<CXmlProp> Props;
CObjectVector<CXmlItem> SubItems;
bool ParseItem(const AString &s, int &pos, int numAllowedLevels);
bool IsTagged(const AString &tag) const;
int FindProperty(const AString &propName) const;
AString GetPropertyValue(const AString &propName) const;
AString GetSubString() const;
int FindSubTag(const AString &tag) const;
AString GetSubStringForTag(const AString &tag) const;
};
struct CXml
{
CXmlItem Root;
bool Parse(const AString &s);
};
#endif

View File

@@ -11,9 +11,9 @@
#ifndef DEBUG_MEMORY_LEAK
#ifdef _WIN32
void *
void *
#ifdef _MSC_VER
__cdecl
__cdecl
#endif
operator new(size_t size)
{
@@ -24,9 +24,9 @@ operator new(size_t size)
return p;
}
void
void
#ifdef _MSC_VER
__cdecl
__cdecl
#endif
operator delete(void *p) throw()
{

View File

@@ -6,11 +6,11 @@
class CNewException {};
#ifdef _WIN32
void
void
#ifdef _MSC_VER
__cdecl
__cdecl
#endif
operator delete(void *p) throw();
#endif
#endif
#endif
#endif

View File

@@ -6,4 +6,4 @@
// #include "MyWindows.h"
#include "NewHandler.h"
#endif
#endif

View File

@@ -14,7 +14,7 @@ static const char kIllegalChar = '\0';
static const char kNewLineChar = '\n';
static const char *kEOFMessage = "Unexpected end of input stream";
static const char *kReadErrorMessage ="Error reading input stream";
static const char *kReadErrorMessage ="Error reading input stream";
static const char *kIllegalCharMessage = "Illegal character in input stream";
static LPCTSTR kFileOpenMode = TEXT("r");

View File

@@ -8,7 +8,7 @@
#include "MyString.h"
#include "Types.h"
class CStdInStream
class CStdInStream
{
bool _streamIsOpen;
FILE *_stream;

View File

@@ -51,7 +51,7 @@ CStdOutStream::~CStdOutStream ()
CStdOutStream & CStdOutStream::operator<<(CStdOutStream & (*aFunction)(CStdOutStream &))
{
(*aFunction)(*this);
(*aFunction)(*this);
return *this;
}

View File

@@ -7,7 +7,7 @@
#include "Types.h"
class CStdOutStream
class CStdOutStream
{
bool _streamIsOpen;
FILE *_stream;

View File

@@ -14,8 +14,8 @@ UString MultiByteToUnicodeString(const AString &srcString, UINT codePage)
UString resultString;
if(!srcString.IsEmpty())
{
int numChars = MultiByteToWideChar(codePage, 0, srcString,
srcString.Length(), resultString.GetBuffer(srcString.Length()),
int numChars = MultiByteToWideChar(codePage, 0, srcString,
srcString.Length(), resultString.GetBuffer(srcString.Length()),
srcString.Length() + 1);
#ifndef _WIN32_WCE
if(numChars == 0)
@@ -34,8 +34,8 @@ AString UnicodeStringToMultiByte(const UString &s, UINT codePage, char defaultCh
{
int numRequiredBytes = s.Length() * 2;
BOOL defUsed;
int numChars = WideCharToMultiByte(codePage, 0, s, s.Length(),
dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1,
int numChars = WideCharToMultiByte(codePage, 0, s, s.Length(),
dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1,
&defaultChar, &defUsed);
defaultCharWasUsed = (defUsed != FALSE);
#ifndef _WIN32_WCE

View File

@@ -40,6 +40,28 @@ UInt64 ConvertOctStringToUInt64(const char *s, const char **end)
}
}
UInt64 ConvertHexStringToUInt64(const char *s, const char **end)
{
UInt64 result = 0;
for (;;)
{
char c = *s;
UInt32 v;
if (c >= '0' && c <= '9') v = (c - '0');
else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A');
else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a');
else
{
if (end != NULL)
*end = s;
return result;
}
result <<= 4;
result |= v;
s++;
}
}
UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end)
{

View File

@@ -8,6 +8,7 @@
UInt64 ConvertStringToUInt64(const char *s, const char **end);
UInt64 ConvertOctStringToUInt64(const char *s, const char **end);
UInt64 ConvertHexStringToUInt64(const char *s, const char **end);
UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end);
Int64 ConvertStringToInt64(const char *s, const char **end);

View File

@@ -5,87 +5,141 @@
#include "UTFConvert.h"
#include "Types.h"
static Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
static const Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
// These functions are for UTF8 <-> UTF16 conversion.
bool ConvertUTF8ToUnicode(const AString &src, UString &dest)
static Bool Utf8_To_Utf16(wchar_t *dest, size_t *destLen, const char *src, size_t srcLen)
{
dest.Empty();
for(int i = 0; i < src.Length();)
size_t destPos = 0, srcPos = 0;
for (;;)
{
Byte c = (Byte)src[i++];
Byte c;
int numAdds;
if (srcPos == srcLen)
{
*destLen = destPos;
return True;
}
c = (Byte)src[srcPos++];
if (c < 0x80)
{
dest += (wchar_t)c;
if (dest)
dest[destPos] = (wchar_t)c;
destPos++;
continue;
}
if(c < 0xC0)
return false;
int numAdds;
if (c < 0xC0)
break;
for (numAdds = 1; numAdds < 5; numAdds++)
if (c < kUtf8Limits[numAdds])
break;
UInt32 value = (c - kUtf8Limits[numAdds - 1]);
do
{
if (i >= src.Length())
return false;
Byte c2 = (Byte)src[i++];
Byte c2;
if (srcPos == srcLen)
break;
c2 = (Byte)src[srcPos++];
if (c2 < 0x80 || c2 >= 0xC0)
return false;
break;
value <<= 6;
value |= (c2 - 0x80);
numAdds--;
}
while(numAdds > 0);
while (--numAdds != 0);
if (value < 0x10000)
dest += (wchar_t)(value);
{
if (dest)
dest[destPos] = (wchar_t)value;
destPos++;
}
else
{
value -= 0x10000;
if (value >= 0x100000)
return false;
dest += (wchar_t)(0xD800 + (value >> 10));
dest += (wchar_t)(0xDC00 + (value & 0x3FF));
break;
if (dest)
{
dest[destPos + 0] = (wchar_t)(0xD800 + (value >> 10));
dest[destPos + 1] = (wchar_t)(0xDC00 + (value & 0x3FF));
}
destPos += 2;
}
}
return true;
*destLen = destPos;
return False;
}
static Bool Utf16_To_Utf8(char *dest, size_t *destLen, const wchar_t *src, size_t srcLen)
{
size_t destPos = 0, srcPos = 0;
for (;;)
{
unsigned numAdds;
UInt32 value;
if (srcPos == srcLen)
{
*destLen = destPos;
return True;
}
value = src[srcPos++];
if (value < 0x80)
{
if (dest)
dest[destPos] = (char)value;
destPos++;
continue;
}
if (value >= 0xD800 && value < 0xE000)
{
UInt32 c2;
if (value >= 0xDC00 || srcPos == srcLen)
break;
c2 = src[srcPos++];
if (c2 < 0xDC00 || c2 >= 0xE000)
break;
value = ((value - 0xD800) << 10) | (c2 - 0xDC00);
}
for (numAdds = 1; numAdds < 5; numAdds++)
if (value < (((UInt32)1) << (numAdds * 5 + 6)))
break;
if (dest)
dest[destPos] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds)));
destPos++;
do
{
numAdds--;
if (dest)
dest[destPos] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F));
destPos++;
}
while (numAdds != 0);
}
*destLen = destPos;
return False;
}
bool ConvertUTF8ToUnicode(const AString &src, UString &dest)
{
dest.Empty();
size_t destLen = 0;
Utf8_To_Utf16(NULL, &destLen, src, src.Length());
wchar_t *p = dest.GetBuffer((int)destLen);
Bool res = Utf8_To_Utf16(p, &destLen, src, src.Length());
p[destLen] = 0;
dest.ReleaseBuffer();
return res ? true : false;
}
bool ConvertUnicodeToUTF8(const UString &src, AString &dest)
{
dest.Empty();
for(int i = 0; i < src.Length();)
{
UInt32 value = (UInt32)src[i++];
if (value < 0x80)
{
dest += (char)value;
continue;
}
if (value >= 0xD800 && value < 0xE000)
{
if (value >= 0xDC00)
return false;
if (i >= src.Length())
return false;
UInt32 c2 = (UInt32)src[i++];
if (c2 < 0xDC00 || c2 >= 0xE000)
return false;
value = ((value - 0xD800) << 10) | (c2 - 0xDC00);
}
int numAdds;
for (numAdds = 1; numAdds < 5; numAdds++)
if (value < (((UInt32)1) << (numAdds * 5 + 6)))
break;
dest += (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds)));
do
{
numAdds--;
dest += (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F));
}
while(numAdds > 0);
}
return true;
size_t destLen = 0;
Utf16_To_Utf8(NULL, &destLen, src, src.Length());
char *p = dest.GetBuffer((int)destLen);
Bool res = Utf16_To_Utf8(p, &destLen, src, src.Length());
p[destLen] = 0;
dest.ReleaseBuffer();
return res ? true : false;
}

View File

@@ -4,7 +4,7 @@
#include "Wildcard.h"
bool g_CaseSensitive =
bool g_CaseSensitive =
#ifdef _WIN32
false;
#else
@@ -31,7 +31,7 @@ static inline bool IsCharDirLimiter(wchar_t c)
{
return (
#ifdef _WIN32
c == kDirDelimiter1 ||
c == kDirDelimiter1 ||
#endif
c == kDirDelimiter2);
}
@@ -54,20 +54,20 @@ static bool EnhancedMaskTest(const wchar_t *mask, const wchar_t *name)
{
wchar_t m = *mask;
wchar_t c = *name;
if (m == 0)
if (m == 0)
return (c == 0);
if (m == kAnyCharsChar)
{
if (EnhancedMaskTest(mask + 1, name))
return true;
if (c == 0)
if (c == 0)
return false;
}
else
{
if (m == kAnyCharChar)
{
if (c == 0)
if (c == 0)
return false;
}
else if (m != c)
@@ -155,7 +155,7 @@ N = TestNameParts.Size();
File Dir
ForFile req M<=N [N-M, N) -
nonreq M=N [0, M) -
nonreq M=N [0, M) -
ForDir req M<N [0, M) ... [N-M-1, N-1) same as ForBoth-File
nonreq [0, M) same as ForBoth-File
@@ -301,7 +301,7 @@ bool CCensorNode::CheckPath(UStringVector &pathParts, bool isFile, bool &include
bool CCensorNode::CheckPath(const UString &path, bool isFile, bool &include) const
{
UStringVector pathParts;
UStringVector pathParts;
SplitPathToParts(path, pathParts);
return CheckPath(pathParts, isFile, include);
}
@@ -327,7 +327,7 @@ bool CCensorNode::CheckPathToRoot(bool include, UStringVector &pathParts, bool i
/*
bool CCensorNode::CheckPathToRoot(bool include, const UString &path, bool isFile) const
{
UStringVector pathParts;
UStringVector pathParts;
SplitPathToParts(path, pathParts);
return CheckPathToRoot(include, pathParts, isFile);
}