Re: license cleanup - Mailing list pgsql-patches

From Neil Conway
Subject Re: license cleanup
Date
Msg-id 4160FD31.2070800@samurai.com
Whole thread Raw
In response to Re: license cleanup  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: license cleanup
List pgsql-patches
Tom Lane wrote:
> I think it is a real bad idea to unilaterally change the copyright text
> in files we got from somewhere else, no matter how benign our intentions.

Agreed.

> Instead, how about adopting the NetBSD version of the functionality?
> If the files did indeed come from UCB originally, then NetBSD should
> have a copy too ...

Attached is a patch that replaces src/port/{strtol.c,strtoul.c} with
versions derived from current NetBSD CVS sources, which has a 3-clause
BSD license. The code is different than the FreeBSD sources in a few
ways (mostly trivial); I've eyeballed the diffs and I couldn't see
anything that would result in a change in behavior, but I may have
missed something. The NetBSD sources are actually better in a few ways
(e.g. they don't use the "register" keyword).

Barring any objections, I intend to apply this patch to HEAD on Tuesday.

There are a few more files whose licenses need updating, but I'll leave
that for later. And of course, there's contrib/ to sort out as well...

-Neil
Index: src/port/strtol.c
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/src/port/strtol.c,v
retrieving revision 1.4
diff -c -r1.4 strtol.c
*** src/port/strtol.c    29 Aug 2004 04:13:12 -0000    1.4
--- src/port/strtol.c    4 Oct 2004 06:20:12 -0000
***************
*** 1,28 ****
! /*
!  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
!  * Portions Copyright (c) 1990 The Regents of the University of California.
!  * 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. 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
!  *      may be used to endorse or promote products derived from this software
!  *      without specific prior written permission.
   *
   * 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)
--- 1,25 ----
! /*    $NetBSD: strtol.c,v 1.16 2003/08/07 16:43:44 agc Exp $    */
!
! /*-
!  * Copyright (c) 1990, 1993
!  *    The Regents of the University of California.  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. 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.
   *
   * 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)
***************
*** 33,47 ****
   */

  #if defined(LIBC_SCCS) && !defined(lint)
! static char sccsid[] = "@(#)strtol.c    5.4 (Berkeley) 2/23/91";
! #endif   /* LIBC_SCCS and not lint */

- #include <limits.h>
  #include <ctype.h>
  #include <errno.h>
  #include <stdlib.h>

- #define const

  /*
   * Convert a string to a long integer.
--- 30,47 ----
   */

  #if defined(LIBC_SCCS) && !defined(lint)
! #if 0
! static char sccsid[] = "@(#)strtol.c    8.1 (Berkeley) 6/4/93";
! #else
! __RCSID("$NetBSD: strtol.c,v 1.16 2003/08/07 16:43:44 agc Exp $");
! #endif
! #endif /* LIBC_SCCS and not lint */

  #include <ctype.h>
  #include <errno.h>
+ #include <limits.h>
  #include <stdlib.h>


  /*
   * Convert a string to a long integer.
***************
*** 51,87 ****
   */
  long
  strtol(nptr, endptr, base)
! const char *nptr;
! char      **endptr;
! int            base;
  {
!     const char *s = nptr;
!     unsigned long acc;
!     unsigned char c;
!     unsigned long cutoff;
!     int            neg = 0,
!                 any,
!                 cutlim;

      /*
!      * Skip white space and pick up leading +/- sign if any. If base is 0,
!      * allow 0x for hex and 0 for octal, else assume decimal; if base is
!      * already 16, allow 0x.
       */
!     do
!     {
!         c = *s++;
      } while (isspace(c));
!     if (c == '-')
!     {
          neg = 1;
          c = *s++;
      }
-     else if (c == '+')
-         c = *s++;
      if ((base == 0 || base == 16) &&
!         c == '0' && (*s == 'x' || *s == 'X'))
!     {
          c = s[1];
          s += 2;
          base = 16;
--- 51,86 ----
   */
  long
  strtol(nptr, endptr, base)
!     const char *nptr;
!     char **endptr;
!     int base;
  {
!     const char *s;
!     long acc, cutoff;
!     int c;
!     int neg, any, cutlim;
!
!     /* endptr may be NULL */

      /*
!      * Skip white space and pick up leading +/- sign if any.
!      * If base is 0, allow 0x for hex and 0 for octal, else
!      * assume decimal; if base is already 16, allow 0x.
       */
!     s = nptr;
!     do {
!         c = (unsigned char) *s++;
      } while (isspace(c));
!     if (c == '-') {
          neg = 1;
          c = *s++;
+     } else {
+         neg = 0;
+         if (c == '+')
+             c = *s++;
      }
      if ((base == 0 || base == 16) &&
!         c == '0' && (*s == 'x' || *s == 'X')) {
          c = s[1];
          s += 2;
          base = 16;
***************
*** 90,140 ****
          base = c == '0' ? 8 : 10;

      /*
!      * Compute the cutoff value between legal numbers and illegal numbers.
!      * That is the largest legal value, divided by the base.  An input
!      * number that is greater than this value, if followed by a legal
!      * input character, is too big.  One that is equal to this value may
!      * be valid or not; the limit between valid and invalid numbers is
!      * then based on the last digit.  For instance, if the range for longs
!      * is [-2147483648..2147483647] and the input base is 10, cutoff will
!      * be set to 214748364 and cutlim to either 7 (neg==0) or 8 (neg==1),
!      * meaning that if we have accumulated a value > 214748364, or equal
!      * but the next digit is > 7 (or 8), the number is too big, and we
!      * will return a range error.
       *
       * Set any if any `digits' consumed; make it negative to indicate
       * overflow.
       */
!     cutoff = neg ? -(unsigned long) LONG_MIN : LONG_MAX;
!     cutlim = cutoff % (unsigned long) base;
!     cutoff /= (unsigned long) base;
!     for (acc = 0, any = 0;; c = *s++)
!     {
          if (isdigit(c))
              c -= '0';
          else if (isalpha(c))
              c -= isupper(c) ? 'A' - 10 : 'a' - 10;
          else
              break;
!         if ((int) c >= base)
              break;
!         if (any < 0 || acc > cutoff || acc == cutoff && (int) c > cutlim)
!             any = -1;
!         else
!         {
!             any = 1;
!             acc *= base;
!             acc += c;
          }
      }
-     if (any < 0)
-     {
-         acc = neg ? LONG_MIN : LONG_MAX;
-         errno = ERANGE;
-     }
-     else if (neg)
-         acc = -acc;
      if (endptr != 0)
!         *endptr = any ? s - 1 : (char *) nptr;
!     return acc;
  }
--- 89,155 ----
          base = c == '0' ? 8 : 10;

      /*
!      * Compute the cutoff value between legal numbers and illegal
!      * numbers.  That is the largest legal value, divided by the
!      * base.  An input number that is greater than this value, if
!      * followed by a legal input character, is too big.  One that
!      * is equal to this value may be valid or not; the limit
!      * between valid and invalid numbers is then based on the last
!      * digit.  For instance, if the range for longs is
!      * [-2147483648..2147483647] and the input base is 10,
!      * cutoff will be set to 214748364 and cutlim to either
!      * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
!      * a value > 214748364, or equal but the next digit is > 7 (or 8),
!      * the number is too big, and we will return a range error.
       *
       * Set any if any `digits' consumed; make it negative to indicate
       * overflow.
       */
!     cutoff = neg ? LONG_MIN : LONG_MAX;
!     cutlim = (int)(cutoff % base);
!     cutoff /= base;
!     if (neg) {
!         if (cutlim > 0) {
!             cutlim -= base;
!             cutoff += 1;
!         }
!         cutlim = -cutlim;
!     }
!     for (acc = 0, any = 0;; c = (unsigned char) *s++) {
          if (isdigit(c))
              c -= '0';
          else if (isalpha(c))
              c -= isupper(c) ? 'A' - 10 : 'a' - 10;
          else
              break;
!         if (c >= base)
              break;
!         if (any < 0)
!             continue;
!         if (neg) {
!             if (acc < cutoff || (acc == cutoff && c > cutlim)) {
!                 any = -1;
!                 acc = LONG_MIN;
!                 errno = ERANGE;
!             } else {
!                 any = 1;
!                 acc *= base;
!                 acc -= c;
!             }
!         } else {
!             if (acc > cutoff || (acc == cutoff && c > cutlim)) {
!                 any = -1;
!                 acc = LONG_MAX;
!                 errno = ERANGE;
!             } else {
!                 any = 1;
!                 acc *= base;
!                 acc += c;
!             }
          }
      }
      if (endptr != 0)
!         /* LINTED interface specification */
!         *endptr = (char *)(any ? s - 1 : nptr);
!     return (acc);
  }
Index: src/port/strtoul.c
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql-server/src/port/strtoul.c,v
retrieving revision 1.1
diff -c -r1.1 strtoul.c
*** src/port/strtoul.c    18 Jul 2002 04:13:59 -0000    1.1
--- src/port/strtoul.c    4 Oct 2004 06:15:42 -0000
***************
*** 1,3 ****
--- 1,5 ----
+ /*    $NetBSD: strtoul.c,v 1.16 2003/08/07 16:43:45 agc Exp $    */
+
  /*
   * Copyright (c) 1990, 1993
   *    The Regents of the University of California.  All rights reserved.
***************
*** 6,27 ****
   * 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. 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
!  *      may be used to endorse or promote products derived from this software
!  *      without specific prior written permission.
   *
   * 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)
--- 8,25 ----
   * 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. 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.
   *
   * 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)
***************
*** 32,43 ****
   */

  #if defined(LIBC_SCCS) && !defined(lint)
  static char sccsid[] = "@(#)strtoul.c    8.1 (Berkeley) 6/4/93";
! #endif   /* LIBC_SCCS and not lint */

- #include <limits.h>
  #include <ctype.h>
  #include <errno.h>
  #include <stdlib.h>

  /*
--- 30,45 ----
   */

  #if defined(LIBC_SCCS) && !defined(lint)
+ #if 0
  static char sccsid[] = "@(#)strtoul.c    8.1 (Berkeley) 6/4/93";
! #else
! __RCSID("$NetBSD: strtoul.c,v 1.16 2003/08/07 16:43:45 agc Exp $");
! #endif
! #endif /* LIBC_SCCS and not lint */

  #include <ctype.h>
  #include <errno.h>
+ #include <limits.h>
  #include <stdlib.h>

  /*
***************
*** 48,119 ****
   */
  unsigned long
  strtoul(nptr, endptr, base)
! const char *nptr;
! char      **endptr;
! register int base;
  {
!     register const char *s = nptr;
!     register unsigned long acc;
!     register unsigned char c;
!     register unsigned long cutoff;
!     register int neg = 0,
!                 any,
!                 cutlim;

      /*
       * See strtol for comments as to the logic used.
       */
!     do
!     {
!         c = *s++;
      } while (isspace(c));
!     if (c == '-')
!     {
          neg = 1;
          c = *s++;
      }
-     else if (c == '+')
-         c = *s++;
      if ((base == 0 || base == 16) &&
!         c == '0' && (*s == 'x' || *s == 'X'))
!     {
          c = s[1];
          s += 2;
          base = 16;
      }
      if (base == 0)
          base = c == '0' ? 8 : 10;
!     cutoff = (unsigned long) ULONG_MAX / (unsigned long) base;
!     cutlim = (unsigned long) ULONG_MAX % (unsigned long) base;
!     for (acc = 0, any = 0;; c = *s++)
!     {
!         if (!isascii(c))
!             break;
          if (isdigit(c))
              c -= '0';
          else if (isalpha(c))
              c -= isupper(c) ? 'A' - 10 : 'a' - 10;
          else
              break;
!         if ((int) c >= base)
              break;
!         if (any < 0 || acc > cutoff || (acc == cutoff && (int) c > cutlim))
              any = -1;
!         else
!         {
              any = 1;
!             acc *= base;
              acc += c;
          }
      }
!     if (any < 0)
!     {
!         acc = ULONG_MAX;
!         errno = ERANGE;
!     }
!     else if (neg)
          acc = -acc;
      if (endptr != 0)
!         *endptr = (char *) (any ? s - 1 : nptr);
!     return acc;
  }
--- 50,117 ----
   */
  unsigned long
  strtoul(nptr, endptr, base)
!     const char *nptr;
!     char **endptr;
!     int base;
  {
!     const char *s;
!     unsigned long acc, cutoff;
!     int c;
!     int neg, any, cutlim;
!
!     /* endptr may be NULL */

      /*
       * See strtol for comments as to the logic used.
       */
!     s = nptr;
!     do {
!         c = (unsigned char) *s++;
      } while (isspace(c));
!     if (c == '-') {
          neg = 1;
          c = *s++;
+     } else {
+         neg = 0;
+         if (c == '+')
+             c = *s++;
      }
      if ((base == 0 || base == 16) &&
!         c == '0' && (*s == 'x' || *s == 'X')) {
          c = s[1];
          s += 2;
          base = 16;
      }
      if (base == 0)
          base = c == '0' ? 8 : 10;
!
!     cutoff = ULONG_MAX / (unsigned long)base;
!     cutlim = (int)(ULONG_MAX % (unsigned long)base);
!     for (acc = 0, any = 0;; c = (unsigned char) *s++) {
          if (isdigit(c))
              c -= '0';
          else if (isalpha(c))
              c -= isupper(c) ? 'A' - 10 : 'a' - 10;
          else
              break;
!         if (c >= base)
              break;
!         if (any < 0)
!             continue;
!         if (acc > cutoff || (acc == cutoff && c > cutlim)) {
              any = -1;
!             acc = ULONG_MAX;
!             errno = ERANGE;
!         } else {
              any = 1;
!             acc *= (unsigned long)base;
              acc += c;
          }
      }
!     if (neg && any > 0)
          acc = -acc;
      if (endptr != 0)
!         /* LINTED interface specification */
!         *endptr = (char *)(any ? s - 1 : nptr);
!     return (acc);
  }

pgsql-patches by date:

Previous
From: Sean Chittenden
Date:
Subject: Quieting the copyright/startup message...
Next
From: "John Hansen"
Date:
Subject: Re: Quieting the copyright/startup message...