1/*
2 * This file is part of the Linux kernel, and is made available under
3 * the terms of the GNU General Public License version 2.
4 *
5 * Misc librarized functions for cmdline poking.
6 */
7#include <linux/kernel.h>
8#include <linux/string.h>
9#include <linux/ctype.h>
10#include <asm/setup.h>
11
12static inline int myisspace(u8 c)
13{
14	return c <= ' ';	/* Close enough approximation */
15}
16
17/**
18 * Find a boolean option (like quiet,noapic,nosmp....)
19 *
20 * @cmdline: the cmdline string
21 * @option: option string to look for
22 *
23 * Returns the position of that @option (starts counting with 1)
24 * or 0 on not found.
25 */
26int cmdline_find_option_bool(const char *cmdline, const char *option)
27{
28	char c;
29	int len, pos = 0, wstart = 0;
30	const char *opptr = NULL;
31	enum {
32		st_wordstart = 0,	/* Start of word/after whitespace */
33		st_wordcmp,	/* Comparing this word */
34		st_wordskip,	/* Miscompare, skip */
35	} state = st_wordstart;
36
37	if (!cmdline)
38		return -1;      /* No command line */
39
40	len = min_t(int, strlen(cmdline), COMMAND_LINE_SIZE);
41	if (!len)
42		return 0;
43
44	while (len--) {
45		c = *(char *)cmdline++;
46		pos++;
47
48		switch (state) {
49		case st_wordstart:
50			if (!c)
51				return 0;
52			else if (myisspace(c))
53				break;
54
55			state = st_wordcmp;
56			opptr = option;
57			wstart = pos;
58			/* fall through */
59
60		case st_wordcmp:
61			if (!*opptr)
62				if (!c || myisspace(c))
63					return wstart;
64				else
65					state = st_wordskip;
66			else if (!c)
67				return 0;
68			else if (c != *opptr++)
69				state = st_wordskip;
70			else if (!len)		/* last word and is matching */
71				return wstart;
72			break;
73
74		case st_wordskip:
75			if (!c)
76				return 0;
77			else if (myisspace(c))
78				state = st_wordstart;
79			break;
80		}
81	}
82
83	return 0;	/* Buffer overrun */
84}
85