1251881Speter/** 2251881Speter * @copyright 3251881Speter * ==================================================================== 4251881Speter * Licensed to the Apache Software Foundation (ASF) under one 5251881Speter * or more contributor license agreements. See the NOTICE file 6251881Speter * distributed with this work for additional information 7251881Speter * regarding copyright ownership. The ASF licenses this file 8251881Speter * to you under the Apache License, Version 2.0 (the 9251881Speter * "License"); you may not use this file except in compliance 10251881Speter * with the License. You may obtain a copy of the License at 11251881Speter * 12251881Speter * http://www.apache.org/licenses/LICENSE-2.0 13251881Speter * 14251881Speter * Unless required by applicable law or agreed to in writing, 15251881Speter * software distributed under the License is distributed on an 16251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17251881Speter * KIND, either express or implied. See the License for the 18251881Speter * specific language governing permissions and limitations 19251881Speter * under the License. 20251881Speter * ==================================================================== 21251881Speter * @endcopyright 22251881Speter * 23251881Speter * @file svn_string_private.h 24251881Speter * @brief Non-public string utility functions. 25251881Speter */ 26251881Speter 27251881Speter 28251881Speter#ifndef SVN_STRING_PRIVATE_H 29251881Speter#define SVN_STRING_PRIVATE_H 30251881Speter 31251881Speter#include "svn_string.h" /* for svn_boolean_t, svn_error_t */ 32251881Speter 33251881Speter#ifdef __cplusplus 34251881Speterextern "C" { 35251881Speter#endif /* __cplusplus */ 36251881Speter 37251881Speter/** 38251881Speter * @defgroup svn_string String handling 39251881Speter * @{ 40251881Speter */ 41251881Speter 42251881Speter 43251881Speter/** Private functions. 44251881Speter * 45251881Speter * @defgroup svn_string_private Private functions 46251881Speter * @{ 47251881Speter */ 48251881Speter 49251881Speter 50251881Speter/** A self-contained memory buffer of known size. 51251881Speter * 52251881Speter * Intended to be used where a single variable-sized buffer is needed 53251881Speter * within an iteration, a scratch pool is available and we want to 54251881Speter * avoid the cost of creating another pool just for the iteration. 55251881Speter */ 56251881Spetertypedef struct svn_membuf_t 57251881Speter{ 58251881Speter /** The a pool from which this buffer was originally allocated, and is not 59251881Speter * necessarily specific to this buffer. This is used only for allocating 60251881Speter * more memory from when the buffer needs to grow. 61251881Speter */ 62251881Speter apr_pool_t *pool; 63251881Speter 64251881Speter /** pointer to the memory */ 65251881Speter void *data; 66251881Speter 67251881Speter /** total size of buffer allocated */ 68251881Speter apr_size_t size; 69251881Speter} svn_membuf_t; 70251881Speter 71251881Speter 72251881Speter/* Initialize a memory buffer of the given size */ 73251881Spetervoid 74251881Spetersvn_membuf__create(svn_membuf_t *membuf, apr_size_t size, apr_pool_t *pool); 75251881Speter 76251881Speter/* Ensure that the given memory buffer has at least the given size */ 77251881Spetervoid 78251881Spetersvn_membuf__ensure(svn_membuf_t *membuf, apr_size_t size); 79251881Speter 80251881Speter/* Resize the given memory buffer, preserving its contents. */ 81251881Spetervoid 82251881Spetersvn_membuf__resize(svn_membuf_t *membuf, apr_size_t size); 83251881Speter 84251881Speter/* Zero-fill the given memory */ 85251881Spetervoid 86251881Spetersvn_membuf__zero(svn_membuf_t *membuf); 87251881Speter 88251881Speter/* Zero-fill the given memory buffer up to the smaller of SIZE and the 89251881Speter current buffer size. */ 90251881Spetervoid 91251881Spetersvn_membuf__nzero(svn_membuf_t *membuf, apr_size_t size); 92251881Speter 93251881Speter/* Inline implementation of svn_membuf__zero. 94251881Speter * Note that PMEMBUF is evaluated only once. 95251881Speter */ 96251881Speter#define SVN_MEMBUF__ZERO(pmembuf) \ 97251881Speter do \ 98251881Speter { \ 99251881Speter svn_membuf_t *const _m_b_f_ = (pmembuf); \ 100251881Speter memset(_m_b_f_->data, 0, _m_b_f_->size); \ 101251881Speter } \ 102251881Speter while(0) 103251881Speter 104251881Speter/* Inline implementation of svn_membuf__nzero 105251881Speter * Note that PMEMBUF and PSIZE are evaluated only once. 106251881Speter */ 107251881Speter#define SVN_MEMBUF__NZERO(pmembuf, psize) \ 108251881Speter do \ 109251881Speter { \ 110251881Speter svn_membuf_t *const _m_b_f_ = (pmembuf); \ 111251881Speter const apr_size_t _s_z_ = (psize); \ 112251881Speter if (_s_z_ > _m_b_f_->size) \ 113251881Speter memset(_m_b_f_->data, 0, _m_b_f_->size); \ 114251881Speter else \ 115251881Speter memset(_m_b_f_->data, 0, _s_z_); \ 116251881Speter } \ 117251881Speter while(0) 118251881Speter 119251881Speter#ifndef SVN_DEBUG 120251881Speter/* In non-debug mode, just use these inlie replacements */ 121251881Speter#define svn_membuf__zero(B) SVN_MEMBUF__ZERO((B)) 122251881Speter#define svn_membuf__nzero(B, S) SVN_MEMBUF__NZERO((B), (S)) 123251881Speter#endif 124251881Speter 125251881Speter 126251881Speter/** Returns the #svn_string_t information contained in the data and 127251881Speter * len members of @a strbuf. This is effectively a typecast, converting 128251881Speter * @a strbuf into an #svn_string_t. This first will become invalid and must 129251881Speter * not be accessed after this function returned. 130251881Speter */ 131251881Spetersvn_string_t * 132251881Spetersvn_stringbuf__morph_into_string(svn_stringbuf_t *strbuf); 133251881Speter 134251881Speter/** Like apr_strtoff but provided here for backward compatibility 135251881Speter * with APR 0.9 */ 136251881Speterapr_status_t 137251881Spetersvn__strtoff(apr_off_t *offset, const char *buf, char **end, int base); 138251881Speter 139251881Speter/** Number of chars needed to represent signed (19 places + sign + NUL) or 140251881Speter * unsigned (20 places + NUL) integers as strings. 141251881Speter */ 142251881Speter#define SVN_INT64_BUFFER_SIZE 21 143251881Speter 144251881Speter/** Writes the @a number as string into @a dest. The latter must provide 145251881Speter * space for at least #SVN_INT64_BUFFER_SIZE characters. Returns the number 146251881Speter * chars written excluding the terminating NUL. 147251881Speter */ 148251881Speterapr_size_t 149251881Spetersvn__ui64toa(char * dest, apr_uint64_t number); 150251881Speter 151251881Speter/** Writes the @a number as string into @a dest. The latter must provide 152251881Speter * space for at least #SVN_INT64_BUFFER_SIZE characters. Returns the number 153251881Speter * chars written excluding the terminating NUL. 154251881Speter */ 155251881Speterapr_size_t 156251881Spetersvn__i64toa(char * dest, apr_int64_t number); 157251881Speter 158251881Speter/** Returns a decimal string for @a number allocated in @a pool. Put in 159251881Speter * the @a seperator at each third place. 160251881Speter */ 161251881Speterchar * 162251881Spetersvn__ui64toa_sep(apr_uint64_t number, char seperator, apr_pool_t *pool); 163251881Speter 164251881Speter/** Returns a decimal string for @a number allocated in @a pool. Put in 165251881Speter * the @a seperator at each third place. 166251881Speter */ 167251881Speterchar * 168251881Spetersvn__i64toa_sep(apr_int64_t number, char seperator, apr_pool_t *pool); 169251881Speter 170251881Speter/** 171251881Speter * Computes the similarity score of STRA and STRB. Returns the ratio 172251881Speter * of the length of their longest common subsequence and the average 173251881Speter * length of the strings, normalized to the range [0..1000]. 174251881Speter * The result is equivalent to Python's 175251881Speter * 176251881Speter * difflib.SequenceMatcher.ratio 177251881Speter * 178251881Speter * Optionally sets *RLCS to the length of the longest common 179251881Speter * subsequence of STRA and STRB. Using BUFFER for temporary storage, 180251881Speter * requires memory proportional to the length of the shorter string. 181251881Speter * 182251881Speter * The LCS algorithm used is described in, e.g., 183251881Speter * 184251881Speter * http://en.wikipedia.org/wiki/Longest_common_subsequence_problem 185251881Speter * 186251881Speter * Q: Why another LCS when we already have one in libsvn_diff? 187251881Speter * A: svn_diff__lcs is too heavyweight and too generic for the 188251881Speter * purposes of similarity testing. Whilst it would be possible 189251881Speter * to use a character-based tokenizer with it, we really only need 190251881Speter * the *length* of the LCS for the similarity score, not all the 191251881Speter * other information that svn_diff__lcs produces in order to 192251881Speter * make printing diffs possible. 193251881Speter * 194251881Speter * Q: Is there a limit on the length of the string parameters? 195251881Speter * A: Only available memory. But note that the LCS algorithm used 196251881Speter * has O(strlen(STRA) * strlen(STRB)) worst-case performance, 197251881Speter * so do keep a rein on your enthusiasm. 198251881Speter */ 199251881Speterunsigned int 200251881Spetersvn_cstring__similarity(const char *stra, const char *strb, 201251881Speter svn_membuf_t *buffer, apr_size_t *rlcs); 202251881Speter 203251881Speter/** 204251881Speter * Like svn_cstring__similarity, but accepts svn_string_t's instead 205251881Speter * of NUL-terminated character strings. 206251881Speter */ 207251881Speterunsigned int 208251881Spetersvn_string__similarity(const svn_string_t *stringa, 209251881Speter const svn_string_t *stringb, 210251881Speter svn_membuf_t *buffer, apr_size_t *rlcs); 211251881Speter 212251881Speter 213251881Speter/** @} */ 214251881Speter 215251881Speter/** @} */ 216251881Speter 217251881Speter 218251881Speter#ifdef __cplusplus 219251881Speter} 220251881Speter#endif /* __cplusplus */ 221251881Speter 222251881Speter#endif /* SVN_STRING_PRIVATE_H */ 223