1 /* key-gen.c --- manufacturing sequential keys for some db tables
3 * ====================================================================
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
20 * ====================================================================
26 #define APR_WANT_STRFUNC
35 /*** Keys for reps and strings. ***/
39 svn_fs_base__next_key(const char *this, apr_size_t *len, char *next)
41 apr_size_t olen = *len; /* remember the first length */
42 int i = olen - 1; /* initial index; we work backwards */
43 char c; /* current char */
44 svn_boolean_t carry = TRUE; /* boolean: do we have a carry or not?
45 We start with a carry, because we're
46 incrementing the number, after all. */
48 /* Leading zeros are not allowed, except for the string "0". */
49 if ((*len > 1) && (this[0] == '0'))
55 for (i = (olen - 1); i >= 0; i--)
59 /* Validate as we go. */
60 if (! (((c >= '0') && (c <= '9')) || ((c >= 'a') && (c <= 'z'))))
84 /* The new length is OLEN, plus 1 if there's a carry out of the
86 *len = olen + (carry ? 1 : 0);
88 /* Ensure that we haven't overrun the (ludicrous) bound on key length.
89 Note that MAX_KEY_SIZE is a bound on the size *including*
90 the trailing null byte. */
91 assert(*len < MAX_KEY_SIZE);
93 /* Now we know it's safe to add the null terminator. */
96 /* Handle any leftover carry. */
99 memmove(next+1, next, olen);
106 svn_fs_base__key_compare(const char *a, const char *b)
108 int a_len = strlen(a);
109 int b_len = strlen(b);
117 return (cmp ? (cmp / abs(cmp)) : 0);
122 svn_fs_base__same_keys(const char *a, const char *b)
130 return (strcmp(a, b) == 0);