| /* | |
| * Copyright 2010 Tilera Corporation. All Rights Reserved. | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License | |
| * as published by the Free Software Foundation, version 2. | |
| * | |
| * This program is distributed in the hope that it will be useful, but | |
| * WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | |
| * NON INFRINGEMENT. See the GNU General Public License for | |
| * more details. | |
| */ | |
| #include <linux/cpumask.h> | |
| #include <linux/ctype.h> | |
| #include <linux/errno.h> | |
| #include <linux/smp.h> | |
| #include <linux/export.h> | |
| /* | |
| * Allow cropping out bits beyond the end of the array. | |
| * Move to "lib" directory if more clients want to use this routine. | |
| */ | |
| int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits) | |
| { | |
| unsigned a, b; | |
| bitmap_zero(maskp, nmaskbits); | |
| do { | |
| if (!isdigit(*bp)) | |
| return -EINVAL; | |
| a = simple_strtoul(bp, (char **)&bp, 10); | |
| b = a; | |
| if (*bp == '-') { | |
| bp++; | |
| if (!isdigit(*bp)) | |
| return -EINVAL; | |
| b = simple_strtoul(bp, (char **)&bp, 10); | |
| } | |
| if (!(a <= b)) | |
| return -EINVAL; | |
| if (b >= nmaskbits) | |
| b = nmaskbits-1; | |
| while (a <= b) { | |
| set_bit(a, maskp); | |
| a++; | |
| } | |
| if (*bp == ',') | |
| bp++; | |
| } while (*bp != '\0' && *bp != '\n'); | |
| return 0; | |
| } | |
| EXPORT_SYMBOL(bitmap_parselist_crop); |