52 lines
1.3 KiB
C
52 lines
1.3 KiB
C
|
/*
|
||
|
* 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>
|
||
|
|
||
|
/*
|
||
|
* 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;
|
||
|
}
|