From f69cd8c998e4e2fbf28ebb57ae84aced21e80fca Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 27 Mar 2004 05:38:27 +0000 Subject: move to lib --- lib/tarife.c | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 lib/tarife.c (limited to 'lib/tarife.c') 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 + * + * 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 +#include +#include +#include +#include + +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; +} -- cgit v1.2.3