This is an automated email from the ASF dual-hosted git repository.

tuhaihe pushed a commit to branch REL_2_STABLE
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit b4e3d1337b7c69e0a18668a3137b9d043932518b
Author: Dianjin Wang <[email protected]>
AuthorDate: Tue Sep 29 17:34:24 2026 +0800

    Replace pg_cron's bitstring.h with the BSD-3 version
    
    pg_cron's bitstring.h carries the pre-4.4BSD form of the University of
    California license, which asks that documentation and advertising
    materials acknowledge UC Berkeley.  Replace it with FreeBSD's
    sys/sys/bitstring.h from stable/10, the same Berkeley code after UC
    Berkeley deleted the advertising clause (FreeBSD commit 82c6e8799148).
    That leaves it under the plain 3-clause BSD license, which RAT
    recognizes, so drop its exclude.
    
    The macros pg_cron uses (bit_decl, bit_set, bit_test, bit_nset and
    bit_nclear) behave the same; the multi-statement ones are now wrapped
    in do { } while (0).
    
    Assisted-by: Claude Code
---
 pom.xml                      |   1 -
 src/include/task/bitstring.h | 154 +++++++++++++++++++++++++------------------
 2 files changed, 89 insertions(+), 66 deletions(-)

diff --git a/pom.xml b/pom.xml
index 04beb4bc97d..d57560d51d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1445,7 +1445,6 @@ code or new licensing patterns.
             <!-- The following files are from pg_cron under PostgreSQL 
                  license, introduced by Cloudberry.
             -->
-            <exclude>src/include/task/bitstring.h</exclude>
             <exclude>src/include/task/cron.h</exclude>
             <exclude>src/include/task/pg_cron.h</exclude>
             <exclude>src/include/task/task_states.h</exclude>
diff --git a/src/include/task/bitstring.h b/src/include/task/bitstring.h
index 8a700662baa..125ef51d889 100644
--- a/src/include/task/bitstring.h
+++ b/src/include/task/bitstring.h
@@ -1,66 +1,80 @@
-/*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
+/*-
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * Paul Vixie.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * 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.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
  *
- *     @(#)bitstring.h 5.2 (Berkeley) 4/4/90
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS 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 THE REGENTS OR 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.
+ *
+ * $FreeBSD$
  */
 
+#ifndef _SYS_BITSTRING_H_
+#define        _SYS_BITSTRING_H_
+
 typedef        unsigned char bitstr_t;
 
 /* internal macros */
-/* byte of the bitstring bit is in */
+                               /* byte of the bitstring bit is in */
 #define        _bit_byte(bit) \
        ((bit) >> 3)
 
-/* mask for the bit within its byte */
+                               /* mask for the bit within its byte */
 #define        _bit_mask(bit) \
        (1 << ((bit)&0x7))
 
 /* external macros */
-/* bytes in a bitstring of nbits bits */
+                               /* bytes in a bitstring of nbits bits */
 #define        bitstr_size(nbits) \
-       ((((nbits) - 1) >> 3) + 1)
+       (((nbits) + 7) >> 3)
 
-/* allocate a bitstring */
+                               /* allocate a bitstring */
 #define        bit_alloc(nbits) \
-       (bitstr_t *)malloc(1, \
-           (unsigned int)bitstr_size(nbits) * sizeof(bitstr_t))
+       (bitstr_t *)calloc((size_t)bitstr_size(nbits), sizeof(bitstr_t))
 
-/* allocate a bitstring on the stack */
+                               /* allocate a bitstring on the stack */
 #define        bit_decl(name, nbits) \
-       (name)[bitstr_size(nbits)]
+       ((name)[bitstr_size(nbits)])
 
-/* is bit N of bitstring name set? */
+                               /* is bit N of bitstring name set? */
 #define        bit_test(name, bit) \
        ((name)[_bit_byte(bit)] & _bit_mask(bit))
 
-/* set bit N of bitstring name */
+                               /* set bit N of bitstring name */
 #define        bit_set(name, bit) \
-       (name)[_bit_byte(bit)] |= _bit_mask(bit)
+       ((name)[_bit_byte(bit)] |= _bit_mask(bit))
 
-/* clear bit N of bitstring name */
+                               /* clear bit N of bitstring name */
 #define        bit_clear(name, bit) \
-       (name)[_bit_byte(bit)] &= ~_bit_mask(bit)
+       ((name)[_bit_byte(bit)] &= ~_bit_mask(bit))
 
