From patchwork Thu Dec 10 16:36:21 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadim Bendebury X-Patchwork-Id: 66287 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id nBAGaOXd016429 for ; Thu, 10 Dec 2009 16:36:24 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760971AbZLJQgQ (ORCPT ); Thu, 10 Dec 2009 11:36:16 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1760998AbZLJQgQ (ORCPT ); Thu, 10 Dec 2009 11:36:16 -0500 Received: from smtp-out.google.com ([216.239.45.13]:45903 "EHLO smtp-out.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760971AbZLJQgQ (ORCPT ); Thu, 10 Dec 2009 11:36:16 -0500 Received: from kpbe19.cbf.corp.google.com (kpbe19.cbf.corp.google.com [172.25.105.83]) by smtp-out.google.com with ESMTP id nBAGaMmx029237 for ; Thu, 10 Dec 2009 08:36:22 -0800 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta; t=1260462982; bh=HKdNHs0eb9DM8yA00i9/xAv9wpU=; h=To:Subject:Message-Id:Date:From; b=X/1dyUBv7RvRX1GnmfrNYEXNTnMYZybk+JqOIXCYup5myshxsJHWZiVVcSwM+v2uC g9b2dKvbPgyzlpxlEVUJw== DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns; h=to:subject:message-id:date:from:x-system-of-record; b=F2HHgS+61IiAdsb/jyF3oN2KkcxVCK4J5OywrVWIgCwNfTA/K7g5UFVEZLbnH5eLZ tpJsYBwscIAtLUaNde+ew== Received: from eskimo.mtv.corp.google.com (eskimo.mtv.corp.google.com [172.18.124.124]) by kpbe19.cbf.corp.google.com with ESMTP id nBAGaLRQ032279 for ; Thu, 10 Dec 2009 08:36:21 -0800 Received: by eskimo.mtv.corp.google.com (Postfix, from userid 41370) id 2E868262573; Thu, 10 Dec 2009 08:36:21 -0800 (PST) To: linux-kbuild@vger.kernel.org Subject: [PATCH} wrap long help lines Message-Id: <20091210163621.2E868262573@eskimo.mtv.corp.google.com> Date: Thu, 10 Dec 2009 08:36:21 -0800 (PST) From: vbendeb@google.com (Vadim Bendebury) X-System-Of-Record: true Sender: linux-kbuild-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index edd3f39..2aa49e8 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c @@ -1083,6 +1083,8 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char * } if (expr_compare_type(prevtoken, e->type) > 0) fn(data, NULL, ")"); + + str_screen_wrap(data, "||"); } static void expr_print_file_helper(void *data, struct symbol *sym, const char *str) diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index f379b0b..8fc69a3 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -112,6 +112,7 @@ struct gstr str_assign(const char *s); void str_free(struct gstr *gs); void str_append(struct gstr *gs, const char *s); void str_printf(struct gstr *gs, const char *fmt, ...); +void str_screen_wrap(struct gstr *gs, const char *break_point); const char *str_get(struct gstr *gs); /* symbol.c */ diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c index b6b2a46..f6c8930 100644 --- a/scripts/kconfig/util.c +++ b/scripts/kconfig/util.c @@ -7,6 +7,7 @@ #include #include "lkc.h" +#include /* file already present in list? If not add it */ struct file *file_lookup(const char *name) @@ -131,3 +132,54 @@ const char *str_get(struct gstr *gs) return gs->s; } +static const char string_breaker[] = { '\\', '\n' }; +#define STRING_BREAKER_SIZE sizeof(string_breaker) +/* + * wrap long lines in the passed in strings. The lines are wrapped to fit into + * the current screen width. The lines can be broken only at 'break points' - + * passed in as the second parameter. A \ (two characters) sequence is + * instered after the appropriate break points to get the line wrapped to fit + * the screen. +*/ +void str_screen_wrap(struct gstr *data, const char *break_point) +{ + char *eol_location; + int total_length; + int screen_width = getmaxx(stdscr) - 10; + int break_point_size = strlen(break_point); + + eol_location = strrchr(data->s, '\n'); + if (!eol_location) + eol_location = data->s; + + total_length = strlen(data->s) + 1; /* include trailing zero */ + + /* while last line's length exceeds screen width */ + while ((total_length - (eol_location - data->s) - 1) > screen_width) { + char *prev_breakp; + char *breakp = eol_location; + do { + prev_breakp = breakp; + breakp = strstr(breakp + 1, break_point); + } while (breakp && + ((breakp - eol_location) < screen_width)); + + if (prev_breakp == eol_location) { + /* no break_points found */ + return; + } + + total_length += STRING_BREAKER_SIZE; + if (data->len < total_length) { + data->s = realloc(data->s, total_length); + data->len = total_length; + } + prev_breakp += break_point_size; + + eol_location = prev_breakp + STRING_BREAKER_SIZE; + /* move the remainder of the string including trailing zero */ + memmove(eol_location, prev_breakp, strlen(prev_breakp) + 1); + /* insert the line break */ + memcpy(prev_breakp, string_breaker, STRING_BREAKER_SIZE); + } +}