commit - 2607cc565ee3d5facb8949e9acfed35c8ae300c9
commit + 43f1873709d39405b55f676ef21c42065cc1408d
blob - 68c5d9769104ff055b0de019884778a8de944b40
blob + 0fc6c16b4e33aabe25b80028cd30cbe807d279a9
--- src/cmd/acme/exec.c
+++ src/cmd/acme/exec.c
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;
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);