diff options
-rw-r--r-- | num.c | 187 |
1 files changed, 91 insertions, 96 deletions
@@ -1,128 +1,123 @@ +#include <stdlib.h> #include <stdio.h> +#include <string.h> +#include <ctype.h> -#define LONG 0 -#define WORD 1 -#define BYTE 2 - -main(argc,argv) -int argc; -char *argv[]; - -{ - signed long snum; - unsigned long num; - unsigned short word; - unsigned char byte; - double dbl; - int mode=LONG; - int arg=0; - int f; - char *binary(); - char *ascii(); - - if(argc==1) - { - printf("%s: usage %s N1 [..Nn]\n",argv[0],argv[0]); - exit(-1); - } - - for(f=1;f<argc;f++) - { - num=(unsigned long)strtoul(argv[f],(char **)NULL,0); - snum=(signed long)num; - - if (num<0x100) - mode=BYTE; - else if (num<0x10000) - mode=WORD; - else - mode=LONG; - - switch(mode) - { - case LONG: - memcpy(&dbl,&num,sizeof(unsigned long)); - printf("Original : %s\n",argv[f]); - printf("Octal : %o\n",num); - printf("Uns. Dec : %u\n",num); - printf("Sgn. Dec : %ld\n",snum); - printf("Hex : %8.8X\n",num); - printf("Binary : %s\n",binary(num,32)); - printf("Ascii : %s\n",ascii(num,4)); - printf("Double : %f\n\n",dbl); - break; - case WORD: - word=(unsigned short)num; - printf("Original : %s\n",argv[f]); - printf("Octal : %o\n",word); - printf("Uns. Dec : %u\n",word); - printf("Sgn. Dec : %ld\n",(signed short)snum); - printf("Hex : %4.4X\n",word); - printf("Binary : %s\n",binary(word,16)); - printf("Ascii : %s\n\n",ascii((unsigned long)word,2)); - break; - case BYTE: - byte=(unsigned char)num; - printf("Original : %s\n",argv[f]); - printf("Octal : %o\n",byte); - printf("Uns. Dec : %u\n",byte); - printf("Sgn. Dec : %ld\n",(signed char)snum); - printf("Hex : %2.2X\n",byte); - printf("Binary : %s\n",binary(byte,8)); - printf("Ascii : %s\n\n",ascii((unsigned long)byte,1)); - break; - } - } -} - - -char *binary(i,w) -unsigned long i,w; - +static char *binary(unsigned long long i, int w) { - static char buff[1024],*p; - unsigned long c=w,b=1<<(w-1); + static char buff[1024]; int first=1; + char *p; + unsigned long long b; + int c; + + b = 1<<(w-1); - p=buff; + p = buff; - for(;c--;b=b>>1) + for(c = w; c--; b = b>>1) + { + if (((c+1)%4) == 0 && !first) { - if (!((c+1)%4)&&!first) *p++=' '; + } if(i&b) + { *p++='1'; + } else + { *p++='0'; + } first=0; - } + } - *p='\0'; + *p = 0; - return(buff); + return buff; } -char *ascii(num,l) -unsigned long num; +static char *ascii(unsigned long long num, int l) { - static char s[5]; + static char s[1024]; int f; unsigned char c; s[l]=0; - for(f=0;f<l;f++) - { - c=num&0xff; - if ((c>=32)&&(c<127)) + for(f = 0; f < l; f++) + { + c = num&0xff; + + if (isprint(c)) + { s[(l-1)-f]=c; + } else + { s[(l-1)-f]='.'; - num=num>>8; } - return(s); + num = num>>8; + } + + return s; +} + + +int main(int argc, char *argv[]) +{ + long long snum; + long long num; + unsigned short word; + unsigned char byte; + int h_width; + int b_width; + int f; + + if(argc == 1) + { + printf("%s: usage %s N1 [..Nn]\n",argv[0],argv[0]); + exit(EXIT_FAILURE); + } + + for(f = 1; f < argc; f++) + { + num = strtoull(argv[f], NULL, 0); + snum=(signed long long)num; + + if (num < 0x100ull) + { + h_width = 2; + b_width = 8; + } + else if (num < 0x10000ull) + { + h_width = 4; + b_width = 16; + } + else if (num < 0x100000000ull) + { + h_width = 8; + b_width = 32; + } + else + { + h_width = 16; + b_width = 64; + } + + printf("Original : %s\n", argv[f]); + printf("Octal : %llo\n", num); + printf("Uns. Dec : %llu\n", num); + printf("Sgn. Dec : %lld\n", snum); + printf("Hex : %*.*llX\n", h_width, h_width, num); + printf("Binary : %s\n", binary(num, b_width)); + printf("Ascii : %s\n", ascii(num, b_width/4)); + } + + return EXIT_SUCCESS; } |