Fix compiler warnings in _zoneinfo.c (GH-20342)

```
D:\a\cpython\cpython\Modules\_zoneinfo.c(903,52): warning C4267: '=': conversion from 'size_t' to 'unsigned int', possible loss of data [D:\a\cpython\cpython\PCbuild\_zoneinfo.vcxproj]
D:\a\cpython\cpython\Modules\_zoneinfo.c(904,44): warning C4267: '=': conversion from 'size_t' to 'unsigned int', possible loss of data [D:\a\cpython\cpython\PCbuild\_zoneinfo.vcxproj]
D:\a\cpython\cpython\Modules\_zoneinfo.c(1772,31): warning C4244: '=': conversion from 'ssize_t' to 'uint8_t', possible loss of data [D:\a\cpython\cpython\PCbuild\_zoneinfo.vcxproj]
```
This commit is contained in:
Pablo Galindo 2020-05-27 21:48:12 +01:00 committed by GitHub
parent c116c94ff1
commit e4799b9594
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 26 additions and 30 deletions

View File

@ -36,8 +36,8 @@ typedef struct {
PyObject *key;
PyObject *file_repr;
PyObject *weakreflist;
unsigned int num_transitions;
unsigned int num_ttinfos;
size_t num_transitions;
size_t num_ttinfos;
int64_t *trans_list_utc;
int64_t *trans_list_wall[2];
_ttinfo **trans_ttinfos; // References to the ttinfo for each transition
@ -117,14 +117,14 @@ ts_to_local(size_t *trans_idx, int64_t *trans_utc, long *utcoff,
static int
parse_tz_str(PyObject *tz_str_obj, _tzrule *out);
static ssize_t
static Py_ssize_t
parse_abbr(const char *const p, PyObject **abbr);
static ssize_t
static Py_ssize_t
parse_tz_delta(const char *const p, long *total_seconds);
static ssize_t
static Py_ssize_t
parse_transition_time(const char *const p, int8_t *hour, int8_t *minute,
int8_t *second);
static ssize_t
static Py_ssize_t
parse_transition_rule(const char *const p, TransitionRuleType **out);
static _ttinfo *
@ -891,12 +891,12 @@ load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj)
// Load the relevant sizes
Py_ssize_t num_transitions = PyTuple_Size(trans_utc);
if (num_transitions == -1) {
if (num_transitions < 0) {
goto error;
}
Py_ssize_t num_ttinfos = PyTuple_Size(utcoff_list);
if (num_ttinfos == -1) {
if (num_ttinfos < 0) {
goto error;
}
@ -908,7 +908,7 @@ load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj)
PyMem_Malloc(self->num_transitions * sizeof(int64_t));
trans_idx = PyMem_Malloc(self->num_transitions * sizeof(Py_ssize_t));
for (Py_ssize_t i = 0; i < self->num_transitions; ++i) {
for (size_t i = 0; i < self->num_transitions; ++i) {
PyObject *num = PyTuple_GetItem(trans_utc, i);
if (num == NULL) {
goto error;
@ -946,7 +946,7 @@ load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj)
if (utcoff == NULL || isdst == NULL) {
goto error;
}
for (Py_ssize_t i = 0; i < self->num_ttinfos; ++i) {
for (size_t i = 0; i < self->num_ttinfos; ++i) {
PyObject *num = PyTuple_GetItem(utcoff_list, i);
if (num == NULL) {
goto error;
@ -1468,7 +1468,7 @@ parse_tz_str(PyObject *tz_str_obj, _tzrule *out)
char *p = tz_str;
// Read the `std` abbreviation, which must be at least 3 characters long.
ssize_t num_chars = parse_abbr(p, &std_abbr);
Py_ssize_t num_chars = parse_abbr(p, &std_abbr);
if (num_chars < 1) {
PyErr_Format(PyExc_ValueError, "Invalid STD format in %R", tz_str_obj);
goto error;
@ -1565,18 +1565,19 @@ error:
return -1;
}
static ssize_t
parse_uint(const char *const p)
static int
parse_uint(const char *const p, uint8_t *value)
{
if (!isdigit(*p)) {
return -1;
}
return (*p) - '0';
*value = (*p) - '0';
return 0;
}
/* Parse the STD and DST abbreviations from a TZ string. */
static ssize_t
static Py_ssize_t
parse_abbr(const char *const p, PyObject **abbr)
{
const char *ptr = p;
@ -1629,7 +1630,7 @@ parse_abbr(const char *const p, PyObject **abbr)
}
/* Parse a UTC offset from a TZ str. */
static ssize_t
static Py_ssize_t
parse_tz_delta(const char *const p, long *total_seconds)
{
// From the POSIX spec:
@ -1712,7 +1713,7 @@ complete:
}
/* Parse the date portion of a transition rule. */
static ssize_t
static Py_ssize_t
parse_transition_rule(const char *const p, TransitionRuleType **out)
{
// The full transition rule indicates when to change back and forth between
@ -1739,20 +1740,18 @@ parse_transition_rule(const char *const p, TransitionRuleType **out)
if (*ptr == 'M') {
uint8_t month, week, day;
ptr++;
ssize_t tmp = parse_uint(ptr);
if (tmp < 0) {
if (parse_uint(ptr, &month)) {
return -1;
}
month = (uint8_t)tmp;
ptr++;
if (*ptr != '.') {
tmp = parse_uint(ptr);
if (tmp < 0) {
uint8_t tmp;
if (parse_uint(ptr, &tmp)) {
return -1;
}
month *= 10;
month += (uint8_t)tmp;
month += tmp;
ptr++;
}
@ -1763,18 +1762,15 @@ parse_transition_rule(const char *const p, TransitionRuleType **out)
}
ptr++;
tmp = parse_uint(ptr);
if (tmp < 0) {
if (parse_uint(ptr, values[i])) {
return -1;
}
ptr++;
*(values[i]) = tmp;
}
if (*ptr == '/') {
ptr++;
ssize_t num_chars =
Py_ssize_t num_chars =
parse_transition_time(ptr, &hour, &minute, &second);
if (num_chars < 0) {
return -1;
@ -1816,7 +1812,7 @@ parse_transition_rule(const char *const p, TransitionRuleType **out)
if (*ptr == '/') {
ptr++;
ssize_t num_chars =
Py_ssize_t num_chars =
parse_transition_time(ptr, &hour, &minute, &second);
if (num_chars < 0) {
return -1;
@ -1840,7 +1836,7 @@ parse_transition_rule(const char *const p, TransitionRuleType **out)
}
/* Parse the time portion of a transition rule (e.g. following an /) */
static ssize_t
static Py_ssize_t
parse_transition_time(const char *const p, int8_t *hour, int8_t *minute,
int8_t *second)
{