<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/27d5b33250ac794c0d70252a4c3c93038ff5e402">https://github.com/macports/macports-base/commit/27d5b33250ac794c0d70252a4c3c93038ff5e402</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 27d5b33250ac794c0d70252a4c3c93038ff5e402
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sun Jun 9 23:33:52 2024 +1000

<span style='display:block; white-space:pre;color:#404040;'>    snapshot_obj_ports: build proper Tcl lists
</span>---
 src/registry2.0/snapshotobj.c | 54 ++++++++++++++++++++-----------------------
 1 file changed, 25 insertions(+), 29 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/snapshotobj.c b/src/registry2.0/snapshotobj.c
</span><span style='display:block; white-space:pre;color:#808080;'>index cfcfb628d..d422c6124 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/snapshotobj.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/snapshotobj.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -30,11 +30,6 @@
</span> #include <config.h>
 #endif
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-/* required for asprintf(3) on macOS */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define _DARWIN_C_SOURCE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/* required for asprintf(3) on Linux */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define _GNU_SOURCE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> #include <string.h>
 #include <stdlib.h>
 #include <tcl.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -112,45 +107,46 @@ static int snapshot_obj_ports(Tcl_Interp* interp, reg_snapshot* snapshot, int ob
</span>         return TCL_ERROR;
     }
     if (objc == 2) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        /* ${snapshot} prop; return the current value */
</span>         reg_registry* reg = registry_for(interp, reg_attached);
         if (reg == NULL) {
             return TCL_ERROR;
         }
         if (Tcl_GetIndexFromObj(interp, objv[1], snapshot_props, "prop", 0, &index)
                 == TCL_OK) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            int returncode = TCL_OK;
</span>             port** ports;
             reg_error error;
             int port_count = reg_snapshot_ports_get(snapshot, &ports, &error);
             if (port_count >= 0) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                char* portstrs[port_count + 1];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                int i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                for(i = 0; i < port_count; i++){
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    port* current_port = ports[i];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    portstrs[i] = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if (asprintf(&portstrs[i], "%s %d %s %s %s",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            current_port->name,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            current_port->requested,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            current_port->state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            current_port->variants,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            current_port->requested_variants) < 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        return TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* 5 elements in each returned sublist */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                Tcl_Obj* port_elements[5];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                Tcl_Obj* current_port;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                Tcl_Obj* result = Tcl_NewListObj(port_count, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                for (int i = 0; i < port_count; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port_elements[0] = Tcl_NewStringObj(ports[i]->name, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port_elements[1] = Tcl_NewIntObj(ports[i]->requested);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port_elements[2] = Tcl_NewStringObj(ports[i]->state, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port_elements[3] = Tcl_NewStringObj(ports[i]->variants, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port_elements[4] = Tcl_NewStringObj(ports[i]->requested_variants, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    current_port = Tcl_NewListObj((sizeof(port_elements)/sizeof(port_elements[0])), port_elements);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if (current_port == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        returncode = TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if (Tcl_ListObjAppendElement(interp, result, current_port) != TCL_OK) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        returncode = TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        break;
</span>                     }
                 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                Tcl_Obj** objs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if (list_string_to_obj(&objs, portstrs, port_count, &error)){
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    Tcl_Obj* result = Tcl_NewListObj(port_count, objs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                for (int i=0; i < port_count; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    free(ports[i]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                free(ports);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if (returncode == TCL_OK) {
</span>                     Tcl_SetObjResult(interp, result);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    free(objs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    for (i=0; i < port_count; i++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        free(ports[i]);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    free(ports);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return TCL_OK;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return registry_failed(interp, &error);
</span>                 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                return returncode;
</span>             }
             return registry_failed(interp, &error);
         }
</pre><pre style='margin:0'>

</pre>