]> arthur.barton.de Git - bup.git/blob - hsplit.c
Actually hash stuff, and add a basic 'make test'.
[bup.git] / hsplit.c
1 #include <stdio.h>
2 #include <stdint.h>
3 #include <assert.h>
4 #include <memory.h>
5
6 #define BLOBBITS (14)
7 #define BLOBSIZE (1<<(BLOBBITS-1))
8 #define WINDOWBITS (7)
9 #define WINDOWSIZE (1<<(WINDOWBITS-1))
10
11
12 static uint32_t rol(uint32_t v, unsigned bits)
13 {
14     bits = bits % 32;
15     return (v << bits) | (v >> (32-bits));
16 }
17
18
19 static uint32_t stupidsum_add(uint32_t old, uint8_t drop, uint8_t add)
20 {
21     return ((old<<1) | (old>>31)) ^ drop ^ add;
22 }
23
24
25 static void test_sums()
26 {
27     uint32_t sum = 0;
28     int i;
29     
30     for (i = 0; i < WINDOWSIZE; i++)
31         sum = stupidsum_add(sum, 0, i%256);
32     uint32_t sum1 = sum;
33     
34     for (i = 0; i < WINDOWSIZE; i++)
35         sum = stupidsum_add(sum, i%256, i%256);
36     assert(sum1 == sum);
37     
38     for (i = 0; i < WINDOWSIZE; i++)
39         sum = stupidsum_add(sum, i%256, 0);
40     assert(sum == 0);
41 }
42
43
44 int main()
45 {
46     assert(rol(1,0) == 1);
47     assert(rol(1,1) == 2);
48     assert(rol(1,32) == 1);
49     assert(rol(1,33) == 2);
50     assert(rol(0x12345678, 16) == 0x56781234);
51     assert(rol(0x12345678, 34) == 0x48d159e0);
52     assert(rol(0x92345678, 34) == 0x48d159e2);
53     assert(WINDOWSIZE >= 32);
54     assert(BLOBSIZE >= 32);
55     test_sums();
56     
57     uint8_t buf[WINDOWSIZE];
58     uint32_t sum = 0;
59     int i = 0, count = 0, c;
60     FILE *pipe = NULL;
61     
62     memset(buf, 0, sizeof(buf));
63     
64     while ((c = fgetc(stdin)) != EOF)
65     {
66         sum = stupidsum_add(sum, buf[i], c);
67         buf[i] = c;
68         
69         //int cprint = (c >= 32 && c <= 126) ? c : '.';
70         //fprintf(stderr, "[%05X] %02X '%c' %08X\n", i, c, cprint, sum);
71         
72         i = (i + 1) % WINDOWSIZE;
73         count++;
74         
75         if ((sum & (BLOBSIZE-1)) == 0)
76         {
77             fprintf(stderr, "SPLIT @ %d (%d)\n", count, BLOBSIZE);
78             count = i = 0;
79             memset(buf, 0, sizeof(buf));
80             if (pipe)
81             {
82                 fflush(stderr);
83                 pclose(pipe);
84                 pipe = NULL;
85             }
86         }
87         
88         if (!pipe)
89             pipe = popen("git hash-object --stdin -w", "w");
90         fputc(c, pipe);
91     }
92     
93     if (pipe)
94         pclose(pipe);
95     
96     return 0;
97 }