From 4c775f40d4c85057b8e8b3967e8845de148e0b0a Mon Sep 17 00:00:00 2001 From: Wojciech Graj Date: Mon, 27 Mar 2023 02:45:33 +0200 Subject: [PATCH] Update satcat dependency. --- lib/satcat/satcat.c | 72 +++++++++++++++++++++---------------- lib/satcat/satcat.h | 27 ++++++++------ lib/satcat/satcat_code.c | 8 +++-- lib/satcat/satcat_code.h | 13 ++----- src/util/satcat_code_list.c | 1 + src/util/satcat_code_list.h | 2 +- 6 files changed, 69 insertions(+), 54 deletions(-) diff --git a/lib/satcat/satcat.c b/lib/satcat/satcat.c index 7abac6f..d104618 100644 --- a/lib/satcat/satcat.c +++ b/lib/satcat/satcat.c @@ -9,29 +9,37 @@ #include "satcat.h" #include -#include #include +#include #include -static bool isopstat(char c); -static int parse_int(char *str, unsigned len); -static double parse_dbl(char *str, unsigned len, unsigned loc_pt); -static void parse_date(struct SCDate *date, char *str); +static scbool isopstat(char c); +static int parse_int(const char *str, unsigned len); +static double parse_dbl(const char *str, unsigned len, unsigned loc_pt); +static void parse_date(const char *str, struct SCDate *date); -void sc_parse(struct SatCat *sc, char *str) +void sc_parse(struct SatCat *sc, const char *str) { memcpy(sc->id, str, 11); +#ifdef SC_CSTRING sc->id[11] = '\0'; +#endif sc->catnum = parse_int(str + 13, 5); sc->mul_names = (str[19] == 'M'); sc->payload = (str[20] == '*'); sc->opstat = str[21]; memcpy(sc->name, str + 23, 24); +#ifdef SC_CSTRING + sc->name[24] = '\0'; +#endif memcpy(sc->source, str + 49, 5); - parse_date(&sc->launch_date, str + 56); +#ifdef SC_CSTRING + sc->source[5] = '\0'; +#endif + parse_date(str + 56, &sc->launch_date); memcpy(sc->launch_site, str + 68, 5); if (str[75] != ' ') { - parse_date(&sc->decay_date, str + 75); + parse_date(str + 75, &sc->decay_date); } else { sc->decay_date.year = 0; sc->decay_date.month = 0; @@ -46,34 +54,29 @@ void sc_parse(struct SatCat *sc, char *str) else sc->radar_cs = 0.0; memcpy(sc->status_code, str + 129, 3); +#ifdef SC_CSTRING + sc->status_code[3] = '\0'; +#endif } -bool sc_validate(char *str) +scbool sc_validate(const char *str) { - const char *fmt = "nnnn-nnnaaa nnnnn M*O aaaaaaaaaaaaaaaaaaaaaaaa aaaaa nnnn-nn-nn aaaaa nnnn-nn-nn NNNNn.n NNn.n NNNNNn NNNNNn NNn.nnnn aaa"; + const char *fmt = "nnnn-nnnaaa nnnnn M*O aaaaaaaaaaaaaaaaaaaaaaaa aaaaa nnnn-nn-nn aaaaa lnnn-nn-nn NNNNn.n NNn.n NNNNNn NNNNNn LNn.nnnn aaa"; unsigned i; - /* Validate Length */ for (i = 0; i < 132; i++) { + /* Validate Length */ if (str[i] == '\0') return 0; - } - /* Validate Contents */ - for (i = 0; i < 132; i++) { - if (i == 75) { + /* Validate Contents */ + switch (fmt[i]) { + case 'l': if (!strncmp(" ", str + 75, 10)) { i += 9; continue; } - } else if (i == 119) { - if (!strncmp(" N/A ", str + 119, 8)) { - i += 7; - continue; - } - } - - switch (fmt[i]) { + __attribute__((fallthrough)); case 'n': if (!isdigit(str[i])) return 0; @@ -91,8 +94,15 @@ bool sc_validate(char *str) if (!isopstat(str[i])) return 0; break; + case 'L': + if (!strncmp(" N/A ", str + 119, 8)) { + i += 7; + continue; + } + __attribute__((fallthrough)); case 'N': - if ((fmt[i - 1] == 'N' && str[i - 1] != ' ' && str[i] == ' ') || (str[i] != ' ' && !isdigit(str[i]))) + if ((fmt[i - 1] == 'N' && str[i - 1] != ' ' && str[i] == ' ') + || (str[i] != ' ' && !isdigit(str[i]))) return 0; break; default: @@ -103,7 +113,7 @@ bool sc_validate(char *str) return 1; } -bool isopstat(char c) +scbool isopstat(const char c) { switch (c) { case '+': @@ -121,7 +131,7 @@ bool isopstat(char c) } } -int parse_int(char *str, unsigned len) +int parse_int(const char *str, const unsigned len) { char buf[8]; memcpy(buf, str, len); @@ -129,15 +139,15 @@ int parse_int(char *str, unsigned len) return strtol(buf, NULL, 10); } -double parse_dbl(char *str, unsigned len, unsigned loc_pt) +double parse_dbl(const char *str, const unsigned len, const unsigned loc_pt) { - unsigned decim_places = len - loc_pt - 1; - int integral = parse_int(str, loc_pt); - int fract = parse_int(str + loc_pt + 1, decim_places); + const unsigned decim_places = len - loc_pt - 1; + const int integral = parse_int(str, loc_pt); + const int fract = parse_int(str + loc_pt + 1, decim_places); return integral + fract / pow(10.0, decim_places); } -void parse_date(struct SCDate *date, char *str) +void parse_date(const char *str, struct SCDate *date) { date->year = parse_int(str, 4); date->month = parse_int(str + 5, 2); diff --git a/lib/satcat/satcat.h b/lib/satcat/satcat.h index 8cba5ec..266fb8a 100644 --- a/lib/satcat/satcat.h +++ b/lib/satcat/satcat.h @@ -11,8 +11,15 @@ #ifdef __STDC_VERSION__ #include +typedef bool scbool; #else -typedef int bool; +typedef int scbool; +#endif + +#ifdef SC_CSTRING +#define SC_TERM 1 +#else +#define SC_TERM 0 #endif struct SCDate { @@ -22,25 +29,25 @@ struct SCDate { }; struct SatCat { - char id[12]; /* International Designator */ /* NOTE: NULL-Terminated */ + char id[11 + SC_TERM]; /* International Designator */ unsigned catnum; /* NORAD Catalog Number */ - bool mul_names; /* Multiple Name Flag */ - bool payload; /* Payload Flag */ + scbool mul_names; /* Multiple Name Flag */ + scbool payload; /* Payload Flag */ char opstat; /* Operational Status Code */ - char name[24]; /* Satellite Name */ - char source[5]; /* Source or Ownership */ + char name[24 + SC_TERM]; /* Satellite Name */ + char source[5 + SC_TERM]; /* Source or Ownership */ struct SCDate launch_date; /* Launch Date */ - char launch_site[5]; /* Launch Site */ + char launch_site[5 + SC_TERM]; /* Launch Site */ struct SCDate decay_date; /* Decay Date [Optional] */ double period; /* Orbital Period (minutes) */ double inc_deg; /* Inclination (degrees) */ unsigned apogee; /* Apogee Altitude (kilometers) */ unsigned perigee; /* Perigee Altitude (kilometers) */ double radar_cs; /* Radar Cross Section (meters^2) [Optional] */ - char status_code[3]; /* Orbital Status Code */ + char status_code[3 + SC_TERM]; /* Orbital Status Code */ }; -void sc_parse(struct SatCat *sc, char *str); -bool sc_validate(char *str); +void sc_parse(struct SatCat *sc, const char *str); +scbool sc_validate(const char *str); #endif /* SATCAT_H */ diff --git a/lib/satcat/satcat_code.c b/lib/satcat/satcat_code.c index e9059af..be9c0d0 100644 --- a/lib/satcat/satcat_code.c +++ b/lib/satcat/satcat_code.c @@ -34,7 +34,8 @@ const char *sc_status_str(const char code) } } -const char *sc_source_str(const sc_code_t code){ +const char *sc_source_str(const sc_code_t code) +{ switch (code) { case SCSRC_AB : return "Arab Satellite Communications Organization"; @@ -162,6 +163,8 @@ const char *sc_source_str(const sc_code_t code){ return "Morroco"; case SCSRC_MALA: return "Malaysia"; + case SCSRC_MDA : + return "Republic of Moldova"; case SCSRC_MEX : return "Mexico"; case SCSRC_MMR : @@ -275,7 +278,8 @@ const char *sc_source_str(const sc_code_t code){ } } -const char *sc_launch_site_str(const sc_code_t code){ +const char *sc_launch_site_str(const sc_code_t code) +{ switch (code) { case SCSITE_AFETR: return "Air Force Eastern Test Range, Florida, USA"; diff --git a/lib/satcat/satcat_code.h b/lib/satcat/satcat_code.h index f12c95b..89614ee 100644 --- a/lib/satcat/satcat_code.h +++ b/lib/satcat/satcat_code.h @@ -9,18 +9,14 @@ #ifndef SATCAT_CODE_H #define SATCAT_CODE_H -#ifdef __cplusplus -extern "C"{ -#endif - #ifdef _ISOC99_SOURCE #include typedef uint64_t sc_code_t; #else #include -#if (UINT_MAX >= 0xFFFFFFFFFF) +#if (UINT_MAX >= 0xFFFFFFFFFFUL) typedef unsigned sc_code_t; -#elif (ULONG_MAX >= 0xFFFFFFFFFF) +#elif (ULONG_MAX >= 0xFFFFFFFFFFUL) typedef unsigned long sc_code_t; #else typedef unsigned long long sc_code_t; @@ -113,6 +109,7 @@ const char *sc_launch_site_str(sc_code_t code); #define SCSRC_LUXE (sc_code_t)138602370380UL #define SCSRC_MA (sc_code_t)137977938253UL #define SCSRC_MALA (sc_code_t)138534469965UL +#define SCSRC_MDA (sc_code_t)137980101709UL #define SCSRC_MEX (sc_code_t)137981609293UL #define SCSRC_MMR (sc_code_t)137981218125UL #define SCSRC_MNG (sc_code_t)137980497485UL @@ -204,8 +201,4 @@ const char *sc_launch_site_str(sc_code_t code); #define SCSITE_YAVNE (sc_code_t)297667019097UL #define SCSITE_YUN (sc_code_t)137980958041UL -#ifdef __cplusplus -} -#endif - #endif /* SATCAT_CODE_H */ \ No newline at end of file diff --git a/src/util/satcat_code_list.c b/src/util/satcat_code_list.c index 46b52b2..67a6145 100644 --- a/src/util/satcat_code_list.c +++ b/src/util/satcat_code_list.c @@ -93,6 +93,7 @@ const sc_code_t SCSRC[NUM_SCSRC] = { SCSRC_LUXE, SCSRC_MA, SCSRC_MALA, + SCSRC_MDA, SCSRC_MEX, SCSRC_MMR, SCSRC_MNG, diff --git a/src/util/satcat_code_list.h b/src/util/satcat_code_list.h index 10d3c22..5dae8d4 100644 --- a/src/util/satcat_code_list.h +++ b/src/util/satcat_code_list.h @@ -18,7 +18,7 @@ #include "satcat_code.h" #define NUM_SCSTAT 8 -#define NUM_SCSRC 117 +#define NUM_SCSRC 118 #define NUM_SCSITE 34 extern const char SCSTAT[NUM_SCSTAT];