summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--num.c187
1 files changed, 91 insertions, 96 deletions
diff --git a/num.c b/num.c
index b24da39..d826f8d 100644
--- a/num.c
+++ b/num.c
@@ -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;
}