diff options
author | Petter Rodhelind <petter.rodhelind@gmail.com> | 2019-02-05 01:40:37 +0100 |
---|---|---|
committer | Petter Rodhelind <petter.rodhelind@gmail.com> | 2019-02-05 01:40:37 +0100 |
commit | 892efcdacf40182a99cf7e8f65e9208b7f39ba2c (patch) | |
tree | 2a7e9654b1cbad2be7c3352cf48b56c3218f7e86 /src/cmd/acme | |
parent | 98222694f92aeecfcbb216fd1cb835b9550aa6d6 (diff) | |
parent | 3ad4afbe821687bd77f8dffb0e0bf4947faf0a83 (diff) | |
download | plan9port-892efcdacf40182a99cf7e8f65e9208b7f39ba2c.tar.gz plan9port-892efcdacf40182a99cf7e8f65e9208b7f39ba2c.tar.bz2 plan9port-892efcdacf40182a99cf7e8f65e9208b7f39ba2c.zip |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/cmd/acme')
-rw-r--r-- | src/cmd/acme/exec.c | 41 |
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); |