diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2015-02-12 11:19:05 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-02-12 11:19:05 -0800 |
commit | e720c82aa1abac491ee48f39a69fe88620115bfc (patch) | |
tree | 60bf01530c1417288938ff74633a4ea45abc7dae | |
parent | dcfda29da6d5539c602935f3518749942dad2153 (diff) | |
download | subsurface-e720c82aa1abac491ee48f39a69fe88620115bfc.tar.gz |
Some dive site helper functions
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | divesite.c | 57 | ||||
-rw-r--r-- | divesite.h | 10 |
2 files changed, 64 insertions, 3 deletions
diff --git a/divesite.c b/divesite.c index 1d3bb1c0d..21efaf2e6 100644 --- a/divesite.c +++ b/divesite.c @@ -1,2 +1,59 @@ /* divesite.c */ #include "divesite.h" +#include "dive.h" + +struct dive_site_table dive_site_table; + +/* try to create a uniqe ID - fingers crossed */ +static uint32_t dive_site_getUniqId() +{ + uint32_t id = 0; + + while (id == 0 || get_dive_site_by_uuid(id)) + id = random() + random(); + + return id; +} + +struct dive_site *alloc_dive_site() +{ + int nr = dive_site_table.nr, allocated = dive_site_table.allocated; + struct dive_site **sites = dive_site_table.dive_sites; + + if (nr >= allocated) { + allocated = (nr + 32) * 3 / 2; + sites = realloc(sites, allocated * sizeof(struct dive_site *)); + if (!sites) + exit(1); + dive_site_table.dive_sites = sites; + dive_site_table.allocated = allocated; + } + struct dive_site *ds = calloc(1, sizeof(*ds)); + if (!ds) + exit(1); + sites[nr] = ds; + dive_site_table.nr = nr + 1; + return ds; +} + +/* allocate a new site and add it to the table */ +uint32_t create_dive_site(const char *name, degrees_t latitude, degrees_t longitude) +{ + struct dive_site *ds = alloc_dive_site(); + ds->uuid = dive_site_getUniqId(); + ds->name = copy_string(name); + ds->latitude = latitude; + ds->longitude = longitude; + + return ds->uuid; +} + +/* this either returns the uuid for a site with that name or creates an entry */ +uint32_t dive_site_uuid_by_name(const char *name) +{ + uint32_t id = get_dive_site_uuid_by_name(name); + if (id == 0) + id = create_dive_site(name, (degrees_t){0}, (degrees_t){0}); + + return id; +} diff --git a/divesite.h b/divesite.h index e11a10738..da0a78983 100644 --- a/divesite.h +++ b/divesite.h @@ -36,12 +36,16 @@ static inline struct dive_site *get_dive_site_by_uuid(uint32_t uuid) } /* there could be multiple sites of the same name - return the first one */ -static inline struct dive_site *get_dive_site_by_name(const char *name) +static inline uint32_t get_dive_site_uuid_by_name(const char *name) { for (int i = 0; i < dive_site_table.nr; i++) if (get_dive_site(i)->name == name) - return get_dive_site(i); - return NULL; + return get_dive_site(i)->uuid; + return 0; } +struct dive_site *alloc_dive_site(); +uint32_t create_dive_site(const char *name, degrees_t latitude, degrees_t longitude); +uint32_t dive_site_uuid_by_name(const char *name); + #endif // DIVESITE_H |