Compare commits

..

10 Commits

Author SHA1 Message Date
jim_nance%yahoo.com
5efdd75081 Moving stringmap code to head
git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@130358 18797224-902f-48f8-a5cc-f745e15eee43
2002-09-24 17:30:09 +00:00
(no author)
bb4d583501 This commit was manufactured by cvs2svn to create branch
'jnance_stringmap_branch'.

git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@129782 18797224-902f-48f8-a5cc-f745e15eee43
2002-09-17 06:20:27 +00:00
jim_nance%yahoo.com
87f2b425c5 fixing bitrot
git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@125222 18797224-902f-48f8-a5cc-f745e15eee43
2002-07-15 16:27:23 +00:00
jim_nance%yahoo.com
e6beef1883 Make the nsStringMap class safe for arbitrary data, not just 0 terminated
strings


git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@102169 18797224-902f-48f8-a5cc-f745e15eee43
2001-09-01 20:12:59 +00:00
jim_nance%yahoo.com
86e80f88cd Fix mixed tab space problem
git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@102137 18797224-902f-48f8-a5cc-f745e15eee43
2001-09-01 01:57:59 +00:00
jim_nance%yahoo.com
a6b3ccc7c5 Added ability to copy string into object
git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@102030 18797224-902f-48f8-a5cc-f745e15eee43
2001-08-30 18:58:42 +00:00
jim_nance%yahoo.com
1c214c2fab Did some quantify optimizations. We run much faster now :-)
git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@101870 18797224-902f-48f8-a5cc-f745e15eee43
2001-08-28 02:34:25 +00:00
jim_nance%yahoo.com
806cb0a4d6 add nsStringMap class
git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@101807 18797224-902f-48f8-a5cc-f745e15eee43
2001-08-26 02:44:12 +00:00
jim_nance%yahoo.com
1baf4456fb Adding nsStringMap class
git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@101806 18797224-902f-48f8-a5cc-f745e15eee43
2001-08-26 02:41:48 +00:00
(no author)
f5ac20ebb4 This commit was manufactured by cvs2svn to create branch
'jnance_stringmap_branch'.

git-svn-id: svn://10.0.0.236/branches/jnance_stringmap_branch@101264 18797224-902f-48f8-a5cc-f745e15eee43
2001-08-17 02:03:35 +00:00
6 changed files with 5885 additions and 689 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,219 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* ex: set tabstop=8 softtabstop=2 shiftwidth=2 expandtab:
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef nsFontMetricsGTK_h__
#define nsFontMetricsGTK_h__
#include "nsDeviceContextGTK.h"
#include "nsIFontMetrics.h"
#include "nsIFontEnumerator.h"
#include "nsFont.h"
#include "nsString.h"
#include "nsUnitConversion.h"
#include "nsIDeviceContext.h"
#include "nsCRT.h"
#include "nsCOMPtr.h"
#include "nsRenderingContextGTK.h"
#include "nsICharRepresentable.h"
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#undef FONT_HAS_GLYPH
#define FONT_HAS_GLYPH(map, char) IS_REPRESENTABLE(map, char)
typedef struct nsFontCharSetInfo nsFontCharSetInfo;
typedef gint (*nsFontCharSetConverter)(nsFontCharSetInfo* aSelf,
XFontStruct* aFont, const PRUnichar* aSrcBuf, PRInt32 aSrcLen,
char* aDestBuf, PRInt32 aDestLen);
struct nsFontCharSet;
struct nsFontFamily;
struct nsFontNode;
struct nsFontStretch;
class nsFontGTKUserDefined;
class nsFontMetricsGTK;
class nsFontGTK
{
public:
nsFontGTK();
virtual ~nsFontGTK();
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
void LoadFont(void);
PRBool IsEmptyFont(GdkFont*);
inline int SupportsChar(PRUnichar aChar)
{ return mFont && FONT_HAS_GLYPH(mMap, aChar); };
virtual GdkFont* GetGDKFont(void);
virtual PRBool GetGDKFontIs10646(void);
virtual gint GetWidth(const PRUnichar* aString, PRUint32 aLength) = 0;
virtual gint DrawString(nsRenderingContextGTK* aContext,
nsDrawingSurfaceGTK* aSurface, nscoord aX,
nscoord aY, const PRUnichar* aString,
PRUint32 aLength) = 0;
#ifdef MOZ_MATHML
// bounding metrics for a string
// remember returned values are not in app units
// - to emulate GetWidth () above
virtual nsresult
GetBoundingMetrics(const PRUnichar* aString,
PRUint32 aLength,
nsBoundingMetrics& aBoundingMetrics) = 0;
#endif
PRUint32* mMap;
nsFontCharSetInfo* mCharSetInfo;
char* mName;
nsFontGTKUserDefined* mUserDefinedFont;
PRUint16 mSize;
PRInt16 mBaselineAdjust;
protected:
GdkFont* mFont;
PRBool mAlreadyCalledLoadFont;
};
class nsFontMetricsGTK : public nsIFontMetrics
{
public:
nsFontMetricsGTK();
virtual ~nsFontMetricsGTK();
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
NS_DECL_ISUPPORTS
NS_IMETHOD Init(const nsFont& aFont, nsIAtom* aLangGroup,
nsIDeviceContext* aContext);
NS_IMETHOD Destroy();
NS_IMETHOD GetXHeight(nscoord& aResult);
NS_IMETHOD GetSuperscriptOffset(nscoord& aResult);
NS_IMETHOD GetSubscriptOffset(nscoord& aResult);
NS_IMETHOD GetStrikeout(nscoord& aOffset, nscoord& aSize);
NS_IMETHOD GetUnderline(nscoord& aOffset, nscoord& aSize);
NS_IMETHOD GetHeight(nscoord &aHeight);
NS_IMETHOD GetNormalLineHeight(nscoord &aHeight);
NS_IMETHOD GetLeading(nscoord &aLeading);
NS_IMETHOD GetEmHeight(nscoord &aHeight);
NS_IMETHOD GetEmAscent(nscoord &aAscent);
NS_IMETHOD GetEmDescent(nscoord &aDescent);
NS_IMETHOD GetMaxHeight(nscoord &aHeight);
NS_IMETHOD GetMaxAscent(nscoord &aAscent);
NS_IMETHOD GetMaxDescent(nscoord &aDescent);
NS_IMETHOD GetMaxAdvance(nscoord &aAdvance);
NS_IMETHOD GetFont(const nsFont *&aFont);
NS_IMETHOD GetLangGroup(nsIAtom** aLangGroup);
NS_IMETHOD GetFontHandle(nsFontHandle &aHandle);
virtual nsresult GetSpaceWidth(nscoord &aSpaceWidth);
nsFontGTK* FindFont(PRUnichar aChar);
nsFontGTK* FindUserDefinedFont(PRUnichar aChar);
nsFontGTK* FindStyleSheetSpecificFont(PRUnichar aChar);
nsFontGTK* FindStyleSheetGenericFont(PRUnichar aChar);
nsFontGTK* FindLangGroupPrefFont(nsIAtom* aLangGroup, PRUnichar aChar);
nsFontGTK* FindLangGroupFont(nsIAtom* aLangGroup, PRUnichar aChar, nsCString* aName);
nsFontGTK* FindAnyFont(PRUnichar aChar);
nsFontGTK* FindSubstituteFont(PRUnichar aChar);
nsFontGTK* SearchNode(nsFontNode* aNode, PRUnichar aChar);
nsFontGTK* TryAliases(nsCString* aName, PRUnichar aChar);
nsFontGTK* TryFamily(nsCString* aName, PRUnichar aChar);
nsFontGTK* TryNode(nsCString* aName, PRUnichar aChar);
nsFontGTK* TryNodes(nsAWritableCString &aFFREName, PRUnichar aChar);
nsFontGTK* TryLangGroup(nsIAtom* aLangGroup, nsCString* aName, PRUnichar aChar);
nsFontGTK* AddToLoadedFontsList(nsFontGTK* aFont);
nsFontGTK* PickASizeAndLoad(nsFontStretch* aStretch,
nsFontCharSetInfo* aCharSet,
PRUnichar aChar,
const char *aName);
static nsresult FamilyExists(const nsString& aFontName);
//friend struct nsFontGTK;
nsFontGTK **mLoadedFonts;
PRUint16 mLoadedFontsAlloc;
PRUint16 mLoadedFontsCount;
nsFontGTK *mSubstituteFont;
nsCStringArray mFonts;
PRUint16 mFontsIndex;
nsVoidArray mFontIsGeneric;
nsCAutoString mDefaultFont;
nsCString *mGeneric;
nsCOMPtr<nsIAtom> mLangGroup;
nsCAutoString mUserDefined;
PRUint8 mTriedAllGenerics;
PRUint8 mIsUserDefined;
protected:
void RealizeFont();
nsIDeviceContext *mDeviceContext;
nsFont *mFont;
nsFontGTK *mWesternFont;
nscoord mLeading;
nscoord mEmHeight;
nscoord mEmAscent;
nscoord mEmDescent;
nscoord mMaxHeight;
nscoord mMaxAscent;
nscoord mMaxDescent;
nscoord mMaxAdvance;
nscoord mXHeight;
nscoord mSuperscriptOffset;
nscoord mSubscriptOffset;
nscoord mStrikeoutSize;
nscoord mStrikeoutOffset;
nscoord mUnderlineSize;
nscoord mUnderlineOffset;
nscoord mSpaceWidth;
PRUint16 mPixelSize;
PRUint8 mStretchIndex;
PRUint8 mStyleIndex;
nsFontCharSetConverter mDocConverterType;
};
class nsFontEnumeratorGTK : public nsIFontEnumerator
{
public:
nsFontEnumeratorGTK();
NS_DECL_ISUPPORTS
NS_DECL_NSIFONTENUMERATOR
};
#endif

