Paste: a simple (probably broken) tst in C
        
	
	
	
		| Author: | zedas | 
|---|
		| Mode: | c | 
|---|
		| Date: | Fri, 12 Dec 2008 05:08:44 | 
|---|
	
	Plain Text |
	
	#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
typedef struct tnode { 
    char splitchar; 
    struct tnode *low;
    struct tnode *equal;
    struct tnode *high; 
    void *value;
} tnode; 
void *search(tnode *root, char *s) 
{
    tnode *p = root;
    while (p) { 
        if (*s < p->splitchar) {
            p = p->low; 
        } else if (*s == p->splitchar) {
            if (*s == '\0') {
                return p->value;
            } else {
                s++;
                p = p->equal; 
            }
        } else {
            p = p->high; 
        }
    } 
    return NULL; 
}
tnode *insert(tnode *p, char *s, char *value)
{
    if (p == NULL) { 
        p = (tnode *) calloc(1,sizeof(tnode)); 
        p->splitchar = *s; 
    } 
    if (*s < p->splitchar) {
        p->low = insert(p->low, s, value); 
    } else if (*s == p->splitchar) { 
        if (*s != '\0') {
            p->equal = insert(p->equal, ++s, value); 
        } else {
            p->value = value;
        }
    } else 
        p->high = insert(p->high, s, value); 
    return p; 
}
void traverse(tnode *p) 
{
    if (!p) return; 
    traverse(p->low); 
    if (p->splitchar) 
        traverse(p->equal); 
    else {
        
    }
    traverse(p->high); 
}
int main(int argc, char **argv)
{
    int i;
    tnode *root = NULL;
    FILE *samples = NULL;
    int fd = 0;
    struct stat stats;
    char *data = NULL;
    char *key = NULL;
    char *val = NULL;
    unsigned int expected_modulo = (32*2+2);
    unsigned int record_count = 0;
    assert(!stat("samples.txt", &stats) && "Failed to stat.");
    
    assert(stats.st_size % expected_modulo == 0 && "File isn't right size.");
    record_count = stats.st_size / expected_modulo;
    assert(record_count > 0 && "No records in the file.");
    
    fd = open("samples.txt", O_RDONLY);
    assert(fd && "Couldn't open samples.txt.");
    
    data = (char *)mmap(NULL, stats.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
    assert(data && "Failed to mmap the file.");
    
    printf("processing %u records\n", record_count);
    root = insert(NULL, "/", "");
    for(i = 0; i < record_count; i++) {
        key = data + (expected_modulo * i);
        val = key + expected_modulo / 2;
        
        insert(root, key, val);
    }
    
    for(i = 0; i < record_count; i++) {
        key = data + (expected_modulo * i);
        val = search(root, key);
        assert(val && "Couldn't find the val for the key.");
        
        assert(!search(root, val) && "Found a val but should not.");
    }
    
    
}
	
	
		New Annotation