xref: /linux/arch/x86/lib/cmdline.c (revision a13d7201d7deedcbb6ac6efa94a1a7d34d3d79ec)
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 }
85