Add prefix support Hyejin Kim asked about.
diff --git a/toys/other/truncate.c b/toys/other/truncate.c
index d09818f..2b3d479 100644
--- a/toys/other/truncate.c
+++ b/toys/other/truncate.c
@@ -2,37 +2,61 @@
  *
  * Copyright 2011 Rob Landley <rob@landley.net>
 
-USE_TRUNCATE(NEWTOY(truncate, "<1s#|c", TOYFLAG_BIN))
+USE_TRUNCATE(NEWTOY(truncate, "<1s:|c", TOYFLAG_BIN))
 
 config TRUNCATE
   bool "truncate"
   default y
   help
-    usage: truncate [-c] -s file...
+    usage: truncate [-c] -s SIZE file...
 
     Set length of file(s), extending sparsely if necessary.
 
     -c	Don't create file if it doesn't exist.
-    -s	New size
+    -s	New size (with optional prefix and suffix)
+
+    SIZE prefix: + add, - subtract, < shrink to, > expand to,
+                 / block size rounding down, % block size rounding up
+    SIZE suffix: k=1024, m=1024^2, g=1024^3, t=1024^4, p=1024^5, e=1024^6
 */
 
 #define FOR_truncate
 #include "toys.h"
 
 GLOBALS(
+  char *s;
+
   long size;
+  int type;
 )
 
 static void do_truncate(int fd, char *name)
 {
+  long long size;
+
   if (fd<0) return;
-  if (ftruncate(fd, TT.size)) perror_msg("'%s' to '%ld'", name, TT.size);
+
+  if (TT.type == -1) size = TT.size;
+  else {
+    size = fdlength(fd);
+    if (TT.type<2) size += TT.size*(1-(2*TT.type));
+    else if (TT.type<4) {
+      if ((TT.type==3) ? size > TT.size : size < TT.size) size = TT.size;
+    } else {
+      size = (size+(TT.type-4)*(TT.size-1))/TT.size;
+      size *= TT.size;
+    }
+  }
+  if (ftruncate(fd, size)) perror_msg("'%s' to '%lld'", name, size);
 }
 
 void truncate_main(void)
 {
   int cr = !(toys.optflags&1);
 
+  if (-1 != (TT.type = stridx("+-<>/%", *TT.s))) TT.s++;
+  TT.size = atolx(TT.s);
+
   // Create files with mask rwrwrw.
   // Nonexistent files are only an error if we're supposed to create them.
   loopfiles_rw(toys.optargs, O_WRONLY|O_CLOEXEC|(cr ? O_CREAT : 0), 0666, cr,