Update nwlib/libc/search directory

Joel Sherrill joel@rtems.org
Wed Jul 3 14:50:00 GMT 2019


Hi

It looks like a lot of the changes are to move to standard fixed width
types like uint32_t and clean up. I see the calloc lost a cast and some #if
conditionals lost parentheses.

There is an ifdef for 64-bit stat(). I don't know if newlib has a
conditional that should be used to trip that feature or not. But letting it
default to 32-bit stat would be OK to get it working and then we all can
decide how/if to trip that based on something in newlib.

I noticed a change to use pwrite() instead of write() but that should be
OK. It is in <unistd.h> per POSIX.

If the question is to use the new version and continue pushing, then the
answer is yes.

--joel

On Wed, Jul 3, 2019 at 3:13 AM Vaibhav Gupta <vaibhavgupta40@gmail.com>
wrote:

>
>
> On Tue, Jul 2, 2019 at 8:58 PM Joel Sherrill <joel@rtems.org> wrote:
>
>>
>>
>> On Tue, Jul 2, 2019 at 6:41 AM Vaibhav Gupta <vaibhavgupta40@gmail.com>
>> wrote:
>>
>>> Hello everyone,
>>> I have ported    ndbm.h    to newlib from FreeBSD.
>>> I have placed     ndbm.h     to     newlib/libc/include     directory
>>> and
>>> ndbm.c     to    newlib/libc/posix     directory .
>>>
>>> But I realized, the function declaration of __hash_open in newlib is:
>>> DB      *__hash_open(const char *, int, int, int, const HASHINFO *);
>>>
>>> and in FreeBSD it is:
>>> DB      *__hash_open(const char *, int, int, const HASHINFO *, int);
>>> .
>>> .
>>> .
>>> .
>>> Although I made required changes in    ndbm.c      but I guess maybe the
>>> entire search.h should be updated to newer FreeBSD resource?
>>> Should we do that?
>>>
>>
>> I think so. It looks like previous merges have cherry picked code needed
>> for
>> ndbm support and it all needs to be updated in sync.
>>
> Brian replied to my mail last time. He pointed out various updates:
> https://sourceware.org/ml/newlib/2019/msg00250.html
>
>>
>> Out of curiosity, are the parameters all the same but the last two are in
>> different
>> order or did something more substantial change in the __hash_open
>> signature?
>>
> at few places I saw introduction of new functions, may be they are for
> optimizations.
> newlib -
> https://github.com/VARoDeK/newlib/blob/master/newlib/libc/search/hash.c
> freebsd -
> https://github.com/freebsd/freebsd/blob/master/lib/libc/db/hash/hash.c
> =======================================
> Here is the output generated by 'diff' command;
>
> $ ~/temp  diff hashnewlib.c hashfreeBSD.c
> 1a2,3
> >  * SPDX-License-Identifier: BSD-3-Clause
> >  *
> 16,20c18
> <  * 3. All advertising materials mentioning features or use of this
> software
> <  *    must display the following acknowledgement:
> <  * This product includes software developed by the University of
> <  * California, Berkeley and its contributors.
> <  * 4. Neither the name of the University nor the names of its
> contributors
> ---
> >  * 3. Neither the name of the University nor the names of its
> contributors
> 37d34
> < #include <sys/param.h>
> 42c39
> < #include <sys/types.h>
> ---
> > __FBSDID("$FreeBSD$");
> 43a41,42
> > #include "namespace.h"
> > #include <sys/param.h>
> 54a54
> > #include "un-namespace.h"
> 56,57c56
> < #define __DBINTERFACE_PRIVATE /* activate prototypes from db_local.h */
> < #include "db_local.h"
> ---
> > #include <db.h>
> 66c65
> < static int   hash_delete(const DB *, const DBT *, u_int);
> ---
> > static int   hash_delete(const DB *, const DBT *, u_int32_t);
> 68,69c67,68
> < static int   hash_get(const DB *, const DBT *, DBT *, u_int);
> < static int   hash_put(const DB *, DBT *, const DBT *, u_int);
> ---
> > static int   hash_get(const DB *, const DBT *, DBT *, u_int32_t);
> > static int   hash_put(const DB *, DBT *, const DBT *, u_int32_t);
> 71,72c70,71
> < static int   hash_seq(const DB *, DBT *, DBT *, u_int);
> < static int   hash_sync(const DB *, u_int);
> ---
> > static int   hash_seq(const DB *, DBT *, DBT *, u_int32_t);
> > static int   hash_sync(const DB *, u_int32_t);
> 76c75
> < #if (BYTE_ORDER == LITTLE_ENDIAN)
> ---
> > #if BYTE_ORDER == LITTLE_ENDIAN
> 81,88d79
> < /* Macros for min/max.  */
> < #ifndef MIN
> < #define MIN(a,b) (((a)<(b))?(a):(b))
> < #endif
> < #ifndef MAX
> < #define MAX(a,b) (((a)>(b))?(a):(b))
> < #endif
> <
> 106,111c97,101
> < extern DB *
> < __hash_open (const char *file,
> < int flags,
> < int mode,
> < int dflags,
> < const HASHINFO *info) /* Special directives for create */
> ---
> > /* ARGSUSED */
> > DB *
> > __hash_open(const char *file, int flags, int mode,
> >     const HASHINFO *info, /* Special directives for create */
> >     int dflags)
> 114,117d103
> <
> < #ifdef __USE_INTERNAL_STAT64
> <         struct stat64 statbuf;
> < #else
> 119d104
> < #endif
> 140,150d124
> < new_table = 0;
> < if (!file || (flags & O_TRUNC) ||
> < #ifdef __USE_INTERNAL_STAT64
> <    (_stat64(file, &statbuf) && (errno == ENOENT))) {
> < #else
> <    (stat(file, &statbuf) && (errno == ENOENT))) {
> < #endif
> < if (errno == ENOENT)
> < errno = 0; /* Just in case someone looks at errno */
> < new_table = 1;
> < }
> 152c126
> < if ((hashp->fp = open(file, flags, mode)) == -1)
> ---
> > if ((hashp->fp = _open(file, flags | O_CLOEXEC, mode)) == -1)
> 153a128,131
> > new_table = _fstat(hashp->fp, &statbuf) == 0 &&
> >    statbuf.st_size == 0 && (flags & O_ACCMODE) != O_RDONLY;
> > } else
> > new_table = 1;
> 155,168d132
> < /* if the .db file is empty, and we had permission to create
> <   a new .db file, then reinitialize the database */
> < if ((flags & O_CREAT) &&
> < #ifdef __USE_INTERNAL_STAT64
> <     _fstat64(hashp->fp, &statbuf) == 0 && statbuf.st_size == 0)
> < #else
> <     fstat(hashp->fp, &statbuf) == 0 && statbuf.st_size == 0)
> < #endif
> < new_table = 1;
> <
> < #ifdef HAVE_FCNTL
> < (void)fcntl(hashp->fp, F_SETFD, 1);
> < #endif
> < }
> 170c134
> < if (!(hashp = init_hash(hashp, file, (HASHINFO *)info)))
> ---
> > if (!(hashp = init_hash(hashp, file, info)))
> 179,180c143,144
> < hdrsize = read(hashp->fp, &hashp->hdr, sizeof(HASHHDR));
> < #if (BYTE_ORDER == LITTLE_ENDIAN)
> ---
> > hdrsize = _read(hashp->fp, &hashp->hdr, sizeof(HASHHDR));
> > #if BYTE_ORDER == LITTLE_ENDIAN
> 191,192c155,156
> < if (hashp->HASH_VERSION != HASHVERSION &&
> <    hashp->HASH_VERSION != OLDHASHVERSION)
> ---
> > if (hashp->VERSION != HASHVERSION &&
> >    hashp->VERSION != OLDHASHVERSION)
> 194c158
> < if (hashp->hash(CHARKEY, sizeof(CHARKEY)) != hashp->H_CHARKEY)
> ---
> > if ((int32_t)hashp->hash(CHARKEY, sizeof(CHARKEY)) != hashp->H_CHARKEY)
> 196,198d159
> <                 /* Check bucket size isn't too big for target int. */
> <                 if (hashp->BSIZE > INT_MAX)
> <                         RETURN_ERROR(EFTYPE, error1);
> 204,206c165
> < nsegs = (hashp->MAX_BUCKET + 1 + hashp->SGSIZE - 1) /
> < hashp->SGSIZE;
> < hashp->nsegs = 0;
> ---
> > nsegs = howmany(hashp->MAX_BUCKET + 1, hashp->SGSIZE);
> 219c178
> < (void)memset(&hashp->mapp[0], 0, bpages * sizeof(__uint32_t *));
> ---
> > (void)memset(&hashp->mapp[0], 0, bpages * sizeof(u_int32_t *));
> 249c208
> <
> "%s\n%s%x\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%x\n%s%x\n%s%d\n%s%d\n",
> ---
> >
> "%s\n%s%p\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%x\n%s%x\n%s%d\n%s%d\n",
> 273c232
> < (void)close(hashp->fp);
> ---
> > (void)_close(hashp->fp);
> 282,283c241
> < hash_close(dbp)
> < DB *dbp;
> ---
> > hash_close(DB *dbp)
> 298,299c256
> < hash_fd(dbp)
> < const DB *dbp;
> ---
> > hash_fd(const DB *dbp)
> 316,319c273
> < init_hash(hashp, file, info)
> < HTAB *hashp;
> < const char *file;
> < const HASHINFO *info;
> ---
> > init_hash(HTAB *hashp, const char *file, const HASHINFO *info)
> 321,323d274
> < #ifdef __USE_INTERNAL_STAT64
> <         struct stat64 statbuf;
> < #else
> 325d275
> < #endif
> 330c280
> <        hashp->LORDER = DB_BYTE_ORDER;
> ---
> > hashp->LORDER = BYTE_ORDER;
> 343,345d292
> < #ifdef __USE_INTERNAL_STAT64
> < if (_stat64(file, &statbuf))
> < #else
> 347d293
> < #endif
> 349c295,297
> < hashp->BSIZE = MIN(statbuf.st_blksize, MAX_BSIZE);
> ---
> > hashp->BSIZE = statbuf.st_blksize;
> > if (hashp->BSIZE > MAX_BSIZE)
> > hashp->BSIZE = MAX_BSIZE;
> 370,371c318,319
> <                        if (info->lorder != DB_BIG_ENDIAN &&
> <                            info->lorder != DB_LITTLE_ENDIAN) {
> ---
> > if (info->lorder != BIG_ENDIAN &&
> >    info->lorder != LITTLE_ENDIAN) {
> 391,393c339
> < init_htab(hashp, nelem)
> < HTAB *hashp;
> < int nelem;
> ---
> > init_htab(HTAB *hashp, int nelem)
> 395,396c341
> < int nbuckets, nsegs;
> < int l2;
> ---
> > int nbuckets, nsegs, l2;
> 437,438c382
> < hdestroy(hashp)
> < HTAB *hashp;
> ---
> > hdestroy(HTAB *hashp)
> 477,479c421,430
> <
> < if (hashp->fp != -1)
> < (void)close(hashp->fp);
> ---
> > if (hashp->tmp_key)
> > free(hashp->tmp_key);
> > if (hashp->tmp_buf)
> > free(hashp->tmp_buf);
> >
> > if (hashp->fp != -1) {
> > if (hashp->save_file)
> > (void)_fsync(hashp->fp);
> > (void)_close(hashp->fp);
> > }
> 497,499c448
> < hash_sync(dbp, flags)
> < const DB *dbp;
> < u_int flags;
> ---
> > hash_sync(const DB *dbp, u_int32_t flags)
> 515a465,466
> > if (hashp->fp != -1 && _fsync(hashp->fp) != 0)
> > return (ERROR);
> 526,527c477
> < flush_meta(hashp)
> < HTAB *hashp;
> ---
> > flush_meta(HTAB *hashp)
> 530c480
> < #if (BYTE_ORDER == LITTLE_ENDIAN)
> ---
> > #if BYTE_ORDER == LITTLE_ENDIAN
> 538c488
> < hashp->HASH_VERSION = HASHVERSION;
> ---
> > hashp->VERSION = HASHVERSION;
> 543c493
> < #if (BYTE_ORDER == LITTLE_ENDIAN)
> ---
> > #if BYTE_ORDER == LITTLE_ENDIAN
> 547,548c497
> < if ((lseek(fp, (off_t)0, SEEK_SET) == -1) ||
> <    ((wsize = write(fp, whdrp, sizeof(HASHHDR))) == -1))
> ---
> > if ((wsize = pwrite(fp, whdrp, sizeof(HASHHDR), (off_t)0)) == -1)
> 574,578c523
> < hash_get(dbp, key, data, flag)
> < const DB *dbp;
> < const DBT *key;
> < DBT *data;
> < u_int flag;
> ---
> > hash_get(const DB *dbp, const DBT *key, DBT *data, u_int32_t flag)
> 591,595c536
> < hash_put(dbp, key, data, flag)
> < const DB *dbp;
> < DBT *key;
> < const DBT *data;
> < u_int flag;
> ---
> > hash_put(const DB *dbp, DBT *key, const DBT *data, u_int32_t flag)
> 601,602c542
> < hashp->error = EINVAL;
> < errno = EINVAL;
> ---
> > hashp->error = errno = EINVAL;
> 614,617c554,555
> < hash_delete(dbp, key, flag)
> < const DB *dbp;
> < const DBT *key;
> < u_int flag; /* Ignored */
> ---
> > hash_delete(const DB *dbp, const DBT *key,
> >     u_int32_t flag) /* Ignored */
> 637,640c575
> < hash_access(hashp, action, key, val)
> < HTAB *hashp;
> < ACTION action;
> < DBT *key, *val;
> ---
> > hash_access(HTAB *hashp, ACTION action, DBT *key, DBT *val)
> 644c579
> < __uint16_t *bp;
> ---
> > u_int16_t *bp;
> 647c582
> < __uint16_t pageno;
> ---
> > u_int16_t pageno;
> 663c598
> < for (bp = (__uint16_t *)rbufp->page, n = *bp++, ndx = 1; ndx < n;)
> ---
> > for (bp = (u_int16_t *)rbufp->page, n = *bp++, ndx = 1; ndx < n;)
> 682c617
> < bp = (__uint16_t *)rbufp->page;
> ---
> > bp = (u_int16_t *)rbufp->page;
> 704c639
> < bp = (__uint16_t *)rbufp->page;
> ---
> > bp = (u_int16_t *)rbufp->page;
> 738c673
> < bp = (__uint16_t *)rbufp->page;
> ---
> > bp = (u_int16_t *)rbufp->page;
> 766,769c701
> < hash_seq(dbp, key, data, flag)
> < const DB *dbp;
> < DBT *key, *data;
> < u_int flag;
> ---
> > hash_seq(const DB *dbp, DBT *key, DBT *data, u_int32_t flag)
> 771c703
> < __uint32_t bucket;
> ---
> > u_int32_t bucket;
> 774c706
> < __uint16_t *bp, ndx;
> ---
> > u_int16_t *bp, ndx;
> 789c721
> <
> ---
> > next_bucket:
> 799c731
> < bp = (__uint16_t *)bufp->page;
> ---
> > bp = (u_int16_t *)bufp->page;
> 804c736
> < if (hashp->cbucket > hashp->MAX_BUCKET) {
> ---
> > if ((u_int32_t)hashp->cbucket > hashp->MAX_BUCKET) {
> 808,809c740,751
> < } else
> < bp = (__uint16_t *)hashp->cpage->page;
> ---
> > } else {
> > bp = (u_int16_t *)hashp->cpage->page;
> > if (flag == R_NEXT || flag == 0) {
> > hashp->cndx += 2;
> > if (hashp->cndx > bp[0]) {
> > hashp->cpage = NULL;
> > hashp->cbucket++;
> > hashp->cndx = 1;
> > goto next_bucket;
> > }
> > }
> > }
> 820c762
> < bp = (__uint16_t *)(bufp->page);
> ---
> > bp = (u_int16_t *)(bufp->page);
> 832a775,776
> > if (hashp->cpage == NULL)
> > return (ERROR);
> 837,843d780
> < ndx += 2;
> < if (ndx > bp[0]) {
> < hashp->cpage = NULL;
> < hashp->cbucket++;
> < hashp->cndx = 1;
> < } else
> < hashp->cndx = ndx;
> 855,857c792,793
> < extern int
> < __expand_table(hashp)
> < HTAB *hashp;
> ---
> > int
> > __expand_table(HTAB *hashp)
> 859c795
> < __uint32_t old_bucket, new_bucket;
> ---
> > u_int32_t old_bucket, new_bucket;
> 881c817
> <    (SEGMENT)calloc(hashp->SGSIZE, sizeof(SEGMENT))) == NULL)
> ---
> >    calloc(hashp->SGSIZE, sizeof(SEGMENT))) == NULL)
> 911,913c847
> < hash_realloc(p_ptr, oldsize, newsize)
> < SEGMENT **p_ptr;
> < int oldsize, newsize;
> ---
> > hash_realloc(SEGMENT **p_ptr, int oldsize, int newsize)
> 926,930c860,861
> < extern __uint32_t
> < __call_hash(hashp, k, len)
> < HTAB *hashp;
> < char *k;
> < int len;
> ---
> > u_int32_t
> > __call_hash(HTAB *hashp, char *k, int len)
> 932c863
> < int n, bucket;
> ---
> > unsigned int n, bucket;
> 947,949c878
> < alloc_segs(hashp, nsegs)
> < HTAB *hashp;
> < int nsegs;
> ---
> > alloc_segs(HTAB *hashp, int nsegs)
> 957c886
> <    (SEGMENT *)calloc(hashp->DSIZE, sizeof(SEGMENT *))) == NULL) {
> ---
> >    calloc(hashp->DSIZE, sizeof(SEGMENT *))) == NULL) {
> 962a892,894
> > hashp->nsegs = nsegs;
> > if (nsegs == 0)
> > return (0);
> 964,965c896
> < if ((store =
> <    (SEGMENT)calloc(nsegs << hashp->SSHIFT, sizeof(SEGMENT))) == NULL) {
> ---
> > if ((store = calloc(nsegs << hashp->SSHIFT, sizeof(SEGMENT))) == NULL) {
> 971c902
> < for (i = 0; i < nsegs; i++, hashp->nsegs++)
> ---
> > for (i = 0; i < nsegs; i++)
> 976c907
> < #if (BYTE_ORDER == LITTLE_ENDIAN)
> ---
> > #if BYTE_ORDER == LITTLE_ENDIAN
> 981,982c912
> < swap_header_copy(srcp, destp)
> < HASHHDR *srcp, *destp;
> ---
> > swap_header_copy(HASHHDR *srcp, HASHHDR *destp)
> 1010,1011c940
> < swap_header(hashp)
> < HTAB *hashp;
> ---
> > swap_header(HTAB *hashp)
>
>>
>> --joel
>>
>



More information about the Newlib mailing list