--- ray/src/common/objset.c 2003/02/22 02:07:22 2.8 +++ ray/src/common/objset.c 2015/04/28 16:56:10 2.17 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: objset.c,v 2.8 2003/02/22 02:07:22 greg Exp $"; +static const char RCSid[] = "$Id: objset.c,v 2.17 2015/04/28 16:56:10 greg Exp $"; #endif /* * objset.c - routines for maintaining object sets. @@ -7,62 +7,7 @@ static const char RCSid[] = "$Id: objset.c,v 2.8 2003/ * External symbols declared in object.h */ -/* ==================================================================== - * The Radiance Software License, Version 1.0 - * - * Copyright (c) 1990 - 2002 The Regents of the University of California, - * through Lawrence Berkeley National Laboratory. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes Radiance software - * (http://radsite.lbl.gov/) - * developed by the Lawrence Berkeley National Laboratory - * (http://www.lbl.gov/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" - * and "The Regents of the University of California" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact radiance@radsite.lbl.gov. - * - * 5. Products derived from this software may not be called "Radiance", - * nor may "Radiance" appear in their name, without prior written - * permission of Lawrence Berkeley National Laboratory. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of Lawrence Berkeley National Laboratory. For more - * information on Lawrence Berkeley National Laboratory, please see - * . - */ +#include "copyright.h" #include "standard.h" @@ -71,22 +16,30 @@ static const char RCSid[] = "$Id: objset.c,v 2.8 2003/ #include "object.h" #ifndef OSTSIZ -#ifdef BIGMEM -#define OSTSIZ 262139 /* object table size (a prime!) */ -#else +#ifdef SMLMEM #define OSTSIZ 32749 /* object table size (a prime!) */ +#else +#define OSTSIZ 262139 /* object table size (a prime!) */ #endif #endif +#undef xtra_long +#ifdef _WIN64 +typedef unsigned long long int xtra_long; +#else +typedef unsigned long int xtra_long; +#endif + static OBJECT *ostable[OSTSIZ]; /* the object set table */ void -insertelem(os, obj) /* insert obj into os, no questions */ -register OBJECT *os; -OBJECT obj; +insertelem( /* insert obj into os, no questions */ + OBJECT *os, + OBJECT obj +) { - register int i; + int i; for (i = os[0]++; i > 0; i--) if (os[i] > obj) @@ -98,11 +51,12 @@ OBJECT obj; void -deletelem(os, obj) /* delete obj from os, no questions */ -register OBJECT *os; -OBJECT obj; +deletelem( /* delete obj from os, no questions */ + OBJECT *os, + OBJECT obj +) { - register int i; + int i; i = (*os)--; os++; @@ -118,14 +72,15 @@ OBJECT obj; int -inset(os, obj) /* determine if object is in set */ -register OBJECT *os; -OBJECT obj; +inset( /* determine if object is in set */ + OBJECT *os, + OBJECT obj +) { int upper, lower; - register int cm, i; + int cm, i; - if ((i = os[0]) <= 6) { /* linear search algorithm */ + if ((i = os[0]) <= 12) { /* linear search algorithm */ cm = obj; while (i-- > 0) if (*++os == cm) @@ -150,10 +105,12 @@ OBJECT obj; int -setequal(os1, os2) /* determine if two sets are equal */ -register OBJECT *os1, *os2; +setequal( /* determine if two sets are equal */ + OBJECT *os1, + OBJECT *os2 +) { - register int i; + int i; for (i = *os1; i-- >= 0; ) if (*os1++ != *os2++) @@ -163,10 +120,12 @@ register OBJECT *os1, *os2; void -setcopy(os1, os2) /* copy object set os2 into os1 */ -register OBJECT *os1, *os2; +setcopy( /* copy object set os2 into os1 */ + OBJECT *os1, + OBJECT *os2 +) { - register int i; + int i; for (i = *os2; i-- >= 0; ) *os1++ = *os2++; @@ -174,12 +133,13 @@ register OBJECT *os1, *os2; OBJECT * -setsave(os) /* allocate space and save set */ -register OBJECT *os; +setsave( /* allocate space and save set */ + OBJECT *os +) { OBJECT *osnew; - register OBJECT *oset; - register int i; + OBJECT *oset; + int i; if ((osnew = oset = (OBJECT *)malloc((*os+1)*sizeof(OBJECT))) == NULL) error(SYSTEM, "out of memory in setsave\n"); @@ -190,10 +150,13 @@ register OBJECT *os; void -setunion(osr, os1, os2) /* osr = os1 Union os2 */ -register OBJECT *osr, *os1, *os2; +setunion( /* osr = os1 Union os2 */ + OBJECT *osr, + OBJECT *os1, + OBJECT *os2 +) { - register int i1, i2; + int i1, i2; osr[0] = 0; for (i1 = i2 = 1; i1 <= os1[0] || i2 <= os2[0]; ) { @@ -210,10 +173,13 @@ register OBJECT *osr, *os1, *os2; void -setintersect(osr, os1, os2) /* osr = os1 Intersect os2 */ -register OBJECT *osr, *os1, *os2; +setintersect( /* osr = os1 Intersect os2 */ + OBJECT *osr, + OBJECT *os1, + OBJECT *os2 +) { - register int i1, i2; + int i1, i2; osr[0] = 0; if (os1[0] <= 0) @@ -232,14 +198,15 @@ register OBJECT *osr, *os1, *os2; OCTREE -fullnode(oset) /* return octree for object set */ -OBJECT *oset; +fullnode( /* return octree for object set */ + OBJECT *oset +) { - int osentry, ntries; - long hval; + unsigned int ntries; + xtra_long hval; OCTREE ot; - register int i; - register OBJECT *os; + int osentry, i; + OBJECT *os; /* hash on set */ hval = 0; os = oset; @@ -248,7 +215,7 @@ OBJECT *oset; hval += *os++; ntries = 0; tryagain: - osentry = (hval + (long)ntries*ntries) % OSTSIZ; + osentry = (hval + (xtra_long)ntries*ntries) % OSTSIZ; os = ostable[osentry]; if (os == NULL) { os = ostable[osentry] = (OBJECT *)malloc( @@ -264,15 +231,16 @@ tryagain: ot = oseti(i*OSTSIZ + osentry); if (*os > 0) /* found it */ return(ot); - if (!isfull(ot)) /* entry overflow */ + if (!isfull(ot)) { /* entry overflow */ if (++ntries < OSTSIZ) goto tryagain; else error(INTERNAL, "hash table overflow in fullnode"); + } /* remember position */ i = os - ostable[osentry]; os = ostable[osentry] = (OBJECT *)realloc( - (char *)ostable[osentry], + (void *)ostable[osentry], (unsigned)(i+oset[0]+2)*sizeof(OBJECT)); if (os == NULL) goto memerr; @@ -284,16 +252,18 @@ tryagain: return(ot); memerr: error(SYSTEM, "out of memory in fullnode"); + return 0; /* pro forma return */ } void -objset(oset, ot) /* get object set for full node */ -register OBJECT *oset; -OCTREE ot; +objset( /* get object set for full node */ + OBJECT *oset, + OCTREE ot +) { - register OBJECT *os; - register int i; + OBJECT *os; + int i; if (!isfull(ot)) goto noderr; @@ -311,30 +281,10 @@ noderr: } -int -dosets(f) /* loop through all sets */ -int (*f)(); -{ - int res = 0; - int n; - register OBJECT *os; - - for (n = 0; n < OSTSIZ; n++) { - if ((os = ostable[n]) == NULL) - continue; - while (*os > 0) { - res += (*f)(os); - os += *os + 1; - } - } - return(res); -} - - void -donesets() /* free ALL SETS in our table */ +donesets(void) /* free ALL SETS in our table */ { - register int n; + int n; for (n = 0; n < OSTSIZ; n++) if (ostable[n] != NULL) {