summaryrefslogtreecommitdiffstats
path: root/uemis.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-10-03 12:13:54 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-10-03 12:13:54 -0700
commit1531a37dd0b74fcb06ca06fd2f225d4a2d228a87 (patch)
tree87edc576053e177afb4a3bcddee4876cea0ece47 /uemis.c
parenta32d28d5e388ab3e31eadcd329814488fa5e8b1b (diff)
parentc15f798a85db53dae404a9113266a4d2bc72fbc6 (diff)
downloadsubsurface-1531a37dd0b74fcb06ca06fd2f225d4a2d228a87.tar.gz
Merge branch 'uemis-integration' of git://github.com/dirkhh/subsurface
* 'uemis-integration' of git://github.com/dirkhh/subsurface: Remove the ability to 'Import' .SDA files Integrate loading of uemis SDA files into the regular xml parsing First steps towards integrating SDA files into the default XML loading
Diffstat (limited to 'uemis.c')
-rw-r--r--uemis.c116
1 files changed, 2 insertions, 114 deletions
diff --git a/uemis.c b/uemis.c
index 76bd1669b..46878e22a 100644
--- a/uemis.c
+++ b/uemis.c
@@ -73,64 +73,6 @@ static void decode( uint8_t *inbuf, uint8_t *outbuf, int inbuf_len ) {
}
/* end code from Bob Trower */
-/* small helper functions */
-/* simpleregex allocates (and reallocates) the found buffer
- * don't forget to free it when you are done
- */
-static int simpleregex(char *buffer, char *regex, char **found) {
- int status;
- regex_t re;
- regmatch_t match[5];
-
- if (regcomp(&re, regex, 0) !=0) {
- fprintf(stderr,"internal error, regex failed!\n");
- exit(1);
- }
- status = regexec(&re,buffer,5,match,0);
- if(status == 0) {
- *found = realloc(*found,match[1].rm_eo-match[1].rm_so + 1);
- strncpy(*found,buffer+match[1].rm_so,match[1].rm_eo-match[1].rm_so);
- (*found)[match[1].rm_eo-match[1].rm_so] = '\0';
- }
- return(status == 0);
-}
-
-/* read in line of arbitrary length (important for SDA files that can
- * have lines that are tens of kB long
- * don't forget to free it when you are done
- */
-#define MYGETL_INCR 1024
-static char * mygetline(FILE * f) {
- size_t size = 0;
- size_t len = 0;
- char * buf = NULL;
-
- do {
- size += MYGETL_INCR;
- if ((buf = realloc(buf,size)) == NULL)
- break;
- fgets(buf+len,MYGETL_INCR,f);
- len = strlen(buf);
- } while (!feof(f) && buf[len-1]!='\n');
- return buf;
-}
-
-/* text matching, used to build very poor man's XML parser */
-int matchit(FILE *infd, char *regex, char *typeregex, char **found) {
- char *buffer;
-
- while (!feof(infd)) {
- buffer = mygetline(infd);
- if (buffer && simpleregex(buffer,regex,found)) {
- buffer = mygetline(infd);
- if (buffer && simpleregex(buffer,typeregex,found)) {
- return 1;
- }
- }
- }
- return 0;
-}
-
/*
* pressure_to_depth: In centibar. And when converting to
* depth, I'm just going to always use saltwater, because I
@@ -180,11 +122,12 @@ bail:
/*
* parse uemis base64 data blob into struct dive
*/
-static void parse_divelog_binary(char *base64, struct dive **divep) {
+void uemis_parse_divelog_binary(char *base64, void *datap) {
int datalen;
int i;
uint8_t *data;
struct sample *sample;
+ struct dive **divep = datap;
struct dive *dive = *divep;
int template, gasoffset;
@@ -237,58 +180,3 @@ static void parse_divelog_binary(char *base64, struct dive **divep) {
dive->duration.seconds = sample->time.seconds - 1;
return;
}
-
-/* parse a single file
- * TODO: we don't report any errors when the parse fails - we simply don't add them to the list
- */
-void
-parse_uemis_file(char *divelogfilename) {
- char *found=NULL;
- struct tm tm;
- struct dive *dive;
-
- FILE *divelogfile = fopen(divelogfilename,"r");
-
- dive = alloc_dive();
-
- if (! matchit(divelogfile,"val key=\"date\"","<ts>\\([^<]*\\)</ts>",&found)) {
- /* some error handling */
- goto bail;
- }
- strptime(found, "%Y-%m-%dT%H:%M:%S", &tm);
- dive->when = utc_mktime(&tm);
- if (! matchit(divelogfile,"<val key=\"duration\">",
- "<float>\\([0-9.]*\\)</float>", &found)) {
- /* some error handling */
- goto bail;
- }
- dive->duration.seconds = 60.0 * atof(found);
-
- if (! matchit(divelogfile,"<val key=\"depth\">",
- "<int>\\([0-9.]*\\)</int>", &found)) {
- /* some error handling */
- goto bail;
- }
- dive->maxdepth.mm = pressure_to_depth(atoi(found));
-
- if (! matchit(divelogfile,"<val key=\"file_content\">",
- ">\\([a-zA-Z0-9+/=]*\\)<", &found)) {
- /* some error handling */
- goto bail;
- }
- parse_divelog_binary(found,&dive);
- record_dive(dive);
-bail:
- if (found)
- free(found);
-}
-
-/*
- * parse the two files extracted from the SDA
- */
-void
-uemis_import() {
- if (open_import_file_dialog("*.SDA","uemis Zurich SDA files",
- &parse_uemis_file))
- report_dives();
-}