Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gtkwave for openSUSE:Factory checked in at 2026-10-26 09:59:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gtkwave (Old) and /work/SRC/openSUSE:Factory/.gtkwave.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gtkwave" Mon Oct 26 09:59:52 2026 rev:36 rq:1392355 version:3.3.128 Changes: -------- --- /work/SRC/openSUSE:Factory/gtkwave/gtkwave.changes 2026-03-24 18:48:56.598640270 +0100 +++ /work/SRC/openSUSE:Factory/.gtkwave.new.2252680/gtkwave.changes 2026-10-26 10:00:24.076716329 +0100 @@ -1,0 +2,19 @@ +Sun Oct 25 06:52:46 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to 3.3.128 + * Hurd compile fix. + * Update bundled lz4 to 1.10.0. +- Changes in 3.3.127 + * Fix for fixed point shift that does not disable it on the specify + value change menu option. + * Changed ps2pdf to pstopdf on Mac as ps2pdf was removed by Sonoma. + * Warnings fix in vcd2fst for missing string.h include. + * Added FST_ST_SV_ARRAY (FST) and "sv_array" (VCD) for arrays. + * Wrote replacement for gdk_pixbuf_new_from_xpm_data. + * Update FSDB to handle FST_ST_SV_ARRAY, FSDB_ST_SV_INTERFACEPORT_REF + and FSDB_VT_STRING. + * Added "SV_ST_ARRAY" to exclude file parsing on init. + * Fix use after free of GLOBALS->entrybox_text in + regexp_highlight_generic(). + +------------------------------------------------------------------- Old: ---- gtkwave-gtk3-3.3.126.tar.gz New: ---- gtkwave-gtk3-3.3.128.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gtkwave.spec ++++++ --- /var/tmp/diff_new_pack.mzoNHZ/_old 2026-10-26 10:00:26.042798816 +0100 +++ /var/tmp/diff_new_pack.mzoNHZ/_new 2026-10-26 10:00:26.048799068 +0100 @@ -17,11 +17,10 @@ Name: gtkwave -Version: 3.3.126 +Version: 3.3.128 Release: 0 Summary: Waveform viewer for Ditital Signals License: GPL-2.0-or-later -Group: Productivity/Scientific/Electronics URL: https://gtkwave.sourceforge.net/ Source0: https://downloads.sourceforge.net/%{name}/%{name}-gtk3-%{version}.tar.gz BuildRequires: fdupes @@ -44,7 +43,6 @@ %package doc Summary: Documentation for GTKWave -Group: Documentation/Other Requires: %{name} = %{version} BuildArch: noarch @@ -57,7 +55,6 @@ %package examples Summary: Examples for GTKWave -Group: Documentation/Other Requires: %{name} = %{version} BuildArch: noarch ++++++ gtkwave-gtk3-3.3.126.tar.gz -> gtkwave-gtk3-3.3.128.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/COPYING new/gtkwave-gtk3-3.3.128/COPYING --- old/gtkwave-gtk3-3.3.126/COPYING 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/COPYING 2026-07-21 04:27:37.000000000 +0200 @@ -2,7 +2,7 @@ Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + <https://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -304,8 +304,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + with this program; if not, see + <https://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/ChangeLog new/gtkwave-gtk3-3.3.128/ChangeLog --- old/gtkwave-gtk3-3.3.126/ChangeLog 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/ChangeLog 2026-07-21 04:27:37.000000000 +0200 @@ -1953,3 +1953,17 @@ Updated libghw to current version. Changed behavior of X search in pattern search so it is matched by a single X bit. +3.3.127 31mar26 Fix for fixed point shift that does not disable it on + the specify value change menu option. + Changed ps2pdf to pstopdf on Mac as ps removed by Sonoma. + Warnings fix in vcd2fst for missing string.h include. + Added FST_ST_SV_ARRAY (FST) and "sv_array" (VCD) for + arrays (gtkwave/libfst#17). + Wrote replacement for gdk_pixbuf_new_from_xpm_data. + Update FSDB to handle FST_ST_SV_ARRAY (VCS emits this), + FSDB_ST_SV_INTERFACEPORT_REF, and FSDB_VT_STRING. + Added "SV_ST_ARRAY" to exclude file parsing on init. + Fix use after free of GLOBALS->entrybox_text in + regexp_highlight_generic(). +3.3.128 18jun26 Hurd compile fix. + Update lz4 to 1.10.0. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/LICENSE.TXT new/gtkwave-gtk3-3.3.128/LICENSE.TXT --- old/gtkwave-gtk3-3.3.126/LICENSE.TXT 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/LICENSE.TXT 2026-07-21 04:27:37.000000000 +0200 @@ -1,6 +1,6 @@ ########################################################################## -GTKWave 3.3.126 Wave Viewer is Copyright (C) 1999-2026 Tony Bybell. +GTKWave 3.3.128 Wave Viewer is Copyright (C) 1999-2026 Tony Bybell. Portions of GTKWave are Copyright (C) 1999-2026 Udi Finkelstein. Context support is Copyright (C) 2007-2026 Kermin Elliott Fleming. Trace group support is Copyright (C) 2009-2026 Donald Baltus. @@ -21,8 +21,8 @@ for more details. You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., 51 -Franklin Street - Suite 500, Boston, MA 02110-1335, USA. +with this program; if not, see +<https://www.gnu.org/licenses/>. ########################################################################## diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/configure new/gtkwave-gtk3-3.3.128/configure --- old/gtkwave-gtk3-3.3.126/configure 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/configure 2026-07-21 04:27:37.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for gtkwave-gtk3 3.3.126. +# Generated by GNU Autoconf 2.69 for gtkwave-gtk3 3.3.128. # # Report bugs to <[email protected]>. # @@ -580,8 +580,8 @@ # Identity of this package. PACKAGE_NAME='gtkwave-gtk3' PACKAGE_TARNAME='gtkwave-gtk3' -PACKAGE_VERSION='3.3.126' -PACKAGE_STRING='gtkwave-gtk3 3.3.126' +PACKAGE_VERSION='3.3.128' +PACKAGE_STRING='gtkwave-gtk3 3.3.128' PACKAGE_BUGREPORT='[email protected]' PACKAGE_URL='' @@ -1395,7 +1395,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures gtkwave-gtk3 3.3.126 to adapt to many kinds of systems. +\`configure' configures gtkwave-gtk3 3.3.128 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1461,7 +1461,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of gtkwave-gtk3 3.3.126:";; + short | recursive ) echo "Configuration of gtkwave-gtk3 3.3.128:";; esac cat <<\_ACEOF @@ -1609,7 +1609,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -gtkwave-gtk3 configure 3.3.126 +gtkwave-gtk3 configure 3.3.128 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2253,7 +2253,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by gtkwave-gtk3 $as_me 3.3.126, which was +It was created by gtkwave-gtk3 $as_me 3.3.128, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3120,7 +3120,7 @@ # Define the identity of the package. PACKAGE='gtkwave-gtk3' - VERSION='3.3.126' + VERSION='3.3.128' cat >>confdefs.h <<_ACEOF @@ -11568,7 +11568,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by gtkwave-gtk3 $as_me 3.3.126, which was +This file was extended by gtkwave-gtk3 $as_me 3.3.128, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -11634,7 +11634,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -gtkwave-gtk3 config.status 3.3.126 +gtkwave-gtk3 config.status 3.3.128 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/configure.ac new/gtkwave-gtk3-3.3.128/configure.ac --- old/gtkwave-gtk3-3.3.126/configure.ac 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/configure.ac 2026-07-21 04:27:37.000000000 +0200 @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT(gtkwave-gtk3, 3.3.126, [email protected]) +AC_INIT(gtkwave-gtk3, 3.3.128, [email protected]) AC_CONFIG_SRCDIR([src/vcd.c]) AM_INIT_AUTOMAKE AC_CONFIG_HEADER([config.h]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/contrib/bundle_for_osx/Info-gtkwave.plist new/gtkwave-gtk3-3.3.128/contrib/bundle_for_osx/Info-gtkwave.plist --- old/gtkwave-gtk3-3.3.126/contrib/bundle_for_osx/Info-gtkwave.plist 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/contrib/bundle_for_osx/Info-gtkwave.plist 2026-07-21 04:27:37.000000000 +0200 @@ -8,7 +8,7 @@ <key>CFBundleExecutable</key> <string>gtkwave</string> <key>CFBundleGetInfoString</key> - <string>3.3.126, (C) 1999-2025 Tony Bybell http://gtkwave.sourceforge.net</string> + <string>3.3.128, (C) 1999-2026 Tony Bybell http://gtkwave.sourceforge.net</string> <key>CFBundleIconFile</key> <string>gtkwave.icns</string> <key>CFBundleIdentifier</key> @@ -18,13 +18,13 @@ <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> - <string>3.3.126</string> + <string>3.3.128</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>3.3.126</string> + <string>3.3.128</string> <key>NSHumanReadableCopyright</key> - <string>Copyright 1999 - 2025 Tony Bybell, GNU General Public License.</string> + <string>Copyright 1999 - 2026 Tony Bybell, GNU General Public License.</string> <key>LSMinimumSystemVersion</key> <string>10.6</string> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/share/appdata/io.github.gtkwave.GTKWave.metainfo.xml new/gtkwave-gtk3-3.3.128/share/appdata/io.github.gtkwave.GTKWave.metainfo.xml --- old/gtkwave-gtk3-3.3.126/share/appdata/io.github.gtkwave.GTKWave.metainfo.xml 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/share/appdata/io.github.gtkwave.GTKWave.metainfo.xml 2026-07-21 04:27:37.000000000 +0200 @@ -34,6 +34,36 @@ <content_rating type="oars-1.0" /> <releases> + <release version="3.3.128" date="2026-06-18"> + <description> + <p> + Changes in 3.3.128: + </p> + <ul> + <li>Hurd compile fix.</li> + <li>Update lz4 to 1.10.0.</li> + </ul> + </description> + </release> + + <release version="3.3.127" date="2026-03-31"> + <description> + <p> + Changes in 3.3.127: + </p> + <ul> + <li>Fix for fixed point shift that does not disable it on the specify value change menu option.</li> + <li>Changed ps2pdf to pstopdf on Mac as ps removed by Sonoma.</li> + <li>Warnings fix in vcd2fst for missing string.h include.</li> + <li>Added FST_ST_SV_ARRAY (FST) and "sv_array" (VCD) for arrays (gtkwave/libfst#17).</li> + <li>Wrote replacement for gdk_pixbuf_new_from_xpm_data.</li> + <li>Update FSDB to handle FST_ST_SV_ARRAY (VCS emits this), FSDB_ST_SV_INTERFACEPORT_REF, and FSDB_VT_STRING.</li> + <li>Added "SV_ST_ARRAY" to exclude file parsing on init.</li> + <li>Fix use after free of GLOBALS->entrybox_text in regexp_highlight_generic().</li> + </ul> + </description> + </release> + <release version="3.3.126" date="2025-12-18"> <description> <p> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/extload.c new/gtkwave-gtk3-3.3.128/src/extload.c --- old/gtkwave-gtk3-3.3.126/src/extload.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/extload.c 2026-07-21 04:27:37.000000000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) Tony Bybell 2009-2017. + * Copyright (c) Tony Bybell 2009-2026. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -358,6 +358,14 @@ GLOBALS->extload_idcodes[i] = d2; if(GLOBALS->extload_inv_idcodes[d2] == 0) GLOBALS->extload_inv_idcodes[d2] = i+1; /* root alias */ + if(!strcmp("vcd_string", typ)) + { + GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_DOUBLE; + GLOBALS->extload_node_block[i].msi=0; + GLOBALS->extload_node_block[i].lsi=0; + GLOBALS->mvlfacs_vzt_c_3[i].len=2; + } + else if(!strcmp("vcd_real", typ)) { GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_DOUBLE; @@ -1047,6 +1055,14 @@ GLOBALS->extload_idcodes[i] = d2; if(GLOBALS->extload_inv_idcodes[d2] == 0) GLOBALS->extload_inv_idcodes[d2] = i+1; /* root alias */ + if(fh->u.var.typ == FST_VT_GEN_STRING) + { + GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_STRING; + GLOBALS->extload_node_block[i].msi=0; + GLOBALS->extload_node_block[i].lsi=0; + GLOBALS->mvlfacs_vzt_c_3[i].len=2; + } + else if(fh->u.var.typ == FST_VT_VCD_REAL) { GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_DOUBLE; @@ -1222,6 +1238,7 @@ case FST_ST_VHDL_FOR_GENERATE: ttype = TREE_VHDL_ST_GENFOR; break; case FST_ST_VHDL_PROCEDURE: ttype = TREE_VHDL_ST_PROCEDURE; break; case FST_ST_VHDL_PROCESS: ttype = TREE_VHDL_ST_PROCESS; break; + case FST_ST_SV_ARRAY: ttype = TREE_SV_ST_ARRAY; break; default: ttype = TREE_UNKNOWN; break; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/fsdb_wrapper_api.cc new/gtkwave-gtk3-3.3.128/src/fsdb_wrapper_api.cc --- old/gtkwave-gtk3-3.3.126/src/fsdb_wrapper_api.cc 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/fsdb_wrapper_api.cc 2026-07-21 04:27:37.000000000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) Tony Bybell 2013-2017. + * Copyright (c) Tony Bybell 2013-2026. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -256,7 +256,7 @@ static byte_T buffer[FSDB_MAX_BIT_SIZE+1]; uint_T i; fsdbVarType var_type; - + switch (vc_trvs_hdl->ffrGetBytesPerBit()) { case FSDB_BYTES_PER_BIT_1B: @@ -338,6 +338,11 @@ case FSDB_VT_VHDL_MEMORY_DEPTH: buffer[0] = 0; break; + + case FSDB_VT_STRING: + vc_trvs_hdl->ffrGetVC(&vc_ptr); + strcpy((char *)buffer, (char *)vc_ptr); + break; default: vc_trvs_hdl->ffrGetVC(&vc_ptr); @@ -473,6 +478,7 @@ break; case FSDB_ST_SV_INTERFACE: + case FSDB_ST_SV_INTERFACEPORT_REF: type = (str_T) "sv_interface"; break; @@ -715,6 +721,11 @@ typelen = 6; break; + case FSDB_VT_STRING: + type = (str_T) "vcd_string"; + typelen = 10; + break; + default: type = (str_T) "vcd_wire"; typelen = 8; @@ -937,6 +948,7 @@ break; case FSDB_ST_SV_INTERFACE: + case FSDB_ST_SV_INTERFACEPORT_REF: typ = FST_ST_VCD_INTERFACE; break; @@ -1117,6 +1129,7 @@ break; case FSDB_VT_STREAM: /* these hold transactions: not yet supported */ + case FSDB_VT_STRING: /* this needs actual work */ typ = FST_VT_GEN_STRING; break; @@ -1173,6 +1186,16 @@ __DumpArray2(fsdbTreeCBDataArrayBegin* arr, void (*cb)(void *)) { /* printf("NAME: %s SIZE: %d is_partial_dumped: %d\n", arr->name, (int)arr->size, (int)arr->is_partial_dumped); */ +struct fstHier fh; + +fh.htyp = FST_HT_SCOPE; +fh.u.scope.typ = FST_ST_SV_ARRAY; +fh.u.scope.name = arr->name; +fh.u.scope.name_length = strlen(fh.u.scope.name); +fh.u.scope.component = NULL; +fh.u.scope.component_length = 0; + +cb(&fh); } @@ -1183,10 +1206,6 @@ void (*cb)(void *) = (void (*)(void *))client_data; struct fstHier fh; - - -char bf[16]; - switch (cb_type) { case FSDB_TREE_CBT_BEGIN_TREE: @@ -1203,6 +1222,7 @@ case FSDB_TREE_CBT_UPSCOPE: case FSDB_TREE_CBT_STRUCT_END: + case FSDB_TREE_CBT_ARRAY_END: fh.htyp = FST_HT_UPSCOPE; cb(&fh); break; @@ -1216,12 +1236,9 @@ __DumpStruct2((fsdbTreeCBDataStructBegin*)tree_cb_data, cb); break; - /* not yet supported */ case FSDB_TREE_CBT_ARRAY_BEGIN: __DumpArray2((fsdbTreeCBDataArrayBegin*)tree_cb_data, cb); break; - case FSDB_TREE_CBT_ARRAY_END: - break; case FSDB_TREE_CBT_FILE_TYPE: case FSDB_TREE_CBT_SIMULATOR_VERSION: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/fst.c new/gtkwave-gtk3-3.3.128/src/fst.c --- old/gtkwave-gtk3-3.3.126/src/fst.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/fst.c 2026-07-21 04:27:37.000000000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) Tony Bybell 2009-2025. + * Copyright (c) Tony Bybell 2009-2026. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -194,6 +194,8 @@ case FST_ST_VHDL_GENERATE: ttype = TREE_VHDL_ST_GENERATE; break; case FST_ST_VHDL_PACKAGE: ttype = TREE_VHDL_ST_PACKAGE; break; + case FST_ST_SV_ARRAY: ttype = TREE_SV_ST_ARRAY; break; + default: ttype = TREE_UNKNOWN; break; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/globals.c new/gtkwave-gtk3-3.3.128/src/globals.c --- old/gtkwave-gtk3-3.3.126/src/globals.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/globals.c 2026-07-21 04:27:37.000000000 +0200 @@ -679,6 +679,7 @@ NULL, /* hiericon_function_pixbuf */ NULL, /* hiericon_begin_pixbuf */ NULL, /* hiericon_fork_pixbuf */ +NULL, /* hiericon_sv_array_pixbuf */ NULL, /* hiericon_interface_pixbuf */ NULL, /* hiericon_svpackage_pixbuf */ NULL, /* hiericon_program_pixbuf */ @@ -2989,6 +2990,7 @@ a->hiericon_function_pixbuf = b->hiericon_function_pixbuf; a->hiericon_begin_pixbuf = b->hiericon_begin_pixbuf; a->hiericon_fork_pixbuf = b->hiericon_fork_pixbuf; + a->hiericon_sv_array_pixbuf = b->hiericon_sv_array_pixbuf; a->hiericon_interface_pixbuf = b->hiericon_interface_pixbuf; a->hiericon_svpackage_pixbuf = b->hiericon_svpackage_pixbuf; a->hiericon_program_pixbuf = b->hiericon_program_pixbuf; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/globals.h new/gtkwave-gtk3-3.3.128/src/globals.h --- old/gtkwave-gtk3-3.3.126/src/globals.h 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/globals.h 2026-07-21 04:27:37.000000000 +0200 @@ -708,6 +708,7 @@ GdkPixbuf *hiericon_function_pixbuf; /* from pixmaps.c */ GdkPixbuf *hiericon_begin_pixbuf; /* from pixmaps.c */ GdkPixbuf *hiericon_fork_pixbuf; /* from pixmaps.c */ +GdkPixbuf *hiericon_sv_array_pixbuf; /* from pixmaps.c */ GdkPixbuf *hiericon_interface_pixbuf; GdkPixbuf *hiericon_svpackage_pixbuf; GdkPixbuf *hiericon_program_pixbuf; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/helpers/fst/fstapi.c new/gtkwave-gtk3-3.3.128/src/helpers/fst/fstapi.c --- old/gtkwave-gtk3-3.3.126/src/helpers/fst/fstapi.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/helpers/fst/fstapi.c 2026-07-21 04:27:37.000000000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2023 Tony Bybell. + * Copyright (c) 2009-2026 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -3203,7 +3203,8 @@ "vhdl_for_generate", "vhdl_if_generate", "vhdl_generate", - "vhdl_package"}; + "vhdl_package", + "sv_array"}; static const char *attrtypes[] = {"misc", "array", "enum", "class"}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/helpers/fst/fstapi.h new/gtkwave-gtk3-3.3.128/src/helpers/fst/fstapi.h --- old/gtkwave-gtk3-3.3.126/src/helpers/fst/fstapi.h 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/helpers/fst/fstapi.h 2026-07-21 04:27:37.000000000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2018 Tony Bybell. + * Copyright (c) 2009-2026 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -108,7 +108,8 @@ FST_ST_VHDL_GENERATE = 20, FST_ST_VHDL_PACKAGE = 21, - FST_ST_MAX = 21, + FST_ST_SV_ARRAY = 22, + FST_ST_MAX = 22, FST_ST_GEN_ATTRBEGIN = 252, FST_ST_GEN_ATTREND = 253, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/helpers/fst/lz4.c new/gtkwave-gtk3-3.3.128/src/helpers/fst/lz4.c --- old/gtkwave-gtk3-3.3.126/src/helpers/fst/lz4.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/helpers/fst/lz4.c 2026-07-21 04:27:37.000000000 +0200 @@ -124,14 +124,17 @@ # include <intrin.h> /* only present in VS2005+ */ # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ # pragma warning(disable : 6237) /* disable: C6237: conditional expression is always 0 */ +# pragma warning(disable : 6239) /* disable: C6239: (<non-zero constant> && <expression>) always evaluates to the result of <expression> */ +# pragma warning(disable : 6240) /* disable: C6240: (<expression> && <non-zero constant>) always evaluates to the result of <expression> */ +# pragma warning(disable : 6326) /* disable: C6326: Potential comparison of a constant with another constant */ #endif /* _MSC_VER */ #ifndef LZ4_FORCE_INLINE -# ifdef _MSC_VER /* Visual Studio */ +# if defined (_MSC_VER) && !defined (__clang__) /* MSVC */ # define LZ4_FORCE_INLINE static __forceinline # else # if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ -# ifdef __GNUC__ +# if defined (__GNUC__) || defined (__clang__) # define LZ4_FORCE_INLINE static inline __attribute__((always_inline)) # else # define LZ4_FORCE_INLINE static inline @@ -430,7 +433,7 @@ return LZ4_read16(memPtr); } else { const BYTE* p = (const BYTE*)memPtr; - return (U16)((U16)p[0] + (p[1]<<8)); + return (U16)((U16)p[0] | (p[1]<<8)); } } @@ -441,7 +444,7 @@ return LZ4_read32(memPtr); } else { const BYTE* p = (const BYTE*)memPtr; - return (U32)p[0] + (p[1]<<8) + (p[2]<<16) + (p[3]<<24); + return (U32)p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24); } } #endif @@ -527,7 +530,7 @@ /* LZ4_memcpy_using_offset() presumes : * - dstEnd >= dstPtr + MINMATCH - * - there is at least 8 bytes available to write after dstEnd */ + * - there is at least 12 bytes available to write after dstEnd */ LZ4_FORCE_INLINE void LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) { @@ -1118,7 +1121,7 @@ goto _last_literals; } if (litLength >= RUN_MASK) { - int len = (int)(litLength - RUN_MASK); + unsigned len = litLength - RUN_MASK; *token = (RUN_MASK<<ML_BITS); for(; len >= 255 ; len-=255) *op++ = 255; *op++ = (BYTE)len; @@ -1579,8 +1582,11 @@ #endif +typedef enum { _ld_fast, _ld_slow } LoadDict_mode_e; #define HASH_UNIT sizeof(reg_t) -int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +int LZ4_loadDict_internal(LZ4_stream_t* LZ4_dict, + const char* dictionary, int dictSize, + LoadDict_mode_e _ld) { LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; const tableType_t tableType = byU32; @@ -1616,13 +1622,39 @@ while (p <= dictEnd-HASH_UNIT) { U32 const h = LZ4_hashPosition(p, tableType); + /* Note: overwriting => favors positions end of dictionary */ LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType); p+=3; idx32+=3; } + if (_ld == _ld_slow) { + /* Fill hash table with additional references, to improve compression capability */ + p = dict->dictionary; + idx32 = dict->currentOffset - dict->dictSize; + while (p <= dictEnd-HASH_UNIT) { + U32 const h = LZ4_hashPosition(p, tableType); + U32 const limit = dict->currentOffset - 64 KB; + if (LZ4_getIndexOnHash(h, dict->hashTable, tableType) <= limit) { + /* Note: not overwriting => favors positions beginning of dictionary */ + LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType); + } + p++; idx32++; + } + } + return (int)dict->dictSize; } +int LZ4_loadDict(LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + return LZ4_loadDict_internal(LZ4_dict, dictionary, dictSize, _ld_fast); +} + +int LZ4_loadDictSlow(LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + return LZ4_loadDict_internal(LZ4_dict, dictionary, dictSize, _ld_slow); +} + void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) { const LZ4_stream_t_internal* dictCtx = (dictionaryStream == NULL) ? NULL : @@ -2042,7 +2074,7 @@ * note : fast loop may show a regression for some client arm chips. */ #if LZ4_FAST_DEC_LOOP if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { - DEBUGLOG(6, "skip fast decode loop"); + DEBUGLOG(6, "move to safe decode loop"); goto safe_decode; } @@ -2054,6 +2086,7 @@ assert(ip < iend); token = *ip++; length = token >> ML_BITS; /* literal length */ + DEBUGLOG(7, "blockPos%6u: litLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length); /* decode literal length */ if (length == RUN_MASK) { @@ -2083,21 +2116,23 @@ /* get offset */ offset = LZ4_readLE16(ip); ip+=2; - DEBUGLOG(6, " offset = %zu", offset); + DEBUGLOG(6, "blockPos%6u: offset = %u", (unsigned)(op-(BYTE*)dst), (unsigned)offset); match = op - offset; assert(match <= op); /* overflow check */ /* get matchlength */ length = token & ML_MASK; + DEBUGLOG(7, " match length token = %u (len==%u)", (unsigned)length, (unsigned)length+MINMATCH); if (length == ML_MASK) { size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); if (addl == rvl_error) { - DEBUGLOG(6, "error reading long match length"); + DEBUGLOG(5, "error reading long match length"); goto _output_error; } length += addl; length += MINMATCH; + DEBUGLOG(7, " long match length == %u", (unsigned)length); if (unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { goto safe_match_copy; @@ -2105,6 +2140,7 @@ } else { length += MINMATCH; if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + DEBUGLOG(7, "moving to safe_match_copy (ml==%u)", (unsigned)length); goto safe_match_copy; } @@ -2123,7 +2159,7 @@ } } } if ( checkOffset && (unlikely(match + dictSize < lowPrefix)) ) { - DEBUGLOG(6, "Error : pos=%zi, offset=%zi => outside buffers", op-lowPrefix, op-match); + DEBUGLOG(5, "Error : pos=%zi, offset=%zi => outside buffers", op-lowPrefix, op-match); goto _output_error; } /* match starting within external dictionary */ @@ -2180,6 +2216,7 @@ assert(ip < iend); token = *ip++; length = token >> ML_BITS; /* literal length */ + DEBUGLOG(7, "blockPos%6u: litLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length); /* A two-stage shortcut for the most common case: * 1) If the literal length is 0..14, and there is enough space, @@ -2200,6 +2237,7 @@ /* The second stage: prepare for match copying, decode full info. * If it doesn't work out, the info won't be wasted. */ length = token & ML_MASK; /* match length */ + DEBUGLOG(7, "blockPos%6u: matchLength token = %u (len=%u)", (unsigned)(op-(BYTE*)dst), (unsigned)length, (unsigned)length + 4); offset = LZ4_readLE16(ip); ip += 2; match = op - offset; assert(match <= op); /* check overflow */ @@ -2272,9 +2310,10 @@ * so check that we exactly consume the input and don't overrun the output buffer. */ if ((ip+length != iend) || (cpy > oend)) { - DEBUGLOG(6, "should have been last run of literals") - DEBUGLOG(6, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend); - DEBUGLOG(6, "or cpy(%p) > oend(%p)", cpy, oend); + DEBUGLOG(5, "should have been last run of literals") + DEBUGLOG(5, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend); + DEBUGLOG(5, "or cpy(%p) > (oend-MFLIMIT)(%p)", cpy, oend-MFLIMIT); + DEBUGLOG(5, "after writing %u bytes / %i bytes available", (unsigned)(op-(BYTE*)dst), outputSize); goto _output_error; } } @@ -2300,6 +2339,7 @@ /* get matchlength */ length = token & ML_MASK; + DEBUGLOG(7, "blockPos%6u: matchLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length); _copy_match: if (length == ML_MASK) { @@ -2389,7 +2429,7 @@ while (op < cpy) { *op++ = *match++; } } else { LZ4_memcpy(op, match, 8); - if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } + if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } } op = cpy; /* wildcopy correction */ } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/helpers/fst/lz4.h new/gtkwave-gtk3-3.3.128/src/helpers/fst/lz4.h --- old/gtkwave-gtk3-3.3.126/src/helpers/fst/lz4.h 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/helpers/fst/lz4.h 2026-07-21 04:27:37.000000000 +0200 @@ -129,8 +129,8 @@ /*------ Version ------*/ #define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ -#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */ -#define LZ4_VERSION_RELEASE 5 /* for tweaks, bug-fixes, or development */ +#define LZ4_VERSION_MINOR 10 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 0 /* for tweaks, bug-fixes, or development */ #define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) @@ -148,6 +148,7 @@ **************************************/ /*! * LZ4_MEMORY_USAGE : + * Can be selected at compile time, by setting LZ4_MEMORY_USAGE. * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB) * Increasing memory usage improves compression ratio, generally at the cost of speed. * Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality. @@ -157,6 +158,7 @@ # define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT #endif +/* These are absolute limits, they should not be changed by users */ #define LZ4_MEMORY_USAGE_MIN 10 #define LZ4_MEMORY_USAGE_DEFAULT 14 #define LZ4_MEMORY_USAGE_MAX 20 @@ -368,6 +370,51 @@ */ LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); +/*! LZ4_loadDictSlow() : v1.10.0+ + * Same as LZ4_loadDict(), + * but uses a bit more cpu to reference the dictionary content more thoroughly. + * This is expected to slightly improve compression ratio. + * The extra-cpu cost is likely worth it if the dictionary is re-used across multiple sessions. + * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded) + */ +LZ4LIB_API int LZ4_loadDictSlow(LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_attach_dictionary() : stable since v1.10.0 + * + * This allows efficient re-use of a static dictionary multiple times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a + * working LZ4_stream_t, this function introduces a no-copy setup mechanism, + * in which the working stream references @dictionaryStream in-place. + * + * Several assumptions are made about the state of @dictionaryStream. + * Currently, only states which have been prepared by LZ4_loadDict() or + * LZ4_loadDictSlow() should be expected to work. + * + * Alternatively, the provided @dictionaryStream may be NULL, + * in which case any existing dictionary stream is unset. + * + * If a dictionary is provided, it replaces any pre-existing stream history. + * The dictionary contents are the only history that can be referenced and + * logically immediately precede the data compressed in the first subsequent + * compression call. + * + * The dictionary will only remain attached to the working stream through the + * first compression call, at the end of which it is cleared. + * @dictionaryStream stream (and source buffer) must remain in-place / accessible / unchanged + * through the completion of the compression session. + * + * Note: there is no equivalent LZ4_attach_*() method on the decompression side + * because there is no initialization cost, hence no need to share the cost across multiple sessions. + * To decompress LZ4 blocks using dictionary, attached or not, + * just employ the regular LZ4_setStreamDecode() for streaming, + * or the stateless LZ4_decompress_safe_usingDict() for one-shot decompression. + */ +LZ4LIB_API void +LZ4_attach_dictionary(LZ4_stream_t* workingStream, + const LZ4_stream_t* dictionaryStream); + /*! LZ4_compress_fast_continue() : * Compress 'src' content using data from previously compressed blocks, for better compression ratio. * 'dst' buffer must be already allocated. @@ -563,43 +610,12 @@ */ LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); -/*! LZ4_compress_destSize_extState() : +/*! LZ4_compress_destSize_extState() : introduced in v1.10.0 * Same as LZ4_compress_destSize(), but using an externally allocated state. * Also: exposes @acceleration */ int LZ4_compress_destSize_extState(void* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize, int acceleration); -/*! LZ4_attach_dictionary() : - * This is an experimental API that allows - * efficient use of a static dictionary many times. - * - * Rather than re-loading the dictionary buffer into a working context before - * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a - * working LZ4_stream_t, this function introduces a no-copy setup mechanism, - * in which the working stream references the dictionary stream in-place. - * - * Several assumptions are made about the state of the dictionary stream. - * Currently, only streams which have been prepared by LZ4_loadDict() should - * be expected to work. - * - * Alternatively, the provided dictionaryStream may be NULL, - * in which case any existing dictionary stream is unset. - * - * If a dictionary is provided, it replaces any pre-existing stream history. - * The dictionary contents are the only history that can be referenced and - * logically immediately precede the data compressed in the first subsequent - * compression call. - * - * The dictionary will only remain attached to the working stream through the - * first compression call, at the end of which it is cleared. The dictionary - * stream (and source buffer) must remain in-place / accessible / unchanged - * through the completion of the first compression call on the stream. - */ -LZ4LIB_STATIC_API void -LZ4_attach_dictionary(LZ4_stream_t* workingStream, - const LZ4_stream_t* dictionaryStream); - - /*! In-place compression and decompression * * It's possible to have input and output sharing the same buffer, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/helpers/vcd2fst.c new/gtkwave-gtk3-3.3.128/src/helpers/vcd2fst.c --- old/gtkwave-gtk3-3.3.126/src/helpers/vcd2fst.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/helpers/vcd2fst.c 2026-07-21 04:27:37.000000000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2014 Tony Bybell. + * Copyright (c) 2009-2026 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -21,6 +21,7 @@ */ #include <config.h> +#include <string.h> #if HAVE_GETOPT_H #include <getopt.h> @@ -960,6 +961,11 @@ { scopetype = FST_ST_VCD_STRUCT; } + else + if(!strcmp(st, "sv_array")) + { + scopetype = FST_ST_SV_ARRAY; + } break; case 'u': diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/main.c new/gtkwave-gtk3-3.3.128/src/main.c --- old/gtkwave-gtk3-3.3.126/src/main.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/main.c 2026-07-21 04:27:37.000000000 +0200 @@ -1605,6 +1605,7 @@ fprintf(stderr, "\n%s\n\n",WAVE_VERSION_INFO); +#if 0 if(!mainwindow_already_built) { gboolean has_xpm_loader = FALSE; @@ -1626,6 +1627,7 @@ fprintf(stderr, "GTKWAVE | GdkPixbuf loader for XPM images is not installed.\n"); } } +#endif if(!old_g) /* copy all variables earlier when old_g is set */ { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/menu.c new/gtkwave-gtk3-3.3.128/src/menu.c --- old/gtkwave-gtk3-3.3.126/src/menu.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/menu.c 2026-07-21 04:27:37.000000000 +0200 @@ -4540,7 +4540,7 @@ strcpy(GLOBALS->regexp_string_menu_c_1, GLOBALS->entrybox_text); wave_regex_compile(GLOBALS->regexp_string_menu_c_1, WAVE_REGEX_SEARCH); - free_2(GLOBALS->entrybox_text); + free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text = NULL; t=GLOBALS->traces.first; while(t) { @@ -6685,7 +6685,8 @@ entrybox("Fixed Point Shift Specify",300,"",NULL,128,G_CALLBACK(menu_dataformat_fpshift_specify_cleanup)); -dataformat( ~(TR_FPDECSHIFT), 0 ); +/* not necessary as menu_dataformat_fpshift_specify_cleanup() has dataformat-like code in it that also handles the error case which this doesn't */ +/* dataformat( ~(TR_FPDECSHIFT), TR_FPDECSHIFT ); */ } void diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/pixmaps.c new/gtkwave-gtk3-3.3.128/src/pixmaps.c --- old/gtkwave-gtk3-3.3.126/src/pixmaps.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/pixmaps.c 2026-07-21 04:27:37.000000000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) Tony Bybell 1999-2012. + * Copyright (c) Tony Bybell 1999-2026. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -10,6 +10,7 @@ #include "globals.h" #include <config.h> #include "pixmaps.h" +#include <assert.h> /* XPM */ static char * icon_redo[] = { @@ -4670,6 +4671,123 @@ }; +/* XPM */ +static char *table_multiple[] = { +/* columns rows colors chars-per-pixel */ +"16 16 93 2 ", +" c #7CBE76", +". c #80C17A", +"X c #84C37E", +"o c #4277BB", +"O c #5284C3", +"+ c #5486C4", +"@ c #5586C6", +"# c #5687C7", +"$ c #5D8AC5", +"% c #598AC8", +"& c #5F8FCB", +"* c #6392CE", +"= c #6493CE", +"- c #6896D1", +"; c #6A97D1", +": c #6E99D3", +"> c #6F9BD4", +", c #729ED6", +"< c #74A0D7", +"1 c #75A1D7", +"2 c #7AA3DA", +"3 c #7DA5DC", +"4 c #7FA8DC", +"5 c #89C682", +"6 c #93CB8B", +"7 c #A1D398", +"8 c #A5D59C", +"9 c #80A9DD", +"0 c #87B0DA", +"q c #8BB3DC", +"w c #92B8DF", +"e c #84ACE0", +"r c #85ACE0", +"t c #87AEE1", +"y c #88AFE2", +"u c #8CB1E3", +"i c #8DB2E2", +"p c #8CB2E4", +"a c #8FB4E5", +"s c #92B6E5", +"d c #93B6E5", +"f c #93B7E7", +"g c #94B7E7", +"h c #96B8E7", +"j c #9BBFE3", +"k c #98BAE9", +"l c #99BBE9", +"z c #9BBDEB", +"x c #9CBDEB", +"c c #9DBEEB", +"v c #9EBFEC", +"b c #9FBFEC", +"n c #A4CBC6", +"m c #A4CBC9", +"M c #9EC1E5", +"N c #9FC0ED", +"B c #A2C4E1", +"V c #A2C3E6", +"C c #A6C3E9", +"Z c #A1C1EE", +"A c #A2C1EF", +"S c #AAC6E9", +"D c #ACC7E8", +"F c #ACC6E9", +"G c #A8C6EF", +"H c #AEC8E8", +"J c #AEC9EA", +"K c #B0C8E8", +"L c #B0C9E9", +"P c #B2CBEA", +"I c #B3CCEA", +"U c #B5CCE8", +"Y c #AECAF0", +"T c #D8E2F0", +"R c #DBE4F1", +"E c #DBE5F1", +"W c #DEE7F2", +"Q c #E5ECF7", +"! c #E6EDF6", +"~ c #E9EFF8", +"^ c #EAF0F7", +"/ c #EBF1F7", +"( c #EDF2F8", +") c #EDF3F9", +"_ c #EEF3FA", +"` c #F0F4FA", +"' c #F0F5FA", +"] c #F1F6FA", +"[ c #F2F6FA", +"{ c #F4F7FB", +"} c #F5F8FB", +"| c white", +" . c None", +/* pixels */ +" . . . . . . . . . . . . . . . .", +" . .A N c f p y e 9 3 2 . . . .", +" .Z { { { { { { { { { < . . . .", +" .v { n B M j w q 0 i 4 3 2 . .", +" .z { Y } } } } } } { ~ { < . .", +" .k { b _ m V N c f p y e 9 3 2 ", +" .g { x } G { { { { { { { { { < ", +" .a [ l _ v { 8 7 6 5 X . { > ", +" .u ] h } z { | | | | | | | { ; ", +" .t ` s ) k { C C C C C C C { = ", +" .1 ( d ' g { C | D | | | | / & ", +" ., : r Q a [ S F D D L K U W % ", +" . . .1 ( u ] J | D | | | | E @ ", +" . . ., : t ` P I D D D K H T + ", +" . . . . .1 ( ^ ! R T T T T T $ ", +" . . . . ., : - * # O O O O O o " +}; + + #ifdef MAC_INTEGRATION #define wave_gdk_pixmap_create_from_xpm_d(A,B,C,D) gdk_pixmap_create_from_xpm_d(A,NULL,C,D) #else @@ -4685,53 +4803,54 @@ { GdkPixbuf *gp; -GLOBALS->redo_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_redo); -GLOBALS->larrow_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_larrow); -GLOBALS->rarrow_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_rarrow); -GLOBALS->prev_page_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)prev_page_xpm); -GLOBALS->next_page_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)next_page_xpm); - -GLOBALS->zoomout_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_zoomout); -GLOBALS->zoomin_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_zoomin); -GLOBALS->zoomfit_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_zoomfit); -GLOBALS->zoomundo_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_zoomundo); -GLOBALS->zoom_larrow_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)zoom_larrow); -GLOBALS->zoom_rarrow_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)zoom_rarrow); +GLOBALS->redo_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_redo); +GLOBALS->larrow_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_larrow); +GLOBALS->rarrow_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_rarrow); +GLOBALS->prev_page_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)prev_page_xpm); +GLOBALS->next_page_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)next_page_xpm); + +GLOBALS->zoomout_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_zoomout); +GLOBALS->zoomin_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_zoomin); +GLOBALS->zoomfit_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_zoomfit); +GLOBALS->zoomundo_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_zoomundo); +GLOBALS->zoom_larrow_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)zoom_larrow); +GLOBALS->zoom_rarrow_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)zoom_rarrow); -GLOBALS->wave_info_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)wave_info); -GLOBALS->wave_alert_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)wave_alert); +GLOBALS->wave_info_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)wave_info); +GLOBALS->wave_alert_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)wave_alert); /* Verilog */ -GLOBALS->hiericon_module_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)chart_organisation); -GLOBALS->hiericon_task_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)cog); -GLOBALS->hiericon_function_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)chart_line); -GLOBALS->hiericon_begin_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)flag_green); -GLOBALS->hiericon_fork_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_divide); +GLOBALS->hiericon_module_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)chart_organisation); +GLOBALS->hiericon_task_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)cog); +GLOBALS->hiericon_function_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)chart_line); +GLOBALS->hiericon_begin_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)flag_green); +GLOBALS->hiericon_fork_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_divide); +GLOBALS->hiericon_sv_array_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)table_multiple); /* SV */ -GLOBALS->hiericon_interface_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_inout); -GLOBALS->hiericon_svpackage_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)package); -GLOBALS->hiericon_program_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)application); -GLOBALS->hiericon_class_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)plugin); +GLOBALS->hiericon_interface_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_inout); +GLOBALS->hiericon_svpackage_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)package); +GLOBALS->hiericon_program_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)application); +GLOBALS->hiericon_class_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)plugin); /* VHDL */ -GLOBALS->hiericon_design_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)database); -GLOBALS->hiericon_block_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)brick); -GLOBALS->hiericon_generateif_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_switch); -GLOBALS->hiericon_generatefor_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_rotate_clockwise); -GLOBALS->hiericon_instance_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_component); -GLOBALS->hiericon_package_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)box); - -GLOBALS->hiericon_signal_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)signal_gtkwave); -GLOBALS->hiericon_portin_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)door_in); -GLOBALS->hiericon_portout_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)door_out); -GLOBALS->hiericon_portinout_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)door_open); -GLOBALS->hiericon_buffer_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_extension); -GLOBALS->hiericon_linkage_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)icon_link); +GLOBALS->hiericon_design_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)database); +GLOBALS->hiericon_block_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)brick); +GLOBALS->hiericon_generateif_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_switch); +GLOBALS->hiericon_generatefor_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_rotate_clockwise); +GLOBALS->hiericon_instance_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_component); +GLOBALS->hiericon_package_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)box); + +GLOBALS->hiericon_signal_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)signal_gtkwave); +GLOBALS->hiericon_portin_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)door_in); +GLOBALS->hiericon_portout_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)door_out); +GLOBALS->hiericon_portinout_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)door_open); +GLOBALS->hiericon_buffer_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_extension); +GLOBALS->hiericon_linkage_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)icon_link); /* FSDB VHDL (on top of GHW's existing) */ -GLOBALS->hiericon_record_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)cd_img); -GLOBALS->hiericon_generate_pixbuf=gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_redo); +GLOBALS->hiericon_record_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)cd_img); +GLOBALS->hiericon_generate_pixbuf=XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)arrow_redo); /* set icon for window manager */ gp = GLOBALS->wave_info_pixbuf; @@ -4740,3 +4859,95 @@ return(gp); #endif } + + +/* replacement function as XPM has been removed in some distributions containing gdkpixbuf */ +GdkPixbuf *XXX_gdk_pixbuf_new_from_xpm_data(const gchar **src) +{ +int row = 0; +int width=0, height=0, ncols=0, ncolbytes=0; +unsigned int argb = 0; +int rc, i, x, y; +guchar r[65536]; +guchar g[65536]; +guchar b[65536]; +guchar a[65536]; + +memset(r, sizeof(r), 0); +memset(g, sizeof(g), 0); +memset(b, sizeof(b), 0); +memset(a, sizeof(a), 0); + +rc = sscanf(src[row++], "%d %d %d %d", &width, &height, &ncols, &ncolbytes); +assert(rc == 4); +assert(ncolbytes<=2); + +for(i=0;i<ncols;i++) + { + int cval = (ncolbytes==1) ? ((int)src[row][0]) : ((int)src[row][0])+256*((int)src[row][1]); + + assert(src[row][ncolbytes+1] == 'c'); + + if(src[row][ncolbytes+3] == '#') + { + const gchar *hex = src[row]+ncolbytes+4; + int slen = strlen(hex); + if(slen==6) /* 24-bit color specification */ + { + argb = get_rgb_from_name(src[row]+ncolbytes+4); + } + else + if(slen==12) /* chop down 48-bit color specification */ + { + gchar hex6[7] = {hex[0],hex[1], + hex[4],hex[5], + hex[8],hex[9], + 0}; + argb = get_rgb_from_name(hex6); + } + } + else + if((src[row][ncolbytes+3] == 'N') && (!strcmp(src[row]+ncolbytes+4, "one"))) + { + argb = 0xFF000000; + } + else + { + argb = get_rgb_from_name(src[row]+ncolbytes+3); + } + + b[cval] = argb & 255; argb >>= 8; + g[cval] = argb & 255; argb >>= 8; + r[cval] = argb & 255; argb >>= 8; + a[cval] = ~(argb & 255); + + row++; + } + +GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height); +guchar *pixels = gdk_pixbuf_get_pixels (pixbuf); +int rowstride = gdk_pixbuf_get_rowstride (pixbuf); +assert(gdk_pixbuf_get_n_channels(pixbuf) == 4); + +for(y=0;y<height;y++) + { + const char *cv = src[row++]; + for(x=0;x<width;x++) + { + int cval = ((int)*(cv++)); + + if(ncolbytes==2) + { + cval += (((int)*(cv++)) << 8); + } + + guchar *p = pixels + y * rowstride + x * 4; + p[0] = r[cval]; + p[1] = g[cval]; + p[2] = b[cval]; + p[3] = a[cval]; + } + } + +return(pixbuf); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/pixmaps.h new/gtkwave-gtk3-3.3.128/src/pixmaps.h --- old/gtkwave-gtk3-3.3.126/src/pixmaps.h 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/pixmaps.h 2026-07-21 04:27:37.000000000 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) Tony Bybell 1999-2011. + * Copyright (c) Tony Bybell 1999-2026. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -26,7 +26,7 @@ #define WAVE_SPLASH_Y (384) void make_splash_pixmaps(GtkWidget *window); - +GdkPixbuf *XXX_gdk_pixbuf_new_from_xpm_data(const gchar **src); #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/rc.h new/gtkwave-gtk3-3.3.128/src/rc.h --- old/gtkwave-gtk3-3.3.126/src/rc.h 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/rc.h 2026-07-21 04:27:37.000000000 +0200 @@ -26,7 +26,7 @@ void read_rc_file(char *override_rc); int insert_rc_variable(char *str); -int get_rgb_from_name(char *str); +int get_rgb_from_name(const char *str); int f_accel (char *str); int f_alt_hier_delimeter (char *str); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/renderopt.c new/gtkwave-gtk3-3.3.128/src/renderopt.c --- old/gtkwave-gtk3-3.3.126/src/renderopt.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/renderopt.c 2026-07-21 04:27:37.000000000 +0200 @@ -153,14 +153,10 @@ } else { - char *sysname = malloc_2(7 + 1 + len + 3 + 1 + len + 1); + char *sysname = malloc_2(6 + 1 + len + 3 + 1 + len + 1); int rc; -#ifdef MAC_INTEGRATION - sprintf(sysname, "pstopdf" /* 7 */ -#else sprintf(sysname, "ps2pdf" /* 6 */ -#endif " " /* 1 */ "%s" /* len + 3 */ " " /* 1 */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/rgb.c new/gtkwave-gtk3-3.3.128/src/rgb.c --- old/gtkwave-gtk3-3.3.126/src/rgb.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/rgb.c 2026-07-21 04:27:37.000000000 +0200 @@ -796,7 +796,7 @@ return((int)strcasecmp(key, color->name)); } -int get_rgb_from_name(char *str) +int get_rgb_from_name(const char *str) { struct wave_rgb_color *match; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/savefile.c new/gtkwave-gtk3-3.3.128/src/savefile.c --- old/gtkwave-gtk3-3.3.126/src/savefile.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/savefile.c 2026-07-21 04:27:37.000000000 +0200 @@ -16,7 +16,7 @@ #include <sys/stat.h> #endif -#ifdef __linux__ +#if defined( __linux__ ) || defined(__gnu_hurd__) #ifndef _XOPEN_SOURCE char *strptime(const char *s, const char *format, struct tm *tm); #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/splash.c new/gtkwave-gtk3-3.3.128/src/splash.c --- old/gtkwave-gtk3-3.3.126/src/splash.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/splash.c 2026-07-21 04:27:37.000000000 +0200 @@ -667,7 +667,7 @@ { (void) window; -GLOBALS->wave_splash_pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **)wave_splash_xpm); +GLOBALS->wave_splash_pixbuf = XXX_gdk_pixbuf_new_from_xpm_data((const gchar **)wave_splash_xpm); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/tree.c new/gtkwave-gtk3-3.3.128/src/tree.c --- old/gtkwave-gtk3-3.3.126/src/tree.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/tree.c 2026-07-21 04:27:37.000000000 +0200 @@ -860,6 +860,8 @@ case TREE_VHDL_ST_RECORD: pxb = GLOBALS->hiericon_record_pixbuf; break; case TREE_VHDL_ST_GENERATE: pxb = GLOBALS->hiericon_generate_pixbuf; break; + case TREE_SV_ST_ARRAY: pxb = GLOBALS->hiericon_sv_array_pixbuf; break; /* new VCD add for artificial hierarchy */ + default: pxb = NULL; break; } @@ -1073,6 +1075,8 @@ else if(!strcmp(p, "VHDL_ST_RECORD")) { exclhier |= exclone << TREE_VHDL_ST_RECORD; } else if(!strcmp(p, "VHDL_ST_PROCESS")) { exclhier |= exclone << TREE_VHDL_ST_PROCESS; } else if(!strcmp(p, "VHDL_ST_GENERATE")) { exclhier |= exclone << TREE_VHDL_ST_GENERATE; } + + else if(!strcmp(p, "SV_ST_ARRAY")) { exclhier |= exclone << TREE_SV_ST_ARRAY; } break; case SST_EXCL_COMP: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/tree.h new/gtkwave-gtk3-3.3.128/src/tree.h --- old/gtkwave-gtk3-3.3.126/src/tree.h 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/tree.h 2026-07-21 04:27:37.000000000 +0200 @@ -91,7 +91,10 @@ TREE_VHDL_ST_PROCEDURE, TREE_VHDL_ST_RECORD, TREE_VHDL_ST_PROCESS, - TREE_VHDL_ST_GENERATE + TREE_VHDL_ST_GENERATE, + + /* artificial hierarchy wrapper (for arrays) */ + TREE_SV_ST_ARRAY, }; #define WAVE_T_WHICH_UNDEFINED_COMPNAME (-1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/vcd.c new/gtkwave-gtk3-3.3.128/src/vcd.c --- old/gtkwave-gtk3-3.3.126/src/vcd.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/vcd.c 2026-07-21 04:27:37.000000000 +0200 @@ -1174,7 +1174,22 @@ case 'f': ttype = (GLOBALS->yytext_vcd_c_1[1] == 'u') ? TREE_VCD_ST_FUNCTION : TREE_VCD_ST_FORK; break; case 'b': ttype = TREE_VCD_ST_BEGIN; break; case 'g': ttype = TREE_VCD_ST_GENERATE; break; - case 's': ttype = TREE_VCD_ST_STRUCT; break; + case 's': { + char *vht = GLOBALS->yytext_vcd_c_1; + if(!strncmp(vht, "sv_", 3)) + { + switch(vht[3]) + { + case 'a': ttype = TREE_SV_ST_ARRAY; break; + default: ttype = TREE_UNKNOWN; break; + } + } + else + { + ttype = TREE_VCD_ST_STRUCT; break; + } + } + break; case 'u': ttype = TREE_VCD_ST_UNION; break; case 'c': ttype = TREE_VCD_ST_CLASS; break; case 'i': ttype = TREE_VCD_ST_INTERFACE; break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/vcd_partial.c new/gtkwave-gtk3-3.3.128/src/vcd_partial.c --- old/gtkwave-gtk3-3.3.126/src/vcd_partial.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/vcd_partial.c 2026-07-21 04:27:37.000000000 +0200 @@ -1113,8 +1113,23 @@ case 'f': ttype = (GLOBALS->yytext_vcd_partial_c_2[1] == 'u') ? TREE_VCD_ST_FUNCTION : TREE_VCD_ST_FORK; break; case 'b': ttype = TREE_VCD_ST_BEGIN; break; case 'g': ttype = TREE_VCD_ST_GENERATE; break; - case 's': ttype = TREE_VCD_ST_STRUCT; break; - case 'u': ttype = TREE_VCD_ST_UNION; break; + case 's': { + char *vht = GLOBALS->yytext_vcd_partial_c_2; + if(!strncmp(vht, "sv_", 3)) + { + switch(vht[3]) + { + case 'a': ttype = TREE_SV_ST_ARRAY; break; + default: ttype = TREE_UNKNOWN; break; + } + } + else + { + ttype = TREE_VCD_ST_STRUCT; break; + } + } + break; + case 'u': ttype = TREE_VCD_ST_UNION; break; case 'c': ttype = TREE_VCD_ST_CLASS; break; case 'i': ttype = TREE_VCD_ST_INTERFACE; break; case 'p': ttype = (GLOBALS->yytext_vcd_partial_c_2[1] == 'r') ? TREE_VCD_ST_PROGRAM : TREE_VCD_ST_PACKAGE; break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gtkwave-gtk3-3.3.126/src/vcd_recoder.c new/gtkwave-gtk3-3.3.128/src/vcd_recoder.c --- old/gtkwave-gtk3-3.3.126/src/vcd_recoder.c 2025-12-23 20:49:10.000000000 +0100 +++ new/gtkwave-gtk3-3.3.128/src/vcd_recoder.c 2026-07-21 04:27:37.000000000 +0200 @@ -1517,8 +1517,23 @@ case 'f': ttype = (GLOBALS->yytext_vcd_recoder_c_3[1] == 'u') ? TREE_VCD_ST_FUNCTION : TREE_VCD_ST_FORK; break; case 'b': ttype = TREE_VCD_ST_BEGIN; break; case 'g': ttype = TREE_VCD_ST_GENERATE; break; - case 's': ttype = TREE_VCD_ST_STRUCT; break; - case 'u': ttype = TREE_VCD_ST_UNION; break; + case 's': { + char *vht = GLOBALS->yytext_vcd_recoder_c_3; + if(!strncmp(vht, "sv_", 3)) + { + switch(vht[3]) + { + case 'a': ttype = TREE_SV_ST_ARRAY; break; + default: ttype = TREE_UNKNOWN; break; + } + } + else + { + ttype = TREE_VCD_ST_STRUCT; break; + } + } + break; + case 'u': ttype = TREE_VCD_ST_UNION; break; case 'c': ttype = TREE_VCD_ST_CLASS; break; case 'i': ttype = TREE_VCD_ST_INTERFACE; break; case 'p': ttype = (GLOBALS->yytext_vcd_recoder_c_3[1] == 'r') ? TREE_VCD_ST_PROGRAM : TREE_VCD_ST_PACKAGE; break;
