/* * This file is part of the Linux kernel, and is made available under * the terms of the GNU General Public License version 2. * * Misc librarized functions for cmdline poking. */ #include <linux/kernel.h> #include <linux/string.h> #include <linux/ctype.h> #include <asm/setup.h> static inline int myisspace(u8 c) { return c <= ' '; /* Close enough approximation */ } /** * Find a boolean option (like quiet,noapic,nosmp....) * * @cmdline: the cmdline string * @option: option string to look for * * Returns the position of that @option (starts counting with 1) * or 0 on not found. */ int cmdline_find_option_bool(const char *cmdline, const char *option) { char c; int len, pos = 0, wstart = 0; const char *opptr = NULL; enum { st_wordstart = 0, /* Start of word/after whitespace */ st_wordcmp, /* Comparing this word */ st_wordskip, /* Miscompare, skip */ } state = st_wordstart; if (!cmdline) return -1; /* No command line */ len = min_t(int, strlen(cmdline), COMMAND_LINE_SIZE); if (!len) return 0; while (len--) { c = *(char *)cmdline++; pos++; switch (state) { case st_wordstart: if (!c) return 0; else if (myisspace(c)) break; state = st_wordcmp; opptr = option; wstart = pos; /* fall through */ case st_wordcmp: if (!*opptr) if (!c || myisspace(c)) return wstart; else state = st_wordskip; else if (!c) return 0; else if (c != *opptr++) state = st_wordskip; else if (!len) /* last word and is matching */ return wstart; break; case st_wordskip: if (!c) return 0; else if (myisspace(c)) state = st_wordstart; break; } } return 0; /* Buffer overrun */ }