summaryrefslogtreecommitdiff
path: root/Modules/_zoneinfo.c
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2020-05-27 21:48:12 +0100
committerGitHub <noreply@github.com>2020-05-27 13:48:12 -0700
commite4799b95945b44eb0e2eea26473db8e0a49ed0ee (patch)
tree0a834d6f67374baffdd2d411c3846695725db4f7 /Modules/_zoneinfo.c
parentc116c94ff119485761460f1033cdee425bed0310 (diff)
downloadcpython-git-e4799b95945b44eb0e2eea26473db8e0a49ed0ee.tar.gz
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] ```
Diffstat (limited to 'Modules/_zoneinfo.c')
-rw-r--r--Modules/_zoneinfo.c56
1 files changed, 26 insertions, 30 deletions
diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c
index d852c763e2..e8b2831999 100644
--- a/Modules/_zoneinfo.c
+++ b/Modules/_zoneinfo.c
@@ -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)
{