1// Scintilla source code edit control 2/** @file PropSet.h 3 ** A Java style properties file module. 4 **/ 5// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org> 6// The License.txt file describes the conditions under which this software may be distributed. 7 8#ifndef PROPSET_H 9#define PROPSET_H 10#include "SString.h" 11 12bool EqualCaseInsensitive(const char *a, const char *b); 13 14bool isprefix(const char *target, const char *prefix); 15 16struct Property { 17 unsigned int hash; 18 char *key; 19 char *val; 20 Property *next; 21 Property() : hash(0), key(0), val(0), next(0) {} 22}; 23 24/** 25 */ 26class PropSet { 27protected: 28 enum { hashRoots=31 }; 29 Property *props[hashRoots]; 30 Property *enumnext; 31 int enumhash; 32 static bool caseSensitiveFilenames; 33 static unsigned int HashString(const char *s, size_t len) { 34 unsigned int ret = 0; 35 while (len--) { 36 ret <<= 4; 37 ret ^= *s; 38 s++; 39 } 40 return ret; 41 } 42 static bool IncludesVar(const char *value, const char *key); 43 44public: 45 PropSet *superPS; 46 PropSet(); 47 ~PropSet(); 48 void Set(const char *key, const char *val, int lenKey=-1, int lenVal=-1); 49 void Set(const char *keyVal); 50 void Unset(const char *key, int lenKey=-1); 51 void SetMultiple(const char *s); 52 SString Get(const char *key); 53 SString GetExpanded(const char *key); 54 SString Expand(const char *withVars, int maxExpands=100); 55 int GetInt(const char *key, int defaultValue=0); 56 SString GetWild(const char *keybase, const char *filename); 57 SString GetNewExpand(const char *keybase, const char *filename=""); 58 void Clear(); 59 char *ToString(); // Caller must delete[] the return value 60 bool GetFirst(char **key, char **val); 61 bool GetNext(char **key, char **val); 62 static void SetCaseSensitiveFilenames(bool caseSensitiveFilenames_) { 63 caseSensitiveFilenames = caseSensitiveFilenames_; 64 } 65 66private: 67 // copy-value semantics not implemented 68 PropSet(const PropSet ©); 69 void operator=(const PropSet &assign); 70}; 71 72/** 73 */ 74class WordList { 75public: 76 // Each word contains at least one character - a empty word acts as sentinel at the end. 77 char **words; 78 char **wordsNoCase; 79 char *list; 80 int len; 81 bool onlyLineEnds; ///< Delimited by any white space or only line ends 82 bool sorted; 83 bool sortedNoCase; 84 int starts[256]; 85 WordList(bool onlyLineEnds_ = false) : 86 words(0), wordsNoCase(0), list(0), len(0), onlyLineEnds(onlyLineEnds_), 87 sorted(false), sortedNoCase(false) {} 88 ~WordList() { Clear(); } 89 operator bool() { return len ? true : false; } 90 char *operator[](int ind) { return words[ind]; } 91 void Clear(); 92 void Set(const char *s); 93 char *Allocate(int size); 94 void SetFromAllocated(); 95 bool InList(const char *s); 96 bool InListAbbreviated(const char *s, const char marker); 97 const char *GetNearestWord(const char *wordStart, int searchLen, 98 bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1); 99 char *GetNearestWords(const char *wordStart, int searchLen, 100 bool ignoreCase=false, char otherSeparator='\0', bool exactLen=false); 101}; 102 103inline bool IsAlphabetic(unsigned int ch) { 104 return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z')); 105} 106 107 108#ifdef _MSC_VER 109// Visual C++ doesn't like the private copy idiom for disabling 110// the default copy constructor and operator=, but it's fine. 111#pragma warning(disable: 4511 4512) 112#endif 113 114#endif 115