blob: 422db000d72767adf718dc75db682e5df576e877 [file] [log] [blame]
Borislav Petkov1b1ded52014-05-19 20:59:16 +02001/*
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}