9 typedef __uint32_t art_id;
13 cmpstring_p_pp(const void *p1, const void *p2)
15 return strcasecmp((char * const) p1, * (char * const *) p2);
21 int main(int argc, char **argv)
28 art_id titles_read = 0;
38 int cur_dist_is_not_last;
44 printf("Supply article name to look up articles linking to it.\n");
50 * Read all incoming links into memory
53 in_file = fopen("links-incoming.bin", "rb");
55 fread(&titles, sizeof(titles), 1, in_file);
57 linki = malloc(titles * sizeof(art_id*));
58 linkis = malloc(titles * sizeof(art_id));
60 for (i = 0; i < titles; i++) {
63 fread(&linkis[i], sizeof(linkis[i]), 1, in_file);
64 //printf("linkis[%zd] = %zd\n", i, linkis[i]);
66 linki[i] = malloc(linkis[i] * sizeof(linki[i][0]));
68 j = fread(linki[i], sizeof(linki[i][0]), linkis[i], in_file);
69 assert(j == linkis[i]);
70 //for (j = 0; j < linkis[i]; j++) {
71 // fread(&linki[i][j], sizeof(linki[i][j]), 1, in_file);
74 printf("Incoming links read (%zd bytes).\n", ftell(in_file));
81 * Read all titles into memory
84 title = malloc(titles * sizeof(title[0]));
86 in_file = fopen("titles-sorted.txt", "r");
87 while (!feof(in_file)) {
89 ssize_t in_line_len = 0;
92 in_line_len = getline(&in_line, &zero, in_file);
94 /* Ignore empty lines and errors */
95 if (in_line_len < 2) {
99 /* Delete trailing newline */
100 in_line[in_line_len - 1] = '\0';
102 title[titles_read] = in_line;
107 printf("Titles read.\n");
112 /* Look up article ID */
113 cur_title = bsearch(argv[1], title,
114 titles, sizeof(title[0]),
118 printf("TITLE NOT FOUND: %s\n", argv[1]);
122 title_id = cur_title - title;
124 printf("Article %zd (%s) is linked from %zd articles:\n", title_id, title[title_id], linkis[title_id]);
126 for (i = 0; i < linkis[title_id]; i++) {
127 art_id x = linki[title_id][i];
128 printf(" %s\n", title[x]);
133 printf("\n\n\n\nBuilding table of distances...\n\n");
135 dist_table = malloc(titles * sizeof(dist_table[0]));
137 dist_table[title_id] = 0xdeadbeef;
139 for (i = 0; i < linkis[title_id]; i++) {
140 art_id x = linki[title_id][i];
145 cur_dist_is_not_last = 1;
147 while (cur_dist_is_not_last) {
148 art_id articles_found = 0;
150 cur_dist_is_not_last = 0;
152 for (i = 0; i < titles; i++) {
153 if (dist_table[i] == cur_dist) {
156 for (j = 0; j < linkis[i]; j++) {
157 art_id x = linki[i][j];
159 if (!dist_table[x]) {
160 dist_table[x] = cur_dist + 1;
164 cur_dist_is_not_last = 1;
170 printf("Distance %zd: Found %zd articles.\n", cur_dist, articles_found);
176 printf("\n\n\nThe articles with the distance of %zd are:\n\n", cur_dist);
177 for (i = 0; i < titles; i++) {
178 if (dist_table[i] == cur_dist) {
179 printf(" %s\n", title[i]);