From 3e7bb9b87ef9b47d8f643dbcae19a64ddbc81dbb Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Tue, 5 Aug 2025 09:04:00 +0200 Subject: Added DRFIN solver --- src/solvers/coord/checkdata.h | 75 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 9 deletions(-) (limited to 'src/solvers/coord/checkdata.h') diff --git a/src/solvers/coord/checkdata.h b/src/solvers/coord/checkdata.h index e448e8f..51265a8 100644 --- a/src/solvers/coord/checkdata.h +++ b/src/solvers/coord/checkdata.h @@ -1,14 +1,39 @@ -STATIC long long checkdata_coord( +STATIC long long checkdata_coord_dispatch( const char *, unsigned long long, const unsigned char *); +STATIC long long checkdata_coord( + const coord_t *, unsigned long long, const unsigned char *); +STATIC long long checkdata_multicoord( + const multicoord_t *, unsigned long long, const unsigned char *); STATIC long long -checkdata_coord( +checkdata_coord_dispatch( const char *solver, unsigned long long data_size, const unsigned char *data ) { - coord_t *coord; + coord_t *c; + multicoord_t *mc; + + parse_coord_and_trans(solver, &c, &mc, NULL); + + if (c != NULL) + return checkdata_coord(c, data_size, data); + + if (mc != NULL) + return checkdata_multicoord(mc, data_size, data); + + LOG("[cehckdata] Unknown coordinate solver '%s'\n", solver); + return NISSY_ERROR_DATA; +} + +STATIC long long +checkdata_coord( + const coord_t *coord, + unsigned long long data_size, + const unsigned char *data +) +{ const unsigned char *table; tableinfo_t info; int64_t err; @@ -19,12 +44,6 @@ checkdata_coord( return NISSY_ERROR_DATA; } - parse_coord_and_trans(solver, &coord, NULL); - if (coord == NULL) { - LOG("[cehckdata] Unknown coordinate solver '%s'\n", solver); - return NISSY_ERROR_DATA; - } - table = data + INFOSIZE; err = readtableinfo(data_size, data, &info); if (err != NISSY_OK) { @@ -63,3 +82,41 @@ checkdata_coord( return NISSY_OK; } + +STATIC long long +checkdata_multicoord( + const multicoord_t *mcoord, + unsigned long long data_size, + const unsigned char *data +) +{ + long long r; + size_t i, of, s; + + for (of = INFOSIZE, i = 0; mcoord->coordinates[i] != NULL; i++) { + LOG("[checkdata] %s: checking data for %s\n", mcoord->name, + mcoord->coordinates[i]->name); + s = gendata_coord(mcoord->coordinates[i], NULL); + if (s > data_size-of) + return NISSY_ERROR_DATA; + + r = checkdata_coord(mcoord->coordinates[i], s, data + of); + if (r != NISSY_OK) + return r; + + LOG("[checkdata] Ok\n"); + + of += s; + + /* Skip padding */ + while (of % 8 != 0) { + if (data[of] != 0) + LOG("[checkdata] Warning: some unused bytes " + "are not set to zero. Please report this " + "bug.\n"); + of++; + } + } + + return NISSY_OK; +} -- cgit v1.3