/* Display value of fixed point numbers */ #include #include /* Extract hex/decimal/or float value from string */ static int get_num_val(char *sval, unsigned *valp) { char *endp; /* See if it's an integer or floating point */ int ishex = 0; int isfloat = 0; int i; for (i = 0; sval[i]; i++) { switch (sval[i]) { case 'x': case 'X': ishex = 1; break; case 'e': case 'E': if (!ishex) isfloat = 1; break; case '.': isfloat = 1; break; default: break; } } if (isfloat) { return 0; /* Not supposed to have a float here */ } else { long long int llval = strtoll(sval, &endp, 0); long long int upperbits = llval >> 31; /* will give -1 for negative, 0 or 1 for positive */ if (valp && (upperbits == 0 || upperbits == -1 || upperbits == 1)) { *valp = (unsigned) llval; return 1; } return 0; } } void show_int(unsigned uf) { printf("Hex = 0x%.8x,\tSigned = %d,\tUnsigned = %u\n", uf, (int) uf, uf); } void usage(char *fname) { printf("Usage: %s val1 val2 ...\n", fname); printf("Values may be given in hex or decimal\n"); exit(0); } int main(int argc, char *argv[]) { int i; unsigned uf; if (argc < 2) usage(argv[0]); for (i = 1; i < argc; i++) { char *sval = argv[i]; if (get_num_val(sval, &uf)) { show_int(uf); } else { printf("Cannot convert '%s' to 32-bit number\n", sval); } } return 0; }