Should be ok?
>From e7c20038d4b7151889a67ddaa7c8b502820bb388 Mon Sep 17 00:00:00 2001
From: sin <s...@2f30.org>
Date: Mon, 20 Jan 2014 12:03:01 +0000
Subject: [PATCH] Use the width of the output device by default in mc(1)

If that fails, fallback to 65 characters as before.  If the -c
option is specified then just use that.
---
 mc.1 |    9 ++++-----
 mc.c |   11 ++++++++++-
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/mc.1 b/mc.1
index f1c9a0f..b7ce4e3 100644
--- a/mc.1
+++ b/mc.1
@@ -19,9 +19,9 @@ If no file is given, mc reads from stdin.
 specifies the maximum number of character columns to use
 (unless the input contains lines longer than
 .I chars
-characters).
-.I chars
-defaults to 65.
+characters).  By default mc tries to figure out the width
+of the output device, if that fails it defaults to 65
+chars.
 .SH BUGS
 This implementation of
 .B mc
@@ -32,5 +32,4 @@ or TAB characters correctly.
 .B mc
 currently mangles files which contain embedded NULs.
 .B mc
-does not attempt to determine the width of its output device,
-nor does it allow the user to set a default width in its environment.
+does not allow the user to set a default width in its environment.
diff --git a/mc.c b/mc.c
index 381885d..411ce58 100644
--- a/mc.c
+++ b/mc.c
@@ -5,10 +5,12 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/ioctl.h>
 #include "text.h"
 #include "util.h"
 
 static long chars = 65;
+static int cflag;
 static struct linebuf b = EMPTY_LINEBUF;
 
 static long n_columns;
@@ -26,10 +28,12 @@ main(int argc, char *argv[])
        long i, l, col;
        size_t maxlen = 0;
        char *space;
+       struct winsize w;
        FILE *fp;
 
        ARGBEGIN {
        case 'c':
+               cflag = 1;
                chars = estrtol(EARGF(usage()), 0);
                if(chars < 3)
                        eprintf("%d: too few character columns");
@@ -38,6 +42,12 @@ main(int argc, char *argv[])
                usage();
        } ARGEND;
 
+       if (cflag == 0) {
+               ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
+               if (w.ws_col != 0)
+                       chars = w.ws_col;
+       }
+
        /* XXX librarify this chunk, too?  only useful in sponges though */
        if(argc == 0) {
                getlines(stdin, &b);
@@ -84,4 +94,3 @@ main(int argc, char *argv[])
 
        return EXIT_SUCCESS;
 }
-
-- 
1.7.10.4

Reply via email to