]> git.ozlabs.org Git - ccan/blobdiff - ccan/opt/usage.c
opt: accept newline in help strings
[ccan] / ccan / opt / usage.c
index 1142fb85c9c91ca091172d8971fe58101d0beca6..494b179bfde97ccb93c8969ce066f1b5860b5097 100644 (file)
@@ -1,7 +1,9 @@
 /* Licensed under GPLv3+ - see LICENSE file for details */
 #include <ccan/opt/opt.h>
+#if HAVE_SYS_TERMIOS_H
 #include <sys/ioctl.h>
 #include <sys/termios.h> /* Required on Solaris for struct winsize */
+#endif
 #include <sys/unistd.h> /* Required on Solaris for ioctl */
 #include <string.h>
 #include <stdlib.h>
@@ -17,19 +19,24 @@ const char opt_hidden[1];
 
 static unsigned int get_columns(void)
 {
-       struct winsize w;
+       int ws_col = 0;
        const char *env = getenv("COLUMNS");
 
-       w.ws_col = 0;
        if (env)
-               w.ws_col = atoi(env);
-       if (!w.ws_col)
-               if (ioctl(0, TIOCGWINSZ, &w) == -1)
-                       w.ws_col = 0;
-       if (!w.ws_col)
-               w.ws_col = 80;
-
-       return w.ws_col;
+               ws_col = atoi(env);
+
+#ifdef TIOCGWINSZ
+       if (!ws_col)
+       {
+               struct winsize w;
+               if (ioctl(0, TIOCGWINSZ, &w) != -1)
+                       ws_col = w.ws_col;
+       }
+#endif
+       if (!ws_col)
+               ws_col = 80;
+
+       return ws_col;
 }
 
 /* Return number of chars of words to put on this line.
@@ -40,7 +47,7 @@ static size_t consume_words(const char *words, size_t maxlen, size_t *prefix)
        size_t oldlen, len;
 
        /* Swallow leading whitespace. */
-       *prefix = strspn(words, " ");
+       *prefix = strspn(words, " \n");
        words += *prefix;
 
        /* Use at least one word, even if it takes us over maxlen. */
@@ -48,7 +55,9 @@ static size_t consume_words(const char *words, size_t maxlen, size_t *prefix)
        while (len <= maxlen) {
                oldlen = len;
                len += strspn(words+len, " ");
-               len += strcspn(words+len, " ");
+               if (words[len] == '\n')
+                       break;
+               len += strcspn(words+len, " \n");
                if (len == oldlen)
                        break;
        }