summaryrefslogtreecommitdiff
path: root/gpsdecode.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2009-08-28 08:31:46 +0000
committerEric S. Raymond <esr@thyrsus.com>2009-08-28 08:31:46 +0000
commite6f35e2ca71af4c46ad6e232d711e8dc07c5bb03 (patch)
tree3b8068c701d313efdc0a13d3192ed626e256e8dc /gpsdecode.c
parent7d6ca7d03b94f4ab37812d08f2d68b2c1f8f52fa (diff)
downloadgpsd-e6f35e2ca71af4c46ad6e232d711e8dc07c5bb03.tar.gz
Passthrough check of RTCM2 JSON decoding works for message types 1 and 9.
Diffstat (limited to 'gpsdecode.c')
-rw-r--r--gpsdecode.c60
1 files changed, 27 insertions, 33 deletions
diff --git a/gpsdecode.c b/gpsdecode.c
index da9e6231..762017f0 100644
--- a/gpsdecode.c
+++ b/gpsdecode.c
@@ -42,7 +42,7 @@ void gpsd_report(int errlevel, const char *fmt, ... )
/*@ -compdestroy -compdef -usedef @*/
static void decode(FILE *fpin, FILE *fpout)
-/* RTCM-104 bits on fpin to dump format on fpout */
+/* RTCM or AIS packets on fpin to dump format on fpout */
{
struct gps_packet_t lexer;
struct rtcm2_t rtcm2;
@@ -82,33 +82,41 @@ static void decode(FILE *fpin, FILE *fpout)
/*@ +compdestroy +compdef +usedef @*/
/*@ -compdestroy @*/
-static void encode(FILE *fpin, FILE *fpout)
+static void encode(FILE *fpin, bool repack, FILE *fpout)
/* dump format on fpin to RTCM-104 on fpout */
{
- char buf[BUFSIZ];
+ char inbuf[BUFSIZ];
struct gps_data_t gpsdata;
- struct gps_packet_t lexer;
int lineno = 0;
- memset(&lexer, 0, sizeof(lexer));
- while (fgets(buf, (int)sizeof(buf), fpin) != NULL) {
+ memset(&gpsdata, '\0', sizeof(gpsdata)); /* avoid segfault due to garbage in thread-hook slots */
+ while (fgets(inbuf, (int)sizeof(inbuf), fpin) != NULL) {
int status;
++lineno;
- if (buf[0] == '#')
+ if (inbuf[0] == '#')
continue;
- status = gps_unpack(buf, &gpsdata);
- if (status == 0 && (gpsdata.set & RTCM2_SET) != 0) {
- (void)memset(lexer.isgps.buf, 0, sizeof(lexer.isgps.buf));
- (void)rtcm2_repack(&gpsdata.rtcm2, lexer.isgps.buf);
- if (fwrite(lexer.isgps.buf,
- sizeof(isgps30bits_t),
- (size_t)gpsdata.rtcm2.length, fpout) != (size_t)gpsdata.rtcm2.length)
- (void) fprintf(stderr, "gpsdecode: report write failed.\n");
- memset(&lexer, 0, sizeof(lexer));
- } else if (status < 0) {
+ status = gps_unpack(inbuf, &gpsdata);
+ if (status < 0) {
(void) fprintf(stderr, "gpsdecode: bailing out with status %d on line %d\n", status, lineno);
exit(1);
+ } if ((gpsdata.set & RTCM2_SET) != 0) {
+ if (repack) {
+ // FIXME: This code is presently broken
+ struct gps_packet_t lexer;
+ (void)memset(lexer.isgps.buf, 0, sizeof(lexer.isgps.buf));
+ (void)rtcm2_repack(&gpsdata.rtcm2, lexer.isgps.buf);
+ if (fwrite(lexer.isgps.buf,
+ sizeof(isgps30bits_t),
+ (size_t)gpsdata.rtcm2.length, fpout) != (size_t)gpsdata.rtcm2.length)
+ (void) fprintf(stderr, "gpsdecode: report write failed.\n");
+ memset(&lexer, 0, sizeof(lexer));
+ } else {
+ /* this works */
+ char outbuf[BUFSIZ];
+ rtcm2_json_dump(&gpsdata.rtcm2, outbuf, sizeof(outbuf));
+ (void)fputs(outbuf, fpout);
+ }
}
}
}
@@ -116,12 +124,10 @@ static void encode(FILE *fpin, FILE *fpout)
int main(int argc, char **argv)
{
- char buf[BUFSIZ];
int c;
- bool striphdr = false;
enum {doencode, dodecode} mode = dodecode;
- while ((c = getopt(argc, argv, "dhejuVD:")) != EOF) {
+ while ((c = getopt(argc, argv, "dejpuVD:")) != EOF) {
switch (c) {
case 'd':
mode = dodecode;
@@ -131,10 +137,6 @@ int main(int argc, char **argv)
mode = doencode;
break;
- case 'h':
- striphdr = true;
- break;
-
case 'j':
json = true;
break;
@@ -161,16 +163,8 @@ int main(int argc, char **argv)
argc -= optind;
argv += optind;
- /* strip lines with leading # */
- if (striphdr) {
- while ((c = getchar()) == '#')
- if (fgets(buf, (int)sizeof(buf), stdin) == NULL)
- (void)fputs("gpsdecode: read failed\n", stderr);
- (void)ungetc(c, stdin);
- }
-
if (mode == doencode)
- encode(stdin, stdout);
+ encode(stdin, !json, stdout);
else
decode(stdin, stdout);
exit(0);