Split up dive data structure declarations into 'dive.h'

The dive parser should eventually be just a part of the program, not the
whole thing. So start preparing for that.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2011-08-30 18:23:59 -07:00
parent 17fcb3d32d
commit f3a338a9af
3 changed files with 119 additions and 113 deletions

View file

@ -1,5 +1,5 @@
CC=gcc
CFLAGS=-Wall -Wno-pointer-sign -g
parse: parse.c
parse: parse.c dive.h
$(CC) $(CFLAGS) -o parse `xml2-config --cflags` parse.c `xml2-config --libs`

114
dive.h Normal file
View file

@ -0,0 +1,114 @@
#ifndef DIVE_H
#define DIVE_H
/*
* Some silly typedefs to make our units very explicit.
*
* Also, the units are chosen so that values can be expressible as
* integers, so that we never have FP rounding issues. And they
* are small enough that converting to/from imperial units doesn't
* really matter.
*
* We also strive to make '0' a meaningless number saying "not
* initialized", since many values are things that may not have
* been reported (eg tank pressure or temperature from dive
* computers that don't support them). But sometimes -1 is an even
* more explicit way of saying "not there".
*
* Thus "millibar" for pressure, for example, or "millikelvin" for
* temperatures. Doing temperatures in celsius or fahrenheit would
* make for loss of precision when converting from one to the other,
* and using millikelvin is SI-like but also means that a temperature
* of '0' is clearly just a missing temperature or tank pressure.
*
* Also strive to use units that can not possibly be mistaken for a
* valid value in a "normal" system without conversion. If the max
* depth of a dive is '20000', you probably didn't convert from mm on
* output, or if the max depth gets reported as "0.2ft" it was either
* a really boring dive, or there was some missing input conversion,
* and a 60-ft dive got recorded as 60mm.
*
* Doing these as "structs containing value" means that we always
* have to explicitly write out those units in order to get at the
* actual value. So there is hopefully little fear of using a value
* in millikelvin as Fahrenheit by mistake.
*
* We don't actually use these all yet, so maybe they'll change, but
* I made a number of types as guidelines.
*/
typedef struct {
int seconds;
} duration_t;
typedef struct {
int mm;
} depth_t;
typedef struct {
int mbar;
} pressure_t;
typedef struct {
int mkelvin;
} temperature_t;
typedef struct {
int mliter;
} volume_t;
typedef struct {
int permille;
} fraction_t;
typedef struct {
int grams;
} weight_t;
typedef struct {
fraction_t o2;
fraction_t n2;
fraction_t he2;
} gasmix_t;
typedef struct {
volume_t size;
pressure_t pressure;
} tank_type_t;
static inline int to_feet(depth_t depth)
{
return depth.mm * 0.00328084 + 0.5;
}
static inline int to_C(temperature_t temp)
{
if (!temp.mkelvin)
return 0;
return (temp.mkelvin - 273150) / 1000;
}
static inline int to_PSI(pressure_t pressure)
{
return pressure.mbar * 0.0145037738 + 0.5;
}
struct sample {
duration_t time;
depth_t depth;
temperature_t temperature;
pressure_t tankpressure;
int tankindex;
};
struct dive {
time_t when;
depth_t maxdepth, meandepth;
duration_t duration, surfacetime;
depth_t visibility;
temperature_t airtemp, watertemp;
pressure_t beginning_pressure, end_pressure;
int samples;
struct sample sample[];
};
#endif /* DIVE_H */

116
parse.c
View file

@ -7,118 +7,10 @@
#include <libxml/parser.h>
#include <libxml/tree.h>
#include "dive.h"
static int verbose;
/*
* Some silly typedefs to make our units very explicit.
*
* Also, the units are chosen so that values can be expressible as
* integers, so that we never have FP rounding issues. And they
* are small enough that converting to/from imperial units doesn't
* really matter.
*
* We also strive to make '0' a meaningless number saying "not
* initialized", since many values are things that may not have
* been reported (eg tank pressure or temperature from dive
* computers that don't support them). But sometimes -1 is an even
* more explicit way of saying "not there".
*
* Thus "millibar" for pressure, for example, or "millikelvin" for
* temperatures. Doing temperatures in celsius or fahrenheit would
* make for loss of precision when converting from one to the other,
* and using millikelvin is SI-like but also means that a temperature
* of '0' is clearly just a missing temperature or tank pressure.
*
* Also strive to use units that can not possibly be mistaken for a
* valid value in a "normal" system without conversion. If the max
* depth of a dive is '20000', you probably didn't convert from mm on
* output, or if the max depth gets reported as "0.2ft" it was either
* a really boring dive, or there was some missing input conversion,
* and a 60-ft dive got recorded as 60mm.
*
* Doing these as "structs containing value" means that we always
* have to explicitly write out those units in order to get at the
* actual value. So there is hopefully little fear of using a value
* in millikelvin as Fahrenheit by mistake.
*
* We don't actually use these all yet, so maybe they'll change, but
* I made a number of types as guidelines.
*/
typedef struct {
int seconds;
} duration_t;
typedef struct {
int mm;
} depth_t;
typedef struct {
int mbar;
} pressure_t;
typedef struct {
int mkelvin;
} temperature_t;
typedef struct {
int mliter;
} volume_t;
typedef struct {
int permille;
} fraction_t;
typedef struct {
int grams;
} weight_t;
typedef struct {
fraction_t o2;
fraction_t n2;
fraction_t he2;
} gasmix_t;
typedef struct {
volume_t size;
pressure_t pressure;
} tank_type_t;
static int to_feet(depth_t depth)
{
return depth.mm * 0.00328084 + 0.5;
}
static int to_C(temperature_t temp)
{
if (!temp.mkelvin)
return 0;
return (temp.mkelvin - 273150) / 1000;
}
static int to_PSI(pressure_t pressure)
{
return pressure.mbar * 0.0145037738 + 0.5;
}
struct sample {
duration_t time;
depth_t depth;
temperature_t temperature;
pressure_t tankpressure;
int tankindex;
};
struct dive {
time_t when;
depth_t maxdepth, meandepth;
duration_t duration, surfacetime;
depth_t visibility;
temperature_t airtemp, watertemp;
pressure_t beginning_pressure, end_pressure;
int samples;
struct sample sample[];
};
static struct dive **dive_table;
static int nr_dives, nr_allocated;
@ -686,7 +578,7 @@ static void traverse(xmlNode *node)
}
}
static void parse(const char *filename)
static void parse_xml_file(const char *filename)
{
xmlDoc *doc;
@ -732,7 +624,7 @@ int main(int argc, char **argv)
parse_argument(a);
continue;
}
parse(a);
parse_xml_file(a);
}
report_dives();
return 0;