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