]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/subversion/subversion/libsvn_fs_base/id.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / subversion / subversion / libsvn_fs_base / id.c
1 /* id.c : operations on node-revision IDs
2  *
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
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
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
19  *    under the License.
20  * ====================================================================
21  */
22
23 #include <string.h>
24 #include <stdlib.h>
25
26 #include "id.h"
27 #include "../libsvn_fs/fs-loader.h"
28
29
30 \f
31 typedef struct id_private_t {
32   const char *node_id;
33   const char *copy_id;
34   const char *txn_id;
35 } id_private_t;
36
37 \f
38 /* Accessing ID Pieces.  */
39
40 const char *
41 svn_fs_base__id_node_id(const svn_fs_id_t *id)
42 {
43   id_private_t *pvt = id->fsap_data;
44
45   return pvt->node_id;
46 }
47
48
49 const char *
50 svn_fs_base__id_copy_id(const svn_fs_id_t *id)
51 {
52   id_private_t *pvt = id->fsap_data;
53
54   return pvt->copy_id;
55 }
56
57
58 const char *
59 svn_fs_base__id_txn_id(const svn_fs_id_t *id)
60 {
61   id_private_t *pvt = id->fsap_data;
62
63   return pvt->txn_id;
64 }
65
66
67 svn_string_t *
68 svn_fs_base__id_unparse(const svn_fs_id_t *id,
69                         apr_pool_t *pool)
70 {
71   id_private_t *pvt = id->fsap_data;
72
73   return svn_string_createf(pool, "%s.%s.%s",
74                             pvt->node_id, pvt->copy_id, pvt->txn_id);
75 }
76
77 \f
78 /*** Comparing node IDs ***/
79
80 svn_boolean_t
81 svn_fs_base__id_eq(const svn_fs_id_t *a,
82                    const svn_fs_id_t *b)
83 {
84   id_private_t *pvta = a->fsap_data, *pvtb = b->fsap_data;
85
86   if (a == b)
87     return TRUE;
88   if (strcmp(pvta->node_id, pvtb->node_id) != 0)
89      return FALSE;
90   if (strcmp(pvta->copy_id, pvtb->copy_id) != 0)
91     return FALSE;
92   if (strcmp(pvta->txn_id, pvtb->txn_id) != 0)
93     return FALSE;
94   return TRUE;
95 }
96
97
98 svn_boolean_t
99 svn_fs_base__id_check_related(const svn_fs_id_t *a,
100                               const svn_fs_id_t *b)
101 {
102   id_private_t *pvta = a->fsap_data, *pvtb = b->fsap_data;
103
104   if (a == b)
105     return TRUE;
106
107   return (strcmp(pvta->node_id, pvtb->node_id) == 0);
108 }
109
110
111 int
112 svn_fs_base__id_compare(const svn_fs_id_t *a,
113                         const svn_fs_id_t *b)
114 {
115   if (svn_fs_base__id_eq(a, b))
116     return 0;
117   return (svn_fs_base__id_check_related(a, b) ? 1 : -1);
118 }
119
120
121 \f
122 /* Creating ID's.  */
123
124 static id_vtable_t id_vtable = {
125   svn_fs_base__id_unparse,
126   svn_fs_base__id_compare
127 };
128
129
130 svn_fs_id_t *
131 svn_fs_base__id_create(const char *node_id,
132                        const char *copy_id,
133                        const char *txn_id,
134                        apr_pool_t *pool)
135 {
136   svn_fs_id_t *id = apr_palloc(pool, sizeof(*id));
137   id_private_t *pvt = apr_palloc(pool, sizeof(*pvt));
138
139   pvt->node_id = apr_pstrdup(pool, node_id);
140   pvt->copy_id = apr_pstrdup(pool, copy_id);
141   pvt->txn_id = apr_pstrdup(pool, txn_id);
142   id->vtable = &id_vtable;
143   id->fsap_data = pvt;
144   return id;
145 }
146
147
148 svn_fs_id_t *
149 svn_fs_base__id_copy(const svn_fs_id_t *id, apr_pool_t *pool)
150 {
151   svn_fs_id_t *new_id = apr_palloc(pool, sizeof(*new_id));
152   id_private_t *new_pvt = apr_palloc(pool, sizeof(*new_pvt));
153   id_private_t *pvt = id->fsap_data;
154
155   new_pvt->node_id = apr_pstrdup(pool, pvt->node_id);
156   new_pvt->copy_id = apr_pstrdup(pool, pvt->copy_id);
157   new_pvt->txn_id = apr_pstrdup(pool, pvt->txn_id);
158   new_id->vtable = &id_vtable;
159   new_id->fsap_data = new_pvt;
160   return new_id;
161 }
162
163
164 svn_fs_id_t *
165 svn_fs_base__id_parse(const char *data,
166                       apr_size_t len,
167                       apr_pool_t *pool)
168 {
169   svn_fs_id_t *id;
170   id_private_t *pvt;
171   char *data_copy, *str;
172
173   /* Dup the ID data into POOL.  Our returned ID will have references
174      into this memory. */
175   data_copy = apr_pstrmemdup(pool, data, len);
176
177   /* Alloc a new svn_fs_id_t structure. */
178   id = apr_palloc(pool, sizeof(*id));
179   pvt = apr_palloc(pool, sizeof(*pvt));
180   id->vtable = &id_vtable;
181   id->fsap_data = pvt;
182
183   /* Now, we basically just need to "split" this data on `.'
184      characters.  We will use svn_cstring_tokenize, which will put
185      terminators where each of the '.'s used to be.  Then our new
186      id field will reference string locations inside our duplicate
187      string.*/
188
189   /* Node Id */
190   str = svn_cstring_tokenize(".", &data_copy);
191   if (str == NULL)
192     return NULL;
193   pvt->node_id = str;
194
195   /* Copy Id */
196   str = svn_cstring_tokenize(".", &data_copy);
197   if (str == NULL)
198     return NULL;
199   pvt->copy_id = str;
200
201   /* Txn Id */
202   str = svn_cstring_tokenize(".", &data_copy);
203   if (str == NULL)
204     return NULL;
205   pvt->txn_id = str;
206
207   return id;
208 }