Skip to content

Commit 8085979

Browse files
authored
fix for #1124 (#1125)
1 parent 59a772c commit 8085979

3 files changed

Lines changed: 31 additions & 5 deletions

File tree

src/apps/filters/h3.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,7 @@ H3Index *readCellsFromFile(FILE *fp, char *buffer, size_t *totalCells) {
11991199
int cellsLen = 128;
12001200
int bufferOffset = 0;
12011201
int cellsOffset = 0;
1202+
size_t bytesRead = 0;
12021203
do {
12031204
// Always start from the beginning of the buffer
12041205
bufferOffset = 0;
@@ -1253,9 +1254,24 @@ H3Index *readCellsFromFile(FILE *fp, char *buffer, size_t *totalCells) {
12531254
for (int i = 0; i < BUFFER_SIZE - lastGoodOffset; i++) {
12541255
buffer[i] = buffer[i + lastGoodOffset];
12551256
}
1256-
bufferOffset = BUFFER_SIZE - lastGoodOffset;
1257-
} while (fp != 0 && fread(buffer + bufferOffset, 1,
1258-
BUFFER_SIZE - bufferOffset, fp) != 0);
1257+
int tailLen = BUFFER_SIZE - lastGoodOffset;
1258+
bufferOffset = tailLen;
1259+
1260+
// Read the next chunk from the file, appending after the
1261+
// carried-over tail bytes.
1262+
if (fp != NULL) {
1263+
bytesRead = fread(buffer + tailLen, 1, BUFFER_SIZE - tailLen, fp);
1264+
} else {
1265+
bytesRead = 0;
1266+
}
1267+
1268+
// When fread returns fewer bytes than requested (final chunk),
1269+
// stale data from the previous read remains in the buffer tail.
1270+
// sscanf has no concept of "valid length" — it will keep parsing
1271+
// whatever is in the buffer — so zero the entire stale region.
1272+
memset(buffer + tailLen + bytesRead, 0,
1273+
BUFFER_SIZE - tailLen - bytesRead);
1274+
} while (bytesRead > 0);
12591275
*totalCells = cellsOffset;
12601276
return cells;
12611277
}

