Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Jun 2025 06:54:03 GMT
From:      Alexey Dokuchaev <danfe@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: 5baf43483cae - main - lang/gnu-apl: try to unbreak the port's build on recent -CURRENT
Message-ID:  <202506040654.5546s3pE087917@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by danfe:

URL: https://cgit.FreeBSD.org/ports/commit/?id=5baf43483caeb86c42128d7ce0feeae825da671a

commit 5baf43483caeb86c42128d7ce0feeae825da671a
Author:     Alexey Dokuchaev <danfe@FreeBSD.org>
AuthorDate: 2025-06-04 06:51:24 +0000
Commit:     Alexey Dokuchaev <danfe@FreeBSD.org>
CommitDate: 2025-06-04 06:51:24 +0000

    lang/gnu-apl: try to unbreak the port's build on recent -CURRENT
    
    The base template for std::char_traits<> has been removed in LLVM 19;
    specializations are only provided for char, wchar_t, char8_t, char16_t,
    and char32_t.  This had severely impacted GNU APL which derived its
    UTF8 and UCS string classes from std::basic_string<>.  The author had
    made several attempts to convert these classes to use std::vector<>
    instead.  Carefully cherry-pick required changes so these fixes could
    be applied on top of version 1.8 as trunk had diverged significantly.
    
    Obtained from:  upstream (SVN revisions 1823, 1831, and 1837)
    Reported by:    pkg-fallout
---
 lang/gnu-apl/files/patch-src_CDR__string.hh       |  29 +++++
 lang/gnu-apl/files/patch-src_InputFile.hh         |  11 ++
 lang/gnu-apl/files/patch-src_LibPaths.cc          |  58 ++++++++++
 lang/gnu-apl/files/patch-src_Nabla.cc             |  20 ++++
 lang/gnu-apl/files/patch-src_PrimitiveFunction.cc |  13 +++
 lang/gnu-apl/files/patch-src_Quad__CR.cc          |  27 +++++
 lang/gnu-apl/files/patch-src_UCS__string.cc       |  89 +++++++++++++++
 lang/gnu-apl/files/patch-src_UCS__string.hh       | 127 ++++++++++++++++++++++
 lang/gnu-apl/files/patch-src_UTF8__string.hh      |  29 +++++
 9 files changed, 403 insertions(+)