View File

@@ -1,689 +0,0 @@
;+#
;+# The contents of this file are subject to the Mozilla Public
;+# License Version 1.1 (the "License"); you may not use this file
;+# except in compliance with the License. You may obtain a copy of
;+# the License at http://www.mozilla.org/MPL/
;+#
;+# Software distributed under the License is distributed on an "AS
;+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
;+# implied. See the License for the specific language governing
;+# rights and limitations under the License.
;+#
;+# The Original Code is the Netscape security libraries.
;+#
;+# The Initial Developer of the Original Code is Netscape
;+# Communications Corporation. Portions created by Netscape are
;+# Copyright (C) 2000 Netscape Communications Corporation. All
;+# Rights Reserved.
;+#
;+# Contributor(s):
;+# Dr Stephen Henson <stephen.henson@gemplus.com>
;+#
;+# Alternatively, the contents of this file may be used under the
;+# terms of the GNU General Public License Version 2 or later (the
;+# "GPL"), in which case the provisions of the GPL are applicable
;+# instead of those above. If you wish to allow use of your
;+# version of this file only under the terms of the GPL and not to
;+# allow others to use your version of this file under the MPL,
;+# indicate your decision by deleting the provisions above and
;+# replace them with the notice and other provisions required by
;+# the GPL. If you do not delete the provisions above, a recipient
;+# may use your version of this file under either the MPL or the
;+# GPL.
;+#
;+#
;+# OK, this file is meant to support SUN, LINUX, AIX and WINDOWS
;+# 1. For all unix platforms, the string ";-" means "remove this line"
;+# 2. For all unix platforms, the string " DATA " will be removed from any
;+# line on which it occurs.
;+# 3. Lines containing ";+" will have ";+" removed on SUN and LINUX.
;+# On AIX, lines containing ";+" will be removed.
;+# 4. For all unix platforms, the string ";;" will thave the ";;" removed.
;+# 5. For all unix platforms, after the above processing has taken place,
;+# all characters after the first ";" on the line will be removed.
;+# And for AIX, the first ";" will also be removed.
;+# This file is passed directly to windows. Since ';' is a comment, all UNIX
;+# directives are hidden behind ";", ";+", and ";-"
;+NSS_3.2 { # NSS 3.2 release
;+ global:
LIBRARY nss3 ;-
EXPORTS ;-
ATOB_AsciiToData;
BTOA_ConvertItemToAscii;
BTOA_DataToAscii;
CERT_AsciiToName;
CERT_CertTimesValid;
CERT_CheckCertValidTimes;
CERT_CreateCertificateRequest;
CERT_ChangeCertTrust;
CERT_DecodeDERCrl;
CERT_DestroyCertificateRequest;
CERT_DestroyCertList;
CERT_DestroyName;
CERT_EnableOCSPChecking;
CERT_FormatName;
CERT_DestroyCertificate;
CERT_DupCertificate;
CERT_FreeDistNames;
CERT_FreeNicknames;
CERT_GetAVATag;
CERT_GetCertEmailAddress;
CERT_GetCertNicknames;
CERT_GetCertIssuerAndSN;
CERT_GetCertTrust;
CERT_GetCertUid;
CERT_GetCommonName;
CERT_GetCountryName;
CERT_GetDBContentVersion;
CERT_GetDefaultCertDB;
CERT_GetDomainComponentName;
CERT_GetLocalityName;
CERT_GetOrgName;
CERT_GetOrgUnitName;
CERT_GetSSLCACerts;
CERT_GetSlopTime;
CERT_GetStateName;
CERT_ImportCAChain;
CERT_NameToAscii;
CERT_RFC1485_EscapeAndQuote;
CERT_SetSlopTime;
CERT_VerifyCertName;
CERT_VerifyCertNow;
DER_UTCDayToAscii;
DER_UTCTimeToAscii;
DER_GeneralizedTimeToTime;
NSS_Init;
NSS_Initialize;
NSS_InitReadWrite;
NSS_NoDB_Init;
NSS_Shutdown;
NSS_VersionCheck;
PK11_Authenticate;
PK11_ChangePW;
PK11_CheckUserPassword;
PK11_CipherOp;
PK11_CloneContext;
PK11_ConfigurePKCS11;
PK11_CreateContextBySymKey;
PK11_CreateDigestContext;
PK11_DestroyContext;
PK11_DestroyTokenObject;
PK11_DigestBegin;
PK11_DigestOp;
PK11_DigestFinal;
PK11_DoesMechanism;
PK11_FindCertFromNickname;
PK11_FindCertFromDERCert;
PK11_FindCertByIssuerAndSN;
PK11_FindKeyByAnyCert;
PK11_FindKeyByDERCert;
PK11_FindSlotByName;
PK11_Finalize;
PK11_FortezzaHasKEA;
PK11_FreeSlot;
PK11_FreeSlotList;
PK11_FreeSymKey;
PK11_GenerateKeyPair;
PK11_GenerateRandom;
PK11_GenerateNewParam;
PK11_GetAllTokens;
PK11_GetBlockSize;
PK11_GetFirstSafe;
PK11_GetInternalKeySlot;
PK11_GetInternalSlot;
PK11_GetSlotName;
PK11_GetTokenName;
PK11_HashBuf;
PK11_IsFIPS;
PK11_IsFriendly;
PK11_IsInternal;
PK11_IsHW;
PK11_IsPresent;
PK11_IsReadOnly;
PK11_KeyGen;
PK11_ListCerts;
PK11_NeedLogin;
PK11_RandomUpdate;
PK11_SetPasswordFunc;
PK11_SetSlotPWValues;
PORT_Alloc;
PORT_Free;
PORT_GetError;
PORT_SetError;
PORT_SetUCS4_UTF8ConversionFunction;
PORT_SetUCS2_UTF8ConversionFunction;
PORT_SetUCS2_ASCIIConversionFunction;
SECITEM_CopyItem;
SECITEM_DupItem;
SECITEM_FreeItem;
SECITEM_ZfreeItem;
SECKEY_ConvertToPublicKey;
SECKEY_CopyPrivateKey;
SECKEY_CreateSubjectPublicKeyInfo;
SECKEY_DestroyPrivateKey;
SECKEY_DestroySubjectPublicKeyInfo;
SECMOD_IsModulePresent;
SECOID_FindOIDTagDescription;
SECOID_GetAlgorithmTag;
SEC_DeletePermCertificate;
SEC_DeletePermCRL;
SEC_DerSignData;
SEC_DestroyCrl;
SEC_FindCrlByDERCert;
SEC_FindCrlByName;
SEC_LookupCrls;
SEC_NewCrl;
;+#
;+# The following symbols are exported only to make libssl3.so work.
;+# These are still private!!!
;+#
__CERT_NewTempCertificate;
__PK11_CreateContextByRawKey;
__PK11_GetKeyData;
__nss_InitLock;
CERT_CertChainFromCert;
CERT_DestroyCertificateList;
CERT_DupCertList;
CERT_ExtractPublicKey;
CERT_FindCertByName;
DER_Lengths;
DSAU_DecodeDerSig;
DSAU_EncodeDerSig;
HASH_GetHashObject;
NSSRWLock_Destroy;
NSSRWLock_HaveWriteLock;
NSSRWLock_LockRead;
NSSRWLock_LockWrite;
NSSRWLock_New;
NSSRWLock_UnlockRead;
NSSRWLock_UnlockWrite;
NSS_PutEnv;
PK11_Derive;
PK11_DeriveWithFlags;
PK11_DigestKey;
PK11_FindBestKEAMatch;
PK11_FindFixedKey;
PK11_GenerateFortezzaIV;
PK11_GetBestKeyLength;
PK11_GetBestSlot;
PK11_GetBestSlotMultiple;
PK11_GetBestWrapMechanism;
PK11_GetCurrentWrapIndex;
PK11_GetMechanism;
PK11_GetModuleID;
PK11_GetPrivateModulusLen;
PK11_GetSlotFromKey;
PK11_GetSlotFromPrivateKey;
PK11_GetSlotID;
PK11_GetSlotSeries;
PK11_GetTokenInfo;
PK11_GetWindow;
PK11_GetWrapKey;
PK11_IVFromParam;
PK11_MakeKEAPubKey;
PK11_ParamFromIV;
PK11_PubDecryptRaw;
PK11_PubDerive;
PK11_PubEncryptRaw;
PK11_PubUnwrapSymKey;
PK11_PubWrapSymKey;
PK11_ReferenceSymKey;
PK11_RestoreContext;
PK11_SaveContext;
PK11_SetFortezzaHack;
PK11_SetWrapKey;
PK11_Sign;
PK11_SignatureLen;
PK11_SymKeyFromHandle;
PK11_TokenExists;
PK11_UnwrapSymKey;
PK11_UnwrapSymKeyWithFlags;
PK11_Verify;
PK11_VerifyKeyOK;
PK11_WrapSymKey;
PORT_ArenaAlloc;
PORT_ArenaZAlloc;
PORT_FreeArena;
PORT_NewArena;
PORT_Realloc;
PORT_ZAlloc;
PORT_ZFree;
RSA_FormatBlock;
SECITEM_CompareItem;
SECKEY_CreateRSAPrivateKey;
SECKEY_DestroyPublicKey;
SECKEY_PublicKeyStrength;
SECKEY_UpdateCertPQG;
SECMOD_LookupSlot;
SGN_Begin;
SGN_DestroyContext;
SGN_End;
SGN_NewContext;
SGN_Update;
VFY_Begin;
VFY_CreateContext;
VFY_DestroyContext;
VFY_End;
VFY_Update;
;+#
;+# The following symbols are exported only to make libsmime3.so work.
;+# These are still private!!!
;+#
__CERT_ClosePermCertDB;
__CERT_DecodeDERCertificate;
__CERT_TraversePermCertsForNickname;
__CERT_TraversePermCertsForSubject;
__PBE_CreateContext;
__PBE_DestroyContext;
__PBE_GenerateBits;
ATOB_ConvertAsciiToItem;
CERT_AddCertToListTail;
CERT_CertListFromCert;
CERT_DestroyCertArray;
CERT_FindCertByDERCert;
CERT_FindCertByIssuerAndSN;
CERT_FindSMimeProfile;
CERT_ImportCerts;
CERT_NewCertList;
CERT_OpenCertDBFilename;
CERT_SaveSMimeProfile;
CERT_VerifyCert;
DER_GetInteger;
DER_TimeToUTCTime;
DER_UTCTimeToTime;
PK11_AlgtagToMechanism;
PK11_BlockData;
PK11_CreatePBEAlgorithmID;
PK11_DestroyObject;
PK11_ExportEncryptedPrivateKeyInfo;
PK11_ExportPrivateKeyInfo;
PK11_FindCertAndKeyByRecipientList;
PK11_FindCertAndKeyByRecipientListNew;
PK11_FindCertInSlot;
PK11_FindPrivateKeyFromCert;
PK11_FortezzaMapSig;
PK11_GetKeyLength;
PK11_GetKeyStrength;
PK11_ImportCertForKeyToSlot;
PK11_ImportEncryptedPrivateKeyInfo;
PK11_ImportPrivateKeyInfo;
PK11_MapPBEMechanismToCryptoMechanism;
PK11_PBEKeyGen;
PK11_ParamFromAlgid;
PK11_ParamToAlgid;
PK11_TraverseCertsForNicknameInSlot;
PK11_TraverseCertsForSubjectInSlot;
PORT_ArenaGrow;
PORT_ArenaMark;
PORT_ArenaRelease;
PORT_ArenaStrdup;
PORT_ArenaUnmark;
PORT_UCS2_ASCIIConversion;
PORT_UCS2_UTF8Conversion;
SECITEM_AllocItem;
SECKEY_CopyEncryptedPrivateKeyInfo;
SECKEY_CopyPrivateKeyInfo;
SECKEY_DestroyEncryptedPrivateKeyInfo;
SECKEY_DestroyPrivateKeyInfo;
SECOID_CompareAlgorithmID;
SECOID_CopyAlgorithmID;
SECOID_DestroyAlgorithmID;
SECOID_FindOID;
SECOID_FindOIDByTag;
SECOID_FindOIDTag;
SECOID_SetAlgorithmID;
SEC_ASN1DecodeInteger;
SEC_ASN1DecodeItem;
SEC_ASN1DecoderClearFilterProc;
SEC_ASN1DecoderClearNotifyProc;
SEC_ASN1DecoderFinish;
SEC_ASN1DecoderSetFilterProc;
SEC_ASN1DecoderSetNotifyProc;
SEC_ASN1DecoderStart;
SEC_ASN1DecoderUpdate;
SEC_ASN1Encode;
SEC_ASN1EncodeInteger;
SEC_ASN1EncodeItem;
SEC_ASN1EncoderClearNotifyProc;
SEC_ASN1EncoderClearStreaming;
SEC_ASN1EncoderClearTakeFromBuf;
SEC_ASN1EncoderFinish;
SEC_ASN1EncoderSetNotifyProc;
SEC_ASN1EncoderSetStreaming;
SEC_ASN1EncoderSetTakeFromBuf;
SEC_ASN1EncoderStart;
SEC_ASN1EncoderUpdate;
SEC_ASN1LengthLength;
SEC_PKCS5GetCryptoAlgorithm;
SEC_PKCS5GetKeyLength;
SEC_PKCS5GetPBEAlgorithm;
SEC_PKCS5IsAlgorithmPBEAlg;
SEC_SignData;
SGN_CompareDigestInfo;
SGN_CopyDigestInfo;
SGN_CreateDigestInfo;
SGN_DestroyDigestInfo;
SGN_Digest;
VFY_VerifyData;
VFY_VerifyDigest;
;+#
;+# Data objects
;+#
;+# Don't export these DATA symbols on Windows because they don't work right.
;;CERT_CrlTemplate DATA ;
;;CERT_SignedDataTemplate DATA ;
;;CERT_CertificateTemplate DATA ;
;;CERT_CertificateRequestTemplate DATA ;
;;CERT_IssuerAndSNTemplate DATA ;
;;CERT_SetOfSignedCrlTemplate DATA ;
;;SECKEY_DSAPublicKeyTemplate DATA ;
;;SECKEY_EncryptedPrivateKeyInfoTemplate DATA ;
;;SECKEY_PointerToEncryptedPrivateKeyInfoTemplate DATA ;
;;SECKEY_PointerToPrivateKeyInfoTemplate DATA ;
;;SECKEY_PrivateKeyInfoTemplate DATA ;
;;SECKEY_RSAPublicKeyTemplate DATA ;
;;SECOID_AlgorithmIDTemplate DATA ;
;;SEC_AnyTemplate DATA ;
;;SEC_BMPStringTemplate DATA ;
;;SEC_BitStringTemplate DATA ;
;;SEC_GeneralizedTimeTemplate DATA ;
;;SEC_IA5StringTemplate DATA ;
;;SEC_IntegerTemplate DATA ;
;;SEC_ObjectIDTemplate DATA ;
;;SEC_OctetStringTemplate DATA ;
;;SEC_PointerToAnyTemplate DATA ;
;;SEC_PointerToOctetStringTemplate DATA ;
;;SEC_SetOfAnyTemplate DATA ;
;;SEC_UTCTimeTemplate DATA ;
;;sgn_DigestInfoTemplate DATA ;
NSS_Get_CERT_CrlTemplate;
NSS_Get_CERT_SignedDataTemplate;
NSS_Get_CERT_CertificateTemplate;
NSS_Get_CERT_CertificateRequestTemplate;
NSS_Get_CERT_IssuerAndSNTemplate;
NSS_Get_CERT_SetOfSignedCrlTemplate;
NSS_Get_SECKEY_DSAPublicKeyTemplate;
NSS_Get_SECKEY_EncryptedPrivateKeyInfoTemplate;
NSS_Get_SECKEY_PointerToEncryptedPrivateKeyInfoTemplate;
NSS_Get_SECKEY_PointerToPrivateKeyInfoTemplate;
NSS_Get_SECKEY_PrivateKeyInfoTemplate;
NSS_Get_SECKEY_RSAPublicKeyTemplate;
NSS_Get_SECOID_AlgorithmIDTemplate;
NSS_Get_SEC_AnyTemplate;
NSS_Get_SEC_BMPStringTemplate;
NSS_Get_SEC_BitStringTemplate;
NSS_Get_SEC_GeneralizedTimeTemplate;
NSS_Get_SEC_IA5StringTemplate;
NSS_Get_SEC_IntegerTemplate;
NSS_Get_SEC_ObjectIDTemplate;
NSS_Get_SEC_OctetStringTemplate;
NSS_Get_SEC_PointerToAnyTemplate;
NSS_Get_SEC_PointerToOctetStringTemplate;
NSS_Get_SEC_SetOfAnyTemplate;
NSS_Get_SEC_UTCTimeTemplate;
NSS_Get_sgn_DigestInfoTemplate;
;+# commands
CERT_DecodeBasicConstraintValue;
CERT_DecodeOidSequence;
CERT_DecodeUserNotice;
CERT_DecodeCertificatePoliciesExtension;
CERT_DestroyCertificatePoliciesExtension;
CERT_FindCertByNicknameOrEmailAddr;
CERT_FindCertByNickname;
CERT_GenTime2FormattedAscii;
CERT_Hexify;
CERT_CompareName;
PK11SDR_Encrypt;
PK11SDR_Decrypt;
NSSBase64Decoder_Create;
NSSBase64Decoder_Destroy;
NSSBase64Decoder_Update;
NSSBase64Encoder_Create;
NSSBase64Encoder_Destroy;
NSSBase64Encoder_Update;
;+#PK11_DoPassword;
;+#PK11_FindKeyByKeyID;
PK11_InitPin;
PK11_NeedUserInit;
;+ local:
;+ *;
;+};
;+NSS_3.2.1 { # NSS 3.2.1 release
;+ global:
CERT_AddRDN;
CERT_CreateRDN;
CERT_CreateAVA;
CERT_CreateName;
;+ local:
;+ *;
;+};
;+NSS_3.3 { # NSS 3.3. release
;+ global:
CERT_CheckCertUsage;
CERT_FindCertIssuer;
PK11_GetModule;
SECKEY_CreateDHPrivateKey;
SECKEY_GetPublicKeyType;
SECMOD_AddNewModule;
;+#
;+# The following symbols are exported only to make JSS work.
;+# These are still private!!!
;+#
CERT_DisableOCSPChecking;
CERT_DisableOCSPDefaultResponder;
CERT_EnableOCSPDefaultResponder;
CERT_GetCertTimes;
CERT_ImportCAChainTrusted;
CERT_ImportCRL;
CERT_IsCACert;
CERT_IsCADERCert;
CERT_SetOCSPDefaultResponder;
PBE_CreateContext;
PBE_DestroyContext;
PBE_GenerateBits;
PK11_CheckSSOPassword;
PK11_CopySymKeyForSigning;
PK11_DeleteTokenCertAndKey;
PK11_DEREncodePublicKey;
PK11_ExtractKeyValue;
PK11_FindCertsFromNickname;
PK11_FindKeyByKeyID;
PK11_GetIVLength;
PK11_GetKeyData;
PK11_GetKeyType;
PK11_GetLowLevelKeyIDForCert;
PK11_GetLowLevelKeyIDForPrivateKey;
PK11_GetSlotPWValues;
PK11_ImportCertForKey;
PK11_ImportDERCertForKey;
PK11_ImportDERPrivateKeyInfo;
PK11_ImportSymKey;
PK11_IsLoggedIn;
PK11_KeyForDERCertExists;
PK11_KeyForCertExists;
PK11_ListPrivateKeysInSlot;
PK11_ListCertsInSlot;
PK11_Logout;
PK11_NeedPWInit;
PK11_MakeIDFromPubKey;
PK11_PQG_DestroyParams;
PK11_PQG_DestroyVerify;
PK11_PQG_GetBaseFromParams;
PK11_PQG_GetCounterFromVerify;
PK11_PQG_GetHFromVerify;
PK11_PQG_GetPrimeFromParams;
PK11_PQG_GetSeedFromVerify;
PK11_PQG_GetSubPrimeFromParams;
PK11_PQG_NewParams;
PK11_PQG_NewVerify;
PK11_PQG_ParamGen;
PK11_PQG_ParamGenSeedLen;
PK11_PQG_VerifyParams;
PK11_ReferenceSlot;
PK11_SeedRandom;
PK11_UnwrapPrivKey;
PK11_VerifyRecover;
PK11_WrapPrivKey;
SEC_CertNicknameConflict;
SEC_PKCS5GetIV;
SECMOD_DeleteInternalModule;
SECMOD_DestroyModule;
SECMOD_GetDefaultModuleList;
SECMOD_GetDefaultModuleListLock;
SECMOD_GetInternalModule;
SECMOD_GetReadLock;
SECMOD_ReferenceModule;
SECMOD_ReleaseReadLock;
SECKEY_AddPrivateKeyToListTail;
SECKEY_EncodeDERSubjectPublicKeyInfo;
SECKEY_ExtractPublicKey;
SECKEY_DestroyPrivateKeyList;
SECKEY_GetPrivateKeyType;
SECKEY_HashPassword;
SECKEY_ImportDERPublicKey;
SECKEY_NewPrivateKeyList;
SECKEY_RemovePrivateKeyListNode;
VFY_EndWithSignature;
;+ local:
;+ *;
;+};
;+NSS_3.3.1 { # NSS 3.3.1 release
;+ global:
;+#
;+# The following symbols are exported only to make libsmime3.so work.
;+# These are still private!!!
;+#
PK11_CreatePBEParams;
PK11_DestroyPBEParams;
;+ local:
;+ *;
;+};
;+NSS_3.4 { # NSS 3.4 release
;+ global:
SECMOD_AddNewModuleEx;
SECMOD_DeleteModule;
SECMOD_FreeModuleSpecList;
SECMOD_GetModuleSpecList;
SECMOD_LoadModule;
SECMOD_LoadUserModule;
SECMOD_UnloadUserModule;
SECMOD_UpdateModule;
;+# for PKCS #12
PK11_RawPBEKeyGen;
;+# for PSM
__CERT_AddTempCertToPerm;
CERT_AddOKDomainName;
CERT_CopyName;
CERT_CreateSubjectCertList;
CERT_DecodeAVAValue;
;+#CERT_DecodeCertFromPackage;
CERT_DecodeGeneralName;
CERT_DecodeTrustString;
CERT_DerNameToAscii;
CERT_EncodeGeneralName;
CERT_FilterCertListByCANames;
CERT_FilterCertListByUsage;
CERT_FindCertExtension;
CERT_FindKeyUsageExtension;
CERT_FindUserCertByUsage;
CERT_FindUserCertsByUsage;
CERT_GetCertChainFromCert;
CERT_GetOCSPAuthorityInfoAccessLocation;
CERT_KeyFromDERCrl;
CERT_MakeCANickname;
CERT_NicknameStringsFromCertList;
CERT_VerifySignedData;
DER_Encode;
HASH_Begin;
HASH_Create;
HASH_Destroy;
HASH_End;
HASH_ResultLen;
HASH_Update;
NSSBase64_DecodeBuffer; # from Stan
NSSBase64_EncodeItem; # from Stan
PK11_GetKeyGen;
PK11_GetMinimumPwdLength;
PK11_GetNextSafe;
PK11_GetPadMechanism;
PK11_GetSlotInfo;
PK11_HasRootCerts;
PK11_IsDisabled;
PK11_LoadPrivKey;
PK11_LogoutAll;
PK11_MechanismToAlgtag;
PK11_ResetToken;
PK11_TraverseSlotCerts;
SEC_ASN1Decode;
SECKEY_CopySubjectPublicKeyInfo;
SECMOD_CreateModule;
SECMOD_FindModule;
SECMOD_FindSlot;
SECMOD_PubCipherFlagstoInternal;
SECMOD_PubMechFlagstoInternal;
;;CERT_NameTemplate DATA ;
;;CERT_SubjectPublicKeyInfoTemplate DATA ;
;;SEC_BooleanTemplate DATA ;
;;SEC_NullTemplate DATA ;
;;SEC_SignedCertificateTemplate DATA ;
;;SEC_UTF8StringTemplate DATA ;
NSS_Get_CERT_NameTemplate;
NSS_Get_CERT_SubjectPublicKeyInfoTemplate;
NSS_Get_SEC_BooleanTemplate;
NSS_Get_SEC_NullTemplate;
NSS_Get_SEC_SignedCertificateTemplate;
NSS_Get_SEC_UTF8StringTemplate;
;+# for JSS
PK11_DeleteTokenPrivateKey;
PK11_DeleteTokenPublicKey;
PK11_DeleteTokenSymKey;
PK11_GetNextSymKey;
PK11_GetPQGParamsFromPrivateKey;
PK11_GetPrivateKeyNickname;
PK11_GetPublicKeyNickname;
PK11_GetSymKeyNickname;
PK11_ImportDERPrivateKeyInfoAndReturnKey;
PK11_ImportPrivateKeyInfoAndReturnKey;
PK11_ImportPublicKey;
PK11_ImportSymKeyWithFlags;
PK11_ListFixedKeysInSlot;
PK11_ListPrivKeysInSlot;
PK11_ListPublicKeysInSlot;
PK11_ProtectedAuthenticationPath;
PK11_SetPrivateKeyNickname;
PK11_SetPublicKeyNickname;
PK11_SetSymKeyNickname;
SECKEY_DecodeDERSubjectPublicKeyInfo;
SECKEY_DestroyPublicKeyList;
;+# for debugging
nss_DumpCertificateCacheInfo;
;+ local:
;+ *;
;+};
;+NSS_3.5 { # cert creation APIs used by certutil
;+ global:
CERT_AddExtension;
CERT_CopyRDN;
CERT_CreateCertificate;
CERT_CreateValidity;
CERT_DestroyValidity;
CERT_EncodeAndAddBitStrExtension;
CERT_EncodeAuthKeyID;
CERT_EncodeBasicConstraintValue;
CERT_EncodeCRLDistributionPoints;
CERT_FinishExtensions;
CERT_StartCertExtensions;
DER_AsciiToTime;
PK11_ImportCert;
PORT_Strdup;
SECMOD_CanDeleteInternalModule;
;+ local:
;+ *;
;+};
;+NSS_3.6 { # cert creation APIs used by certutil
;+ global:
PK11_GetPBEIV;
CERT_VerifyCertChain;
;+ local:
;+ *;
;+};

