Commit | Line | Data |
---|---|---|
867e359b CM |
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> | |
0707ad30 | 18 | #include <linux/smp.h> |
7c63e1ee | 19 | #include <linux/export.h> |
867e359b CM |
20 | |
21 | /* | |
22 | * Allow cropping out bits beyond the end of the array. | |
23 | * Move to "lib" directory if more clients want to use this routine. | |
24 | */ | |
25 | int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits) | |
26 | { | |
27 | unsigned a, b; | |
28 | ||
29 | bitmap_zero(maskp, nmaskbits); | |
30 | do { | |
31 | if (!isdigit(*bp)) | |
32 | return -EINVAL; | |
33 | a = simple_strtoul(bp, (char **)&bp, 10); | |
34 | b = a; | |
35 | if (*bp == '-') { | |
36 | bp++; | |
37 | if (!isdigit(*bp)) | |
38 | return -EINVAL; | |
39 | b = simple_strtoul(bp, (char **)&bp, 10); | |
40 | } | |
41 | if (!(a <= b)) | |
42 | return -EINVAL; | |
43 | if (b >= nmaskbits) | |
44 | b = nmaskbits-1; | |
45 | while (a <= b) { | |
46 | set_bit(a, maskp); | |
47 | a++; | |
48 | } | |
49 | if (*bp == ',') | |
50 | bp++; | |
51 | } while (*bp != '\0' && *bp != '\n'); | |
52 | return 0; | |
53 | } | |
7c63e1ee | 54 | EXPORT_SYMBOL(bitmap_parselist_crop); |