/* $Id$ */ /* * Copyright (c) 2004 Dimitri Sokolyuk * * 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; }