View File

@@ -0,0 +1,134 @@
#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
#
DEPTH = ../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = xpcom
XPIDL_MODULE = xpcom_ds
LIBRARY_NAME = xpcomds_s
REQUIRES = unicharutil string
CSRCS = \
pldhash.c \
plvector.c \
$(NULL)
CPPSRCS = \
nsArena.cpp \
nsAtomTable.cpp \
nsAtomService.cpp \
nsAVLTree.cpp \
nsByteBuffer.cpp \
nsCRT.cpp \
nsConjoiningEnumerator.cpp \
nsDeque.cpp \
nsEmptyEnumerator.cpp \
nsEnumeratorUtils.cpp \
nsFixedSizeAllocator.cpp \
nsHashtable.cpp \
nsHashtableEnumerator.cpp \
nsObserver.cpp \
nsObserverList.cpp \
nsObserverService.cpp \
nsProperties.cpp \
nsPersistentProperties.cpp \
nsQuickSort.cpp \
nsSizeOfHandler.cpp \
nsStaticNameTable.cpp \
nsStatistics.cpp \
nsStringMap.cpp \
nsSupportsArray.cpp \
nsSupportsArrayEnumerator.cpp \
nsSupportsPrimitives.cpp \
nsUnicharBuffer.cpp \
nsVoidArray.cpp \
nsVoidBTree.cpp \
nsTextFormatter.cpp \
nsTimelineService.cpp \
$(NULL)
EXPORTS = \
nsAVLTree.h \
nsAtomService.h \
nsCppSharedAllocator.h \
nsCRT.h \
nsDeque.h \
nsEnumeratorUtils.h \
nsFixedSizeAllocator.h \
nsHashtable.h \
nsHashtableEnumerator.h \
nsIArena.h \
nsIByteBuffer.h \
nsIObserverList.h \
nsISimpleEnumerator.h \
nsISizeOfHandler.h \
nsIUnicharBuffer.h \
nsInt64.h \
nsQuickSort.h \
nsStaticNameTable.h \
nsStatistics.h \
nsStringMap.h \
nsSupportsArray.h \
nsSupportsPrimitives.h \
nsTime.h \
nsUnitConversion.h \
nsVector.h \
nsVoidArray.h \
nsVoidBTree.h \
pldhash.h \
plvector.h \
nsTextFormatter.h \
$(NULL)
XPIDLSRCS = \
nsIAtom.idl \
nsIAtomService.idl \
nsICollection.idl \
nsIEnumerator.idl \
nsIObserver.idl \
nsIObserverService.idl \
nsIPersistentProperties2.idl \
nsIProperties.idl \
nsISerializable.idl \
nsIStopwatch.idl \
nsISupportsArray.idl \
nsISupportsIterators.idl \
nsISupportsPrimitives.idl \
nsITimelineService.idl \
$(NULL)
EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS))
# we don't want the shared lib, but we want to force the creation of a static lib.
FORCE_STATIC_LIB = 1
# Force use of PIC
FORCE_USE_PIC = 1
include $(topsrcdir)/config/rules.mk
DEFINES += -D_IMPL_NS_COM -D_IMPL_NS_BASE

