mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Parse multiple dives from single DL7 log file
Signed-off-by: Miika Turkia <miika.turkia@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
05098f90cd
commit
66d9cc788c
1 changed files with 99 additions and 60 deletions
159
core/file.c
159
core/file.c
|
@ -894,6 +894,104 @@ int parse_txt_file(const char *filename, const char *csv)
|
||||||
#define DATESTR 9
|
#define DATESTR 9
|
||||||
#define TIMESTR 6
|
#define TIMESTR 6
|
||||||
|
|
||||||
|
int parse_dan_format(const char *filename, char **params, int pnr)
|
||||||
|
{
|
||||||
|
int ret = 0, i, end_ptr = 0;
|
||||||
|
struct memblock mem, mem_csv;
|
||||||
|
time_t now;
|
||||||
|
struct tm *timep = NULL;
|
||||||
|
char tmpbuf[MAXCOLDIGITS];
|
||||||
|
|
||||||
|
char *ptr = NULL;
|
||||||
|
char *NL = NULL;
|
||||||
|
char *iter = NULL;
|
||||||
|
|
||||||
|
if (readfile(filename, &mem) < 0)
|
||||||
|
return report_error(translate("gettextFromC", "Failed to read '%s'"), filename);
|
||||||
|
|
||||||
|
/* Determine NL (new line) character and the start of CSV data */
|
||||||
|
if ((ptr = strstr(mem.buffer, "\r\n")) != NULL) {
|
||||||
|
NL = "\r\n";
|
||||||
|
} else if ((ptr = strstr(mem.buffer, "\n")) != NULL) {
|
||||||
|
NL = "\n";
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "DEBUG: failed to detect NL\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int j = 0;
|
||||||
|
|
||||||
|
while ((end_ptr < mem.size) && (ptr = strstr(mem.buffer + end_ptr, "ZDH"))) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process the dives, but let the last round be parsed
|
||||||
|
* from C++ code
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (end_ptr)
|
||||||
|
process_dives(true, false);
|
||||||
|
|
||||||
|
mem_csv.buffer = malloc(mem.size + 1);
|
||||||
|
mem_csv.size = mem.size;
|
||||||
|
|
||||||
|
//fprintf(stderr, "DEBUG: BEGIN end_ptr %d round %d <%s>\n", end_ptr, j++, ptr);
|
||||||
|
iter = ptr + 1;
|
||||||
|
for (i = 0; i <= 4 && iter; ++i) {
|
||||||
|
iter = strchr(iter, '|');
|
||||||
|
if (iter)
|
||||||
|
++iter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setting date */
|
||||||
|
memcpy(tmpbuf, iter, 8);
|
||||||
|
tmpbuf[8] = 0;
|
||||||
|
params[pnr] = "date";
|
||||||
|
params[pnr + 1] = strdup(tmpbuf);
|
||||||
|
|
||||||
|
/* Setting time, gotta prepend it with 1 to
|
||||||
|
* avoid octal parsing (this is stripped out in
|
||||||
|
* XSLT */
|
||||||
|
tmpbuf[0] = '1';
|
||||||
|
memcpy(tmpbuf + 1, iter + 8, 6);
|
||||||
|
tmpbuf[7] = 0;
|
||||||
|
params[pnr + 2] = "time";
|
||||||
|
params[pnr + 3] = strdup(tmpbuf);
|
||||||
|
params[pnr + 4] = NULL;
|
||||||
|
|
||||||
|
ptr = strstr(ptr, "ZDP{");
|
||||||
|
if (ptr)
|
||||||
|
ptr = strstr(ptr, NL);
|
||||||
|
if (ptr)
|
||||||
|
ptr += strlen(NL);
|
||||||
|
|
||||||
|
end_ptr = ptr - (char *)mem.buffer;
|
||||||
|
|
||||||
|
/* Copy the current dive data to start of mem_csv buffer */
|
||||||
|
memcpy(mem_csv.buffer, ptr, mem.size - (ptr - (char *)mem.buffer));
|
||||||
|
ptr = strstr(mem_csv.buffer, "ZDP}");
|
||||||
|
if (ptr) {
|
||||||
|
*ptr = 0;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "DEBUG: failed to find end ZDP\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
mem_csv.size = ptr - (char*)mem_csv.buffer;
|
||||||
|
|
||||||
|
if (try_to_xslt_open_csv(filename, &mem_csv, "csv"))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
ret |= parse_xml_buffer(filename, mem_csv.buffer, mem_csv.size, &dive_table, (const char **)params);
|
||||||
|
end_ptr += ptr - (char *)mem_csv.buffer;
|
||||||
|
free(mem_csv.buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(mem.buffer);
|
||||||
|
for (i = 0; params[i]; i += 2)
|
||||||
|
free(params[i + 1]);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int parse_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate)
|
int parse_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate)
|
||||||
{
|
{
|
||||||
int ret, i;
|
int ret, i;
|
||||||
|
@ -914,66 +1012,7 @@ int parse_csv_file(const char *filename, char **params, int pnr, const char *csv
|
||||||
|
|
||||||
mem.size = 0;
|
mem.size = 0;
|
||||||
if (!strcmp("DL7", csvtemplate)) {
|
if (!strcmp("DL7", csvtemplate)) {
|
||||||
char *ptr = NULL;
|
return parse_dan_format(filename, params, pnr);
|
||||||
char *NL = NULL;
|
|
||||||
char *iter = NULL;
|
|
||||||
|
|
||||||
csvtemplate = "csv";
|
|
||||||
if (readfile(filename, &mem) < 0)
|
|
||||||
return report_error(translate("gettextFromC", "Failed to read '%s'"), filename);
|
|
||||||
|
|
||||||
/* Determine NL (new line) character and the start of CSV data */
|
|
||||||
if ((ptr = strstr(mem.buffer, "\r\n")) != NULL) {
|
|
||||||
NL = "\r\n";
|
|
||||||
} else if ((ptr = strstr(mem.buffer, "\n")) != NULL) {
|
|
||||||
NL = "\n";
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "DEBUG: failed to detect NL\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = strstr(mem.buffer, "ZDH");
|
|
||||||
if (ptr) {
|
|
||||||
iter = ptr + 1;
|
|
||||||
for (i = 0; i <= 4 && iter; ++i) {
|
|
||||||
iter = strchr(iter, '|');
|
|
||||||
if (iter)
|
|
||||||
++iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setting date */
|
|
||||||
memcpy(tmpbuf, iter, 8);
|
|
||||||
tmpbuf[8] = 0;
|
|
||||||
params[pnr++] = "date";
|
|
||||||
params[pnr++] = strdup(tmpbuf);
|
|
||||||
|
|
||||||
/* Setting time, gotta prepend it with 1 to
|
|
||||||
* avoid octal parsing (this is stripped out in
|
|
||||||
* XSLT */
|
|
||||||
tmpbuf[0] = '1';
|
|
||||||
memcpy(tmpbuf + 1, iter + 8, 6);
|
|
||||||
tmpbuf[7] = 0;
|
|
||||||
params[pnr++] = "time";
|
|
||||||
params[pnr++] = strdup(tmpbuf);
|
|
||||||
params[pnr++] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = strstr(mem.buffer, "ZDP");
|
|
||||||
if (ptr)
|
|
||||||
ptr = strstr(ptr, NL);
|
|
||||||
if (ptr)
|
|
||||||
ptr += strlen(NL);
|
|
||||||
|
|
||||||
/* Move the CSV data to the start of mem buffer */
|
|
||||||
memmove(mem.buffer, ptr, mem.size - (ptr - (char*)mem.buffer));
|
|
||||||
ptr = strstr(mem.buffer, "ZDP");
|
|
||||||
if (ptr) {
|
|
||||||
*ptr = 0;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "DEBUG: failed to find end ZDP\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
mem.size = ptr - (char*)mem.buffer;
|
|
||||||
} else if (strcmp(params[0], "date")) {
|
} else if (strcmp(params[0], "date")) {
|
||||||
time(&now);
|
time(&now);
|
||||||
timep = localtime(&now);
|
timep = localtime(&now);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue