|
|
@@ -35,20 +35,20 @@ static void add_parseerror_codes(PyObject *module) |
|
|
|
} |
|
|
|
|
|
|
|
/* Helpers to raise ParseErrors. Use "return raise_str(...)" etc. */ |
|
|
|
static PyObject *raise_str(int linenum, int code, const char *string) |
|
|
|
static PyObject *raise_str(int line, int col, int code, const char *string) |
|
|
|
{ |
|
|
|
PyObject *o; |
|
|
|
o = Py_BuildValue("(iis)", linenum, code, string); |
|
|
|
o = Py_BuildValue("(iiis)", line, col, code, string); |
|
|
|
if (o != NULL) { |
|
|
|
PyErr_SetObject(ParseError, o); |
|
|
|
Py_DECREF(o); |
|
|
|
} |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
static PyObject *raise_num(int linenum, int code, double num) |
|
|
|
static PyObject *raise_num(int line, int col, int code, double num) |
|
|
|
{ |
|
|
|
PyObject *o; |
|
|
|
o = Py_BuildValue("(iid)", linenum, code, num); |
|
|
|
o = Py_BuildValue("(iiid)", line, col, code, num); |
|
|
|
if (o != NULL) { |
|
|
|
PyErr_SetObject(ParseError, o); |
|
|
|
Py_DECREF(o); |
|
|
@@ -352,6 +352,7 @@ static PyObject *Rocket_append_string(Rocket *self, PyObject *args) |
|
|
|
int count; |
|
|
|
const char *data; |
|
|
|
int offset; |
|
|
|
const char *linestart; |
|
|
|
int linenum; |
|
|
|
double start; |
|
|
|
double end; |
|
|
@@ -377,6 +378,7 @@ static PyObject *Rocket_append_string(Rocket *self, PyObject *args) |
|
|
|
const char *buf = &data[offset]; |
|
|
|
while (written < count && *buf) |
|
|
|
{ |
|
|
|
linestart = buf; |
|
|
|
linenum++; |
|
|
|
|
|
|
|
/* Skip leading whitespace and commented lines */ |
|
|
@@ -393,12 +395,15 @@ static PyObject *Rocket_append_string(Rocket *self, PyObject *args) |
|
|
|
/* Extract timestamp */ |
|
|
|
t64.d = strtod(buf, &endptr); |
|
|
|
if (endptr == buf) |
|
|
|
return raise_str(linenum, ERR_OTHER, "bad timestamp"); |
|
|
|
return raise_str(linenum, buf - linestart + 1, |
|
|
|
ERR_OTHER, "bad timestamp"); |
|
|
|
if (t64.d <= last_timestamp) |
|
|
|
return raise_num(linenum, ERR_NON_MONOTONIC, t64.d); |
|
|
|
return raise_num(linenum, buf - linestart + 1, |
|
|
|
ERR_NON_MONOTONIC, t64.d); |
|
|
|
last_timestamp = t64.d; |
|
|
|
if (t64.d < start || t64.d >= end) |
|
|
|
return raise_num(linenum, ERR_OUT_OF_INTERVAL, t64.d); |
|
|
|
return raise_num(linenum, buf - linestart + 1, |
|
|
|
ERR_OUT_OF_INTERVAL, t64.d); |
|
|
|
t64.u = le64toh(t64.u); |
|
|
|
if (fwrite(&t64.u, 8, 1, self->file) != 1) |
|
|
|
goto err; |
|
|
@@ -467,11 +472,14 @@ err: |
|
|
|
PyErr_SetFromErrno(PyExc_OSError); |
|
|
|
return NULL; |
|
|
|
wrong_number_of_values: |
|
|
|
return raise_str(linenum, ERR_OTHER, "wrong number of values"); |
|
|
|
return raise_str(linenum, buf - linestart + 1, |
|
|
|
ERR_OTHER, "wrong number of values"); |
|
|
|
value_out_of_range: |
|
|
|
return raise_str(linenum, ERR_OTHER, "value out of range"); |
|
|
|
return raise_str(linenum, buf - linestart + 1, |
|
|
|
ERR_OTHER, "value out of range"); |
|
|
|
extra_data_on_line: |
|
|
|
return raise_str(linenum, ERR_OTHER, "extra data on line"); |
|
|
|
return raise_str(linenum, buf - linestart + 1, |
|
|
|
ERR_OTHER, "extra data on line"); |
|
|
|
} |
|
|
|
|
|
|
|
/**** |
|
|
|