##// END OF EJS Templates
parsers: add fm1readmarker...
Augie Fackler -
r24017:72c9b5ae default
parent child Browse files
Show More
@@ -2146,6 +2146,127 b' bail:'
2146 2146 return NULL;
2147 2147 }
2148 2148
2149 #define BUMPED_FIX 1
2150 #define USING_SHA_256 2
2151
2152 static PyObject *readshas(
2153 const char *source, unsigned char num, Py_ssize_t hashwidth)
2154 {
2155 int i;
2156 PyObject *list = PyTuple_New(num);
2157 if (list == NULL) {
2158 return NULL;
2159 }
2160 for (i = 0; i < num; i++) {
2161 PyObject *hash = PyString_FromStringAndSize(source, hashwidth);
2162 if (hash == NULL) {
2163 Py_DECREF(list);
2164 return NULL;
2165 }
2166 PyTuple_SetItem(list, i, hash);
2167 source += hashwidth;
2168 }
2169 return list;
2170 }
2171
2172 static PyObject *fm1readmarker(PyObject *self, PyObject *args)
2173 {
2174 const char *data;
2175 const char *meta;
2176 Py_ssize_t datalen, offset;
2177
2178 uint32_t msize;
2179 double mtime;
2180 int16_t tz;
2181 uint16_t flags;
2182 unsigned char nsuccs, nparents, nmetadata;
2183 Py_ssize_t hashwidth = 20;
2184
2185 PyObject *prec = NULL, *parents = NULL, *succs = NULL;
2186 PyObject *metadata = NULL, *ret = NULL;
2187 int i;
2188
2189 if (!PyArg_ParseTuple(args, "s#n", &data, &datalen, &offset)) {
2190 return NULL;
2191 }
2192 data += offset;
2193
2194 msize = getbe32(data);
2195 data += 4;
2196 mtime = getbefloat64(data);
2197 data += 8;
2198 tz = getbeint16(data);
2199 data += 2;
2200 flags = getbeuint16(data);
2201 data += 2;
2202
2203 if (flags & USING_SHA_256) {
2204 hashwidth = 32;
2205 }
2206
2207 nsuccs = (unsigned char)(*data++);
2208 nparents = (unsigned char)(*data++);
2209 nmetadata = (unsigned char)(*data++);
2210
2211 prec = PyString_FromStringAndSize(data, hashwidth);
2212 data += hashwidth;
2213 if (prec == NULL) {
2214 goto bail;
2215 }
2216
2217 succs = readshas(data, nsuccs, hashwidth);
2218 if (succs == NULL) {
2219 goto bail;
2220 }
2221 data += nsuccs * hashwidth;
2222
2223 if (nparents == 1 || nparents == 2) {
2224 parents = readshas(data, nparents, hashwidth);
2225 if (parents == NULL) {
2226 goto bail;
2227 }
2228 data += nparents * hashwidth;
2229 } else {
2230 parents = Py_None;
2231 }
2232
2233 meta = data + (2 * nmetadata);
2234 metadata = PyTuple_New(nmetadata);
2235 if (metadata == NULL) {
2236 goto bail;
2237 }
2238 for (i = 0; i < nmetadata; i++) {
2239 PyObject *tmp, *left = NULL, *right = NULL;
2240 Py_ssize_t metasize = (unsigned char)(*data++);
2241 left = PyString_FromStringAndSize(meta, metasize);
2242 meta += metasize;
2243 metasize = (unsigned char)(*data++);
2244 right = PyString_FromStringAndSize(meta, metasize);
2245 meta += metasize;
2246 if (!left || !right) {
2247 Py_XDECREF(left);
2248 Py_XDECREF(right);
2249 goto bail;
2250 }
2251 tmp = PyTuple_Pack(2, left, right);
2252 Py_DECREF(left);
2253 Py_DECREF(right);
2254 if (!tmp) {
2255 goto bail;
2256 }
2257 PyTuple_SetItem(metadata, i, tmp);
2258 }
2259 ret = Py_BuildValue("(nOOHO(di)O)", msize, prec, succs, flags,
2260 metadata, mtime, (int)tz * 60, parents);
2261 bail:
2262 Py_XDECREF(prec);
2263 Py_XDECREF(succs);
2264 Py_XDECREF(metadata);
2265 if (parents != Py_None)
2266 Py_XDECREF(parents);
2267 return ret;
2268 }
2269
2149 2270 static char parsers_doc[] = "Efficient content parsing.";
2150 2271
2151 2272 PyObject *encodedir(PyObject *self, PyObject *args);
@@ -2161,6 +2282,7 b' static PyMethodDef methods[] = {'
2161 2282 {"encodedir", encodedir, METH_VARARGS, "encodedir a path\n"},
2162 2283 {"pathencode", pathencode, METH_VARARGS, "fncache-encode a path\n"},
2163 2284 {"lowerencode", lowerencode, METH_VARARGS, "lower-encode a path\n"},
2285 {"fm1readmarker", fm1readmarker, METH_VARARGS, "parse v1 obsolete marker\n"},
2164 2286 {NULL, NULL}
2165 2287 };
2166 2288
General Comments 0
You need to be logged in to leave comments. Login now