summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cleanindex.c23
-rw-r--r--src/cutfile.c33
-rw-r--r--src/dumppointers.c84
-rw-r--r--src/extractblocks.c69
-rw-r--r--src/extractstreets.c66
-rw-r--r--src/joinfields.c21
-rw-r--r--src/makepic.c62
-rw-r--r--src/splitfiles.c126
-rw-r--r--src/testmap.c19
9 files changed, 503 insertions, 0 deletions
diff --git a/src/cleanindex.c b/src/cleanindex.c
new file mode 100644
index 0000000..fb15bed
--- /dev/null
+++ b/src/cleanindex.c
@@ -0,0 +1,23 @@
1#include "mystdlib.h"
2#include <sys/mman.h>
3#include <fcntl.h>
4
5static int indexed = -1;
6
7int main( int argc, char **argv ) {
8 MAP index = NULL;
9 int i;
10
11 if( argc != 2 )
12 { fputs( "Syntax: cleanindex <indexfile>", stderr); exit( 1 ); }
13
14 if( !(index = map_file( argv[1], 0 ) ) ) exit( 1 );
15
16 for( i = 0; i < index->size; i+= 16 )
17 *((unsigned long*)(index->addr + i)) += *((unsigned char*)index->addr + i + 4);
18
19 unmap_file( &index );
20 close( indexed );
21
22 return 0;
23}
diff --git a/src/cutfile.c b/src/cutfile.c
new file mode 100644
index 0000000..a2c87dc
--- /dev/null
+++ b/src/cutfile.c
@@ -0,0 +1,33 @@
1#include "mystdlib.h"
2#include <unistd.h>
3
4int main( int argc, char **argv )
5{
6 MAP file = NULL;
7 unsigned long i = 0;
8
9 if( !(file = map_file( argv[1], 0 ) ) ) exit( 1 );
10
11 if( file->size & 15 )
12 puts( "WARNING: File size not multiple of 16" );
13
14 while( i < file->size && *(unsigned long*)(file->addr+i) < 2911418625UL )
15 i+= 16;
16
17 if( i < file->size)
18 {
19 if( i ) {
20 off_t newsize = (off_t)i;
21 printf( "%s reduced by %8d bytes. (Offending offset: %09lu)\n", argv[1], (unsigned long)(file->size - i ), *(unsigned long*)(file->addr+i) );
22 ftruncate( file->fh, newsize );
23 } else {
24 printf( "%s removed. (Offending offset: %09lu)\n", argv[1], *(unsigned long*)(file->addr+i) );
25 unlink( argv[1] );
26 }
27 }
28
29 unmap_file( &file );
30
31
32 return 0;
33}
diff --git a/src/dumppointers.c b/src/dumppointers.c
new file mode 100644
index 0000000..c677d71
--- /dev/null
+++ b/src/dumppointers.c
@@ -0,0 +1,84 @@
1#include <stdio.h>
2#include <unistd.h>
3#include <fcntl.h>
4
5static unsigned char to_lower[] = {
60x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x0B, 0x0C, 0x00, 0x0E, 0x0F,
70x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
80x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
90x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
100x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
110x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
120x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
130x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
140x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
150x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
160xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
170xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
180xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
190xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
200xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
210xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
22};
23
24int main( int args, char **argv )
25{
26 int fd[0x10000];
27 int run = 1, row;
28
29 memset( fd, 0, sizeof(fd) );
30
31 if( (args != 2) || ((row = atol(argv[1]))==0))
32 {
33 fprintf( stderr, "syntax: %s row", *argv );
34 exit( 1 );
35 }
36
37 while( run )
38 {
39 unsigned long offs = ftell( stdin );
40 unsigned char input[1024];
41 unsigned char *line = gets( input );
42 if( !line )
43 {
44 run = 0;
45 } else {
46 unsigned long rowc = row;
47 unsigned short int i = 0;
48
49 while( (--rowc) && line[i] )
50 while( line[i] && ( line[i++] != 9 ));
51
52 if( line[i] )
53 {
54 unsigned char a, b, x;
55 while( ( a = to_lower[line[i]]) && ( b = to_lower[line[i+1]]) )
56 {
57 unsigned char outblock[16];
58 unsigned int j;
59
60 memset( outblock, 0, sizeof( outblock ) );
61 *(unsigned long*)outblock = offs + i;
62 outblock[4] = (unsigned char) i;
63
64 if( !fd[ a | ( b << 8 )] ) {
65 char fn[5] = { 'A' + ( a >> 4 ), 'A' + ( a & 15 ),
66 'A' + ( b >> 4 ), 'A' + ( b & 15 ), 0 };
67 if( ( fd[ a | ( b << 8 )] = open( fn, O_RDWR | O_CREAT, 0644 ) ) == -1 )
68 { fprintf( stderr, "Couldn't open: %s\n", fn ); exit( 1 ); }
69 }
70
71 for( j=0; (j < 10) && (x = to_lower[line[i + j + 2]]); ++j )
72 outblock[ 5 + j ] = x;
73
74 write( fd[ a | ( b << 8 )], outblock, sizeof(outblock) );
75
76 i++;
77 }
78 while( line[i++] );
79 }
80 }
81 }
82
83 return 0;
84}
diff --git a/src/extractblocks.c b/src/extractblocks.c
new file mode 100644
index 0000000..51505ef
--- /dev/null
+++ b/src/extractblocks.c
@@ -0,0 +1,69 @@
1#include <sys/types.h>
2#include <sys/stat.h>
3#include <sys/mman.h>
4#include <strings.h>
5#include <stdio.h>
6#include <fcntl.h>
7
8int main( int args, char **argv )
9{
10 int toindex;
11 int i, run = 1, filenum = 0, offset = 0, oldoffset = -1;
12 struct stat fstatus;
13 unsigned char *mappedfile;
14
15 if( args != 2 )
16 { fputs( "Missing filenames.", stderr ); exit( 1 ); }
17
18 if( ( toindex = open( argv[1], O_RDONLY ) ) < 0 )
19 { fprintf( stderr, "Can't open file: %s.\n", argv[1] ); exit( toindex ); }
20
21 fstat( toindex, &fstatus );
22
23 printf( "Size of file: %d\n", fstatus.st_size );
24
25 if( ( mappedfile = mmap( NULL, (size_t)fstatus.st_size, PROT_READ | PROT_WRITE, MAP_NOCORE | MAP_PRIVATE, toindex, 0) ) == MAP_FAILED )
26 { fprintf( stderr, "Can't mmap file: %s.", argv[1] ); exit( 1 ); }
27
28 while( run )
29 {
30 while( ( offset < fstatus.st_size ) && (
31 ( mappedfile[ offset + 0 ] != 0xd9 ) ||
32 ( mappedfile[ offset + 2 ] != 0x6f ) ||
33 ( mappedfile[ offset + 3 ] != 0x6d ) ||
34 ( mappedfile[ offset + 4 ] != 0xaa ) ||
35 ( mappedfile[ offset + 5 ] != 0x11 ) ||
36 ( mappedfile[ offset + 6 ] != 0x6f )
37 ) ) offset++;
38
39 printf( "Found an appropriate offset at: %d\n", oldoffset );
40
41 if( offset == fstatus.st_size )
42 run = 0;
43
44 if( oldoffset != -1 )
45 {
46 unsigned long *mf = (unsigned long*)(mappedfile + oldoffset);
47 unsigned char filename[20], cs = 0;
48
49 for( i=0; i<8; ++i)
50 mf[i]^=0x014224c2;
51
52 snprintf( filename, sizeof( filename ), "%05d.lha", filenum++ );
53
54 memcpy( ((unsigned char*)mf) + 22, filename, 5);
55
56 for( i=2; i<29; ++i)
57 cs += ((unsigned char*)mf)[i];
58 ((unsigned char*)mf)[1] = cs;
59
60 i = open( filename, O_CREAT | O_TRUNC | O_WRONLY, 0644 );
61 write( i, mf, offset - oldoffset );
62 close( i );
63 }
64 oldoffset = offset;
65 offset++;
66 }
67
68 return 0;
69}
diff --git a/src/extractstreets.c b/src/extractstreets.c
new file mode 100644
index 0000000..097a736
--- /dev/null
+++ b/src/extractstreets.c
@@ -0,0 +1,66 @@
1#include <sys/types.h>
2#include <sys/stat.h>
3#include <sys/mman.h>
4#include <strings.h>
5#include <stdio.h>
6#include <fcntl.h>
7
8int main( int args, char **argv )
9{
10 int toindex;
11 int i, run = 1, filenum = 0, offset = 0, oldoffset = -1;
12 struct stat fstatus;
13 unsigned char *mappedfile;
14
15 if( args != 2 )
16 { fputs( "Missing filenames.", stderr ); exit( 1 ); }
17
18 if( ( toindex = open( argv[1], O_RDONLY ) ) < 0 )
19 { fprintf( stderr, "Can't open file: %s.\n", argv[1] ); exit( toindex ); }
20
21 fstat( toindex, &fstatus );
22
23 printf( "Size of file: %d\n", fstatus.st_size );
24
25 if( ( mappedfile = mmap( NULL, (size_t)fstatus.st_size, PROT_READ | PROT_WRITE, MAP_NOCORE | MAP_PRIVATE, toindex, 0) ) == MAP_FAILED )
26 { fprintf( stderr, "Can't mmap file: %s.", argv[1] ); exit( 1 ); }
27
28 while( run )
29 {
30 while( ( offset < fstatus.st_size ) && (
31 ( mappedfile[ offset + 0 ] != 0x22 ) ||
32 ( mappedfile[ offset + 2 ] != 0x2d ) ||
33 ( mappedfile[ offset + 3 ] != 0x6c ) ||
34 ( mappedfile[ offset + 4 ] != 0x68 ) ||
35 ( ( mappedfile[ offset + 5 ] != 0x35 ) && ( mappedfile[ offset + 5 ] != 0x30 )) ||
36 ( mappedfile[ offset + 6 ] != 0x2d )
37 ) ) offset++;
38
39 printf( "Found an appropriate offset at: %d\n", oldoffset );
40
41 if( offset == fstatus.st_size )
42 run = 0;
43
44 if( oldoffset != -1 )
45 {
46 unsigned long *mf = (unsigned long*)(mappedfile + oldoffset);
47 unsigned char filename[20], cs = 0;
48
49 snprintf( filename, sizeof( filename ), "%012d.lha", filenum++ );
50
51 memcpy( ((unsigned char*)mf) + 22, filename, 12);
52
53 for( i=2; i<36; ++i)
54 cs += ((unsigned char*)mf)[i];
55 ((unsigned char*)mf)[1] = cs;
56
57 i = open( filename, O_CREAT | O_TRUNC | O_WRONLY, 0644 );
58 write( i, mf, offset - oldoffset );
59 close( i );
60 }
61 oldoffset = offset;
62 offset++;
63 }
64
65 return 0;
66}
diff --git a/src/joinfields.c b/src/joinfields.c
new file mode 100644
index 0000000..2415842
--- /dev/null
+++ b/src/joinfields.c
@@ -0,0 +1,21 @@
1#define BUFSIZE 0x100000
2
3int main() {
4 unsigned char rein[BUFSIZE];
5 unsigned long bytes_read;
6
7 while( (bytes_read = read( 0, rein, BUFSIZE)) != 0)
8 {
9 int i;
10 const int maxentries = bytes_read / 16;
11 for( i=1; i<maxentries; i++) {
12 rein[i*5+0] = rein[i*16+0];
13 rein[i*5+1] = rein[i*16+1];
14 rein[i*5+2] = rein[i*16+2];
15 rein[i*5+3] = rein[i*16+3];
16 rein[i*5+4] = rein[i*16+4];
17 }
18 write( 1, rein, maxentries*5);
19 }
20 return 0;
21}
diff --git a/src/makepic.c b/src/makepic.c
new file mode 100644
index 0000000..5c54cbd
--- /dev/null
+++ b/src/makepic.c
@@ -0,0 +1,62 @@
1//#define MUENCHEN
2//#define MAGDEBURG
3#define BREMEN
4
5#ifdef MUENCHEN
6/* Muenchen */
7#define GEOXMIN 5295821.0
8#define GEOXMAX 5334858.0
9#define GEOYMIN 3233408.0
10#define GEOYMAX 3270042.0
11#endif
12
13#ifdef MAGDEBURG
14/* Magdeburg */
15#define GEOXMIN 5305003.0
16#define GEOXMAX 5316797.0
17#define GEOYMIN 3682236.0
18#define GEOYMAX 3704266.0
19#endif
20
21#ifdef BREMEN
22/* Bremen */
23#define GEOXMIN 5098053.0
24#define GEOXMAX 5134674.0
25#define GEOYMIN 3784147.0
26#define GEOYMAX 3819770.0
27#endif
28
29#define GEOXSIZE (GEOXMAX - GEOXMIN)
30#define GEOYSIZE (GEOYMAX - GEOYMIN)
31
32#define PICXSIZE (2*768.0)
33#define PICYSIZE (2*768.0)
34
35#include <stdio.h>
36#include <math.h>
37
38int main( int args, char **argv)
39{
40 unsigned long pic[ (long)(PICXSIZE * (PICYSIZE+10)) ];
41 char line[1024];
42 int x, y;
43
44 double xscale = (PICXSIZE / GEOXSIZE),
45 yscale = (PICYSIZE / GEOYSIZE);
46 double scale = xscale > yscale ? yscale : xscale;
47
48 memset( pic, 0, sizeof( pic));
49
50 while( scanf( "%ld\t%ld\n", &x, &y) == 2)
51 {
52 double myx = x - GEOXMIN, myy = GEOYSIZE - (y - GEOYMIN);
53 if( (x < GEOXMAX) && (x >= GEOXMIN) && (y < GEOYMAX) && (y >= GEOYMIN))
54 pic[ (long)(((long)(myx * scale)) + ((long)( myy * scale )) * (long)PICXSIZE) ]++;
55 }
56
57 printf( "P5\n%ld %ld\n255\n", (long)PICXSIZE, (long)PICYSIZE );
58 for( x = 0; x < PICXSIZE * PICYSIZE; x++)
59 putchar( sqrt( 32*256*256 * pic[ x ]));
60
61 return 0;
62}
diff --git a/src/splitfiles.c b/src/splitfiles.c
new file mode 100644
index 0000000..d49971b
--- /dev/null
+++ b/src/splitfiles.c
@@ -0,0 +1,126 @@
1#include "mystdlib.h"
2
3#define NUMFIELDS 12
4#define PREFIX "teiln/"
5
6#define STREETFIELD 3
7#define HOUSENUMFIELD 4
8#define ZIPCODEFIELD 6
9#define TOWNFIELD 7
10
11char **generate_index( MAP toindex )
12{
13 off_t fileidx = 0, idxidx = 0;
14 char **index;
15
16 while( fileidx < toindex->size )
17 if( !toindex->addr[ fileidx++ ] ) idxidx++;
18 index = (char**)malloc( sizeof( char *) * idxidx );
19
20 fileidx = idxidx = 0;
21 if( index )
22 {
23 while( fileidx < toindex->size )
24 {
25 index[ idxidx++ ] = toindex->addr + fileidx;
26 while( (fileidx < toindex->size) && (toindex->addr[ fileidx++]));
27 }
28 }
29 return index;
30}
31
32static int g_coordidxsize;
33
34int coordcmp( const void *s1, const void *s2 )
35{
36 return strncmp( s1, s2, g_coordidxsize );
37}
38
39int main( )
40{
41 int i = 0, j, k, leave = 0;
42 off_t in1, in2, in3;
43 char fname[32], **streetnames = NULL;
44 MAP streets = NULL, vnames, nnames, tables, coords = NULL;
45
46 if( !(coords = map_file( "coords/list", true ))) goto cleanup_main;
47 if( !(streets = map_file( "streets/list",true ))) goto cleanup_main;
48 if( !(streetnames = generate_index( streets ))) goto cleanup_main;
49
50 for( i=0; !leave; i+=3 )
51 {
52 int fof[ NUMFIELDS ];
53 char coordidx[160], *coordline;
54 vnames = nnames = tables = NULL;
55
56 snprintf( fname, sizeof( fname ), PREFIX "%05d", i );
57 if( !( tables = map_file( fname, true ) ) ) goto cleanup_loop;
58 snprintf( fname, sizeof( fname ), PREFIX "%05d", i+1 );
59 if( !( nnames = map_file( fname, true ) ) ) goto cleanup_loop;
60 snprintf( fname, sizeof( fname ), PREFIX "%05d", i+2 );
61 if( !( vnames = map_file( fname, true ) ) ) goto cleanup_loop;
62
63 in1 = 0x34; in2 = 0x34; in3 = 0;
64
65 for( j = 0; j < NUMFIELDS; ++j)
66 {
67 fof[ j ] = in1;
68 for( k = 0; k < 3000; ++k )
69 while( tables->addr[ in1++ ]);
70 }
71
72 for( j = 0; j < 3000; ++j )
73 {
74 char *stringend;
75 int v = strtoul( tables->addr + fof[ STREETFIELD ], &stringend, 16 );
76 char *currentstreet = ( stringend == (char*)(tables->addr + fof[ STREETFIELD ])) ? "" : streetnames[ v ];
77 int xco= 0, yco= 0;
78
79 printf( "%s\t%s", nnames->addr+in2, vnames->addr+in3 );
80 while( nnames->addr[ in2++ ] );
81 while( vnames->addr[ in3++ ] );
82
83 g_coordidxsize = snprintf( coordidx, sizeof( coordidx ), "%s;%s;%s;%s;",
84 tables->addr + fof [ ZIPCODEFIELD ],
85 tables->addr + fof [ TOWNFIELD ],
86 currentstreet,
87 tables->addr + fof [ HOUSENUMFIELD ] );
88
89 if( !(coordline = (char*)bsearch( coordidx, coords->addr, coords->size / 90, 90, coordcmp ))) coordline = ";;;;;;";
90 v = 5; while( v--) { while( *coordline && *coordline++ != ';'); }
91 sscanf( coordline, "%d;%d", &xco, &yco );
92
93 for( k = 0; k < NUMFIELDS; ++k )
94 {
95 if( k == STREETFIELD )
96 {
97 printf( "\t%s", currentstreet);
98 }
99 else
100 printf( "\t%s", tables->addr + fof[ k ] );
101 {
102 }
103 while( tables->addr [ fof[ k ]++] );
104 }
105
106 printf( "\t%d\t%d", xco, yco );
107 putchar( 10 );
108 }
109
110 leave ^= 1;
111
112 cleanup_loop:
113 leave ^= 1;
114
115 unmap_file( &vnames );
116 unmap_file( &nnames );
117 unmap_file( &tables );
118 }
119
120 cleanup_main:
121 if( streetnames ) free( streetnames );
122 unmap_file( &streets );
123 unmap_file( &coords );
124
125 return 0;
126}
diff --git a/src/testmap.c b/src/testmap.c
new file mode 100644
index 0000000..d57ac80
--- /dev/null
+++ b/src/testmap.c
@@ -0,0 +1,19 @@
1#include "mystdlib.h"
2
3int main ( int args, char **argv)
4{
5 MAP f1 = NULL;
6 int i,j = 0;
7
8 if( !(f1 = map_file(argv[1], 1)))
9 puts( "Aua");
10 else
11 printf( "%09d %08X %09d\t", f1->fh, f1->addr, f1->size);
12
13 for( i=0; i < f1->size; ++i )
14 j += f1->addr[i];
15
16 printf( "%09d\n", j );
17
18 unmap_file( &f1 );
19}