summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2015-02-12 11:19:05 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-02-12 11:19:05 -0800
commite720c82aa1abac491ee48f39a69fe88620115bfc (patch)
tree60bf01530c1417288938ff74633a4ea45abc7dae
parentdcfda29da6d5539c602935f3518749942dad2153 (diff)
downloadsubsurface-e720c82aa1abac491ee48f39a69fe88620115bfc.tar.gz
Some dive site helper functions
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--divesite.c57
-rw-r--r--divesite.h10
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