aboutsummaryrefslogtreecommitdiff
path: root/tgeb/tarife.c
diff options
context:
space:
mode:
Diffstat (limited to 'tgeb/tarife.c')
-rw-r--r--tgeb/tarife.c91
1 files changed, 62 insertions, 29 deletions
diff --git a/tgeb/tarife.c b/tgeb/tarife.c
index f73a7b5..79b9ae9 100644
--- a/tgeb/tarife.c
+++ b/tgeb/tarife.c
@@ -18,25 +18,28 @@
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
+#include <string.h>
#include "tgebdat.h"
-static void rhdr_ta(struct ta *, FILE *); /* read header */
-static void ridx_ta(struct ta *, FILE *); /* read index */
-static void rdat_ta(struct ta *, FILE *); /* read data */
-static void rdat2_ta(struct ta_d *, FILE *); /* read chain */
-static void maxtoq(struct au *, struct ta *);
+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 *);
-struct ta *
-tgeb_read_ta(char *file, struct au * au)
+TA *
+tgeb_read_ta(char *file, AU * au)
{
- struct ta *ta;
+ TA *ta;
FILE *fd;
if (!(fd = fopen(file, "r")))
err(1, "fopen %s", file);
- if (!(ta = (struct ta *) malloc(sizeof(struct ta))))
+ if (!(ta = malloc(sizeof(TA))))
err(1, "malloc");
+ bzero(ta, sizeof(TA));
maxtoq(au, ta);
rhdr_ta(ta, fd);
@@ -48,12 +51,12 @@ tgeb_read_ta(char *file, struct au * au)
}
void
-rhdr_ta(struct ta * ta, FILE * fd)
+rhdr_ta(TA * ta, FILE * fd)
{
int i;
fread(&ta->q, sizeof(ta->q), 1, fd);
- if (!(ta->h = (struct ta_hdr *) calloc(ta->q, sizeof(struct ta_hdr))))
+ if (!(ta->h = calloc(ta->q, sizeof(TA_HDR))))
err(1, "malloc");
fseek(fd, 2, SEEK_SET);
@@ -67,14 +70,13 @@ rhdr_ta(struct ta * ta, FILE * fd)
}
void
-ridx_ta(struct ta * ta, FILE * fd)
+ridx_ta(TA * ta, FILE * fd)
{
int i, j;
for (i = 0; i < ta->q; i++) {
/* read inland offsets */
- if (!(ta->h[i].in = (struct ta_idx *)
- calloc(Q_IN, sizeof(struct ta_idx))))
+ 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++) {
@@ -84,8 +86,7 @@ ridx_ta(struct ta * ta, FILE * fd)
ta->h[i].in[j].off--;
}
/* read ausland offsets */
- if (!(ta->h[i].aus = (struct ta_idx *)
- calloc(ta->q_aus[i], sizeof(struct ta_idx))))
+ 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++) {
@@ -99,7 +100,7 @@ ridx_ta(struct ta * ta, FILE * fd)
}
void
-rdat_ta(struct ta * ta, FILE * fd)
+rdat_ta(TA * ta, FILE * fd)
{
int i, j;
@@ -109,10 +110,10 @@ rdat_ta(struct ta * ta, FILE * fd)
if (ta->h[i].in[j].off) {
fseek(fd, ta->h[i].in[j].off, SEEK_SET);
- if (!(ta->h[i].in[j].data = (struct ta_d *)
- malloc(sizeof(struct ta_d))))
+ if (!(ta->h[i].in[j].data = malloc(sizeof(TA_D))))
err(1, "malloc");
- rdat2_ta(ta->h[i].in[j].data, fd);
+ bzero(ta->h[i].in[j].data, sizeof(TA_D));
+ rdat_ta2(ta->h[i].in[j].data, fd);
}
}
/* read ausland data */
@@ -120,10 +121,10 @@ rdat_ta(struct ta * ta, FILE * fd)
if (ta->h[i].aus[j].off) {
fseek(fd, ta->h[i].aus[j].off, SEEK_SET);
- if (!(ta->h[i].aus[j].data = (struct ta_d *)
- malloc(sizeof(struct ta_d))))
+ if (!(ta->h[i].aus[j].data = malloc(sizeof(TA_D))))
err(1, "malloc");
- rdat2_ta(ta->h[i].aus[j].data, fd);
+ bzero(ta->h[i].aus[j].data, sizeof(TA_D));
+ rdat_ta2(ta->h[i].aus[j].data, fd);
}
}
}
@@ -131,7 +132,7 @@ rdat_ta(struct ta * ta, FILE * fd)
}
void
-rdat2_ta(struct ta_d * data, FILE * fd)
+rdat_ta2(TA_D * data, FILE * fd)
{
fread(&data->time, sizeof(data->time), 1, fd);
fread(&data->dfee, sizeof(data->dfee), 1, fd);
@@ -139,23 +140,55 @@ rdat2_ta(struct ta_d * data, FILE * 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(struct ta_d))))
+ if (!(data->next = malloc(sizeof(TA_D))))
err(1, "malloc");
+ bzero(data->next, sizeof(TA_D));
data->next->prev = data;
- rdat2_ta(data->next, fd);
+ rdat_ta2(data->next, fd);
}
return;
}
void
-maxtoq(struct au * au, struct ta * ta)
+maxtoq(AU * au, TA * ta)
{
int i;
- if (!(ta->q_aus = (unsigned short *)
- calloc(au->q, sizeof(unsigned short))))
+ 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;
+}