<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>