Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
/*
* * Copyright (c) 1998-9 * Dr John Maddock * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Dr John Maddock makes no representations * about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. * */
/*
* FILE re_kmp.h * VERSION 2.12 * Knuth-Morris-Pratt search. */
#ifndef __RE_KMP_H
#define __RE_KMP_H
#ifdef JM_CFG_H
#include <jm/jm_cfg.h>
#endif
JM_NAMESPACE(__JM)
template <class charT> struct kmp_info { unsigned int size; unsigned int len; const charT* pstr; int kmp_next[1]; };
template <class charT, class Allocator> void kmp_free(kmp_info<charT>* pinfo, Allocator a) { typedef JM_MAYBE_TYPENAME REBIND_TYPE(char, Allocator) atype; atype(a).deallocate((char*)pinfo, pinfo->size); }
template <class iterator, class charT, class Trans, class Allocator> kmp_info<charT>* kmp_compile(iterator first, iterator last, charT, Trans translate, Allocator a #ifdef RE_LOCALE_CPP
, const __JM_STD::locale& l #endif
) { typedef JM_MAYBE_TYPENAME REBIND_TYPE(char, Allocator) atype; int i, j, m; i = 0; m = 0; JM_DISTANCE(first, last, m); ++m; unsigned int size = sizeof(kmp_info<charT>) + sizeof(int)*m + sizeof(charT)*m; --m; //
// allocate struct and fill it in:
//
kmp_info<charT>* pinfo = (kmp_info<charT>*)atype(a).allocate(size); pinfo->size = size; pinfo->len = m; charT* p = (charT*)((char*)pinfo + sizeof(kmp_info<charT>) + sizeof(int)*(m+1)); pinfo->pstr = p; while(first != last) { *p = translate(*first MAYBE_PASS_LOCALE(l)); ++first; ++p; } *p = 0; //
// finally do regular kmp compile:
//
j = pinfo->kmp_next[0] = -1; while (i < m) { while ((j > -1) && (pinfo->pstr[i] != pinfo->pstr[j])) j = pinfo->kmp_next[j]; ++i; ++j; if (pinfo->pstr[i] == pinfo->pstr[j]) pinfo->kmp_next[i] = pinfo->kmp_next[j]; else pinfo->kmp_next[i] = j; }
return pinfo; }
JM_END_NAMESPACE // namespace regex
#endif // __RE_KMP_H
|