aboutsummaryrefslogtreecommitdiff
path: root/lib/tarife.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tarife.c')
-rw-r--r--lib/tarife.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/lib/tarife.c b/lib/tarife.c
new file mode 100644
index 0000000..1c09efa
--- /dev/null
+++ b/lib/tarife.c
@@ -0,0 +1,194 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2004 demon <demon@vhost.dyndns.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <err.h>
+#include <string.h>
+#include <tgeb.h>
+
+static void rhdr_ta(TA *, FILE *); /* read header */
+static void ridx_ta(TA *, FILE *); /* read index */
+static void rdat_ta(TA *, FILE *); /* read data */
+static void rdat_ta2(TA_D *, FILE *); /* read chain */
+static void maxtoq(AU *, TA *);
+static void free_ta2(TA_D *);
+
+TA *
+tgeb_read_ta(char *file, AU * au)
+{
+ TA *ta;
+ FILE *fd;
+
+ if (!(fd = fopen(file, "r")))
+ err(1, "fopen %s", file);
+
+ if (!(ta = malloc(sizeof(TA))))
+ err(1, "malloc");
+ bzero(ta, sizeof(TA));
+
+ maxtoq(au, ta);
+ rhdr_ta(ta, fd);
+ ridx_ta(ta, fd);
+ rdat_ta(ta, fd);
+
+ fclose(fd);
+ return ta;
+}
+
+void
+rhdr_ta(TA * ta, FILE * fd)
+{
+ int i;
+
+ fread(&ta->q, sizeof(ta->q), 1, fd);
+ if (!(ta->h = calloc(ta->q, sizeof(TA_HDR))))
+ err(1, "malloc");
+
+ fseek(fd, 2, SEEK_SET);
+ for (i = 0; i < ta->q; i++) {
+ fread(&ta->h[i].off_in, sizeof(ta->h[i].off_in), 1, fd);
+ ta->h[i].off_in ? ta->h[i].off_in-- : ta->h[i].off_in;
+ fread(&ta->h[i].off_aus, sizeof(ta->h[i].off_aus), 1, fd);
+ ta->h[i].off_aus ? ta->h[i].off_aus-- : ta->h[i].off_aus;
+ }
+ return;
+}
+
+void
+ridx_ta(TA * ta, FILE * fd)
+{
+ int i, j;
+
+ for (i = 0; i < ta->q; i++) {
+ /* read inland offsets */
+ if (!(ta->h[i].in = calloc(Q_IN, sizeof(TA_IDX))))
+ err(1, "malloc");
+ fseek(fd, ta->h[i].off_in, SEEK_SET);
+ for (j = 0; j < Q_IN; j++) {
+ fread(&ta->h[i].in[j].off,
+ sizeof(ta->h[i].in[j].off), 1, fd);
+ if (ta->h[i].in[j].off)
+ ta->h[i].in[j].off--;
+ }
+ /* read ausland offsets */
+ if (!(ta->h[i].aus = calloc(ta->q_aus[i], sizeof(TA_IDX))))
+ err(1, "malloc");
+ fseek(fd, ta->h[i].off_aus, SEEK_SET);
+ for (j = 0; j < ta->q_aus[i]; j++) {
+ fread(&ta->h[i].aus[j].off,
+ sizeof(ta->h[i].aus[j].off), 1, fd);
+ if (ta->h[i].aus[j].off)
+ ta->h[i].aus[j].off--;
+ }
+ }
+ return;
+}
+
+void
+rdat_ta(TA * ta, FILE * fd)
+{
+ int i, j;
+
+ for (i = 0; i < ta->q; i++) {
+ /* read inland data */
+ for (j = 0; j < Q_IN; j++) {
+ if (ta->h[i].in[j].off) {
+ fseek(fd, ta->h[i].in[j].off, SEEK_SET);
+
+ if (!(ta->h[i].in[j].data = malloc(sizeof(TA_D))))
+ err(1, "malloc");
+ bzero(ta->h[i].in[j].data, sizeof(TA_D));
+ rdat_ta2(ta->h[i].in[j].data, fd);
+ }
+ }
+ /* read ausland data */
+ for (j = 0; j < ta->q_aus[i]; j++) {
+ if (ta->h[i].aus[j].off) {
+ fseek(fd, ta->h[i].aus[j].off, SEEK_SET);
+
+ if (!(ta->h[i].aus[j].data = malloc(sizeof(TA_D))))
+ err(1, "malloc");
+ bzero(ta->h[i].aus[j].data, sizeof(TA_D));
+ rdat_ta2(ta->h[i].aus[j].data, fd);
+ }
+ }
+ }
+ return;
+}
+
+void
+rdat_ta2(TA_D * data, FILE * fd)
+{
+ fread(&data->time, sizeof(data->time), 1, fd);
+ fread(&data->dfee, sizeof(data->dfee), 1, fd);
+ fread(&data->fee, sizeof(data->fee), 1, fd);
+ fread(&data->t1, sizeof(data->t1), 1, fd);
+ fread(&data->t2, sizeof(data->t2), 1, fd);
+ if (data->time != 24) {
+ if (!(data->next = malloc(sizeof(TA_D))))
+ err(1, "malloc");
+ bzero(data->next, sizeof(TA_D));
+ data->next->prev = data;
+ rdat_ta2(data->next, fd);
+ }
+ return;
+}
+
+void
+maxtoq(AU * au, TA * ta)
+{
+ int i;
+
+ if (!(ta->q_aus = calloc(au->q, sizeof(unsigned short))))
+ err(1, "malloc");
+ for (i = 0; i < au->q; i++)
+ ta->q_aus[i] = au->max[i] * 2;
+ return;
+}
+
+void
+tgeb_free_ta(TA * ta)
+{
+ int i, j;
+
+ for (i = 0; i < ta->q; i++) {
+ for (j = 0; j < Q_IN; j++) {
+ free_ta2(ta->h[i].in[j].data);
+ }
+ free(ta->h[i].in);
+ for (j = 0; j < ta->q_aus[i]; j++) {
+ free_ta2(ta->h[i].aus[j].data);
+ }
+ free(ta->h[i].aus);
+ }
+ free(ta->q_aus);
+ free(ta->h);
+ free(ta);
+ return;
+}
+
+void
+free_ta2(TA_D * data)
+{
+ if (data) {
+ if (data->next)
+ free_ta2(data->next);
+ free(data);
+ }
+ return;
+}