git: 29c80f114ea6 - main - archivers/pbzip2: fix build with libc++ 19

From: Dimitry Andric <dim_at_FreeBSD.org>
Date: Thu, 07 Nov 2024 17:43:57 UTC
The branch main has been updated by dim:

URL: https://cgit.FreeBSD.org/ports/commit/?id=29c80f114ea6cc60be39502339572af8c35ac440

commit 29c80f114ea6cc60be39502339572af8c35ac440
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2024-11-03 23:24:58 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2024-11-07 17:42:48 +0000

    archivers/pbzip2: fix build with libc++ 19
    
    As noted in the libc++ 19 release notes [1], std::char_traits<> is now
    only provided for char, char8_t, char16_t, char32_t and wchar_t, and any
    instantiation for other types will fail.
    
    This causes archivers/pbzip2 to fail to compile with clang 19 and libc++
    19, resulting in errors similar to:
    
      /usr/include/c++/v1/string:820:42: error: implicit instantiation of undefined template 'std::char_traits<unsigned char>'
        820 |   static_assert(is_same<_CharT, typename traits_type::char_type>::value,
            |                                          ^
      ./BZ2StreamScanner.h:128:25: note: in instantiation of template class 'std::basic_string<unsigned char>' requested here
        128 |         basic_string<CharType> _bz2Header;
            |                                ^
      /usr/include/c++/v1/__fwd/string.h:23:29: note: template is declared here
         23 | struct _LIBCPP_TEMPLATE_VIS char_traits;
            |                             ^
    
    This can be fixed by defining `_bz2Header` and `_bz2HeaderZero` as
    `std::vector<CharType>` instead of `std::basic_string<CharType>`. It
    requieres a few other changes, such as replacing `operator=` with
    `assign`, and `compare` with `equal`.
    
    [1] https://libcxx.llvm.org/ReleaseNotes/19.html#deprecations-and-removals
    
    PR:             282528
    Approved by:    farrokhi (maintainer)
    MFH:            2024Q4
---
 archivers/pbzip2/files/patch-BZ2StreamScanner.cpp | 49 +++++++++++++++++++++++
 archivers/pbzip2/files/patch-BZ2StreamScanner.h   | 22 ++++++++++
 2 files changed, 71 insertions(+)

diff --git a/archivers/pbzip2/files/patch-BZ2StreamScanner.cpp b/archivers/pbzip2/files/patch-BZ2StreamScanner.cpp
new file mode 100644
index 000000000000..e6a3d82b789c
--- /dev/null
+++ b/archivers/pbzip2/files/patch-BZ2StreamScanner.cpp
@@ -0,0 +1,49 @@
+--- BZ2StreamScanner.cpp.orig	2024-11-03 23:01:39 UTC
++++ BZ2StreamScanner.cpp
+@@ -49,8 +49,8 @@ int BZ2StreamScanner::init( int hInFile, size_t inBuff
+ 
+ 	_hInFile = hInFile;
+ 	_eof = false;
+-	_bz2Header = bz2header;
+-	_bz2HeaderZero = bz2ZeroHeader;
++	_bz2Header.assign(begin(bz2header), end(bz2header));
++	_bz2HeaderZero.assign(begin(bz2ZeroHeader), end(bz2ZeroHeader));
+ 	_bz2HeaderFound = false;
+ 	_inBuffCapacity = 0;
+ 	_errState = 0;
+@@ -361,7 +361,7 @@ BZ2StreamScanner::CharType * BZ2StreamScanner::locateH
+ 			_errState |= ERR_INVALID_FILE_FORMAT;
+ 			_inBuffSearchPtr = getInBuffEnd();
+ 		}
+-		else if ( _bz2Header.compare( 0, prefixLen, getInBuffSearchPtr(), prefixLen ) == 0 )
++		else if ( equal( _bz2Header.begin(), _bz2Header.begin() + prefixLen, getInBuffSearchPtr() ) )
+ 		{
+ 			// header prefix found
+ 		}
+@@ -416,7 +416,7 @@ BZ2StreamScanner::CharType * BZ2StreamScanner::searchN
+ 	while ( !failed() && ( getUnsearchedCount() >= getHeaderSize() ) )
+ 	{
+ 		// _inBuffSearchPtr += prefixLen;
+-		basic_string<CharType> * pHdr = NULL;
++		vector<CharType> * pHdr = NULL;
+ 
+ 		if ( getInBuffSearchPtr()[hsp] == _bz2Header[hsp] )
+ 		{
+@@ -441,13 +441,14 @@ BZ2StreamScanner::CharType * BZ2StreamScanner::searchN
+ 				(*pHdr)[prefixLen] = bwtSizeChar;
+ 
+ 				// compare the remaining part of magic header
+-				int cmpres = pHdr->compare( hsp, pHdr->size() - hsp,
+-						getInBuffSearchPtr() + hsp, pHdr->size() - hsp );
++				bool cmpres = equal( pHdr->begin() + hsp, pHdr->begin() + pHdr->size() - hsp,
++						getInBuffSearchPtr() );
+ 
++
+ 				#ifdef PBZIP_DEBUG
+ 				fprintf( stderr, "   searchNextHeaderInBuff:cmpres=%d\n", cmpres );
+ 				#endif
+-				if ( cmpres == 0 )
++				if ( cmpres )
+ 				{
+ 					_searchStatus = true;
+ 					#ifdef PBZIP_DEBUG
diff --git a/archivers/pbzip2/files/patch-BZ2StreamScanner.h b/archivers/pbzip2/files/patch-BZ2StreamScanner.h
new file mode 100644
index 000000000000..e84924aac68b
--- /dev/null
+++ b/archivers/pbzip2/files/patch-BZ2StreamScanner.h
@@ -0,0 +1,22 @@
+--- BZ2StreamScanner.h.orig	2015-12-17 23:32:49 UTC
++++ BZ2StreamScanner.h
+@@ -44,7 +44,7 @@ class BZ2StreamScanner (public)
+ 
+ 	size_t getInBuffSize() const { return ( _inBuffEnd - _inBuff ); }
+ 	size_t getInBuffCapacity() const { return _inBuffCapacity; }
+-	const basic_string<CharType> & getHeader() const { return _bz2Header; }
++	const vector<CharType> & getHeader() const { return _bz2Header; }
+ 	size_t getHeaderSize() const { return _bz2Header.size(); }
+ 	int getErrState() const { return _errState; }
+ 	bool failed() { return ( _errState != 0 ); }
+@@ -125,8 +125,8 @@ class BZ2StreamScanner (public)
+ 	int _hInFile; // input file descriptor
+ 	bool _eof;
+ 
+-	basic_string<CharType> _bz2Header;
+-	basic_string<CharType> _bz2HeaderZero;
++	vector<CharType> _bz2Header;
++	vector<CharType> _bz2HeaderZero;
+ 	bool _bz2HeaderFound;
+ 	bool _searchStatus;
+