/* poly.c
- * Greg Cook, 9/Apr/2015
+ * Greg Cook, 24/Feb/2016
*/
/* CRC RevEng, an arbitrary-precision CRC calculator and algorithm finder
- * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Gregory Cook
+ * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016 Gregory Cook
*
* This file is part of CRC RevEng.
*
* along with CRC RevEng. If not, see <http://www.gnu.org/licenses/>.
*/
-/* 2015-04-03: added direct mode to strtop()
+/* 2015-07-29: discard leading $, &, 0x from argument to strtop()
+ * 2015-04-03: added direct mode to strtop()
* 2014-01-11: added LOFS(), RNDUP()
* 2013-09-16: SIZE(), IDX(), OFS() macros bitshift if BMP_POF2
* 2013-02-07: conditional non-2^n fix, pmpar() return mask constant type
bmp_t accu = BMP_C(0);
bmp_t mask = bperhx == BMP_BIT ? ~BMP_C(0) : (BMP_C(1) << bperhx) - BMP_C(1);
unsigned long iter = 0UL, idx;
- int cmask = ~(~0 << CHAR_BIT), c;
+ int cmask = (1 << CHAR_BIT) - 1, c;
int count = 0, ofs;
poly_t poly = PZERO;
if(bperhx == 0) return(poly);
bmp_t accu;
bmp_t mask = bperhx == BMP_BIT ? ~BMP_C(0) : (BMP_C(1) << bperhx) - BMP_C(1);
int pass, count, ofs;
- int cmask = ~(~0 << CHAR_BIT), c;
+ int cmask = (1 << CHAR_BIT) - 1 , c;
const char *s;
poly_t poly = PZERO;
if(bperhx > BMP_BIT || bperhx <= 0 || string == NULL || *string == '\0')
return(poly);
+ if(~flags & P_DIRECT) {
+ if(*string == '$' || *string == '&')
+ ++string;
+ else if(*string == '0'
+ && (string[1] == 'x' || string[1] == 'X'))
+ string += 2;
+ }
+ length = (*string != '\0');
+
for(pass=0; pass<2 && length > 0UL; ++pass) {
s = string;
length = 0UL;