aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/acme/exec.c
diff options
context:
space:
mode:
authorPetter Rodhelind <petter.rodhelind@gmail.com>2019-02-05 01:40:37 +0100
committerPetter Rodhelind <petter.rodhelind@gmail.com>2019-02-05 01:40:37 +0100
commit892efcdacf40182a99cf7e8f65e9208b7f39ba2c (patch)
tree2a7e9654b1cbad2be7c3352cf48b56c3218f7e86 /src/cmd/acme/exec.c
parent98222694f92aeecfcbb216fd1cb835b9550aa6d6 (diff)
parent3ad4afbe821687bd77f8dffb0e0bf4947faf0a83 (diff)
downloadplan9port-892efcdacf40182a99cf7e8f65e9208b7f39ba2c.tar.gz
plan9port-892efcdacf40182a99cf7e8f65e9208b7f39ba2c.tar.bz2
plan9port-892efcdacf40182a99cf7e8f65e9208b7f39ba2c.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/cmd/acme/exec.c')
-rw-r--r--src/cmd/acme/exec.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c
index 7ad28872..ad818505 100644
--- a/src/cmd/acme/exec.c
+++ b/src/cmd/acme/exec.c
@@ -693,12 +693,44 @@ checksha1(char *name, File *f, Dir *d)
f->qidpath = d->qid.path;
f->mtime = d->mtime;
}
-}
+}
+
+static uint
+trimspaces(Rune *r, uint *np, int eof)
+{
+ uint i, w, nonspace, n;
+ Rune c;
+
+ nonspace = 0;
+ w = 0;
+ n = *np;
+ for(i=0; i<n; i++) {
+ c = r[i];
+ if(c == '\n')
+ w = nonspace;
+ r[w++] = c;
+ if(c != ' ' && c != '\t')
+ nonspace = w;
+ }
+ if(nonspace > 0 && nonspace < w) {
+ // Trailing spaces at end of buffer.
+ // Tell caller to reread them with what follows,
+ // so we can determine whether they need trimming.
+ // Unless the trailing spaces are the entire buffer,
+ // in which case let them through to avoid an infinite loop
+ // if an entire buffer fills with spaces.
+ // At EOF, just consume the spaces.
+ if(!eof)
+ *np = n - (w - nonspace);
+ w = nonspace;
+ }
+ return w;
+}
void
putfile(File *f, int q0, int q1, Rune *namer, int nname)
{
- uint n, m;
+ uint n, nn, m;
Rune *r;
Biobuf *b;
char *s, *name;
@@ -753,7 +785,10 @@ putfile(File *f, int q0, int q1, Rune *namer, int nname)
if(n > BUFSIZE/UTFmax)
n = BUFSIZE/UTFmax;
bufread(&f->b, q, r, n);
- m = snprint(s, BUFSIZE+1, "%.*S", n, r);
+ nn = n;
+ if(w->autoindent)
+ nn = trimspaces(r, &n, q+n==q1);
+ m = snprint(s, BUFSIZE+1, "%.*S", nn, r);
sha1((uchar*)s, m, nil, h);
if(Bwrite(b, s, m) != m){
warning(nil, "can't write file %s: %r\n", name);