diff --git a/lang/gnu-apl/files/patch-src_CDR__string.hh b/lang/gnu-apl/files/patch-src_CDR__string.hh
new file mode 100644
index 000000000000..79f8042ccb08
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_CDR__string.hh
@@ -0,0 +1,29 @@
+--- src/CDR_string.hh.orig	2019-06-23 12:39:20 UTC
++++ src/CDR_string.hh
+@@ -73,7 +73,7 @@ class CDR_string : public std::vector<uint8_t> (public
+ 
+    /// return the bytes of this CDR
+    const uint8_t * get_items() const
+-      { return &front(); }
++      { return utf8P(&front()); }
+ 
+    /// return the header of this CDR
+    const CDR_header & header() const
+@@ -92,7 +92,7 @@ class CDR_string : public std::vector<uint8_t> (public
+ 
+    /// return the ravel of this CDR
+    const uint8_t * ravel() const
+-      { return &(*this)[0] + 16 + 4*get_rank(); }
++      { return utf8P(&(*this)[0] + 16 + 4*get_rank()); }
+ 
+    /// return true if this CDR is bool or integer
+    bool is_integer() const
+@@ -131,7 +131,7 @@ class CDR_string : public std::vector<uint8_t> (public
+ protected:
+    /// return 4 bytes of the header (the header is always big endian)
+    uint32_t get_4(unsigned int offset) const
+-      { return CDR_header::get_be32(&(*this)[0] + offset); }
++      { return CDR_header::get_be32(utf8P(&(*this)[0] + offset)); }
+ };
+ 
+ #endif // __CDR_STRING_HH_DEFINED__
diff --git a/lang/gnu-apl/files/patch-src_InputFile.hh b/lang/gnu-apl/files/patch-src_InputFile.hh
new file mode 100644
index 000000000000..22b4b8898eb4
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_InputFile.hh
@@ -0,0 +1,11 @@
+--- src/InputFile.hh.orig	2019-06-23 12:39:20 UTC
++++ src/InputFile.hh
+@@ -42,7 +42,7 @@ struct InputFile
+    InputFile(const UTF8_string & _filename, FILE * _file,
+                      bool _test, bool _echo, bool _is_script, LX_mode LX)
+    : file     (_file),
+-     filename (&_filename[0], _filename.size()),
++     filename (_filename),
+      test     (_test),
+      echo     (_echo),
+      is_script(_is_script),
diff --git a/lang/gnu-apl/files/patch-src_LibPaths.cc b/lang/gnu-apl/files/patch-src_LibPaths.cc
new file mode 100644
index 000000000000..b894ebb0a56c
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_LibPaths.cc
@@ -0,0 +1,58 @@
+--- src/LibPaths.cc.orig	2019-06-23 12:39:20 UTC
++++ src/LibPaths.cc
+@@ -70,33 +70,22 @@ LibPaths::compute_bin_path(const char * argv0, bool lo
+          //
+          // we fix this by searching argv0 in $PATH
+          //
+-         const char * path = getenv("PATH");   // must NOT be modified
+-
+-         if (path)
++         if (const char * paths = getenv("PATH"))
+             {
+               logit && CERR << "initializing paths from  $PATH = "
+-                            << path << endl;
++                            << paths << endl;
+ 
+-              // we must not modify path, so we copy it to path1 and
+-              // replace the semicolons in path1 by 0. That converts
+-              // p1;p2; ... into a sequence of 0-terminated strings
+-              // p1 p2 ... The variable next points to the start of each
+-              // string.
+-              //
+-              const size_t plen = strlen(path);
+-              std::string   path1;
+-              path1.reserve(plen + 1);
+-              loop(p, (plen + 1))   path1 += path[p];
+-              char * next = &path1[0];
+-              for (;;)
+-                  {
+-                    char * semi = strchr(next, ':');
+-                    if (semi)   *semi = 0;
+-                    UTF8_string filename;
+-                    for (const char * n = next; *n; ++n)   filename += *n;
+-                    filename += '/';
+-                    for (const char * a = argv0; *a; ++a)   filename += *a;
++              while (*paths)
++                    {
++                      size_t dir_len;
++                      if (const char * colon = strchr(paths, ':'))
++                         dir_len = colon - paths;
++                      else
++                         dir_len = strlen(paths);
+ 
++                    std::string filename(paths, dir_len);
++                    filename += '/';
++                    filename.append(argv0);
+                     if (access(filename.c_str(), X_OK) == 0)
+                        {
+                          strncpy(APL_bin_path, filename.c_str(),
+@@ -110,8 +99,7 @@ LibPaths::compute_bin_path(const char * argv0, bool lo
+                          goto done;
+                        }
+ 
+-                    if (semi == 0)   break;
+-                    next = semi + 1;
++                    paths += dir_len + 1;   // next $PATH item
+                   }
+             }
+            else
diff --git a/lang/gnu-apl/files/patch-src_Nabla.cc b/lang/gnu-apl/files/patch-src_Nabla.cc
new file mode 100644
index 000000000000..760396a92252
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_Nabla.cc
@@ -0,0 +1,20 @@
+--- src/Nabla.cc.orig	2019-06-23 12:39:20 UTC
++++ src/Nabla.cc
+@@ -219,7 +219,7 @@ Nabla::start()
+    // ∇FUN[⎕]∇
+    // etc.
+    //
+-UCS_string::iterator c(first_command.begin());
++UCS_string::iterator c(first_command);
+ 
+    // skip leading spaces
+    //
+@@ -375,7 +375,7 @@ Nabla::parse_oper(UCS_string & oper, bool initial)
+ 
+    if (oper.size() == 0 && do_close)   return 0;
+ 
+-UCS_string::iterator c(oper.begin());
++UCS_string::iterator c(oper);
+ Unicode cc = c.next();
+ UCS_string text = oper;
+    while (cc == ' ')   cc = c.next();   // skip leading whitespace
diff --git a/lang/gnu-apl/files/patch-src_PrimitiveFunction.cc b/lang/gnu-apl/files/patch-src_PrimitiveFunction.cc
new file mode 100644
index 000000000000..ae696ea546e8
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_PrimitiveFunction.cc
@@ -0,0 +1,13 @@
+--- src/PrimitiveFunction.cc.orig	2019-06-23 12:39:20 UTC
++++ src/PrimitiveFunction.cc
+@@ -2668,8 +2668,8 @@ Value_P Z(ShapeItem(line_starts.size() - 1), LOC);
+         else
+            len = result_utf8.size() - line_starts[l];
+ 
+-        UTF8_string line_utf8(&result_utf8[line_starts[l]], len);
+-        UCS_string line_ucs(line_utf8);
++        const UTF8_string line_utf8(utf8P(&result_utf8[line_starts[l]]), len);
++        const UCS_string line_ucs(line_utf8);
+         Value_P ZZ(line_ucs, LOC);
+         new (Z->next_ravel())   PointerCell(ZZ.get(), Z.getref());
+       }
diff --git a/lang/gnu-apl/files/patch-src_Quad__CR.cc b/lang/gnu-apl/files/patch-src_Quad__CR.cc
new file mode 100644
index 000000000000..27a38ea92961
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_Quad__CR.cc
@@ -0,0 +1,27 @@
+--- src/Quad_CR.cc.orig	2019-06-23 12:39:20 UTC
++++ src/Quad_CR.cc
+@@ -1041,17 +1041,15 @@ Value_P Z(utf, LOC);
+ Value_P
+ Quad_CR::do_CR19(const Value & B)
+ {
+-UTF8_string utf(B);
+-   for (size_t l = 0; l < utf.size();)
+-       {
+-         int len = 0;
+-         const Unicode uni = UTF8_string::toUni(&utf[l], len, false);
+-         if (uni == Invalid_Unicode)   DOMAIN_ERROR;
++   if (B.get_rank() > 1)   RANK_ERROR;
++const ShapeItem len_B = B.element_count();
+ 
+-         l += len;
+-       }
++UTF8 bytes_utf[len_B + 10];
++   loop(b, len_B)   bytes_utf[b] = B.get_ravel(b).get_byte_value();
++   bytes_utf[len_B] = 0;
+ 
+-UCS_string ucs(utf);
++const UTF8_string utf(bytes_utf, len_B);
++const UCS_string ucs(utf);
+ Value_P Z(ucs, LOC);
+    return Z;
+ }
diff --git a/lang/gnu-apl/files/patch-src_UCS__string.cc b/lang/gnu-apl/files/patch-src_UCS__string.cc
new file mode 100644
index 000000000000..f0eecf212b1a
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_UCS__string.cc
@@ -0,0 +1,89 @@
+--- src/UCS_string.cc.orig	2019-06-23 12:39:20 UTC
++++ src/UCS_string.cc
+@@ -43,32 +43,36 @@ UCS_string::UCS_string()
+ }
+ //-----------------------------------------------------------------------------
+ UCS_string::UCS_string(Unicode uni)
+-   : basic_string<Unicode>(1, uni)
+ {
++  push_back(uni);
+   create(LOC);
+ }
+ //-----------------------------------------------------------------------------
+ UCS_string::UCS_string(const Unicode * data, size_t len)
+-   : basic_string<Unicode>(data, len)
+ {
++   reserve(2*len);
++   loop(l, len)   push_back(data[l]);
+    create(LOC);
+ }
+ //-----------------------------------------------------------------------------
+ UCS_string::UCS_string(size_t len, Unicode uni)
+-   : basic_string<Unicode>(len, uni)
+ {
++   reserve(2*len);
++   loop(l, len)   push_back(uni);
+    create(LOC);
+ }
+ //-----------------------------------------------------------------------------
+ UCS_string::UCS_string(const UCS_string & ucs)
+-   : basic_string<Unicode>(ucs)
++   : vector<Unicode>(ucs)
+ {
+    create(LOC);
+ }
+ //-----------------------------------------------------------------------------
+ UCS_string::UCS_string(const UCS_string & ucs, size_t pos, size_t len)
+-   : basic_string<Unicode>(ucs, pos, len)
+ {
++   if (len > ucs.size() - pos)   len = ucs.size() - pos;
++   reserve(2*len);
++   loop(l, len)   push_back(ucs[pos + l]);
+    create(LOC);
+ }
+ //-----------------------------------------------------------------------------
+@@ -88,7 +92,7 @@ UCS_string::UCS_string(const char * cstring)
+    while (*cstring)
+       {
+         Assert((0x80 & *cstring) == 0);   // ASCII
+-        *this += Unicode(*cstring++);
++        push_back(Unicode(*cstring++));
+       }
+ }
+ //-----------------------------------------------------------------------------
+@@ -127,7 +131,7 @@ UCS_string::UCS_string(const UTF8_string & utf)
+                       << " len " << utf.size() << " at " << LOC <<  endl;
+                    if (utf.size() >= 40)
+                       {
+-                         const UTF8_string end(&utf[utf.size() - 10], 10);
++                         const UTF8_string end(utf8P(&utf[utf.size() - 10]), 10);
+                          end.dump_hex(CERR << endl << "(ending with : ", 20)
+                                            << ")" << endl;
+                       }
+@@ -141,7 +145,7 @@ UCS_string::UCS_string(const UTF8_string & utf)
+                       << " len " << utf.size() << " at " << LOC <<  endl;
+                    if (utf.size() >= 40)
+                       {
+-                         const UTF8_string end(&utf[utf.size() - 10], 10);
++                         const UTF8_string end(utf8P(&utf[utf.size() - 10]), 10);
+                          end.dump_hex(CERR << endl << "(ending with : ", 20)
+                                            << ")" << endl;
+                       }
+@@ -479,7 +483,7 @@ UCS_string::remove_trailing_whitespaces()
+ void
+ UCS_string::remove_leading_whitespaces()
+ {
+-int count = 0;
++ShapeItem count = 0;
+    loop(s, size())
+       {
+         if (at(s) <= UNI_ASCII_SPACE)   ++count;
+@@ -488,7 +492,7 @@ int count = 0;
+ 
+    if (count == 0)        return;      // no leading whitspaces
+    if (count == size())   clear();     // only whitespaces
+-   else                   basic_string::erase(0, count);
++   else                   vector<Unicode>::erase(begin(), begin() + count);
+ }
+ //-----------------------------------------------------------------------------
+ void
diff --git a/lang/gnu-apl/files/patch-src_UCS__string.hh b/lang/gnu-apl/files/patch-src_UCS__string.hh
new file mode 100644
index 000000000000..f9d4dd542d9e
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_UCS__string.hh
@@ -0,0 +1,127 @@
+--- src/UCS_string.hh.orig	2019-06-23 12:39:20 UTC
++++ src/UCS_string.hh
+@@ -23,7 +23,7 @@
+ 
+ #include <stdint.h>
+ #include <stdio.h>
+-#include <string>
++#include <vector>
+ 
+ #include "Assert.hh"
+ #include "Common.hh"
+@@ -44,7 +44,7 @@ class UCS_string_vector;
+ 
+ //=============================================================================
+ /// A string of Unicode characters (32-bit)
+-class UCS_string : public  basic_string<Unicode>
++class UCS_string : public vector<Unicode>
+ {
+ public:
+    /// default constructor: empty string
+@@ -186,7 +186,7 @@ class UCS_string : public  basic_string<Unicode> (publ
+ 
+    /// remove the last character in \b this string
+    void pop_back()
+-   { Assert(size() > 0);   resize(size() - 1); }
++      { Assert(size() > 0);   vector<Unicode>::pop_back(); }
+ 
+    /// return this string reversed (i.e. characters from back to front).
+    UCS_string reverse() const;
+@@ -216,13 +216,13 @@ class UCS_string : public  basic_string<Unicode> (publ
+    int atoi() const;
+ 
+    /// append UCS_string other to this string
+-   void append(const UCS_string & other)
+-      { basic_string::append(other); }
++   void append(const UCS_string & suffix)
++      { loop(s, suffix.size())   push_back(suffix[s]); }
+ 
+    /// append 0-terminated ASCII string \b str to this string. str is NOT
+    /// interpreted as UTF8 string (use append_UTF8() if such interpretation        /// is desired)
+    void append_ASCII(const char * ascii)
+-      { while (*ascii)   *this += Unicode(*ascii++); }
++      { while (const char cc = *ascii++)   push_back(Unicode(cc)); }
+ 
+ 
+    /// append 0-terminated UTF8 string str to \b this UCS_string.
+@@ -241,7 +241,7 @@ class UCS_string : public  basic_string<Unicode> (publ
+ 
+    /// more intuitive insert() function
+    void insert(ShapeItem pos, Unicode uni)
+-      { basic_string::insert(pos, 1, uni); }
++      { vector<Unicode>::insert(begin() + pos, uni); }
+ 
+    /// prepend character \b uni
+    void prepend(Unicode uni)
+@@ -249,7 +249,7 @@ class UCS_string : public  basic_string<Unicode> (publ
+ 
+    /// return \b this string and \b other concatenated
+    UCS_string operator +(const UCS_string & other) const
+-      { UCS_string ret(*this);   ret += other;   return ret; }
++      { UCS_string ret(*this);   ret.append(other);   return ret; }
+ 
+    /// append C-string \b str
+    UCS_string & operator <<(const char * str)
+@@ -261,11 +261,11 @@ class UCS_string : public  basic_string<Unicode> (publ
+ 
+    /// append character \b uni
+    UCS_string & operator <<(Unicode uni)
+-      { *this += uni;   return *this; }
++      { push_back(uni);   return *this; }
+ 
+    /// append UCS_string \b other
+    UCS_string & operator <<(const UCS_string & other)
+-      { basic_string::append(other);   return *this; }
++      { append(other);   return *this; }
+ 
+    /// compare \b this with UCS_string \b other
+    Comp_result compare(const UCS_string & other) const
+@@ -301,16 +301,16 @@ class UCS_string : public  basic_string<Unicode> (publ
+    /// the inverse of \b un_escape().
+    UCS_string do_escape(bool double_quoted) const;
+ 
+-   /// overload basic_string::size() so that it returns a signed length
++   /// overload vector::size() so that it returns a signed length
+    ShapeItem size() const
+-      { return basic_string::size(); }
++      { return ShapeItem(vector<Unicode>::size()); }
+ 
+    /// an iterator for UCS_strings
+    class iterator
+       {
+         public:
+            /// constructor: start at position p
+-           iterator(const UCS_string & ucs, int p)
++           iterator(const UCS_string & ucs, int p = 0)
+            : s(ucs),
+              pos(p)
+            {}
+@@ -335,10 +335,6 @@ class UCS_string : public  basic_string<Unicode> (publ
+            int pos;
+       };
+ 
+-   /// an iterator set to the start of this string
+-   UCS_string::iterator begin() const
+-      { return iterator(*this, 0); }
+-
+    /// round last digit and discard it.
+    void round_last_digit();
+ 
+@@ -362,7 +358,7 @@ class UCS_string : public  basic_string<Unicode> (publ
+ 
+    /// erase 1 (!) character at pos
+    void erase(ShapeItem pos)
+-      { basic_string::erase(pos, 1); }
++      { vector<Unicode>::erase(begin() + pos); }
+ 
+    /// helper function for Heapsort<Unicode>::sort()
+    static bool greater_uni(const Unicode & u1, const Unicode & u2, const void *)
+@@ -425,7 +421,7 @@ class UCS_string : public  basic_string<Unicode> (publ
+ private:
+    /// prevent accidental usage of the rather dangerous default len parameter
+    /// in basic_strng::erase(pos, len = npos)
+-   basic_string & erase(size_type pos, size_type len);
++   vector<Unicode> & erase(size_type pos, size_type len);
+ };
+ //-----------------------------------------------------------------------------
+ inline void
diff --git a/lang/gnu-apl/files/patch-src_UTF8__string.hh b/lang/gnu-apl/files/patch-src_UTF8__string.hh
new file mode 100644
index 000000000000..14a0824eaff1
--- /dev/null
+++ b/lang/gnu-apl/files/patch-src_UTF8__string.hh
@@ -0,0 +1,29 @@
+--- src/UTF8_string.hh.orig	2019-06-23 12:39:20 UTC
++++ src/UTF8_string.hh
+@@ -45,7 +45,7 @@ utf8P(const void * vp)
+ }
+ //-----------------------------------------------------------------------------
+ /// an UTF8 encoded Unicode (RFC 3629) string
+-class UTF8_string : public std::basic_string<UTF8>
++class UTF8_string : public std::string
+ {
+ public:
+    /// constructor: empty UTF8_string
+@@ -79,15 +79,9 @@ class UTF8_string : public std::basic_string<UTF8> (pu
+         return true;
+       }
+ 
+-   /// return \b this string as a 0-termionated C string
+-   const char * c_str() const
+-      { return reinterpret_cast<const char *>
+-                               (std::basic_string<UTF8>::c_str()); }
+-
+-   /// prevent basic_string::erase() with its dangerous default value for
+-   /// the number of erased character.
++   /// erase one item at \b pos
+    void erase(size_t pos)
+-      { basic_string::erase(pos, 1); }
++      { std::string::erase(begin() + pos); }
+ 
+    /// return the last byte in this string
+    UTF8 back() const



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202506040654.5546s3pE087917>