1303980Sngie/*- 2303980Sngie * Copyright (c) 2015 The NetBSD Foundation, Inc. 3303980Sngie * All rights reserved. 4303980Sngie * 5303980Sngie * This code is derived from software contributed to The NetBSD Foundation 6303980Sngie * by Christos Zoulas. 7303980Sngie * 8303980Sngie * Redistribution and use in source and binary forms, with or without 9303980Sngie * modification, are permitted provided that the following conditions 10303980Sngie * are met: 11303980Sngie * 1. Redistributions of source code must retain the above copyright 12303980Sngie * notice, this list of conditions and the following disclaimer. 13303980Sngie * 2. Redistributions in binary form must reproduce the above copyright 14303980Sngie * notice, this list of conditions and the following disclaimer in the 15303980Sngie * documentation and/or other materials provided with the distribution. 16303980Sngie * 17303980Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18303980Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19303980Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20303980Sngie * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21303980Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22303980Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23303980Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24303980Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25303980Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26303980Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27303980Sngie * POSSIBILITY OF SUCH DAMAGE. 28303980Sngie */ 29303980Sngie#include <sys/cdefs.h> 30303980Sngie__RCSID("$NetBSD: h_lfsr.c,v 1.1 2015/11/18 18:35:35 christos Exp $"); 31303980Sngie 32303980Sngie#include <stdio.h> 33303980Sngie#include <stdlib.h> 34303980Sngie#include <fcntl.h> 35303980Sngie#include <err.h> 36303980Sngie#include <string.h> 37303980Sngie#include <unistd.h> 38303980Sngie#include <db.h> 39303980Sngie 40303980Sngie#define MAXKEY 0xffff 41303980Sngie#ifdef DEBUG 42303980Sngie#define DPRINTF(...) printf(__VA_ARGS__) 43303980Sngie#else 44303980Sngie#define DPRINTF(...) 45303980Sngie#endif 46303980Sngie 47303980Sngiestatic uint16_t 48303980Sngienext(uint16_t *cur) 49303980Sngie{ 50303980Sngie uint16_t lsb = *cur & 1; 51303980Sngie *cur >>= 1; 52303980Sngie *cur ^= (-lsb) & 0xB400u; 53303980Sngie return *cur; 54303980Sngie} 55303980Sngie 56303980Sngieint 57303980Sngiemain(int argc, char *argv[]) 58303980Sngie{ 59303980Sngie char buf[65536]; 60303980Sngie char kb[256]; 61303980Sngie DBT key, val; 62303980Sngie DB *db; 63303980Sngie HASHINFO hi; 64303980Sngie uint8_t c; 65303980Sngie uint16_t len; 66303980Sngie uint32_t pagesize = atoi(argv[1]); 67303980Sngie 68303980Sngie memset(&hi, 0, sizeof(hi)); 69303980Sngie memset(buf, 'a', sizeof(buf)); 70303980Sngie hi.bsize = pagesize; 71303980Sngie hi.nelem = 65536; 72303980Sngie hi.ffactor = 128; 73303980Sngie 74303980Sngie key.data = kb; 75303980Sngie val.data = buf; 76303980Sngie 77303980Sngie db = dbopen(NULL, O_CREAT|O_TRUNC|O_RDWR, 0, DB_HASH, &hi); 78303980Sngie if (db == NULL) 79303980Sngie err(EXIT_FAILURE, "dbopen"); 80303980Sngie 81303980Sngie len = 0xaec1; 82303980Sngie for (size_t i = 0; i < MAXKEY; i++) { 83303980Sngie key.size = (len & 0xff) + 1; 84303980Sngie c = len >> 8; 85303980Sngie memset(kb, c, key.size); 86303980Sngie val.size = (next(&len) & 0xff) + 1; 87303980Sngie switch ((*db->put)(db, &key, &val, R_NOOVERWRITE)) { 88303980Sngie case 0: 89303980Sngie DPRINTF("put %zu %zu %#x\n", 90303980Sngie key.size, val.size, c); 91303980Sngie break; 92303980Sngie case -1: 93303980Sngie err(EXIT_FAILURE, "put error %zu %zu %#x", 94303980Sngie key.size, val.size, c); 95303980Sngie case 1: 96303980Sngie errx(EXIT_FAILURE, "put overwrite %zu %zu %#x", 97303980Sngie key.size, val.size, c); 98303980Sngie default: 99303980Sngie abort(); 100303980Sngie } 101303980Sngie } 102303980Sngie 103303980Sngie len = 0xaec1; 104303980Sngie for (size_t i = 0; i < MAXKEY; i++) { 105303980Sngie key.size = (len & 0xff) + 1; 106303980Sngie c = len >> 8; 107303980Sngie memset(kb, c, key.size); 108303980Sngie next(&len); 109303980Sngie switch ((*db->get)(db, &key, &val, 0)) { 110303980Sngie case 0: 111303980Sngie DPRINTF("get %zu %zu %#x\n", 112303980Sngie key.size, val.size, c); 113303980Sngie break; 114303980Sngie case -1: 115303980Sngie err(EXIT_FAILURE, "get %zu %zu %#x", 116303980Sngie key.size, val.size, c); 117303980Sngie case 1: 118303980Sngie errx(EXIT_FAILURE, "get not found %zu %zu %#x", 119303980Sngie key.size, val.size, c); 120303980Sngie default: 121303980Sngie abort(); 122303980Sngie } 123303980Sngie if (memcmp(key.data, kb, key.size) != 0) 124303980Sngie errx(EXIT_FAILURE, "get badkey %zu %zu %#x", 125303980Sngie key.size, val.size, c); 126303980Sngie if (val.size != (len & 0xff) + 1U) 127303980Sngie errx(EXIT_FAILURE, "get badvallen %zu %zu %#x", 128303980Sngie key.size, val.size, c); 129303980Sngie if (memcmp(val.data, buf, val.size) != 0) 130303980Sngie errx(EXIT_FAILURE, "get badval %zu %zu %#x", 131303980Sngie key.size, val.size, c); 132303980Sngie } 133303980Sngie 134303980Sngie len = 0xaec1; 135303980Sngie for (size_t i = 0; i < MAXKEY; i++) { 136303980Sngie key.size = (len & 0xff) + 1; 137303980Sngie c = len >> 8; 138303980Sngie memset(kb, c, key.size); 139303980Sngie next(&len); 140303980Sngie switch ((*db->del)(db, &key, 0)) { 141303980Sngie case 0: 142303980Sngie DPRINTF("del %zu %zu %#x\n", 143303980Sngie key.size, val.size, c); 144303980Sngie break; 145303980Sngie case -1: 146303980Sngie err(EXIT_FAILURE, "del %zu %zu %#x", key.size, 147303980Sngie val.size, c); 148303980Sngie case 1: 149303980Sngie errx(EXIT_FAILURE, "del not found %zu %zu %#x", 150303980Sngie key.size, val.size, c); 151303980Sngie default: 152303980Sngie abort(); 153303980Sngie } 154303980Sngie } 155303980Sngie 156303980Sngie len = 0xaec1; 157303980Sngie for (size_t i = 0; i < MAXKEY; i++) { 158303980Sngie key.size = (len & 0xff) + 1; 159303980Sngie c = len >> 8; 160303980Sngie memset(kb, c, key.size); 161303980Sngie next(&len); 162303980Sngie switch ((*db->get)(db, &key, &val, 0)) { 163303980Sngie case 0: 164303980Sngie errx(EXIT_FAILURE, "get2 found %zu %zu %#x", 165303980Sngie key.size, val.size, c); 166303980Sngie break; 167303980Sngie case -1: 168303980Sngie err(EXIT_FAILURE, "get2 %zu %zu %#x", 169303980Sngie key.size, val.size, c); 170303980Sngie case 1: 171303980Sngie DPRINTF("get2 %zu %zu %#x\n", 172303980Sngie key.size, val.size, c); 173303980Sngie break; 174303980Sngie default: 175303980Sngie abort(); 176303980Sngie } 177303980Sngie } 178303980Sngie return 0; 179303980Sngie} 180