<pre style='margin:0'>
Rainer Müller (raimue) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/255eacd9708ca2d0b8dbfd3709b24ac80fad32e1">https://github.com/macports/macports-base/commit/255eacd9708ca2d0b8dbfd3709b24ac80fad32e1</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 255eacd9708ca2d0b8dbfd3709b24ac80fad32e1
</span>Author: Rainer Müller <raimue@macports.org>
AuthorDate: Mon Apr 2 12:26:30 2018 +0200

<span style='display:block; white-space:pre;color:#404040;'>    system: Use getline(3) to avoid copying each line
</span>---
 src/pextlib1.0/system.c | 35 ++++++++++-------------------------
 1 file changed, 10 insertions(+), 25 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/pextlib1.0/system.c b/src/pextlib1.0/system.c
</span><span style='display:block; white-space:pre;color:#808080;'>index fda9e28..4813ccd 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/pextlib1.0/system.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/pextlib1.0/system.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -113,8 +113,6 @@ static void handle_sigint(int s) {
</span> /* usage: system ?-notty? ?-nodup? ?-nice value? ?-W path? command */
 int SystemCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
 {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    char *buf;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    size_t linelen;
</span>     char *args[7];
     char *cmdstring;
     int sandbox = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -290,32 +288,19 @@ int SystemCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Ob
</span>         read_failed = 0;
         pdes = fdopen(fdset[0], "r");
         if (pdes) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            while ((buf = fgetln(pdes, &linelen)) != NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                char *sbuf;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                size_t slen;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                * Allocate enough space to insert a terminating
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                * '\0' if the line is not terminated with a '\n'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if (buf[linelen - 1] == '\n')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    slen = linelen;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    slen = linelen + 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                sbuf = malloc(slen);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if (sbuf == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    read_failed = 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            char *line = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            size_t linesz = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ssize_t linelen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            while ((linelen = getline(&line, &linesz, pdes)) > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* replace '\n' if it exists */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if (line[linelen - 1] == '\n') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    line[linelen - 1] = '\0';
</span>                 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                memcpy(sbuf, buf, linelen);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                /* terminate line with '\0',replacing '\n' if it exists */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                sbuf[slen - 1] = '\0';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_info(interp, "%s", sbuf);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                free(sbuf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_info(interp, "%s", line);
</span>             }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            free(line);
</span>             fclose(pdes);
         } else {
             read_failed = 1;
</pre><pre style='margin:0'>

</pre>