layer0/Word.h (130 lines of code) (raw):

/* A* ------------------------------------------------------------------- B* This file contains source code for the PyMOL computer program C* Copyright (c) Schrodinger, LLC. D* ------------------------------------------------------------------- E* It is unlawful to modify or remove this copyright notice. F* ------------------------------------------------------------------- G* Please see the accompanying LICENSE file for further information. H* ------------------------------------------------------------------- I* Additional authors of this source file include: -* -* -* Z* ------------------------------------------------------------------- */ #ifndef _H_Word #define _H_Word #include "PyMOLGlobals.h" #include "Lex.h" #define WordLength 256 typedef char WordType[WordLength]; typedef struct { WordType word; int value; } WordKeyValue; typedef struct { char *word; char **start; int n_word; } CWordList; #define cWordMatchOptionNoRanges 0 #define cWordMatchOptionNumericRanges 1 #define cWordMatchOptionAlphaRanges 2 typedef struct { int range_mode; /* 0 = none, 1 = numeric, 2 = alpha */ int lists; int ignore_case; int allow_hyphen; int allow_plus; int space_lists; char wildcard; } CWordMatchOptions; typedef struct _CWordMatcher CWordMatcher; void WordMatchOptionsConfigInteger(CWordMatchOptions * I); void WordMatchOptionsConfigAlpha(CWordMatchOptions * I, char wildcard, int ignore_case); void WordMatchOptionsConfigAlphaList(CWordMatchOptions * I, char wildcard, int ignore_case); void WordMatchOptionsConfigMixed(CWordMatchOptions * I, char wildcard, int ignore_case); void WordMatchOptionsConfigNameList(CWordMatchOptions * I, char wildcard, int ignore_case); CWordMatcher *WordMatcherNew(PyMOLGlobals * G, const char *st, CWordMatchOptions * option, int force); int WordMatcherMatchAlpha(CWordMatcher * I, const char *text); int WordMatcherMatchMixed(CWordMatcher * I, const char *text, int value); int WordMatcherMatchInteger(CWordMatcher * I, int value); void WordMatcherFree(CWordMatcher * I); int WordMatchNoWild(PyMOLGlobals * G, const char *p, const char *q, int ignCase); CWordList *WordListNew(PyMOLGlobals * G, const char *st); void WordListFreeP(CWordList * I); void WordListDump(CWordList * I, const char *prefix); int WordListIterate(PyMOLGlobals * G, CWordList * I, const char **ptr, int *hidden); int WordListMatch(PyMOLGlobals * G, CWordList * I, const char *name, int ignore_case); int WordInit(PyMOLGlobals * G); void WordFree(PyMOLGlobals * G); void WordSetWildcard(PyMOLGlobals * G, char wc); int WordMatch(PyMOLGlobals * G, const char *p, const char *q, int ignCase); int WordMatchExact(PyMOLGlobals * G, const char *p, const char *q, int ignCase); void WordPrimeCommaMatch(PyMOLGlobals * G, char *p); int WordMatchComma(PyMOLGlobals * G, const char *p, const char *q, int ignCase); int WordMatchCommaInt(PyMOLGlobals * G, const char *p, int number); int WordMatchCommaExact(PyMOLGlobals * G, const char *p, const char *q, int ignCase); /* (<0) exact match, (>0) inexact match, =0 no match */ int WordIndex(PyMOLGlobals * G, WordType * list, const char *word, int minMatch, int ignCase); int WordKey(PyMOLGlobals * G, WordKeyValue * list, const char *word, int minMatch, int ignCase, int *exact); #ifdef _PYMOL_INLINE __inline__ static int WordCompare(PyMOLGlobals * G, const char *p, const char *q, int ignCase) /* all things equal, shorter is smaller */ { int result = 0; char cp, cq, tlp, tlq; if(ignCase) { while((cp = *p) && (cq = *q)) { p++; q++; if(cp != cq) { (tlp = tolower(cp)); (tlq = tolower(cq)); if(tlp < tlq) return -1; else if(tlp > tlq) { return 1; } } } } else { while((cp = *p) && (cq = *q)) { p++; q++; if(cp != cq) { if(cp < cq) { return -1; } else if(cp > cq) { return 1; } } } } if((!result) && (!*p) && (*q)) return -1; else if((!result) && (*p) && (!*q)) return 1; return 0; } #else int WordCompare(PyMOLGlobals * G, const char *p, const char *q, int ignCase); #endif inline int WordCompare(PyMOLGlobals * G, const lexidx_t& s1, const lexidx_t& s2, int ignCase) { if (s1 == s2) return 0; return WordCompare(G, LexStr(G, s1), LexStr(G, s2), ignCase); } inline int WordMatch(PyMOLGlobals * G, const lexidx_t& s1, const lexidx_t& s2, int ignCase) { if (s1 == s2) return -1; // negative = perfect match return WordMatch(G, LexStr(G, s1), LexStr(G, s2), ignCase); } inline int WordMatchNoWild(PyMOLGlobals * G, const lexidx_t& s1, const lexidx_t& s2, int ignCase) { if (s1 == s2) return -1; // negative = perfect match return WordMatchNoWild(G, LexStr(G, s1), LexStr(G, s2), ignCase); } inline int WordMatchExact(PyMOLGlobals * G, const lexidx_t& s1, const lexidx_t& s2, int ignCase) { if (s1 == s2) return 1; // non-zero = perfect match if (!ignCase) return 0; // 0 = no match return WordMatchExact(G, LexStr(G, s1), LexStr(G, s2), ignCase); } inline int WordMatchExact(PyMOLGlobals * G, char c1, char c2, int ignCase) { if (c1 == c2) return 1; // non-zero = perfect match if (!ignCase) return 0; // 0 = no match return c1 && c2 && toupper(c1) == toupper(c2); } #endif