1 /*
2  * [The "BSD licence"]
3  * Copyright (c) 2010 Ben Gruver
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 package org.jf.util;
29 
30 import java.io.BufferedReader;
31 import java.io.InputStreamReader;
32 import java.util.regex.Matcher;
33 import java.util.regex.Pattern;
34 
35 public class ConsoleUtil {
36     /**
37      * Attempt to find the width of the console. If it can't get the width, return a default of 80
38      * @return The current console width
39      */
getConsoleWidth()40     public static int getConsoleWidth() {
41         if (System.getProperty("os.name").toLowerCase().contains("windows")) {
42             try {
43                 return attemptMode();
44             } catch (Exception ex) {
45             }
46         } else {
47             try {
48                 return attemptStty();
49             } catch (Exception ex) {
50             }
51         }
52 
53         return 80;
54     }
55 
attemptStty()56     private static int attemptStty() {
57         String output = attemptCommand(new String[]{"sh", "-c", "stty size < /dev/tty"});
58         if (output == null) {
59             return 80;
60         }
61 
62         String[] vals = output.split(" ");
63         if (vals.length < 2) {
64             return 80;
65         }
66         return Integer.parseInt(vals[1]);
67     }
68 
attemptMode()69     private static int attemptMode() {
70         String output = attemptCommand(new String[]{"mode", "con"});
71         if (output == null) {
72             return 80;
73         }
74 
75         Pattern pattern = Pattern.compile("Columns:[ \t]*(\\d+)");
76         Matcher m = pattern.matcher(output);
77         if (!m.find()) {
78             return 80;
79         }
80 
81         return Integer.parseInt(m.group(1));
82     }
83 
attemptCommand(String[] command)84     private static String attemptCommand(String[] command) {
85         StringBuffer buffer = null;
86 
87         try {
88 
89             Process p = Runtime.getRuntime().exec(command);
90             BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
91 
92             String line;
93 
94             while ((line = reader.readLine()) != null) {
95                 if (buffer == null) {
96                     buffer = new StringBuffer();
97                 }
98 
99                 buffer.append(line);
100             }
101 
102             if (buffer != null) {
103                 return buffer.toString();
104             }
105             return null;
106         } catch (Exception ex) {
107             return null;
108         }
109     }
110 }
111