Blame view

lib/cmdline.c 4.08 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * linux/lib/cmdline.c
   * Helper functions generally used for parsing kernel command line
   * and module options.
   *
   * Code and copyrights come from init/main.c and arch/i386/kernel/setup.c.
   *
   * This source code is licensed under the GNU General Public License,
   * Version 2.  See the file COPYING for more details.
   *
   * GNU Indent formatting options for this file: -kr -i8 -npsl -pcs
   *
   */
8bc3bcc93   Paul Gortmaker   lib: reduce the u...
14
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
  #include <linux/kernel.h>
  #include <linux/string.h>
22f2e2801   Derek Fults   [PATCH] get_optio...
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  /*
   *	If a hyphen was found in get_option, this will handle the
   *	range of numbers, M-N.  This will expand the range and insert
   *	the values[M, M+1, ..., N] into the ints array in get_options.
   */
  
  static int get_range(char **str, int *pint)
  {
  	int x, inc_counter, upper_range;
  
  	(*str)++;
  	upper_range = simple_strtol((*str), NULL, 0);
  	inc_counter = upper_range - *pint;
  	for (x = *pint; x < upper_range; x++)
  		*pint++ = x;
  	return inc_counter;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
38
39
40
41
42
43
  
  /**
   *	get_option - Parse integer from an option string
   *	@str: option string
   *	@pint: (output) integer value parsed from @str
   *
   *	Read an int from an option string; if available accept a subsequent
   *	comma as well.
   *
   *	Return values:
72fd4a35a   Robert P. J. Day   [PATCH] Numerous ...
44
45
46
47
   *	0 - no int in string
   *	1 - int found, no subsequent comma
   *	2 - int found including a subsequent comma
   *	3 - hyphen found to denote a range
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
   */
9fd430544   Felipe Contreras   lib/cmdline.c: fi...
49
  int get_option(char **str, int *pint)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
51
52
53
54
  {
  	char *cur = *str;
  
  	if (!cur || !(*cur))
  		return 0;
9fd430544   Felipe Contreras   lib/cmdline.c: fi...
55
  	*pint = simple_strtol(cur, str, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
59
60
61
  	if (cur == *str)
  		return 0;
  	if (**str == ',') {
  		(*str)++;
  		return 2;
  	}
22f2e2801   Derek Fults   [PATCH] get_optio...
62
63
  	if (**str == '-')
  		return 3;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
65
66
  
  	return 1;
  }
ff6f9bbb5   Felipe Contreras   lib/cmdline.c: de...
67
  EXPORT_SYMBOL(get_option);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
71
72
73
74
75
  
  /**
   *	get_options - Parse a string into a list of integers
   *	@str: String to be parsed
   *	@nints: size of integer array
   *	@ints: integer array
   *
   *	This function parses a string containing a comma-separated
22f2e2801   Derek Fults   [PATCH] get_optio...
76
77
   *	list of integers, a hyphen-separated range of _positive_ integers,
   *	or a combination of both.  The parse halts when the array is
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
82
83
84
   *	full, or when no more numbers can be retrieved from the
   *	string.
   *
   *	Return value is the character in the string which caused
   *	the parse to end (typically a null terminator, if @str is
   *	completely parseable).
   */
9fd430544   Felipe Contreras   lib/cmdline.c: fi...
85

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
88
89
90
  char *get_options(const char *str, int nints, int *ints)
  {
  	int res, i = 1;
  
  	while (i < nints) {
9fd430544   Felipe Contreras   lib/cmdline.c: fi...
91
  		res = get_option((char **)&str, ints + i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
  		if (res == 0)
  			break;
22f2e2801   Derek Fults   [PATCH] get_optio...
94
95
96
97
98
99
100
101
102
103
104
105
  		if (res == 3) {
  			int range_nums;
  			range_nums = get_range((char **)&str, ints + i);
  			if (range_nums < 0)
  				break;
  			/*
  			 * Decrement the result by one to leave out the
  			 * last number in the range.  The next iteration
  			 * will handle the upper number in the range
  			 */
  			i += (range_nums - 1);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
109
110
111
112
  		i++;
  		if (res == 1)
  			break;
  	}
  	ints[0] = i - 1;
  	return (char *)str;
  }
ff6f9bbb5   Felipe Contreras   lib/cmdline.c: de...
113
  EXPORT_SYMBOL(get_options);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114
115
116
117
  
  /**
   *	memparse - parse a string with mem suffixes into a number
   *	@ptr: Where parse begins
fd1938297   Robert P. J. Day   lib: allow mempar...
118
   *	@retptr: (output) Optional pointer to next char after parse completes
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
120
   *
   *	Parses a string into a number.  The number stored at @ptr is
e004f3c77   Gui Hecheng   lib/cmdline.c: ad...
121
   *	potentially suffixed with K, M, G, T, P, E.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
   */
d974ae379   Jeremy Fitzhardinge   generic, memparse...
123
  unsigned long long memparse(const char *ptr, char **retptr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
  {
fd1938297   Robert P. J. Day   lib: allow mempar...
125
  	char *endptr;	/* local pointer to end of parsed string */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126

fd1938297   Robert P. J. Day   lib: allow mempar...
127
128
129
  	unsigned long long ret = simple_strtoull(ptr, &endptr, 0);
  
  	switch (*endptr) {
e004f3c77   Gui Hecheng   lib/cmdline.c: ad...
130
131
132
133
134
135
136
137
138
  	case 'E':
  	case 'e':
  		ret <<= 10;
  	case 'P':
  	case 'p':
  		ret <<= 10;
  	case 'T':
  	case 't':
  		ret <<= 10;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
140
141
142
143
144
145
146
147
  	case 'G':
  	case 'g':
  		ret <<= 10;
  	case 'M':
  	case 'm':
  		ret <<= 10;
  	case 'K':
  	case 'k':
  		ret <<= 10;
fd1938297   Robert P. J. Day   lib: allow mempar...
148
  		endptr++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
150
151
  	default:
  		break;
  	}
fd1938297   Robert P. J. Day   lib: allow mempar...
152
153
154
  
  	if (retptr)
  		*retptr = endptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
156
  	return ret;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
  EXPORT_SYMBOL(memparse);
6ccc72b87   Dave Young   lib: Add a generi...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  
  /**
   *	parse_option_str - Parse a string and check an option is set or not
   *	@str: String to be parsed
   *	@option: option name
   *
   *	This function parses a string containing a comma-separated list of
   *	strings like a=b,c.
   *
   *	Return true if there's such option in the string, or return false.
   */
  bool parse_option_str(const char *str, const char *option)
  {
  	while (*str) {
  		if (!strncmp(str, option, strlen(option))) {
  			str += strlen(option);
  			if (!*str || *str == ',')
  				return true;
  		}
  
  		while (*str && *str != ',')
  			str++;
  
  		if (*str == ',')
  			str++;
  	}
  
  	return false;
  }