/* port.c -- perform port in/out operations */ /* $Id$ */ /* Carlos Duarte , 961227/990321 */ #include #include #include static int do_args(int first, int ac, char *av[]); #define ARG() \ s[1] ? (t=s+1, s+=strlen(s)-1, t) : ++i 9**), octal (0**), or hex (0x**)\n\ value may be: hex (0x**), oct (0ooo), dec (ddd), or bin (bbbbbbbb)\n\ (bin requires 8 digits 0 or 1)\n\ ", argv[0], argv[0]), exit(2) /* struct options { } opts; */ int main(int argc, char *argv[]) { int i; for (i=1; i #include #include #if defined(__GLIBC__) && __GLIBC__ >= 2 #include /* for glibc */ #endif int stricmp(char *s1, char *s2) { while (*s1 && *s2) { if (tolower(*s1) != tolower(*s2)) return 1; s1++; s2++; } if (*s1 || *s2) return 1; return 0; } static char * tobin(unsigned int v) { static char buf[16]; char *ptr; unsigned int mask; mask = 0x80; ptr = buf; do { *ptr++ = '0' + !!(v & mask); } while ((mask >>= 1) != 0); return buf; } void say(char *what, int port, int value) { printf("0x%04x: 0x%02x [%s ** %d]\n", port, value, tobin(value), value); } int bin(char *s) { int b = 0; while (*s) { b <<= 1; if (*s++ == '1') b++; } return b; } int parse_value(char *s) { char *errc; int r; if (strlen(s) == 8 && *(s+strspn(s, "01")) == 0) return bin(s); r = strtoul(s, &errc, 0); if (*errc) { fprintf(stderr, "%s: not a valid representation\n", s); exit(2); } return r; } int * parse_addr(char *s) { static int a[256]; int pos, r1, r2; char *t; t = strchr(s, '-'); if (!t) { a[0] = parse_value(s); a[1] = -1; return a; } *t = 0; r1 = parse_value(s); r2 = parse_value(t+1); pos = 0; while (r1<=r2 && pos