added -D
[tridge/junkcode.git] / dump_file.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <ctype.h>
5 #include <sys/types.h>
6 #include <sys/mman.h>
7 #include <sys/stat.h>
8 #include <unistd.h>
9 #include <fcntl.h>
10
11 typedef unsigned char uint8_t;
12 typedef unsigned uint32;
13
14 void dump_data(int level, const char *buf1,int len)
15 {
16 #define DEBUGADD(lvl, x) printf x
17 #define MIN(a,b) ((a)<(b)?(a):(b))
18         void print_asc(int level, const uint8_t *buf,int len) {
19                 int i;
20                 for (i=0;i<len;i++)
21                         DEBUGADD(level,("%c", isprint(buf[i])?buf[i]:'.'));
22         }
23         const uint8_t *buf = (const uint8_t *)buf1;
24         int i=0;
25         if (len<=0) return;
26
27
28         DEBUGADD(level,("[%06X] ",i));
29         for (i=0;i<len;) {
30                 DEBUGADD(level,("%02X ",(int)buf[i]));
31                 i++;
32                 if (i%8 == 0) DEBUGADD(level,(" "));
33                 if (i%16 == 0) {      
34                         print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
35                         print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
36                         if (i<len) DEBUGADD(level,("[%06X] ",i));
37                 }
38         }
39         if (i%16) {
40                 int n;
41                 n = 16 - (i%16);
42                 DEBUGADD(level,(" "));
43                 if (n>8) DEBUGADD(level,(" "));
44                 while (n--) DEBUGADD(level,("   "));
45                 n = MIN(8,i%16);
46                 print_asc(level,&buf[i-(i%16)],n); DEBUGADD(level,( " " ));
47                 n = (i%16) - n;
48                 if (n>0) print_asc(level,&buf[i-n],n); 
49                 DEBUGADD(level,("\n"));    
50         }       
51 }
52
53 static void *map_file(char *fname, size_t *size)
54 {
55         int fd = open(fname, O_RDONLY);
56         struct stat st;
57         void *p;
58         
59         fstat(fd, &st);
60         p = mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
61         close(fd);
62
63         *size = st.st_size;
64         return p;
65 }
66
67 int main(int argc, char *argv[])
68 {
69         unsigned char *p;
70         size_t size;
71
72         p = map_file(argv[1], &size);   
73
74         dump_data(0, p, size);
75
76         return 0;
77 }