mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 8c0517759a
			
		
	
	
		8c0517759a
		
	
	
	
	
		
			
			We will use this in a few patches to implement tests for early parsing. Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> [ Aligned args properly. ] Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: fenghua.yu@intel.com Cc: yu-cheng.yu@intel.com Link: http://lkml.kernel.org/r/20151222225243.5CC47EB6@viggo.jf.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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.  @option will only be found if it is found
 | |
|  * as an entire word in @cmdline.  For instance, if @option="car"
 | |
|  * then a cmdline which contains "cart" will not match.
 | |
|  */
 | |
| static int
 | |
| __cmdline_find_option_bool(const char *cmdline, int max_cmdline_size,
 | |
| 			   const char *option)
 | |
| {
 | |
| 	char c;
 | |
| 	int 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 */
 | |
| 
 | |
| 	/*
 | |
| 	 * This 'pos' check ensures we do not overrun
 | |
| 	 * a non-NULL-terminated 'cmdline'
 | |
| 	 */
 | |
| 	while (pos < max_cmdline_size) {
 | |
| 		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) {
 | |
| 				/*
 | |
| 				 * We matched all the way to the end of the
 | |
| 				 * option we were looking for.  If the
 | |
| 				 * command-line has a space _or_ ends, then
 | |
| 				 * we matched!
 | |
| 				 */
 | |
| 				if (!c || myisspace(c))
 | |
| 					return wstart;
 | |
| 				/*
 | |
| 				 * We hit the end of the option, but _not_
 | |
| 				 * the end of a word on the cmdline.  Not
 | |
| 				 * a match.
 | |
| 				 */
 | |
| 			} else if (!c) {
 | |
| 				/*
 | |
| 				 * Hit the NULL terminator on the end of
 | |
| 				 * cmdline.
 | |
| 				 */
 | |
| 				return 0;
 | |
| 			} else if (c == *opptr++) {
 | |
| 				/*
 | |
| 				 * We are currently matching, so continue
 | |
| 				 * to the next character on the cmdline.
 | |
| 				 */
 | |
| 				break;
 | |
| 			}
 | |
| 			state = st_wordskip;
 | |
| 			/* fall through */
 | |
| 
 | |
| 		case st_wordskip:
 | |
| 			if (!c)
 | |
| 				return 0;
 | |
| 			else if (myisspace(c))
 | |
| 				state = st_wordstart;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return 0;	/* Buffer overrun */
 | |
| }
 | |
| 
 | |
| int cmdline_find_option_bool(const char *cmdline, const char *option)
 | |
| {
 | |
| 	return __cmdline_find_option_bool(cmdline, COMMAND_LINE_SIZE, option);
 | |
| }
 |