comparison mercurial/cext/revlog.c @ 38943:2b89e20c450c

index: move all "nt_*" functions to one place Differential Revision: https://phab.mercurial-scm.org/D4116
author Martin von Zweigbergk <martinvonz@google.com>
date Thu, 19 Jul 2018 11:08:30 -0700
parents 3e74c01102af
children c1de67691d5b
comparison
equal deleted inserted replaced
38942:3e74c01102af 38943:2b89e20c450c
1112 return -1; 1112 return -1;
1113 } 1113 }
1114 return 0; 1114 return 0;
1115 } 1115 }
1116 1116
1117 static int nt_partialmatch(nodetree *self, const char *node,
1118 Py_ssize_t nodelen)
1119 {
1120 return nt_find(self, node, nodelen, 1);
1121 }
1122
1123 /*
1124 * Find the length of the shortest unique prefix of node.
1125 *
1126 * Return values:
1127 *
1128 * -3: error (exception set)
1129 * -2: not found (no exception set)
1130 * rest: length of shortest prefix
1131 */
1132 static int nt_shortest(nodetree *self, const char *node)
1133 {
1134 int level, off;
1135
1136 for (level = off = 0; level < 40; level++) {
1137 int k, v;
1138 nodetreenode *n = &self->nodes[off];
1139 k = nt_level(node, level);
1140 v = n->children[k];
1141 if (v < 0) {
1142 const char *n;
1143 v = -(v + 2);
1144 n = index_node_existing(self->index, v);
1145 if (n == NULL)
1146 return -3;
1147 if (memcmp(node, n, 20) != 0)
1148 /*
1149 * Found a unique prefix, but it wasn't for the
1150 * requested node (i.e the requested node does
1151 * not exist).
1152 */
1153 return -2;
1154 return level + 1;
1155 }
1156 if (v == 0)
1157 return -2;
1158 off = v;
1159 }
1160 /*
1161 * The node was still not unique after 40 hex digits, so this won't
1162 * happen. Also, if we get here, then there's a programming error in
1163 * this file that made us insert a node longer than 40 hex digits.
1164 */
1165 PyErr_SetString(PyExc_Exception, "broken node tree");
1166 return -3;
1167 }
1168
1117 static int index_init_nt(indexObject *self) 1169 static int index_init_nt(indexObject *self)
1118 { 1170 {
1119 if (self->nt == NULL) { 1171 if (self->nt == NULL) {
1120 if ((size_t)self->raw_length > INT_MAX / sizeof(nodetreenode)) { 1172 if ((size_t)self->raw_length > INT_MAX / sizeof(nodetreenode)) {
1121 PyErr_SetString(PyExc_ValueError, "overflow in index_init_nt"); 1173 PyErr_SetString(PyExc_ValueError, "overflow in index_init_nt");
1262 return -1; 1314 return -1;
1263 } 1315 }
1264 self->ntrev = -1; 1316 self->ntrev = -1;
1265 } 1317 }
1266 return 0; 1318 return 0;
1267 }
1268
1269 static int nt_partialmatch(nodetree *self, const char *node,
1270 Py_ssize_t nodelen)
1271 {
1272 return nt_find(self, node, nodelen, 1);
1273 }
1274
1275 /*
1276 * Find the length of the shortest unique prefix of node.
1277 *
1278 * Return values:
1279 *
1280 * -3: error (exception set)
1281 * -2: not found (no exception set)
1282 * rest: length of shortest prefix
1283 */
1284 static int nt_shortest(nodetree *self, const char *node)
1285 {
1286 int level, off;
1287
1288 for (level = off = 0; level < 40; level++) {
1289 int k, v;
1290 nodetreenode *n = &self->nodes[off];
1291 k = nt_level(node, level);
1292 v = n->children[k];
1293 if (v < 0) {
1294 const char *n;
1295 v = -(v + 2);
1296 n = index_node_existing(self->index, v);
1297 if (n == NULL)
1298 return -3;
1299 if (memcmp(node, n, 20) != 0)
1300 /*
1301 * Found a unique prefix, but it wasn't for the
1302 * requested node (i.e the requested node does
1303 * not exist).
1304 */
1305 return -2;
1306 return level + 1;
1307 }
1308 if (v == 0)
1309 return -2;
1310 off = v;
1311 }
1312 /*
1313 * The node was still not unique after 40 hex digits, so this won't
1314 * happen. Also, if we get here, then there's a programming error in
1315 * this file that made us insert a node longer than 40 hex digits.
1316 */
1317 PyErr_SetString(PyExc_Exception, "broken node tree");
1318 return -3;
1319 } 1319 }
1320 1320
1321 static PyObject *index_partialmatch(indexObject *self, PyObject *args) 1321 static PyObject *index_partialmatch(indexObject *self, PyObject *args)
1322 { 1322 {
1323 const char *fullnode; 1323 const char *fullnode;