/* * 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> /* * 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; }