| Chris Metcalf | 867e359 | 2010-05-28 23:09:12 -0400 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright 2010 Tilera Corporation. All Rights Reserved. | 
 | 3 |  * | 
 | 4 |  *   This program is free software; you can redistribute it and/or | 
 | 5 |  *   modify it under the terms of the GNU General Public License | 
 | 6 |  *   as published by the Free Software Foundation, version 2. | 
 | 7 |  * | 
 | 8 |  *   This program is distributed in the hope that it will be useful, but | 
 | 9 |  *   WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 10 |  *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | 
 | 11 |  *   NON INFRINGEMENT.  See the GNU General Public License for | 
 | 12 |  *   more details. | 
 | 13 |  */ | 
 | 14 |  | 
 | 15 | #include <linux/cpumask.h> | 
 | 16 | #include <linux/ctype.h> | 
 | 17 | #include <linux/errno.h> | 
| Chris Metcalf | 0707ad3 | 2010-06-25 17:04:17 -0400 | [diff] [blame] | 18 | #include <linux/smp.h> | 
| Chris Metcalf | 867e359 | 2010-05-28 23:09:12 -0400 | [diff] [blame] | 19 |  | 
 | 20 | /* | 
 | 21 |  * Allow cropping out bits beyond the end of the array. | 
 | 22 |  * Move to "lib" directory if more clients want to use this routine. | 
 | 23 |  */ | 
 | 24 | int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits) | 
 | 25 | { | 
 | 26 | 	unsigned a, b; | 
 | 27 |  | 
 | 28 | 	bitmap_zero(maskp, nmaskbits); | 
 | 29 | 	do { | 
 | 30 | 		if (!isdigit(*bp)) | 
 | 31 | 			return -EINVAL; | 
 | 32 | 		a = simple_strtoul(bp, (char **)&bp, 10); | 
 | 33 | 		b = a; | 
 | 34 | 		if (*bp == '-') { | 
 | 35 | 			bp++; | 
 | 36 | 			if (!isdigit(*bp)) | 
 | 37 | 				return -EINVAL; | 
 | 38 | 			b = simple_strtoul(bp, (char **)&bp, 10); | 
 | 39 | 		} | 
 | 40 | 		if (!(a <= b)) | 
 | 41 | 			return -EINVAL; | 
 | 42 | 		if (b >= nmaskbits) | 
 | 43 | 			b = nmaskbits-1; | 
 | 44 | 		while (a <= b) { | 
 | 45 | 			set_bit(a, maskp); | 
 | 46 | 			a++; | 
 | 47 | 		} | 
 | 48 | 		if (*bp == ',') | 
 | 49 | 			bp++; | 
 | 50 | 	} while (*bp != '\0' && *bp != '\n'); | 
 | 51 | 	return 0; | 
 | 52 | } |