comparison mercurial/manifest.c @ 24294:3d485727e45e

lazymanifest: extract function for iterating to next line This will soon be reused by keys iterator.
author Martin von Zweigbergk <martinvonz@google.com>
date Wed, 11 Mar 2015 13:15:26 -0700
parents 30e9ee203846
children 2b7ab29627fd
comparison
equal deleted inserted replaced
24293:30e9ee203846 24294:3d485727e45e
220 lmIter *self = (lmIter *)o; 220 lmIter *self = (lmIter *)o;
221 Py_DECREF(self->m); 221 Py_DECREF(self->m);
222 PyObject_Del(self); 222 PyObject_Del(self);
223 } 223 }
224 224
225 static line *lmiter_nextline(lmIter *self)
226 {
227 do {
228 self->pos++;
229 if (self->pos >= self->m->numlines) {
230 return NULL;
231 }
232 /* skip over deleted manifest entries */
233 } while (self->m->lines[self->pos].deleted);
234 return self->m->lines + self->pos;
235 }
236
225 static PyObject *lmiter_iternext(PyObject *o) 237 static PyObject *lmiter_iternext(PyObject *o)
226 { 238 {
227 size_t pl; 239 size_t pl;
228 line *l; 240 line *l;
229 Py_ssize_t consumed; 241 Py_ssize_t consumed;
230 PyObject *ret = NULL, *path = NULL, *hash = NULL, *flags = NULL; 242 PyObject *path = NULL, *hash = NULL, *flags = NULL;
231 lmIter *self = (lmIter *)o; 243 l = lmiter_nextline((lmIter *)o);
232 do { 244 if (!l) {
233 self->pos++; 245 goto bail;
234 if (self->pos >= self->m->numlines) { 246 }
235 goto bail;
236 }
237 /* skip over deleted manifest entries */
238 } while (self->m->lines[self->pos].deleted);
239 l = self->m->lines + self->pos;
240 pl = pathlen(l); 247 pl = pathlen(l);
241 path = PyString_FromStringAndSize(l->start, pl); 248 path = PyString_FromStringAndSize(l->start, pl);
242 hash = nodeof(l); 249 hash = nodeof(l);
243 consumed = pl + 41; 250 consumed = pl + 41;
244 flags = PyString_FromStringAndSize(l->start + consumed, 251 flags = PyString_FromStringAndSize(l->start + consumed,
245 l->len - consumed - 1); 252 l->len - consumed - 1);
246 if (!path || !hash || !flags) { 253 if (!path || !hash || !flags) {
247 goto bail; 254 goto bail;
248 } 255 }
249 ret = PyTuple_Pack(3, path, hash, flags); 256 return PyTuple_Pack(3, path, hash, flags);
250 bail: 257 bail:
251 Py_XDECREF(path); 258 Py_XDECREF(path);
252 Py_XDECREF(hash); 259 Py_XDECREF(hash);
253 Py_XDECREF(flags); 260 Py_XDECREF(flags);
254 return ret; 261 return NULL;
255 } 262 }
256 263
257 static PyTypeObject lazymanifestIterator = { 264 static PyTypeObject lazymanifestIterator = {
258 PyObject_HEAD_INIT(NULL) 265 PyObject_HEAD_INIT(NULL)
259 0, /*ob_size */ 266 0, /*ob_size */