Blame view

lib/cmdline.c 3.65 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /*
   * 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
   *
   */
  
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/string.h>
22f2e2801   Derek Fults   [PATCH] get_optio...
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  /*
   *	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
35
36
37
38
39
40
41
42
43
44
  
  /**
   *	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 ...
45
46
47
48
   *	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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
   */
  
  int get_option (char **str, int *pint)
  {
  	char *cur = *str;
  
  	if (!cur || !(*cur))
  		return 0;
  	*pint = simple_strtol (cur, str, 0);
  	if (cur == *str)
  		return 0;
  	if (**str == ',') {
  		(*str)++;
  		return 2;
  	}
22f2e2801   Derek Fults   [PATCH] get_optio...
64
65
  	if (**str == '-')
  		return 3;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
72
73
74
75
76
  
  	return 1;
  }
  
  /**
   *	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...
77
78
   *	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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
   *	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).
   */
   
  char *get_options(const char *str, int nints, int *ints)
  {
  	int res, i = 1;
  
  	while (i < nints) {
  		res = get_option ((char **)&str, ints + i);
  		if (res == 0)
  			break;
22f2e2801   Derek Fults   [PATCH] get_optio...
95
96
97
98
99
100
101
102
103
104
105
106
  		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
107
108
109
110
111
112
113
114
115
116
117
  		i++;
  		if (res == 1)
  			break;
  	}
  	ints[0] = i - 1;
  	return (char *)str;
  }
  
  /**
   *	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
121
122
123
124
125
126
   *
   *	Parses a string into a number.  The number stored at @ptr is
   *	potentially suffixed with %K (for kilobytes, or 1024 bytes),
   *	%M (for megabytes, or 1048576 bytes), or %G (for gigabytes, or
   *	1073741824).  If the number is suffixed with K, M, or G, then
   *	the return value is the number multiplied by one kilobyte, one
   *	megabyte, or one gigabyte, respectively.
   */
d974ae379   Jeremy Fitzhardinge   generic, memparse...
127
  unsigned long long memparse(const char *ptr, char **retptr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
  {
fd1938297   Robert P. J. Day   lib: allow mempar...
129
  	char *endptr;	/* local pointer to end of parsed string */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130

fd1938297   Robert P. J. Day   lib: allow mempar...
131
132
133
  	unsigned long long ret = simple_strtoull(ptr, &endptr, 0);
  
  	switch (*endptr) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
137
138
139
140
141
142
  	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...
143
  		endptr++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
145
146
  	default:
  		break;
  	}
fd1938297   Robert P. J. Day   lib: allow mempar...
147
148
149
  
  	if (retptr)
  		*retptr = endptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
151
152
153
154
155
156
  	return ret;
  }
  
  
  EXPORT_SYMBOL(memparse);
  EXPORT_SYMBOL(get_option);
  EXPORT_SYMBOL(get_options);