-
Notifications
You must be signed in to change notification settings - Fork 0
/
sf.c
executable file
·124 lines (106 loc) · 2.67 KB
/
sf.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "util/linked_list.h"
#include "question.h"
#include "args.h"
#include "query/query_verif.h"
#include "query/lib-cjson/cJSON.h"
#include "query/json_parser.h"
#include "display/display.h"
#include "language_inference/predict_language/naive_bayes.h"
#include "language_inference/search_suggest/levenshtein_dist.h"
static ListEntry *curr_question_entry = 0;
void refresh_display(int signum)
{
if (curr_question_entry != 0)
{
display_clear();
display_preview(curr_question_entry);
}
}
LinkedList *get_questions_list(char *query)
{
char *json_results = get_stackoverflow_results(query);
LinkedList *questions = json_parse(json_results);
free(json_results);
return questions;
}
int main(int argc, char **argv)
{
char *query = process_args(argc, argv);
if (sf_flags.help)
{
display_usage();
exit(EXIT_SUCCESS);
}
initialise_naiveb_lang_infer("./language_inference/languages/");
struct sigaction act = {
.sa_handler = &refresh_display,
};
sigaction(SIGWINCH, &act, NULL);
// Return a linked list of Questions
LinkedList *questions_list = get_questions_list(query);
while (questions_list->head->data == 0)
{
// Magic numbers recommended by Hilliam
char *suggested = get_closest_query(query, 3, 5);
if (strcmp(suggested, query) != 0)
{
printf("No relevant questions found for '%s'. Did you mean: '%s'? [Y/n] ", query, suggested);
char response[5];
scanf("%4s", response);
getchar();
if (strcmp(response, "y") == 0 || strcmp(response, "yes") == 0 || strcmp(response, "Y") == 0)
{
questions_list = get_questions_list(suggested);
free(query);
query = suggested;
continue;
}
}
else
{
printf("No relevant questions found. Try a different query.\n");
}
return EXIT_SUCCESS;
}
free(query);
curr_question_entry = questions_list->head;
while (true)
{
Question *question = curr_question_entry->data;
refresh_display(SIGWINCH);
system("stty raw");
char command = getchar();
system("stty cooked");
switch (command)
{
case 'q':
display_clear();
exit(EXIT_SUCCESS);
break;
case 'h':
display_help_page();
break;
case 'j':
if (curr_question_entry->next->data != 0)
{
curr_question_entry = curr_question_entry->next;
}
break;
case 'k':
if (curr_question_entry->prev != 0)
{
curr_question_entry = curr_question_entry->prev;
}
break;
case 'l':
case ' ':
case '\r':
display_question(question);
break;
}
}
return 0;
}