View File

@@ -0,0 +1,300 @@
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is James L. Nance
* Portions created by James L. Nance are Copyright (C) 2001
* James L. Nance. All Rights Reserved.
*
* Contributor(s): Patricia Jewell Nance, Jesse Jacob Nance
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
* "GPL"), in which case the provisions of the GPL are applicable
* instead of those above. If you wish to allow use of your
* version of this file only under the terms of the GPL and not to
* allow others to use your version of this file under the MPL,
* indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by
* the GPL. If you do not delete the provisions above, a recipient
* may use your version of this file under either the MPL or the
* GPL.
*/
// #define TEST_PATRICIA
#if defined(TEST_PATRICIA)
# include "stdlib.h"
# include "stdio.h"
# include "string.h"
# define PRBool bool
# define PRUint32 unsigned int
# define PRInt32 int
# define PR_CALLBACK
# define PLArenaPool int
# define PL_FinishArenaPool(a)
# define PL_InitArenaPool(a, b, c, d)
# define PL_ArenaAllocate(a, size) malloc(size)
# define PR_TRUE true
# define PR_FALSE false
struct nsCRT {
static int strlen(const char *a) {return ::strlen(a);}
static int memcmp(const void *a, const void *b, PRUint32 c) {
return ::memcmp(a,b,c);
}
};
#else
# include "nsCRT.h"
#endif
#include "nsStringMap.h"
const char nsStringMap::zero_str[] = "\0";
nsStringMap::~nsStringMap()
{
// Get rid of the arena memory
PL_FinishArenaPool(&mPool);
}
nsStringMap::nsStringMap() : numEntries(0)
{
// Initialize the head
head.l = head.r = &head;
head.bit = ~0;
head.key = zero_str;
head.len = 1;
head.obj = 0;
// Initialize the arena. Guess that a 512 byte block size is good
PL_InitArenaPool(&mPool, "nsStringMap", 512, sizeof(void*));
}
void
nsStringMap::Reset()
{
// Initialize the head
head.l = head.r = &head;
head.bit = ~0;
head.key = zero_str;
head.len = 1;
head.obj = 0;
// Reinitialize the Arena
PL_FinishArenaPool(&mPool);
PL_InitArenaPool(&mPool, "nsStringMap", 512, sizeof(void*));
}
void
nsStringMap::Reset(nsStringMapEnumFunc destroyFunc, void *aClosure)
{
Enumerate(destroyFunc, aClosure);
Reset();
}
nsStringMap::Patricia *
nsStringMap::newNode()
{
return (Patricia*) PL_ArenaAllocate(&mPool, sizeof(Patricia));
}
nsStringMap::Patricia *
nsStringMap::searchDown(BitTester &key)
{
// The head node only branches to the left, so we can optimize here.
Patricia *x = head.l;
PRUint32 lastBits;
do {
lastBits = x->bit;
if(key.isset(lastBits))
x = x->r;
else
x = x->l;
} while(lastBits > x->bit);
return x;
}
void*
nsStringMap::Get(const char *str, PRUint32 slen)
{
BitTester key(str, slen);
Patricia *t = searchDown(key);
if(!key.memcmp(t->key, t->len)) {
return t->obj;
}
return 0;
}
void*
nsStringMap::Get(const char *str)
{
BitTester key(str);
Patricia *t = searchDown(key);
if(!key.memcmp(t->key, t->len)) {
return t->obj;
}
return 0;
}
PRBool
nsStringMap::Put(const char *str, void *obj, PRBool copy)
{
PRUint32 slen = nsCRT::strlen(str);
return Put(str, slen, obj, copy);
}
PRBool
nsStringMap::Put(const char *str, PRUint32 slen, void *obj, PRBool copy)
{
if(copy) {
PRUint32 mask = sizeof(double) - 1;
PRUint32 asize = (slen+mask) & ~mask;
char *tstr = (char*) PL_ArenaAllocate(&mPool, asize);
memcpy(tstr, str, slen);
str = tstr;
}
BitTester key(str, slen);
Patricia *t = searchDown(key);
if(!key.memcmp(t->key, t->len)) {
t->obj = obj;
return PR_TRUE;
}
// This is somewhat ugly. We need to find the maximum bit position that
// differs, but this is complicated by the fact that we have random length
// data. Assume that data past the end of the string is 0.
const PRUint32 klen = key.datalen();
const PRUint32 tlen = t->len;
PRUint32 bpos;
if(klen>tlen) {
bpos = 8 * klen - 1;
while(!BitTester::isset_checked(str, bpos)) --bpos;
} else if(tlen>klen) {
bpos = 8 * tlen - 1;
while(!BitTester::isset_checked(t->key, bpos)) --bpos;
} else /* equal */ {
bpos = 8 * tlen - 1;
while(BitTester::bitsequal(t->key, str, bpos)) --bpos;
}
Patricia *p, *x = &head;
do {
p = x;
x = key.isset(x->bit) ? x->r : x->l;
} while(x->bit > bpos && p->bit > x->bit);
t = newNode();
if(!t) {
return PR_FALSE;
}
t->key = str;
t->len = key.datalen();
t->obj = obj;
t->bit = bpos;
if(key.isset(t->bit)) {
t->r = t;
t->l = x;
} else {
t->r = x;
t->l = t;
}
if(key.isset(p->bit)) {
p->r = t;
} else {
p->l = t;
}
return PR_TRUE;
}
void
nsStringMap::enumerate_recurse(
nsStringMapEnumFunc aEnumFunc, void* aClosure, Patricia *node)
{
aEnumFunc(node->key, node->obj, aClosure);
if(node->l && node->l->bit<node->bit)
enumerate_recurse(aEnumFunc, aClosure, node->l);
if(node->r && node->r->bit<node->bit)
enumerate_recurse(aEnumFunc, aClosure, node->r);
}
void
nsStringMap::Enumerate(nsStringMapEnumFunc aEnumFunc, void *aClosure)
{
// We dont want to process head, its a sentinal
if(head.l && head.l->bit<head.bit)
enumerate_recurse(aEnumFunc, aClosure, head.l);
if(head.r && head.r->bit<head.bit)
enumerate_recurse(aEnumFunc, aClosure, head.r);
}
#if defined(TEST_PATRICIA)
PRBool etest(const char *key, void *data, void *closure)
{
printf("%s\n", key);
return PR_TRUE;
}
int main()
{
nsStringMap map;
const char *strings[] = {
"I am number 1 string",
"I am number 2 string",
"I am number 3 string",
"a different string",
"a similar string",
"I am a very long string and I want to make sure we can handle this",
"I am a very long string and I want to make sure we can handle this too",
0
};
int idx;
for(idx=0; strings[idx]; ++idx) {
map.Put(strings[idx], (void*)(1+idx));
}
printf("Lookup Test\n");
while(--idx>=0) {
void *ptr = map.Get(strings[idx]);
printf("%d: %s\n", (long)ptr, strings[idx]);
}
printf("\nEnumeration Test\n");
map.Enumerate(etest, 0);
return 0;
}
#endif