tests/cli/cellsToMultiPolygon.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ add_h3_cli_test(
2121
add_h3_cli_test(
2222
testCliCellsToMultiPolygonFile5
2323
"cellsToMultiPolygon -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test5.txt"
24-
"[[[[37.893933, -120.851267], [37.968684, -120.912560], [37.961273, -121.028117], [38.035842, -121.089514], [38.028243, -121.205013], [38.102628, -121.266514], [38.094842, -121.381953], [38.169044, -121.443555], [38.161070, -121.558932], [38.235088, -121.620634], [38.226927, -121.735948], [38.300760, -121.797749], [38.292411, -121.912997], [38.366059, -121.974896], [38.357522, -122.090075], [38.275391, -122.143187], [38.266721, -122.258129], [38.184513, -122.311004], [38.175712, -122.425707], [38.093428, -122.478345], [38.084496, -122.592809], [38.002138, -122.645211], [37.993077, -122.759435], [37.910647, -122.811600], [37.901458, -122.925582], [37.818957, -122.977512], [37.809642, -123.091252], [37.727072, -123.142946], [37.653813, -123.081070], [37.571172, -123.132698], [37.497785, -123.070917], [37.415075, -123.122480], [37.341561, -123.060795], [37.258782, -123.112292], [37.185142, -123.050702], [37.102296, -123.102134], [37.028530, -123.040638], [36.945618, -123.092005], [36.871727, -123.030604], [36.788751, -123.081906], [36.714736, -123.020599], [36.723641, -122.907984], [36.649445, -122.846765], [36.658170, -122.734072], [36.583794, -122.672942], [36.592340, -122.560174], [36.517784, -122.499133], [36.526150, -122.386293], [36.451416, -122.325343], [36.459602, -122.212431], [36.384689, -122.151573], [36.392695, -122.038593], [36.317605, -121.977827], [36.325432, -121.864780], [36.408404, -121.812338], [36.416106, -121.699065], [36.499012, -121.646395], [36.506587, -121.532897], [36.589424, -121.479999], [36.596872, -121.366277], [36.679638, -121.313150], [36.686957, -121.199205], [36.769651, -121.145849], [36.776840, -121.031683], [36.859460, -120.978099], [36.866518, -120.863712], [36.949062, -120.809899], [37.024556, -120.870629], [37.107030, -120.816743], [37.182402, -120.877566], [37.264805, -120.823607], [37.340054, -120.884523], [37.422384, -120.830491], [37.497511, -120.891502], [37.579767, -120.837396], [37.654769, -120.898500], [37.736951, -120.844321], [37.811828, -120.905520]]], [[[37.490250, -121.006554], [37.565196, -121.067667], [37.647458, -121.013720], [37.722279, -121.074928], [37.804467, -121.020908], [37.879162, -121.082210], [37.871614, -121.197541], [37.789422, -121.251401], [37.714782, -121.190091], [37.632515, -121.243878], [37.557750, -121.182663], [37.475409, -121.236378], [37.400519, -121.175257], [37.318106, -121.228899], [37.243092, -121.167872], [37.160607, -121.221443], [37.085470, -121.160510], [37.002914, -121.214009], [36.995490, -121.328282], [36.912860, -121.381551], [36.905305, -121.495600], [36.822602, -121.548639], [36.814919, -121.662463], [36.732145, -121.715272], [36.724333, -121.828869], [36.799241, -121.889820], [36.791248, -122.003352], [36.865977, -122.064397], [36.857802, -122.177861], [36.932351, -122.239000], [36.923995, -122.352395], [36.998363, -122.413626], [36.989826, -122.526949], [37.064013, -122.588271], [37.055294, -122.701520], [36.972446, -122.753285], [36.898316, -122.691966], [36.906977, -122.578878], [36.832666, -122.517650], [36.841147, -122.404488], [36.766655, -122.343351], [36.774955, -122.230118], [36.700284, -122.169073], [36.708403, -122.055771], [36.633553, -121.994819], [36.641490, -121.881449], [36.566462, -121.820592], [36.574218, -121.707157], [36.657058, -121.654417], [36.664688, -121.540757], [36.747458, -121.487788], [36.754960, -121.373903], [36.837659, -121.320705], [36.845030, -121.206596], [36.927656, -121.153169], [36.934897, -121.038838], [37.017447, -120.985181], [37.092763, -121.046013], [37.175243, -120.992284], [37.250436, -121.053210], [37.332844, -120.999409], [37.407914, -121.060428]]]]"
24+
"[[[[37.497511, -120.891502], [37.579767, -120.837396], [37.654769, -120.898500], [37.736951, -120.844321], [37.811828, -120.905520], [37.893933, -120.851267], [37.968684, -120.912560], [37.961273, -121.028117], [38.035842, -121.089514], [38.028243, -121.205013], [38.102628, -121.266514], [38.094842, -121.381953], [38.169044, -121.443555], [38.161070, -121.558932], [38.235088, -121.620634], [38.226927, -121.735948], [38.300760, -121.797749], [38.292411, -121.912997], [38.366059, -121.974896], [38.357522, -122.090075], [38.275391, -122.143187], [38.266721, -122.258129], [38.184513, -122.311004], [38.175712, -122.425707], [38.093428, -122.478345], [38.084496, -122.592809], [38.002138, -122.645211], [37.993077, -122.759435], [37.910647, -122.811600], [37.901458, -122.925582], [37.818957, -122.977512], [37.809642, -123.091252], [37.727072, -123.142946], [37.653813, -123.081070], [37.571172, -123.132698], [37.497785, -123.070917], [37.415075, -123.122480], [37.341561, -123.060795], [37.258782, -123.112292], [37.185142, -123.050702], [37.102296, -123.102134], [37.028530, -123.040638], [36.945618, -123.092005], [36.871727, -123.030604], [36.788751, -123.081906], [36.714736, -123.020599], [36.723641, -122.907984], [36.649445, -122.846765], [36.658170, -122.734072], [36.583794, -122.672942], [36.592340, -122.560174], [36.517784, -122.499133], [36.526150, -122.386293], [36.451416, -122.325343], [36.459602, -122.212431], [36.384689, -122.151573], [36.392695, -122.038593], [36.317605, -121.977827], [36.325432, -121.864780], [36.408404, -121.812338], [36.416106, -121.699065], [36.499012, -121.646395], [36.506587, -121.532897], [36.589424, -121.479999], [36.596872, -121.366277], [36.679638, -121.313150], [36.686957, -121.199205], [36.769651, -121.145849], [36.776840, -121.031683], [36.859460, -120.978099], [36.866518, -120.863712], [36.949062, -120.809899], [37.024556, -120.870629], [37.107030, -120.816743], [37.182402, -120.877566], [37.264805, -120.823607], [37.340054, -120.884523], [37.422384, -120.830491]]]]"
2525
)
2626
add_h3_cli_test(
2727
testCliCellsToMultiPolygonStdin1
@@ -46,7 +46,7 @@ add_h3_cli_test(
4646
add_h3_cli_test(
4747
testCliCellsToMultiPolygonStdin5
4848
"cellsToMultiPolygon -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test5.txt"
49-
"[[[[37.893933, -120.851267], [37.968684, -120.912560], [37.961273, -121.028117], [38.035842, -121.089514], [38.028243, -121.205013], [38.102628, -121.266514], [38.094842, -121.381953], [38.169044, -121.443555], [38.161070, -121.558932], [38.235088, -121.620634], [38.226927, -121.735948], [38.300760, -121.797749], [38.292411, -121.912997], [38.366059, -121.974896], [38.357522, -122.090075], [38.275391, -122.143187], [38.266721, -122.258129], [38.184513, -122.311004], [38.175712, -122.425707], [38.093428, -122.478345], [38.084496, -122.592809], [38.002138, -122.645211], [37.993077, -122.759435], [37.910647, -122.811600], [37.901458, -122.925582], [37.818957, -122.977512], [37.809642, -123.091252], [37.727072, -123.142946], [37.653813, -123.081070], [37.571172, -123.132698], [37.497785, -123.070917], [37.415075, -123.122480], [37.341561, -123.060795], [37.258782, -123.112292], [37.185142, -123.050702], [37.102296, -123.102134], [37.028530, -123.040638], [36.945618, -123.092005], [36.871727, -123.030604], [36.788751, -123.081906], [36.714736, -123.020599], [36.723641, -122.907984], [36.649445, -122.846765], [36.658170, -122.734072], [36.583794, -122.672942], [36.592340, -122.560174], [36.517784, -122.499133], [36.526150, -122.386293], [36.451416, -122.325343], [36.459602, -122.212431], [36.384689, -122.151573], [36.392695, -122.038593], [36.317605, -121.977827], [36.325432, -121.864780], [36.408404, -121.812338], [36.416106, -121.699065], [36.499012, -121.646395], [36.506587, -121.532897], [36.589424, -121.479999], [36.596872, -121.366277], [36.679638, -121.313150], [36.686957, -121.199205], [36.769651, -121.145849], [36.776840, -121.031683], [36.859460, -120.978099], [36.866518, -120.863712], [36.949062, -120.809899], [37.024556, -120.870629], [37.107030, -120.816743], [37.182402, -120.877566], [37.264805, -120.823607], [37.340054, -120.884523], [37.422384, -120.830491], [37.497511, -120.891502], [37.579767, -120.837396], [37.654769, -120.898500], [37.736951, -120.844321], [37.811828, -120.905520]]], [[[37.490250, -121.006554], [37.565196, -121.067667], [37.647458, -121.013720], [37.722279, -121.074928], [37.804467, -121.020908], [37.879162, -121.082210], [37.871614, -121.197541], [37.789422, -121.251401], [37.714782, -121.190091], [37.632515, -121.243878], [37.557750, -121.182663], [37.475409, -121.236378], [37.400519, -121.175257], [37.318106, -121.228899], [37.243092, -121.167872], [37.160607, -121.221443], [37.085470, -121.160510], [37.002914, -121.214009], [36.995490, -121.328282], [36.912860, -121.381551], [36.905305, -121.495600], [36.822602, -121.548639], [36.814919, -121.662463], [36.732145, -121.715272], [36.724333, -121.828869], [36.799241, -121.889820], [36.791248, -122.003352], [36.865977, -122.064397], [36.857802, -122.177861], [36.932351, -122.239000], [36.923995, -122.352395], [36.998363, -122.413626], [36.989826, -122.526949], [37.064013, -122.588271], [37.055294, -122.701520], [36.972446, -122.753285], [36.898316, -122.691966], [36.906977, -122.578878], [36.832666, -122.517650], [36.841147, -122.404488], [36.766655, -122.343351], [36.774955, -122.230118], [36.700284, -122.169073], [36.708403, -122.055771], [36.633553, -121.994819], [36.641490, -121.881449], [36.566462, -121.820592], [36.574218, -121.707157], [36.657058, -121.654417], [36.664688, -121.540757], [36.747458, -121.487788], [36.754960, -121.373903], [36.837659, -121.320705], [36.845030, -121.206596], [36.927656, -121.153169], [36.934897, -121.038838], [37.017447, -120.985181], [37.092763, -121.046013], [37.175243, -120.992284], [37.250436, -121.053210], [37.332844, -120.999409], [37.407914, -121.060428]]]]"
49+
"[[[[37.497511, -120.891502], [37.579767, -120.837396], [37.654769, -120.898500], [37.736951, -120.844321], [37.811828, -120.905520], [37.893933, -120.851267], [37.968684, -120.912560], [37.961273, -121.028117], [38.035842, -121.089514], [38.028243, -121.205013], [38.102628, -121.266514], [38.094842, -121.381953], [38.169044, -121.443555], [38.161070, -121.558932], [38.235088, -121.620634], [38.226927, -121.735948], [38.300760, -121.797749], [38.292411, -121.912997], [38.366059, -121.974896], [38.357522, -122.090075], [38.275391, -122.143187], [38.266721, -122.258129], [38.184513, -122.311004], [38.175712, -122.425707], [38.093428, -122.478345], [38.084496, -122.592809], [38.002138, -122.645211], [37.993077, -122.759435], [37.910647, -122.811600], [37.901458, -122.925582], [37.818957, -122.977512], [37.809642, -123.091252], [37.727072, -123.142946], [37.653813, -123.081070], [37.571172, -123.132698], [37.497785, -123.070917], [37.415075, -123.122480], [37.341561, -123.060795], [37.258782, -123.112292], [37.185142, -123.050702], [37.102296, -123.102134], [37.028530, -123.040638], [36.945618, -123.092005], [36.871727, -123.030604], [36.788751, -123.081906], [36.714736, -123.020599], [36.723641, -122.907984], [36.649445, -122.846765], [36.658170, -122.734072], [36.583794, -122.672942], [36.592340, -122.560174], [36.517784, -122.499133], [36.526150, -122.386293], [36.451416, -122.325343], [36.459602, -122.212431], [36.384689, -122.151573], [36.392695, -122.038593], [36.317605, -121.977827], [36.325432, -121.864780], [36.408404, -121.812338], [36.416106, -121.699065], [36.499012, -121.646395], [36.506587, -121.532897], [36.589424, -121.479999], [36.596872, -121.366277], [36.679638, -121.313150], [36.686957, -121.199205], [36.769651, -121.145849], [36.776840, -121.031683], [36.859460, -120.978099], [36.866518, -120.863712], [36.949062, -120.809899], [37.024556, -120.870629], [37.107030, -120.816743], [37.182402, -120.877566], [37.264805, -120.823607], [37.340054, -120.884523], [37.422384, -120.830491]]]]"
5050
)
5151
add_h3_cli_test(
5252
testCliCellsToMultiPolygonArg1

tests/cli/readCellsFromFile.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
add_h3_cli_test(
2+
testCliReadCellsFromFileCount
3+
"uncompactCells -r 5 -i ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test5.txt -f newline | wc -l | tr -d ' '"
4+
"127"
5+
)
6+
add_h3_cli_test(
7+
testCliReadCellsFromStdinCount
8+
"uncompactCells -r 5 -i -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test5.txt -f newline | wc -l | tr -d ' '"
9+
"127"
10+
)

0 commit comments

Comments
 (0)