422db000d72767adf718dc75db682e5df576e877
[cascardo/linux.git] / arch / x86 / lib / cmdline.c
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 }