File: | fe-common/core/fe-help.c |
Location: | line 235, column 4 |
Description: | Value stored to 'header' is never read |
1 | /* |
2 | fe-help.c : irssi |
3 | |
4 | Copyright (C) 1999-2001 Timo Sirainen |
5 | |
6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by |
8 | the Free Software Foundation; either version 2 of the License, or |
9 | (at your option) any later version. |
10 | |
11 | This program is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. |
15 | |
16 | You should have received a copy of the GNU General Public License along |
17 | with this program; if not, write to the Free Software Foundation, Inc., |
18 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
19 | */ |
20 | |
21 | #include "module.h" |
22 | #include "signals.h" |
23 | #include "commands.h" |
24 | #include "levels.h" |
25 | #include "misc.h" |
26 | #include "settings.h" |
27 | |
28 | #include "printtext.h" |
29 | #include "formats.h" |
30 | |
31 | static int commands_equal(COMMAND_REC *rec, COMMAND_REC *rec2) |
32 | { |
33 | int i; |
34 | |
35 | if (rec->category == NULL((void *)0) && rec2->category != NULL((void *)0)) |
36 | return -1; |
37 | if (rec2->category == NULL((void *)0) && rec->category != NULL((void *)0)) |
38 | return 1; |
39 | if (rec->category != NULL((void *)0) && rec2->category != NULL((void *)0)) { |
40 | i = strcmp(rec->category, rec2->category); |
41 | if (i != 0) |
42 | return i; |
43 | } |
44 | |
45 | return strcmp(rec->cmd, rec2->cmd); |
46 | } |
47 | |
48 | static int get_cmd_length(void *data) |
49 | { |
50 | return strlen(((COMMAND_REC *) data)->cmd); |
51 | } |
52 | |
53 | static void help_category(GSList *cmdlist, int items) |
54 | { |
55 | WINDOW_REC *window; |
56 | TEXT_DEST_REC dest; |
57 | GString *str; |
58 | GSList *tmp; |
59 | int *columns, cols, rows, col, row, last_col_rows, max_width; |
60 | char *linebuf, *format, *stripped; |
61 | |
62 | window = window_find_closest(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP); |
63 | max_width = window->width; |
64 | |
65 | /* remove width of timestamp from max_width */ |
66 | format_create_dest(&dest, NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, NULL((void *)0)); |
67 | format = format_get_line_start(current_theme, &dest, time(NULL((void *)0))); |
68 | if (format != NULL((void *)0)) { |
69 | stripped = strip_codes(format); |
70 | max_width -= strlen(stripped); |
71 | g_free(stripped); |
72 | g_free(format); |
73 | } |
74 | |
75 | /* calculate columns */ |
76 | cols = get_max_column_count(cmdlist, get_cmd_length, |
77 | max_width, 6, 1, 3, &columns, &rows); |
78 | cmdlist = columns_sort_list(cmdlist, rows); |
79 | |
80 | /* rows in last column */ |
81 | last_col_rows = rows-(cols*rows-g_slist_length(cmdlist)); |
82 | if (last_col_rows == 0) |
83 | last_col_rows = rows; |
84 | |
85 | str = g_string_new(NULL((void *)0)); |
86 | linebuf = g_malloc(max_width+1); |
87 | |
88 | col = 0; row = 0; |
89 | for (tmp = cmdlist; tmp != NULL((void *)0); tmp = tmp->next) { |
90 | COMMAND_REC *rec = tmp->data; |
91 | |
92 | memset(linebuf, ' ', columns[col]); |
93 | linebuf[columns[col]] = '\0'; |
94 | memcpy(linebuf, rec->cmd, strlen(rec->cmd)); |
95 | g_string_append(str, linebuf); |
96 | |
97 | if (++col == cols) { |
98 | printtext(NULL((void *)0), NULL((void *)0), |
99 | MSGLEVEL_CLIENTCRAP, "%s", str->str); |
100 | g_string_truncate(str, 0); |
101 | col = 0; row++; |
102 | |
103 | if (row == last_col_rows) |
104 | cols--; |
105 | } |
106 | } |
107 | if (str->len != 0) |
108 | printtext(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, "%s", str->str); |
109 | |
110 | g_slist_free(cmdlist); |
111 | g_string_free(str, TRUE(!(0))); |
112 | g_free(columns); |
113 | g_free(linebuf); |
114 | } |
115 | |
116 | static int show_help_file(const char *file) |
117 | { |
118 | const char *helppath; |
119 | char *path, **paths, **tmp; |
120 | GIOChannel *handle; |
121 | GString *buf; |
122 | gsize tpos; |
123 | |
124 | helppath = settings_get_str("help_path"); |
125 | |
126 | paths = g_strsplit(helppath, ":", -1); |
127 | |
128 | handle = NULL((void *)0); |
129 | for (tmp = paths; *tmp != NULL((void *)0); tmp++) { |
130 | /* helpdir/command or helpdir/category/command */ |
131 | path = g_strdup_printf("%s/%s", *tmp, file); |
132 | handle = g_io_channel_new_file(path, "r", NULL((void *)0)); |
133 | g_free(path); |
134 | |
135 | if (handle != NULL((void *)0)) |
136 | break; |
137 | |
138 | } |
139 | |
140 | g_strfreev(paths); |
141 | |
142 | if (handle == NULL((void *)0)) |
143 | return FALSE(0); |
144 | |
145 | g_io_channel_set_encoding(handle, NULL((void *)0), NULL((void *)0)); |
146 | buf = g_string_sized_new(512); |
147 | /* just print to screen whatever is in the file */ |
148 | while (g_io_channel_read_line_string(handle, buf, &tpos, NULL((void *)0)) == G_IO_STATUS_NORMAL) { |
149 | buf->str[tpos] = '\0'; |
150 | g_string_prepend(buf, "%|"); |
151 | printtext_string(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, buf->str); |
152 | } |
153 | g_string_free(buf, TRUE(!(0))); |
154 | |
155 | g_io_channel_unref(handle); |
156 | return TRUE(!(0)); |
157 | } |
158 | |
159 | static void show_help(const char *data) |
160 | { |
161 | COMMAND_REC *rec, *last; |
162 | GSList *tmp, *cmdlist; |
163 | int items, findlen; |
164 | int header, found, fullmatch; |
165 | |
166 | g_return_if_fail(data != NULL)do{ if (data != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "data != NULL"); return; }; }while (0); |
167 | |
168 | /* sort the commands list */ |
169 | commands = g_slist_sort(commands, (GCompareFunc) commands_equal); |
170 | |
171 | /* print command, sort by category */ |
172 | cmdlist = NULL((void *)0); last = NULL((void *)0); header = FALSE(0); fullmatch = FALSE(0); |
173 | items = 0; findlen = strlen(data); found = FALSE(0); |
174 | for (tmp = commands; tmp != NULL((void *)0); last = rec, tmp = tmp->next) { |
175 | rec = tmp->data; |
176 | |
177 | if (last != NULL((void *)0) && rec->category != NULL((void *)0) && |
178 | (last->category == NULL((void *)0) || |
179 | strcmp(rec->category, last->category) != 0)) { |
180 | /* category changed */ |
181 | if (items > 0) { |
182 | if (!header) { |
183 | printtext(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, "Irssi commands:"); |
184 | header = TRUE(!(0)); |
185 | } |
186 | if (last->category != NULL((void *)0)) { |
187 | printtext(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, ""); |
188 | printtext(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, "%s:", last->category); |
189 | } |
190 | help_category(cmdlist, items); |
191 | } |
192 | |
193 | g_slist_free(cmdlist); cmdlist = NULL((void *)0); |
194 | items = 0; |
195 | } |
196 | |
197 | if (last != NULL((void *)0) && g_strcasecmp(rec->cmd, last->cmd) == 0) |
198 | continue; /* don't display same command twice */ |
199 | |
200 | if ((int)strlen(rec->cmd) >= findlen && |
201 | g_strncasecmp(rec->cmd, data, findlen) == 0) { |
202 | if (rec->cmd[findlen] == '\0') { |
203 | fullmatch = TRUE(!(0)); |
204 | found = TRUE(!(0)); |
205 | break; |
206 | } |
207 | else if (strchr(rec->cmd+findlen+1, ' ') == NULL((void *)0)) { |
208 | /* not a subcommand (and matches the query) */ |
209 | items++; |
210 | cmdlist = g_slist_append(cmdlist, rec); |
211 | found = TRUE(!(0)); |
212 | } |
213 | } |
214 | } |
215 | |
216 | if ((!found || fullmatch) && !show_help_file(data)) { |
217 | printtext(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, |
218 | "No help for %s", data); |
219 | } |
220 | |
221 | if (*data != '\0' && data[strlen(data)-1] != ' ' && |
222 | command_have_sub(data)) { |
223 | char *cmd; |
224 | |
225 | cmd = g_strconcat(data, " ", NULL((void *)0)); |
226 | show_help(cmd); |
227 | g_free(cmd); |
228 | } |
229 | |
230 | if (items != 0) { |
231 | /* display the last category */ |
232 | if (!header) { |
233 | printtext(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, |
234 | "Irssi commands:"); |
235 | header = TRUE(!(0)); |
Value stored to 'header' is never read | |
236 | } |
237 | |
238 | if (last->category != NULL((void *)0)) { |
239 | printtext(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, ""); |
240 | printtext(NULL((void *)0), NULL((void *)0), MSGLEVEL_CLIENTCRAP, |
241 | "%s:", last->category); |
242 | } |
243 | help_category(cmdlist, items); |
244 | g_slist_free(cmdlist); |
245 | } |
246 | } |
247 | |
248 | /* SYNTAX: HELP [<command>] */ |
249 | static void cmd_help(const char *data) |
250 | { |
251 | char *cmd; |
252 | |
253 | cmd = g_ascii_strdown(data, -1); |
254 | g_strchomp(cmd); |
255 | show_help(cmd); |
256 | g_free(cmd); |
257 | } |
258 | |
259 | void fe_help_init(void) |
260 | { |
261 | settings_add_str("misc", "help_path", HELPDIR)settings_add_str_module("fe-common/core", "misc", "help_path" , "/home/jilles/irssi/share/irssi/help"); |
262 | command_bind("help", NULL, (SIGNAL_FUNC) cmd_help)command_bind_full("fe-common/core", 0, "help", -1, ((void *)0 ), (SIGNAL_FUNC) cmd_help, ((void *)0)); |
263 | } |
264 | |
265 | void fe_help_deinit(void) |
266 | { |
267 | command_unbind("help", (SIGNAL_FUNC) cmd_help)command_unbind_full("help", (SIGNAL_FUNC) cmd_help, ((void *) 0)); |
268 | } |