in h3_coordijk.c [319:359]
H3Error _upAp7Checked(CoordIJK *ijk) {
// Doesn't need to be checked because i, j, and k must all be non-negative
int i = ijk->i - ijk->k;
int j = ijk->j - ijk->k;
// <0 is checked because the input must all be non-negative, but some
// negative inputs are used in unit tests to exercise the below.
if (i >= INT32_MAX_3 || j >= INT32_MAX_3 || i < 0 || j < 0) {
if (ADD_INT32S_OVERFLOWS(i, i)) {
return E_FAILED;
}
int i2 = i + i;
if (ADD_INT32S_OVERFLOWS(i2, i)) {
return E_FAILED;
}
int i3 = i2 + i;
if (ADD_INT32S_OVERFLOWS(j, j)) {
return E_FAILED;
}
int j2 = j + j;
if (SUB_INT32S_OVERFLOWS(i3, j)) {
return E_FAILED;
}
if (ADD_INT32S_OVERFLOWS(i, j2)) {
return E_FAILED;
}
}
ijk->i = (int)lround(((i * 3) - j) * M_ONESEVENTH);
ijk->j = (int)lround((i + (j * 2)) * M_ONESEVENTH);
ijk->k = 0;
// Expected not to be reachable, because max + min or max - min would need
// to overflow.
if (NEVER(_ijkNormalizeCouldOverflow(ijk))) {
return E_FAILED;
}
_ijkNormalize(ijk);
return E_SUCCESS;
}