Files
ShenyangSubway/demo
2025-11-29 20:12:10 +08:00

265 lines
9.2 KiB
Plaintext

/* ------------------------------------------------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>
/* ------------------------------------------------------------------------------------------ */
#define FAILED 1
#define SUCCEED 0
/* ------------------------------------------------------------------------------------------ */
#define LOCATION_NUM 460
struct location {
__uint16_t width;
__uint16_t height;
};
struct location_table {
__uint16_t location_num;
struct location *location_table;
};
#define STATION_NAME_NUM 124
struct station_name_table {
__uint8_t station_name_num;
__uint8_t **station_name_table;
};
#define LINE_NUM 6
struct station_id {
__uint16_t line_id: 3;
__uint16_t station_id: 6;
__uint16_t head_station_tag: 1;
__uint16_t tail_station_tag: 1;
__uint16_t transfer_station_tag: 1;
__uint16_t transfer_station_id: 4;
};
struct station {
struct station_id station_id;
__uint8_t station_name_id;
__uint32_t location_id;
};
struct station_table {
__uint8_t station_num;
struct station *station_table;
};
struct tstation {
struct station_id station_id;
__uint8_t near_tstation_num;
__uint8_t near_tstation_index[4];
__uint8_t near_tstation_station_num[4];
};
struct tstation_table {
__uint8_t tstation_num;
struct tstation *tstation_table;
};
/* ------------------------------------------------------------------------------------------ */
__uint8_t init_location_table(struct location_table *location_table) {
location_table -> location_num = LOCATION_NUM;
location_table -> location_table = (struct location *) malloc (sizeof(struct location) * LOCATION_NUM);
/* ----- Open location.way file ----- */
FILE *fp = NULL;
/* ----- Read location.way ----- */
if ((fp = fopen("../lib/location.way", "r")) == NULL) {
printf(" [ Console ]: Cannot open file location.way\n");
return FAILED;
}
__uint16_t tmp_width, tmp_height;
for (__uint16_t location_table_index = 0; location_table_index < LOCATION_NUM; ++location_table_index) {
tmp_width = tmp_height = 0;
fgetc(fp);
for (__uint8_t width_ch_index = 0; width_ch_index < 5; ++width_ch_index) {
tmp_width = tmp_width * 10 + (fgetc(fp) - '0');
}
fgetc(fp);
fgetc(fp);
fgetc(fp);
for (__uint8_t height_ch_index = 0; height_ch_index < 5; ++height_ch_index) {
tmp_height = tmp_height * 10 + (fgetc(fp) - '0');
}
fgetc(fp);
fgetc(fp);
((location_table -> location_table) + location_table_index) -> width = tmp_width;
((location_table -> location_table) + location_table_index) -> height = tmp_height;
}
fclose(fp);
printf(" [ Console ]: Initialize location_table successfully\n");
return SUCCEED;
}
__uint8_t init_station_name_table(struct station_name_table *station_name_table) {
/* ----- Open station_name.way file ----- */
FILE *fp = NULL;
/* ----- Read station_name.way ----- */
if ((fp = fopen("../lib/station_name.way", "r")) == NULL) {
printf(" [ Console ]: Cannot open file station_name.way\n");
return FAILED;
}
station_name_table -> station_name_num = STATION_NAME_NUM;
station_name_table -> station_name_table = (__uint8_t **) malloc (sizeof(__uint8_t *) * STATION_NAME_NUM);
for (__uint8_t station_name_index1 = 0, station_name_index2, *station_name, station_name_len; station_name_index1 < STATION_NAME_NUM; ++station_name_index1) {
fgetc(fp);
station_name_len = (fgetc(fp) - '0') * 10 + (fgetc(fp) - '0');
fgetc(fp);
fgetc(fp);
fgetc(fp);
station_name = *((station_name_table -> station_name_table) + station_name_index1) = (__uint8_t *) malloc (sizeof(__uint8_t) * station_name_len);
for (station_name_index2 = 0; station_name_index2 < station_name_len; ++station_name_index2) {
*(station_name + station_name_index2) = fgetc(fp);
}
*(station_name + station_name_len - 1) = '\000';
fgetc(fp);
}
fclose(fp);
printf(" [ Console ]: Initialize station_name_table successfully\n");
return SUCCEED;
}
__uint8_t init_station_table(struct station_table *station_table) {
/* ----- Open station_id.way file ----- */
FILE *fp = NULL;
/* ----- Read station_id.way ----- */
if ((fp = fopen("../lib/station_id.way", "r")) == NULL) {
printf(" [ Console ]: Cannot open file station_id.way\n");
return FAILED;
}
__uint8_t station_num;
for (__uint8_t ch_index = 0; ch_index < 15; ++ch_index) fgetc(fp);
station_num = station_table -> station_num = ((fgetc(fp) - '0') * 10) + (fgetc(fp) - '0');
station_table -> station_table = (struct station *) malloc (sizeof(struct station) * station_num);
fgetc(fp);
fgetc(fp);
for (__uint8_t station_index = 0; station_index < station_num; ++station_index) {
/* ----- line_id ----- */
for (__uint8_t ch_index = 0; ch_index < 11; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.line_id = fgetc(fp) - '0';
/* ----- station_id ----- */
for (__uint8_t ch_index = 0; ch_index < 16; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.station_id = (fgetc(fp) - '0') * 10 + (fgetc(fp) - '0');
/* ----- head_station_tag ----- */
for (__uint8_t ch_index = 0; ch_index < 22; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.head_station_tag = (fgetc(fp) - '0');
/* ----- tail_station_tag ----- */
for (__uint8_t ch_index = 0; ch_index < 22; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.tail_station_tag = (fgetc(fp) - '0');
/* ----- transfer_station_tag ----- */
for (__uint8_t ch_index = 0; ch_index < 26; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.transfer_station_tag = (fgetc(fp) - '0');
/* ----- transfer_station_id ----- */
for (__uint8_t ch_index = 0; ch_index < 25; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.transfer_station_id = (fgetc(fp) - '0') * 10 + (fgetc(fp) - '0');
/* ----- station_name_id ----- */
for (__uint8_t ch_index = 0; ch_index < 21; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_name_id = (fgetc(fp) - '0') * 100 + (fgetc(fp) - '0') * 10 + (fgetc(fp) - '0');
/* ----- location_id ----- */
for (__uint8_t ch_index = 0; ch_index < 17; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> location_id = (fgetc(fp) - '0') * 100 + (fgetc(fp) - '0') * 10 + (fgetc(fp) - '0');
fgetc(fp);
fgetc(fp);
}
for (__uint8_t station_index = 0; station_index < station_num; ++station_index) {
printf("line_id:%d,", ((station_table -> station_table) + station_index) -> station_id.line_id);
printf("station_id:%d,", ((station_table -> station_table) + station_index) -> station_id.station_id);
printf("head_station_tag:%d,", ((station_table -> station_table) + station_index) -> station_id.head_station_tag);
/* ----- head_station_tag ----- */
for (__uint8_t ch_index = 0; ch_index < 22; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.head_station_tag = (fgetc(fp) - '0');
/* ----- tail_station_tag ----- */
for (__uint8_t ch_index = 0; ch_index < 22; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.tail_station_tag = (fgetc(fp) - '0');
/* ----- transfer_station_tag ----- */
for (__uint8_t ch_index = 0; ch_index < 26; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.transfer_station_tag = (fgetc(fp) - '0');
/* ----- transfer_station_id ----- */
for (__uint8_t ch_index = 0; ch_index < 25; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_id.transfer_station_id = (fgetc(fp) - '0') * 10 + (fgetc(fp) - '0');
/* ----- station_name_id ----- */
for (__uint8_t ch_index = 0; ch_index < 21; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> station_name_id = (fgetc(fp) - '0') * 100 + (fgetc(fp) - '0') * 10 + (fgetc(fp) - '0');
/* ----- location_id ----- */
for (__uint8_t ch_index = 0; ch_index < 17; ++ch_index) fgetc(fp);
((station_table -> station_table) + station_index) -> location_id = (fgetc(fp) - '0') * 100 + (fgetc(fp) - '0') * 10 + (fgetc(fp) - '0');
fgetc(fp);
fgetc(fp);
}
fclose(fp);
return SUCCEED;
}
int main(int argc, char **argv) {
struct location_table location_table;
struct station_name_table station_name_table;
struct station_table line_01_station_table;
init_location_table(&location_table);
init_station_name_table(&station_name_table);
init_station_table(&line_01_station_table);
return 0;
}