00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifdef HAVE_CONFIG_H
00019 # include <dtn-config.h>
00020 #endif
00021
00022 #include <stdio.h>
00023 #include <unistd.h>
00024 #include <errno.h>
00025 #include <strings.h>
00026 #include <string.h>
00027 #include <stdlib.h>
00028
00029 #include "sdnv-c.h"
00030
00031 char* progname;
00032 char* numstr;
00033 char* end;
00034 int len;
00035 u_char buf[1024];
00036 u_int64_t val;
00037
00038 int mode = 0;
00039 #define ENCODE 1
00040 #define DECODE 2
00041
00042 char hex[] = "0123456789abcdef";
00043 #define HEXTONUM(x) ((x) < 'a' ? (x) - '0' : x - 'a' + 10)
00044
00045 int main(int argc, char* argv[])
00046 {
00047 size_t i;
00048 memset(buf, 0, sizeof(buf));
00049
00050 progname = strrchr(argv[0], '/');
00051 if (progname == 0) {
00052 progname = argv[0];
00053 } else {
00054 progname++;
00055 }
00056
00057 if (!strcmp(progname, "num2sdnv")) {
00058 mode = ENCODE;
00059 } else if (!strcmp(progname, "sdnv2num")) {
00060 mode = DECODE;
00061 }
00062
00063 argv++;
00064 argc--;
00065
00066 while (argc > 1) {
00067 char* arg = argv[0];
00068 argv++;
00069 argc--;
00070
00071 if (!strcmp(arg, "-e")) {
00072 mode = ENCODE;
00073 } else if (!strcmp(arg, "-d")) {
00074 mode = DECODE;
00075 } else {
00076 fprintf(stderr, "unknown argument %s\n", arg);
00077 exit(1);
00078 }
00079 }
00080
00081 if (argc != 1 || mode == 0) {
00082 fprintf(stderr, "usage: %s [-de] <num>\n"
00083 " -e encode number to sdnv\n"
00084 " -d decode sdnv to number\n",
00085 progname);
00086 exit(1);
00087 }
00088
00089 numstr = argv[0];
00090 if (mode == ENCODE) {
00091 if (numstr[0] == '0' && numstr[1] == 'x') {
00092 val = strtoull(numstr + 2, &end, 16);
00093 } else {
00094 val = strtoull(numstr, &end, 10);
00095 }
00096 if (*end != '\0') {
00097 fprintf(stderr, "invalid number %s\n", numstr);
00098 exit(1);
00099 }
00100
00101 len = sdnv_encode(val, buf, sizeof(buf));
00102 } else {
00103 if (numstr[0] == '0' && numstr[1] == 'x') {
00104 numstr += 2;
00105 }
00106
00107 if ((strlen(numstr) % 2) != 0) {
00108 fprintf(stderr, "number string %s must contain full bytes\n",
00109 numstr);
00110 exit(1);
00111 }
00112
00113 for (i = 0; i < strlen(numstr) / 2; ++i) {
00114 buf[i] = (HEXTONUM(numstr[2*i]) << 4) +
00115 HEXTONUM(numstr[2*i + 1]);
00116 }
00117 len = sdnv_decode(buf, strlen(numstr)/2, &val);
00118 }
00119
00120 printf("val: %llu (0x%llx)\n", (unsigned long long)val, (unsigned long long)val);
00121 printf("len: %d\n", len);
00122 printf("sdnv: ");
00123 if (len > 0) {
00124 for (i = 0; i < (size_t)len; ++i) {
00125 printf("%c%c", hex[(buf[i] >> 4) & 0xf], hex[buf[i] & 0xf]);
00126 }
00127 }
00128 printf("\n");
00129
00130 return 0;
00131 }