/* numscan * convert strings from bases 2, 8, 10 or 16 into integers * and integers into binary strings * * in numscan, base is indicated by the first digit(s) as follows: * b, 0b = binary * d, 0d, 1-9 = decimal * o, 0o, 0[0-7] = octal * x, 0x = hexadecimal * any of the prefix letters alone will return 0. */ #include #include "numscan.h" unsigned long binscan(char *str) { unsigned result = 0; while ((*str-'0'|1)==1) result = (result<<1) + (*str++=='1'); return result; } void printbin(unsigned long x, int n) { if (--n) printbin(x>>1, n); putchar("01"[x&1]); } unsigned long numscan(char *str) { unsigned long x = 0; rescan: switch(str[0]) { case 'd': sscanf(str+1,"%lu",&x); break; case 'o': sscanf(str+1,"%lo",&x); break; case 'x': sscanf(str+1,"%lx",&x); break; case 'b': x=binscan(str+1); break; case '0': if (str[1]<'0' || str[1]>'7') { str++; goto rescan; } sscanf(str,"%lo",&x); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': sscanf(str,"%lu",&x); break; } return x; }