Now also parse new diffs
[handlerosm.git] / osmbinary / decoder.c
blob28ad88ad714e9774be081979771aa46c39cce572
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/mman.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <string.h>
8 #include <errno.h>
9 #include <math.h>
10 #include <unistd.h>
12 #include "osmbinary.h"
14 int main(int argc, char *argv[]) {
15 int fd;
16 struct stat statbuf;
18 if (argc != 2)
19 exit(-1);
21 fprintf(stderr, "Analysing %s...\n", argv[1]);
23 fd = open(argv[1], O_RDONLY);
25 if (fd < 0)
26 exit(-1);
28 if (fstat (fd, &statbuf) == -1) { perror("fstat:"); exit(-1); }
30 if (statbuf.st_size > 0) {
31 char *range = NULL;
32 range = mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, (off_t) 0);
33 if (range == MAP_FAILED) { perror("Mmap:"); printf("(did you compile PAE in the kernel?)\n"); exit(-1); }
35 int i = 0;
37 while (i < statbuf.st_size) {
38 int j;
39 node_t bin_node;
40 tag_t bin_tag;
41 other_t bin_other;
42 nd_t bin_nd;
43 member_t bin_member;
45 switch (range[i++]) {
46 case 'N': {
47 unsigned char *len;
48 // fprintf(stderr, "\nindex: %d\n", i);
49 i += sizeof(bin_node.id) +
50 sizeof(bin_node.lat) +
51 sizeof(bin_node.lon) +
52 sizeof(bin_node.stamp);
54 len = (unsigned char *) &range[i];
55 i += sizeof(bin_node.userlen);
57 for (j = 0; j < *len; j++)
58 putchar(range[i + j]);
60 putchar('\n');
62 i += *len;
63 break;
65 case 'T': {
66 unsigned short int *len;
68 len = (unsigned short int *) &range[i];
69 i += sizeof(bin_tag.klen);
71 for (j = 0; j < *len; j++)
72 putchar(range[i + j]);
73 i += *len;
74 putchar('\n');
76 len = (unsigned short int *) &range[i];
77 i += sizeof(bin_tag.vlen);
79 for (j = 0; j < *len; j++)
80 putchar(range[i + j]);
81 i += *len;
82 putchar('\n');
84 break;
86 case 'W': {
87 unsigned char *len;
88 i += sizeof(bin_other.id) +
89 sizeof(bin_other.stamp);
91 len = (unsigned char *) &range[i];
92 i += sizeof(bin_other.userlen);
94 for (j = 0; j < *len; j++)
95 putchar(range[i + j]);
96 i += *len;
97 putchar('\n');
98 break;
100 case 'D': {
101 i += sizeof(bin_nd.id);
102 break;
104 case 'R': {
105 unsigned char *len;
106 i += sizeof(bin_other.id) +
107 sizeof(bin_other.stamp);
109 len = (unsigned char *) &range[i];
110 i += sizeof(bin_other.userlen);
112 for (j = 0; j < *len; j++)
113 putchar(range[i + j]);
114 i += *len;
115 putchar('\n');
116 break;
118 case 'M': {
119 unsigned short int *len;
121 len = (unsigned short int *) &range[i];
122 i += sizeof(bin_member.typelen);
124 for (j = 0; j < *len; j++)
125 putchar(range[i + j]);
126 i += *len;
127 putchar('\n');
129 len = (unsigned short int *) &range[i];
130 i += sizeof(bin_member.reflen);
132 for (j = 0; j < *len; j++)
133 putchar(range[i + j]);
134 i += *len;
135 putchar('\n');
137 len = (unsigned short int *) &range[i];
138 i += sizeof(bin_member.rolelen);
140 for (j = 0; j < *len; j++)
141 putchar(range[i + j]);
142 i += *len;
143 putchar('\n');
144 break;
146 default:
147 fprintf(stderr, "otherstate");
148 i = statbuf.st_size;
152 munmap(range, statbuf.st_size);
155 close(fd);
156 exit(0);