-/* clear bits start ... stop in bitstring */
-#define        bit_nclear(name, start, stop) { \
-       register bitstr_t *_name = name; \
-       register int _start = start, _stop = stop; \
+                               /* clear bits start ... stop in bitstring */
+#define        bit_nclear(name, start, stop) do { \
+       register bitstr_t *_name = (name); \
+       register int _start = (start), _stop = (stop); \
        register int _startbyte = _bit_byte(_start); \
        register int _stopbyte = _bit_byte(_stop); \
        if (_startbyte == _stopbyte) { \
@@ -72,12 +86,12 @@ typedef     unsigned char bitstr_t;
                        _name[_startbyte] = 0; \
                _name[_stopbyte] &= 0xff << ((_stop&0x7) + 1); \
        } \
-}
+} while (0)
 
-/* set bits start ... stop in bitstring */
-#define        bit_nset(name, start, stop) { \
-       register bitstr_t *_name = name; \
-       register int _start = start, _stop = stop; \
+                               /* set bits start ... stop in bitstring */
+#define        bit_nset(name, start, stop) do { \
+       register bitstr_t *_name = (name); \
+       register int _start = (start), _stop = (stop); \
        register int _startbyte = _bit_byte(_start); \
        register int _stopbyte = _bit_byte(_stop); \
        if (_startbyte == _stopbyte) { \
@@ -89,34 +103,44 @@ typedef    unsigned char bitstr_t;
                        _name[_startbyte] = 0xff; \
                _name[_stopbyte] |= 0xff >> (7 - (_stop&0x7)); \
        } \
-}
+} while (0)
 
-/* find first bit clear in name */
-#define        bit_ffc(name, nbits, value) { \
-       register bitstr_t *_name = name; \
-       register int _byte, _nbits = nbits; \
-       register int _stopbyte = _bit_byte(_nbits), _value = -1; \
-       for (_byte = 0; _byte <= _stopbyte; ++_byte) \
-               if (_name[_byte] != 0xff) { \
-                       _value = _byte << 3; \
-                       for (_stopbyte = _name[_byte]; (_stopbyte&0x1); \
-                           ++_value, _stopbyte >>= 1); \
-                       break; \
-               } \
+                               /* find first bit clear in name */
+#define        bit_ffc(name, nbits, value) do { \
+       register bitstr_t *_name = (name); \
+       register int _byte, _nbits = (nbits); \
+       register int _stopbyte = _bit_byte(_nbits - 1), _value = -1; \
+       if (_nbits > 0) \
+               for (_byte = 0; _byte <= _stopbyte; ++_byte) \
+                       if (_name[_byte] != 0xff) { \
+                               bitstr_t _lb; \
+                               _value = _byte << 3; \
+                               for (_lb = _name[_byte]; (_lb&0x1); \
+                                   ++_value, _lb >>= 1); \
+                               break; \
+                       } \
+       if (_value >= nbits) \
+               _value = -1; \
        *(value) = _value; \
-}
+} while (0)
 
-/* find first bit set in name */
-#define        bit_ffs(name, nbits, value) { \
-       register bitstr_t *_name = name; \
-       register int _byte, _nbits = nbits; \
-       register int _stopbyte = _bit_byte(_nbits), _value = -1; \
-       for (_byte = 0; _byte <= _stopbyte; ++_byte) \
-               if (_name[_byte]) { \
-                       _value = _byte << 3; \
-                       for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \
-                           ++_value, _stopbyte >>= 1); \
-                       break; \
-               } \
+                               /* find first bit set in name */
+#define        bit_ffs(name, nbits, value) do { \
+       register bitstr_t *_name = (name); \
+       register int _byte, _nbits = (nbits); \
+       register int _stopbyte = _bit_byte(_nbits - 1), _value = -1; \
+       if (_nbits > 0) \
+               for (_byte = 0; _byte <= _stopbyte; ++_byte) \
+                       if (_name[_byte]) { \
+                               bitstr_t _lb; \
+                               _value = _byte << 3; \
+                               for (_lb = _name[_byte]; !(_lb&0x1); \
+                                   ++_value, _lb >>= 1); \
+                               break; \
+                       } \
+       if (_value >= nbits) \
+               _value = -1; \
        *(value) = _value; \
-}
+} while (0)
+
+#endif /* !_SYS_BITSTRING_H_ */


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to