Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
michael@0 | 1 | /*- |
michael@0 | 2 | * Copyright (c) 1990, 1993, 1994 |
michael@0 | 3 | * The Regents of the University of California. All rights reserved. |
michael@0 | 4 | * |
michael@0 | 5 | * This code is derived from software contributed to Berkeley by |
michael@0 | 6 | * Margo Seltzer. |
michael@0 | 7 | * |
michael@0 | 8 | * Redistribution and use in source and binary forms, with or without |
michael@0 | 9 | * modification, are permitted provided that the following conditions |
michael@0 | 10 | * are met: |
michael@0 | 11 | * 1. Redistributions of source code must retain the above copyright |
michael@0 | 12 | * notice, this list of conditions and the following disclaimer. |
michael@0 | 13 | * 2. Redistributions in binary form must reproduce the above copyright |
michael@0 | 14 | * notice, this list of conditions and the following disclaimer in the |
michael@0 | 15 | * documentation and/or other materials provided with the distribution. |
michael@0 | 16 | * 3. ***REMOVED*** - see |
michael@0 | 17 | * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change |
michael@0 | 18 | * 4. Neither the name of the University nor the names of its contributors |
michael@0 | 19 | * may be used to endorse or promote products derived from this software |
michael@0 | 20 | * without specific prior written permission. |
michael@0 | 21 | * |
michael@0 | 22 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
michael@0 | 23 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
michael@0 | 24 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
michael@0 | 25 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
michael@0 | 26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
michael@0 | 27 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
michael@0 | 28 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
michael@0 | 29 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
michael@0 | 30 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
michael@0 | 31 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
michael@0 | 32 | * SUCH DAMAGE. |
michael@0 | 33 | * |
michael@0 | 34 | * @(#)page.h 8.2 (Berkeley) 5/31/94 |
michael@0 | 35 | */ |
michael@0 | 36 | |
michael@0 | 37 | /* |
michael@0 | 38 | * Definitions for hashing page file format. |
michael@0 | 39 | */ |
michael@0 | 40 | |
michael@0 | 41 | /* |
michael@0 | 42 | * routines dealing with a data page |
michael@0 | 43 | * |
michael@0 | 44 | * page format: |
michael@0 | 45 | * +------------------------------+ |
michael@0 | 46 | * p | n | keyoff | datoff | keyoff | |
michael@0 | 47 | * +------------+--------+--------+ |
michael@0 | 48 | * | datoff | free | ptr | --> | |
michael@0 | 49 | * +--------+---------------------+ |
michael@0 | 50 | * | F R E E A R E A | |
michael@0 | 51 | * +--------------+---------------+ |
michael@0 | 52 | * | <---- - - - | data | |
michael@0 | 53 | * +--------+-----+----+----------+ |
michael@0 | 54 | * | key | data | key | |
michael@0 | 55 | * +--------+----------+----------+ |
michael@0 | 56 | * |
michael@0 | 57 | * Pointer to the free space is always: p[p[0] + 2] |
michael@0 | 58 | * Amount of free space on the page is: p[p[0] + 1] |
michael@0 | 59 | */ |
michael@0 | 60 | |
michael@0 | 61 | /* |
michael@0 | 62 | * How many bytes required for this pair? |
michael@0 | 63 | * 2 shorts in the table at the top of the page + room for the |
michael@0 | 64 | * key and room for the data |
michael@0 | 65 | * |
michael@0 | 66 | * We prohibit entering a pair on a page unless there is also room to append |
michael@0 | 67 | * an overflow page. The reason for this it that you can get in a situation |
michael@0 | 68 | * where a single key/data pair fits on a page, but you can't append an |
michael@0 | 69 | * overflow page and later you'd have to split the key/data and handle like |
michael@0 | 70 | * a big pair. |
michael@0 | 71 | * You might as well do this up front. |
michael@0 | 72 | */ |
michael@0 | 73 | #ifndef PAGE_H |
michael@0 | 74 | #define PAGE_H |
michael@0 | 75 | |
michael@0 | 76 | #define PAIRSIZE(K,D) (2*sizeof(uint16) + (K)->size + (D)->size) |
michael@0 | 77 | #define BIGOVERHEAD (4*sizeof(uint16)) |
michael@0 | 78 | #define KEYSIZE(K) (4*sizeof(uint16) + (K)->size); |
michael@0 | 79 | #define OVFLSIZE (2*sizeof(uint16)) |
michael@0 | 80 | #define FREESPACE(P) ((P)[(P)[0]+1]) |
michael@0 | 81 | #define OFFSET(P) ((P)[(P)[0]+2]) |
michael@0 | 82 | #define PAIRFITS(P,K,D) \ |
michael@0 | 83 | (((P)[2] >= REAL_KEY) && \ |
michael@0 | 84 | (PAIRSIZE((K),(D)) + OVFLSIZE) <= FREESPACE((P))) |
michael@0 | 85 | #define PAGE_META(N) (((N)+3) * sizeof(uint16)) |
michael@0 | 86 | |
michael@0 | 87 | typedef struct { |
michael@0 | 88 | BUFHEAD *newp; |
michael@0 | 89 | BUFHEAD *oldp; |
michael@0 | 90 | BUFHEAD *nextp; |
michael@0 | 91 | uint16 next_addr; |
michael@0 | 92 | } SPLIT_RETURN; |
michael@0 | 93 | #endif |
michael@0 | 94 |