Commit | Line | Data |
---|---|---|
1b1ded57 BP |
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 | ||
12 | static 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 | */ | |
26 | int 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 | } |