Remove function prototypes and reorder functions accordingly ba75bb30
FRIGN · 2015-09-28 00:19 1 file(s) · +64 −80
dmenu.c +64 −80
34 34
	bool out;
35 35
};
36 36
37 -
static void appenditem(struct item *, struct item **, struct item **);
38 -
static void calcoffsets(void);
39 -
static char *cistrstr(const char *, const char *);
40 -
static void cleanup(void);
41 -
static void drawmenu(void);
42 -
static void grabkeyboard(void);
43 -
static void insert(const char *, ssize_t);
44 -
static void keypress(XKeyEvent *);
45 -
static void match(void);
46 -
static size_t nextrune(int);
47 -
static void paste(void);
48 -
static void readstdin(void);
49 -
static void run(void);
50 -
static void setup(void);
51 -
static void usage(void);
52 -
53 37
static char text[BUFSIZ] = "";
54 38
static int bh, mw, mh;
55 39
static int sw, sh; /* X display screen geometry width, height */
216 200
}
217 201
218 202
static void
203 +
match(void)
204 +
{
205 +
	static char **tokv = NULL;
206 +
	static int tokn = 0;
207 +
208 +
	char buf[sizeof text], *s;
209 +
	int i, tokc = 0;
210 +
	size_t len;
211 +
	struct item *item, *lprefix, *lsubstr, *prefixend, *substrend;
212 +
213 +
	strcpy(buf, text);
214 +
	/* separate input text into tokens to be matched individually */
215 +
	for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " "))
216 +
		if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv)))
217 +
			die("cannot realloc %u bytes\n", tokn * sizeof *tokv);
218 +
	len = tokc ? strlen(tokv[0]) : 0;
219 +
220 +
	matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
221 +
	for (item = items; item && item->text; item++) {
222 +
		for (i = 0; i < tokc; i++)
223 +
			if (!fstrstr(item->text, tokv[i]))
224 +
				break;
225 +
		if (i != tokc) /* not all tokens match */
226 +
			continue;
227 +
		/* exact matches go first, then prefixes, then substrings */
228 +
		if (!tokc || !fstrncmp(tokv[0], item->text, len + 1))
229 +
			appenditem(item, &matches, &matchend);
230 +
		else if (!fstrncmp(tokv[0], item->text, len))
231 +
			appenditem(item, &lprefix, &prefixend);
232 +
		else
233 +
			appenditem(item, &lsubstr, &substrend);
234 +
	}
235 +
	if (lprefix) {
236 +
		if (matches) {
237 +
			matchend->right = lprefix;
238 +
			lprefix->left = matchend;
239 +
		} else
240 +
			matches = lprefix;
241 +
		matchend = prefixend;
242 +
	}
243 +
	if (lsubstr) {
244 +
		if (matches) {
245 +
			matchend->right = lsubstr;
246 +
			lsubstr->left = matchend;
247 +
		} else
248 +
			matches = lsubstr;
249 +
		matchend = substrend;
250 +
	}
251 +
	curr = sel = matches;
252 +
	calcoffsets();
253 +
}
254 +
255 +
static void
219 256
insert(const char *str, ssize_t n)
220 257
{
221 258
	if (strlen(text) + n > sizeof text - 1)
228 265
	match();
229 266
}
230 267
268 +
static size_t
269 +
nextrune(int inc)
270 +
{
271 +
	ssize_t n;
272 +
273 +
	/* return location of next utf8 rune in the given direction (+1 or -1) */
274 +
	for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc)
275 +
		;
276 +
	return n;
277 +
}
278 +
231 279
static void
232 280
keypress(XKeyEvent *ev)
233 281
{
396 444
		break;
397 445
	}
398 446
	drawmenu();
399 -
}
400 -
401 -
static void
402 -
match(void)
403 -
{
404 -
	static char **tokv = NULL;
405 -
	static int tokn = 0;
406 -
407 -
	char buf[sizeof text], *s;
408 -
	int i, tokc = 0;
409 -
	size_t len;
410 -
	struct item *item, *lprefix, *lsubstr, *prefixend, *substrend;
411 -
412 -
	strcpy(buf, text);
413 -
	/* separate input text into tokens to be matched individually */
414 -
	for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " "))
415 -
		if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv)))
416 -
			die("cannot realloc %u bytes\n", tokn * sizeof *tokv);
417 -
	len = tokc ? strlen(tokv[0]) : 0;
418 -
419 -
	matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
420 -
	for (item = items; item && item->text; item++) {
421 -
		for (i = 0; i < tokc; i++)
422 -
			if (!fstrstr(item->text, tokv[i]))
423 -
				break;
424 -
		if (i != tokc) /* not all tokens match */
425 -
			continue;
426 -
		/* exact matches go first, then prefixes, then substrings */
427 -
		if (!tokc || !fstrncmp(tokv[0], item->text, len + 1))
428 -
			appenditem(item, &matches, &matchend);
429 -
		else if (!fstrncmp(tokv[0], item->text, len))
430 -
			appenditem(item, &lprefix, &prefixend);
431 -
		else
432 -
			appenditem(item, &lsubstr, &substrend);
433 -
	}
434 -
	if (lprefix) {
435 -
		if (matches) {
436 -
			matchend->right = lprefix;
437 -
			lprefix->left = matchend;
438 -
		} else
439 -
			matches = lprefix;
440 -
		matchend = prefixend;
441 -
	}
442 -
	if (lsubstr) {
443 -
		if (matches) {
444 -
			matchend->right = lsubstr;
445 -
			lsubstr->left = matchend;
446 -
		} else
447 -
			matches = lsubstr;
448 -
		matchend = substrend;
449 -
	}
450 -
	curr = sel = matches;
451 -
	calcoffsets();
452 -
}
453 -
454 -
static size_t
455 -
nextrune(int inc)
456 -
{
457 -
	ssize_t n;
458 -
459 -
	/* return location of next utf8 rune in the given direction (+1 or -1) */
460 -
	for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc)
461 -
		;
462 -
	return n;
463 447
}
464 448
465 449
static void