View File

@@ -0,0 +1,112 @@
#ifndef nsStringMap_h__
#define nsStringMap_h__
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is James L. Nance
* Portions created by James L. Nance are Copyright (C) 2001
* James L. Nance. All Rights Reserved.
*
* Contributor(s): Patricia Jewell Nance, Jesse Jacob Nance
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
* "GPL"), in which case the provisions of the GPL are applicable
* instead of those above. If you wish to allow use of your
* version of this file only under the terms of the GPL and not to
* allow others to use your version of this file under the MPL,
* indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by
* the GPL. If you do not delete the provisions above, a recipient
* may use your version of this file under either the MPL or the
* GPL.
*/
#if !defined(TEST_PATRICIA)
# include "nscore.h"
# include "prtypes.h"
# include "plarena.h"
#endif
typedef PRBool (*PR_CALLBACK nsStringMapEnumFunc) (
const char *aKey, void *aData, void *aClosure);
class nsStringMap
{
public:
nsStringMap();
~nsStringMap();
PRBool Put(const char *str, PRUint32 slen, void *obj, PRBool copy=PR_FALSE);
PRBool Put(const char *str, void *obj, PRBool copy=PR_FALSE);
void* Get(const char *str);
void* Get(const char *str, PRUint32 slen);
void Reset();
void Reset(nsStringMapEnumFunc destroyFunc, void *aClosure = 0);
void Enumerate(nsStringMapEnumFunc aEnumFunc, void *aClosure = 0);
struct Patricia {
Patricia *l, *r;
PRUint32 bit; // Bit position for l/r comp
const char *key;
PRUint32 len;
void *obj;
};
// The BitTester class is used to test a particular bit position in an
// array of characters. It does not assign any special meaning to 0
// characters. Bits past the end of the array are treated as 0
class BitTester {
const PRUint32 slen;
const char *cstr;
public:
BitTester(const char *s) : slen(nsCRT::strlen(s)), cstr(s) {}
BitTester(const char *s, PRUint32 l) : slen(l), cstr(s) {}
PRInt32 memcmp(const char *ostr, PRUint32 olen) {
if(olen==slen) {
return ::memcmp((void*)cstr, ostr, slen);
} else {
return olen - slen;
}
}
PRUint32 datalen() const {return slen;}
static PRBool isset_checked(const char *str, PRUint32 idx) {
return (str[idx/8] & (1<<(idx & 7))) != 0;
}
static PRBool
bitsequal(const char *str1, const char*str2, PRUint32 idx) {
return (str1[idx/8] & (1<<(idx&7)))==(str2[idx/8] & (1<<(idx&7)));
}
PRBool isset(PRUint32 idx) {
const PRUint32 base = idx/8;
if(base>=slen) return 0;
return (cstr[base] & (1<<(idx & 7))) != 0;
}
};
private:
PLArenaPool mPool;
Patricia *newNode();
Patricia *searchDown(BitTester&);
void enumerate_recurse(nsStringMapEnumFunc, void*, Patricia*);
Patricia head; // Sentinal node
PRInt32 numEntries;
static const char zero_str[];
};
#endif