SunOS can rot in hell.
diff --git a/src/cmd/acme/addr.c b/src/cmd/acme/addr.c
index d64db61..2a34474 100644
--- a/src/cmd/acme/addr.c
+++ b/src/cmd/acme/addr.c
@@ -64,7 +64,7 @@
 		if(line<0 || line>t->file->b.nc)
 			goto Rescue;
 		*evalp = TRUE;
-		return (Range){line, line};
+		return range(line, line);
 	}
 	q0 = r.q0;
 	q1 = r.q1;
@@ -104,7 +104,7 @@
 			--q0;
 	}
 	*evalp = TRUE;
-	return (Range){q0, q1};
+	return range(q0, q1);
 
     Rescue:
 	if(md != nil)
@@ -197,7 +197,7 @@
 				if(c == '.')
 					r = ar;
 				else
-					r = (Range){t->file->b.nc, t->file->b.nc};
+					r = range(t->file->b.nc, t->file->b.nc);
 			if(q < q1)
 				dir = Fore;
 			else
diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c
index 0e3389d..3c1aad2 100644
--- a/src/cmd/acme/exec.c
+++ b/src/cmd/acme/exec.c
@@ -106,7 +106,7 @@
 	{ LTab,		tab,		FALSE,	XXX,		XXX		},
 	{ LUndo,		undo,	FALSE,	TRUE,	XXX		},
 	{ LZerox,	zeroxx,	FALSE,	XXX,		XXX		},
-	{ nil, 			nil,		0,		0,		0		},
+	{ nil, 			0,		0,		0,		0		},
 };
 
 Exectab*
diff --git a/src/cmd/acme/fns.h b/src/cmd/acme/fns.h
index c164bb3..3cabc66 100644
--- a/src/cmd/acme/fns.h
+++ b/src/cmd/acme/fns.h
@@ -91,6 +91,7 @@
 void		startplumbing(void);
 
 Runestr	runestr(Rune*, uint);
+Range range(int, int);
 
 #define	runemalloc(a)		(Rune*)emalloc((a)*sizeof(Rune))
 #define	runerealloc(a, b)	(Rune*)erealloc((a), (b)*sizeof(Rune))
diff --git a/src/cmd/acme/fsys.c b/src/cmd/acme/fsys.c
index af4255c..fb4ae5c 100644
--- a/src/cmd/acme/fsys.c
+++ b/src/cmd/acme/fsys.c
@@ -310,7 +310,7 @@
 fsysflush(Xfid *x, Fid *f)
 {
 	USED(f);
-	sendp(x->c, xfidflush);
+	sendp(x->c, (void*)xfidflush);
 	return nil;
 }
 
@@ -526,7 +526,7 @@
 	if(((f->dir->perm&~(DMDIR|DMAPPEND))&m) != m)
 		goto Deny;
 
-	sendp(x->c, xfidopen);
+	sendp(x->c, (void*)xfidopen);
 	return nil;
 
     Deny:
@@ -624,7 +624,7 @@
 		free(b);
 		return x;
 	}
-	sendp(x->c, xfidread);
+	sendp(x->c, (void*)xfidread);
 	return nil;
 }
 
@@ -633,7 +633,7 @@
 fsyswrite(Xfid *x, Fid *f)
 {
 	USED(f);
-	sendp(x->c, xfidwrite);
+	sendp(x->c, (void*)xfidwrite);
 	return nil;
 }
 
@@ -642,7 +642,7 @@
 fsysclunk(Xfid *x, Fid *f)
 {
 	fsysdelid(f->mntdir);
-	sendp(x->c, xfidclose);
+	sendp(x->c, (void*)xfidclose);
 	return nil;
 }
 
diff --git a/src/cmd/acme/look.c b/src/cmd/acme/look.c
index 7023382..f892640 100644
--- a/src/cmd/acme/look.c
+++ b/src/cmd/acme/look.c
@@ -591,7 +591,7 @@
 	e->u.at = t;
 	e->a0 = amin+1;
 	eval = FALSE;
-	address(nil, nil, (Range){-1,-1}, (Range){0, 0}, t, e->a0, amax, tgetc, &eval, (uint*)&e->a1);
+	address(nil, nil, range(-1,-1), range(0,0), t, e->a0, amax, tgetc, &eval, (uint*)&e->a1);
 	return TRUE;
 
    Isntfile:
@@ -723,7 +723,7 @@
 		eval = FALSE;
 	else{
 		eval = TRUE;
-		r = address(nil, t, (Range){-1, -1}, (Range){t->q0, t->q1}, e->u.at, e->a0, e->a1, e->agetc, &eval, &dummy);
+		r = address(nil, t, range(-1,-1), range(t->q0, t->q1), e->u.at, e->a0, e->a1, e->agetc, &eval, &dummy);
 		if(eval == FALSE)
 			e->jump = FALSE;	/* don't jump if invalid address */
 	}
diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c
index c0cd7ec..6c1243c 100644
--- a/src/cmd/acme/text.c
+++ b/src/cmd/acme/text.c
@@ -894,7 +894,7 @@
 		/* horrible botch: while asleep, may have lost selection altogether */
 		if(selectq > t->file->b.nc)
 			selectq = t->org + t->fr.p0;
-		t->fr.scroll = nil;
+		t->fr.scroll = 0;
 		if(selectq < t->org)
 			q0 = selectq;
 		else
diff --git a/src/cmd/acme/util.c b/src/cmd/acme/util.c
index a7307e0..f72a5bf 100644
--- a/src/cmd/acme/util.c
+++ b/src/cmd/acme/util.c
@@ -14,6 +14,16 @@
 static	Point		prevmouse;
 static	Window	*mousew;
 
+Range
+range(int q0, int q1)
+{
+	Range r;
+
+	r.q0 = q0;
+	r.q1 = q1;
+	return r;
+}
+
 Runestr
 runestr(Rune *r, uint n)
 {
diff --git a/src/cmd/acme/xfid.c b/src/cmd/acme/xfid.c
index 839308e..5fc4c5a 100644
--- a/src/cmd/acme/xfid.c
+++ b/src/cmd/acme/xfid.c
@@ -47,7 +47,7 @@
 	threadsetname("xfidctlthread");
 	x = arg;
 	for(;;){
-		f = recvp(x->c);
+		f = (void(*)(Xfid*))recvp(x->c);
 		(*f)(x);
 		flushimage(display, 1);
 		sendp(cxfidfree, x);
@@ -104,8 +104,8 @@
 		switch(q){
 		case QWaddr:
 			if(w->nopen[q]++ == 0){
-				w->addr = (Range){0,0};
-				w->limit = (Range){-1,-1};
+				w->addr = range(0,0);
+				w->limit = range(-1,-1);
 			}
 			break;
 		case QWdata:
@@ -164,7 +164,7 @@
 			seq++;
 			filemark(t->file);
 			cut(t, t, nil, FALSE, TRUE, nil, 0);
-			w->wrselrange = (Range){t->q1, t->q1};
+			w->wrselrange = range(t->q1, t->q1);
 			w->nomark = TRUE;
 			break;
 		case QWeditout:
@@ -173,7 +173,7 @@
 				respond(x, &fc, Eperm);
 				return;
 			}
-			w->wrselrange = (Range){t->q1, t->q1};
+			w->wrselrange = range(t->q1, t->q1);
 			break;
 		}
 		winunlock(w);