427 lines
9.4 KiB
C++
427 lines
9.4 KiB
C++
/****************************************************************************\
|
|
*
|
|
* PARSERAT.H --Structures for holding pics information
|
|
*
|
|
* Created: Jason Thomas
|
|
* Updated: Ann McCurdy
|
|
*
|
|
\****************************************************************************/
|
|
|
|
#ifndef _PARSERAT_H_
|
|
#define _PARSERAT_H_
|
|
|
|
|
|
|
|
|
|
// output defines ---------------------------------------
|
|
#define OUTPUT_PICS
|
|
|
|
|
|
|
|
|
|
/*Array template---------------------------------------------------*/
|
|
|
|
/*Interface-------------------------------------------------------------------*/
|
|
template <class T>
|
|
class array {
|
|
private:
|
|
int nLen, nMax;
|
|
T *pData;
|
|
void Destruct();
|
|
public:
|
|
array();
|
|
~array();
|
|
|
|
BOOL Append(T v);
|
|
int Length() const;
|
|
void ClearAll();
|
|
void DeleteAll();
|
|
|
|
T& operator[](int index);
|
|
};
|
|
|
|
/*definitions of everything*/
|
|
|
|
#ifndef ARRAY_CXX
|
|
#define ARRAY_CXX
|
|
|
|
/*Implementation------------------------------------------------------------*/
|
|
template <class T>
|
|
array<T>::array(){
|
|
nLen = nMax = 0;
|
|
pData = NULL;
|
|
}
|
|
|
|
template <class T>
|
|
inline array<T>::~array() {
|
|
if (pData) ::MemFree(pData);
|
|
pData = NULL;
|
|
nMax = nLen = 0;
|
|
}
|
|
|
|
template <class T>
|
|
inline int array<T>::Length() const{
|
|
return nLen;
|
|
}
|
|
|
|
template <class T>
|
|
inline T& array<T>::operator[](int index){
|
|
assert(index<Length());
|
|
assert(index>=0);
|
|
assert(pData);
|
|
return pData[index];
|
|
}
|
|
|
|
template <class T>
|
|
BOOL array<T>::Append(T v) {
|
|
if (nLen == nMax){
|
|
nMax = nMax + 8; /* grow by bigger chunks */
|
|
T* pNew = (T*)::MemReAlloc(pData, sizeof(T)*nMax);
|
|
if (pNew == NULL)
|
|
return FALSE;
|
|
pData = pNew;
|
|
}
|
|
assert(pData);
|
|
assert(nMax);
|
|
pData[nLen++] = v;
|
|
return TRUE;
|
|
}
|
|
|
|
template <class T>
|
|
void array<T>::Destruct(){
|
|
while (nLen){
|
|
delete pData[--nLen];
|
|
}
|
|
}
|
|
|
|
template <class T>
|
|
inline void array<T>::ClearAll() {
|
|
nLen = 0;
|
|
}
|
|
|
|
template <class T>
|
|
inline void array<T>::DeleteAll() {
|
|
Destruct();
|
|
}
|
|
|
|
#endif
|
|
/* ARRAY_CXX */
|
|
|
|
|
|
#define P_INFINITY 9999
|
|
#define N_INFINITY -9999
|
|
|
|
/*Simple PICS types------------------------------------------------*/
|
|
|
|
#if 0
|
|
class ET{
|
|
private:
|
|
BOOL m_fInit;
|
|
public:
|
|
ET();
|
|
void Init();
|
|
void UnInit();
|
|
BOOL fIsInit();
|
|
};
|
|
#endif
|
|
|
|
class ETN
|
|
{
|
|
private:
|
|
INT_PTR r;
|
|
BOOL m_fInit;
|
|
public:
|
|
ETN() { m_fInit = FALSE; }
|
|
|
|
void Init() { m_fInit = TRUE; }
|
|
void UnInit() { m_fInit = FALSE; }
|
|
BOOL fIsInit() { return m_fInit; }
|
|
|
|
#ifdef DEBUG
|
|
void Set(INT_PTR rIn);
|
|
INT_PTR Get();
|
|
#else
|
|
void Set(INT_PTR rIn) { Init(); r = rIn; }
|
|
INT_PTR Get() { return r; }
|
|
#endif
|
|
|
|
ETN* Duplicate();
|
|
};
|
|
|
|
const UINT ETB_VALUE = 0x01;
|
|
const UINT ETB_ISINIT = 0x02;
|
|
class ETB
|
|
{
|
|
private:
|
|
UINT m_nFlags;
|
|
public:
|
|
ETB() { m_nFlags = 0; }
|
|
|
|
#ifdef DEBUG
|
|
INT_PTR Get();
|
|
void Set(INT_PTR b);
|
|
#else
|
|
INT_PTR Get() { return m_nFlags & ETB_VALUE; }
|
|
void Set(INT_PTR b) { m_nFlags = ETB_ISINIT | (b ? ETB_VALUE : 0); }
|
|
#endif
|
|
|
|
ETB *Duplicate();
|
|
BOOL fIsInit() { return m_nFlags & ETB_ISINIT; }
|
|
};
|
|
|
|
class ETS
|
|
{
|
|
private:
|
|
char *pc;
|
|
public:
|
|
ETS() { pc = NULL; }
|
|
~ETS();
|
|
#ifdef DEBUG
|
|
char* Get();
|
|
#else
|
|
char *Get() { return pc; }
|
|
#endif
|
|
void Set(const char *pIn);
|
|
ETS* Duplicate();
|
|
void SetTo(char *pIn);
|
|
|
|
BOOL fIsInit() { return pc != NULL; }
|
|
};
|
|
|
|
/*Complex PICS types-----------------------------------------------*/
|
|
|
|
|
|
enum RatObjectID
|
|
{
|
|
ROID_INVALID, /* dummy entry for terminating arrays */
|
|
ROID_PICSDOCUMENT, /* value representing the entire document (i.e., no token) */
|
|
ROID_PICSVERSION,
|
|
ROID_RATINGSYSTEM,
|
|
ROID_RATINGSERVICE,
|
|
ROID_RATINGBUREAU,
|
|
ROID_BUREAUREQUIRED,
|
|
ROID_CATEGORY,
|
|
ROID_TRANSMITAS,
|
|
ROID_LABEL,
|
|
ROID_VALUE,
|
|
ROID_DEFAULT,
|
|
ROID_DESCRIPTION,
|
|
ROID_EXTENSION,
|
|
ROID_MANDATORY,
|
|
ROID_OPTIONAL,
|
|
ROID_ICON,
|
|
ROID_INTEGER,
|
|
ROID_LABELONLY,
|
|
ROID_MAX,
|
|
ROID_MIN,
|
|
ROID_MULTIVALUE,
|
|
ROID_NAME,
|
|
ROID_UNORDERED
|
|
};
|
|
|
|
/* A RatObjectHandler parses the contents of a parenthesized object and
|
|
* spits out a binary representation of that data, suitable for passing
|
|
* to an object's AddItem function. It does not consume the ')' which
|
|
* closes the object.
|
|
*/
|
|
class RatFileParser;
|
|
typedef HRESULT (*RatObjectHandler)(LPSTR *ppszIn, LPVOID *ppOut, RatFileParser *pParser);
|
|
|
|
|
|
class PicsCategory;
|
|
|
|
class PicsObjectBase : public CObject
|
|
{
|
|
public:
|
|
virtual HRESULT AddItem(RatObjectID roid, LPVOID pData) = 0;
|
|
virtual HRESULT InitializeMyDefaults(PicsCategory *pCategory) = 0;
|
|
virtual void Dump( void ) = 0;
|
|
};
|
|
|
|
|
|
const DWORD AO_SINGLE = 0x01;
|
|
const DWORD AO_SEEN = 0x02;
|
|
const DWORD AO_MANDATORY = 0x04;
|
|
|
|
struct AllowableOption
|
|
{
|
|
RatObjectID roid;
|
|
DWORD fdwOptions;
|
|
};
|
|
|
|
|
|
class PicsEnum : public PicsObjectBase
|
|
{
|
|
private:
|
|
public:
|
|
ETS etstrName, etstrIcon, etstrDesc;
|
|
ETN etnValue;
|
|
|
|
PicsEnum() {}
|
|
~PicsEnum() {}
|
|
|
|
HRESULT AddItem(RatObjectID roid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults(PicsCategory *pCategory);
|
|
void Dump( void );
|
|
};
|
|
|
|
class PicsRatingSystem;
|
|
|
|
class PicsCategory : public PicsObjectBase
|
|
{
|
|
public:
|
|
PicsCategory():currentValue(0) {;}
|
|
~PicsCategory()
|
|
{
|
|
arrpPC.DeleteAll();
|
|
arrpPE.DeleteAll();
|
|
}
|
|
|
|
private:
|
|
public:
|
|
array<PicsCategory*> arrpPC;
|
|
array<PicsEnum*> arrpPE;
|
|
ETS etstrTransmitAs, etstrName, etstrIcon, etstrDesc;
|
|
ETN etnMin, etnMax;
|
|
ETB etfMulti, etfInteger, etfLabelled, etfUnordered;
|
|
PicsRatingSystem *pPRS;
|
|
|
|
WORD currentValue;
|
|
|
|
void FixupLimits();
|
|
void SetParents(PicsRatingSystem *pOwner);
|
|
|
|
HRESULT AddItem(RatObjectID roid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults(PicsCategory *pCategory);
|
|
|
|
void Dump( void );
|
|
|
|
// boydm
|
|
void OutputLabel( CString &sz );
|
|
BOOL FSetValuePair( CHAR chCat, WORD value );
|
|
};
|
|
|
|
|
|
class PicsDefault : public PicsObjectBase
|
|
{
|
|
public:
|
|
ETB etfInteger, etfLabelled, etfMulti, etfUnordered;
|
|
ETN etnMax, etnMin;
|
|
|
|
PicsDefault() {}
|
|
~PicsDefault() {}
|
|
|
|
HRESULT AddItem(RatObjectID roid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults(PicsCategory *pCategory);
|
|
|
|
void Dump( void );
|
|
};
|
|
|
|
|
|
class PicsExtension : public PicsObjectBase
|
|
{
|
|
public:
|
|
LPSTR m_pszRatingBureau;
|
|
|
|
PicsExtension();
|
|
~PicsExtension();
|
|
|
|
HRESULT AddItem(RatObjectID roid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults(PicsCategory *pCategory);
|
|
|
|
void Dump( void );
|
|
};
|
|
|
|
|
|
class PicsRatingSystem : public PicsObjectBase
|
|
{
|
|
private:
|
|
public:
|
|
array<PicsCategory*> arrpPC;
|
|
ETS etstrFile, etstrName, etstrIcon, etstrDesc,
|
|
etstrRatingService, etstrRatingSystem, etstrRatingBureau;
|
|
ETN etnPicsVersion;
|
|
ETB etbBureauRequired;
|
|
PicsDefault * m_pDefaultOptions;
|
|
DWORD dwFlags;
|
|
UINT nErrLine;
|
|
|
|
PicsRatingSystem() :
|
|
m_pDefaultOptions( NULL ),
|
|
dwFlags( 0 ),
|
|
nErrLine( 0 ) {}
|
|
|
|
~PicsRatingSystem()
|
|
{
|
|
arrpPC.DeleteAll();
|
|
if (m_pDefaultOptions != NULL)
|
|
delete m_pDefaultOptions;
|
|
}
|
|
|
|
HRESULT Parse(LPSTR pStreamIn);
|
|
|
|
HRESULT AddItem(RatObjectID roid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults(PicsCategory *pCategory);
|
|
VOID Dump();
|
|
void ReportError(HRESULT hres);
|
|
|
|
void OutputLabels( CString &sz, CString szURL,CString szName, CString szStart, CString szEnd );
|
|
};
|
|
|
|
void SkipWhitespace(LPSTR *ppsz);
|
|
BOOL IsEqualToken(LPCSTR pszTokenStart, LPCSTR pszTokenEnd, LPCSTR pszTokenToMatch);
|
|
LPSTR FindTokenEnd(LPSTR pszStart);
|
|
HRESULT GetBool(LPSTR *ppszToken, BOOL *pfOut);
|
|
HRESULT ParseNumber(LPSTR *ppszNumber, INT *pnOut);
|
|
|
|
/*Memory utility functions-----------------------------------------------*/
|
|
|
|
inline void * WINAPI MemAlloc(long cb)
|
|
{
|
|
return (void *)::LocalAlloc(LPTR, cb);
|
|
}
|
|
|
|
inline void * WINAPI MemReAlloc(void * pb, long cb)
|
|
{
|
|
if (pb == NULL)
|
|
return MemAlloc(cb);
|
|
|
|
return (void *)::LocalReAlloc((HLOCAL)pb, cb, LMEM_MOVEABLE | LMEM_ZEROINIT);
|
|
}
|
|
|
|
inline BOOL WINAPI MemFree(void * pb)
|
|
{
|
|
return (BOOL)HandleToUlong(::LocalFree((HLOCAL)pb));
|
|
}
|
|
|
|
/*String manipulation wrappers---------------------------------------------*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define memcmpf(d,s,l) memcmp((d),(s),(l))
|
|
#define memcpyf(d,s,l) memcpy((d),(s),(l))
|
|
#define memmovef(d,s,l) MoveMemory((d),(s),(l))
|
|
#define memsetf(s,c,l) memset((s),(c),(l))
|
|
#define strcatf(d,s) strcat((d),(s))
|
|
#define strcmpf(s1,s2) lstrcmp(s1,s2)
|
|
#define strcpyf(d,s) strcpy((d),(s))
|
|
#define stricmpf(s1,s2) lstrcmpi(s1,s2)
|
|
#define strlenf(s) strlen((s))
|
|
#define strchrf(s,c) strchr((s),(c))
|
|
#define strrchrf(s,c) strrchr((s),(c))
|
|
#define strspnf(s1,s2) strspn((s1),(s2))
|
|
#define strnicmpf(s1,s2,i) _strnicmp((s1),(s2),(i))
|
|
#define strncpyf(s1,s2,i) strncpy((s1),(s2),(i))
|
|
#define strcspnf(s1,s2) strcspn((s1),(s2))
|
|
#define strtokf(s1,s2) strtok((s1),(s2))
|
|
#define strstrf(s1,s2) strstr((s1),(s2))
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|