diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2009-08-28 08:31:46 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2009-08-28 08:31:46 +0000 |
commit | e6f35e2ca71af4c46ad6e232d711e8dc07c5bb03 (patch) | |
tree | 3b8068c701d313efdc0a13d3192ed626e256e8dc /gpsdecode.c | |
parent | 7d6ca7d03b94f4ab37812d08f2d68b2c1f8f52fa (diff) | |
download | gpsd-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.c | 60 |
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); |