From ea224be6aa8fed5486376d3021a4cb911e935106 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sun, 18 Jun 2006 20:20:07 +0000 Subject: skip_whitespace() shouldn't claim its return value is const, it doesn't know that and callers wind up typecasting it back. --- applets/applets.c | 9 ++-- coreutils/ls.c | 112 ++++++++++----------------------------- coreutils/test.c | 7 +-- coreutils/uniq.c | 6 +-- include/libbb.h | 2 +- libbb/dump.c | 33 ++++++------ libbb/inet_common.c | 2 +- libbb/pw_encrypt.c | 2 +- libbb/skip_whitespace.c | 23 ++------ libpwdgrp/pwd_grp.c | 8 +-- networking/libiproute/ll_proto.c | 3 +- util-linux/hexdump.c | 49 ++--------------- 12 files changed, 64 insertions(+), 192 deletions(-) diff --git a/applets/applets.c b/applets/applets.c index aea116a..27becfd 100644 --- a/applets/applets.c +++ b/applets/applets.c @@ -14,8 +14,6 @@ #include "busybox.h" #include -#include -#include #include #include @@ -43,7 +41,6 @@ const size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1); #ifdef CONFIG_FEATURE_SUID_CONFIG -#include #include #include "pwd_.h" #include "grp_.h" @@ -99,7 +96,7 @@ static char *get_trimmed_slice(char *s, char *e) /* Next, advance past all leading space and return a ptr to the * first non-space char; possibly the terminating nul. */ - return (char *) bb_skip_whitespace(s); + return skip_whitespace(s); } @@ -240,7 +237,7 @@ static void parse_config_file(void) /* Get the specified mode. */ - e = (char *) bb_skip_whitespace(e+1); + e = skip_whitespace(e+1); for (i=0 ; i < 3 ; i++) { const char *q; @@ -253,7 +250,7 @@ static void parse_config_file(void) /* Now get the the user/group info. */ - s = (char *) bb_skip_whitespace(e); + s = skip_whitespace(e); /* Note: We require whitespace between the mode and the * user/group info. */ diff --git a/coreutils/ls.c b/coreutils/ls.c index 47acec6..4a20b33 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -36,32 +36,18 @@ enum { /************************************************************************/ -#include -#include -#include +#include "busybox.h" #include -#include #include -#include #include -#include #include #include -#include #include /* struct option */ #include #include /* major() and minor() */ -#include "busybox.h" -#ifdef CONFIG_SELINUX -#include /* for is_selinux_enabled() */ -#endif - -#ifdef CONFIG_FEATURE_LS_TIMESTAMPS #include -#endif /* what is the overall style of the listing */ -#define STYLE_AUTO (0) #define STYLE_COLUMNS (1U<<21) /* fill columns */ #define STYLE_LONG (2U<<21) /* one record per line, extended info */ #define STYLE_SINGLE (3U<<21) /* one record per line */ @@ -99,7 +85,7 @@ enum { #define DISP_MASK (((DISP_ROWS << 1) - 1) & ~(DISP_DIRNAME - 1)) -#ifdef CONFIG_FEATURE_LS_SORTFILES +// CONFIG_FEATURE_LS_SORTFILES /* how will the files be sorted */ #define SORT_ORDER_FORWARD 0 /* sort in reverse order */ #define SORT_ORDER_REVERSE (1U<<27) /* sort in reverse order */ @@ -114,7 +100,6 @@ enum { #define SORT_DIR (7U<<28) /* sort by file or directory */ #define SORT_MASK (7U<<28) -#endif #ifdef CONFIG_FEATURE_LS_TIMESTAMPS /* which of the three times will be used */ @@ -416,11 +401,8 @@ static int sortcmp(const void *a, const void *b) if (dif == 0) { /* sort by name- may be a tie_breaker for time or size cmp */ -#ifdef CONFIG_LOCALE_SUPPORT - dif = strcoll(d1->name, d2->name); -#else - dif = strcmp(d1->name, d2->name); -#endif + if (ENABLE_LOCALE_SUPPORT) dif = strcoll(d1->name, d2->name); + else dif = strcmp(d1->name, d2->name); } if (all_fmt & SORT_ORDER_REVERSE) { @@ -434,8 +416,12 @@ static void dnsort(struct dnode **dn, int size) { qsort(dn, size, sizeof *dn, sortcmp); } +#else +#define sortcmp(a, b) 0 +#define dnsort(dn, size) #endif + /*----------------------------------------------------------------------*/ static void showfiles(struct dnode **dn, int nfiles) { @@ -502,11 +488,8 @@ static void showdirs(struct dnode **dn, int ndirs, int first) { int i, nfiles; struct dnode **subdnp; - -#ifdef CONFIG_FEATURE_LS_RECURSIVE int dndirs; struct dnode **dnd; -#endif if (dn == NULL || ndirs < 1) return; @@ -522,9 +505,7 @@ static void showdirs(struct dnode **dn, int ndirs, int first) nfiles = countfiles(subdnp); if (nfiles > 0) { /* list all files at this level */ -#ifdef CONFIG_FEATURE_LS_SORTFILES - dnsort(subdnp, nfiles); -#endif + if (ENABLE_FEATURE_LS_SORTFILES) dnsort(subdnp, nfiles); showfiles(subdnp, nfiles); #ifdef CONFIG_FEATURE_LS_RECURSIVE if (all_fmt & DISP_RECURSIVE) { @@ -532,9 +513,7 @@ static void showdirs(struct dnode **dn, int ndirs, int first) dnd = splitdnarray(subdnp, nfiles, SPLIT_SUBDIR); dndirs = countsubdirs(subdnp, nfiles); if (dndirs > 0) { -#ifdef CONFIG_FEATURE_LS_SORTFILES - dnsort(dnd, dndirs); -#endif + if (ENABLE_FEATURE_LS_SORTFILES) dnsort(dnd, dndirs); showdirs(dnd, dndirs, 0); free(dnd); /* free the array of dnode pointers to the dirs */ } @@ -796,12 +775,6 @@ static int list_single(struct dnode *dn) # define LS_STR_TIMESTAMPS "" #endif -#ifdef CONFIG_FEATURE_LS_SORTFILES -# define LS_STR_SORTFILES "SXrv" -#else -# define LS_STR_SORTFILES "" -#endif - #ifdef CONFIG_FEATURE_LS_FILETYPES # define LS_STR_FILETYPES "Fp" #else @@ -840,7 +813,7 @@ static int list_single(struct dnode *dn) static const char ls_options[]="Cadil1gnsxAk" \ LS_STR_TIMESTAMPS \ - LS_STR_SORTFILES \ + USE_FEATURE_LS_SORTFILES("SXrv") \ LS_STR_FILETYPES \ LS_STR_FOLLOW_LINKS \ LS_STR_RECURSIVE \ @@ -872,22 +845,10 @@ static const unsigned opt_flags[] = { 0, /* k - ingored */ #endif #ifdef CONFIG_FEATURE_LS_TIMESTAMPS -# ifdef CONFIG_FEATURE_LS_SORTFILES - TIME_CHANGE | SORT_CTIME, /* c */ -# else - TIME_CHANGE, /* c */ -# endif + TIME_CHANGE | (ENABLE_FEATURE_LS_SORTFILES * SORT_CTIME), /* c */ LIST_FULLTIME, /* e */ -# ifdef CONFIG_FEATURE_LS_SORTFILES - SORT_MTIME, /* t */ -# else - 0, /* t - ignored -- is this correct? */ -# endif -# ifdef CONFIG_FEATURE_LS_SORTFILES - TIME_ACCESS | SORT_ATIME, /* u */ -# else - TIME_ACCESS, /* u */ -# endif + ENABLE_FEATURE_LS_SORTFILES * SORT_MTIME, /* t */ + TIME_ACCESS | (ENABLE_FEATURE_LS_SORTFILES * SORT_ATIME), /* u */ #endif #ifdef CONFIG_FEATURE_LS_SORTFILES SORT_SIZE, /* S */ @@ -943,14 +904,8 @@ int ls_main(int argc, char **argv) char *color_opt; #endif - all_fmt = LIST_SHORT | STYLE_AUTO -#ifdef CONFIG_FEATURE_LS_TIMESTAMPS - | TIME_MOD -#endif -#ifdef CONFIG_FEATURE_LS_SORTFILES - | SORT_NAME | SORT_ORDER_FORWARD -#endif - ; + all_fmt = LIST_SHORT | (ENABLE_FEATURE_LS_TIMESTAMPS * TIME_MOD) | + (ENABLE_FEATURE_LS_SORTFILES * (SORT_NAME | SORT_ORDER_FORWARD)); #ifdef CONFIG_FEATURE_AUTOWIDTH /* Obtain the terminal width. */ @@ -993,11 +948,9 @@ int ls_main(int argc, char **argv) if (flags & STYLE_MASK_TRIGGER) { all_fmt &= ~STYLE_MASK; } -#ifdef CONFIG_FEATURE_LS_SORTFILES - if (flags & SORT_MASK_TRIGGER) { + if (ENABLE_FEATURE_LS_SORTFILES && (flags & SORT_MASK_TRIGGER)) { all_fmt &= ~SORT_MASK; } -#endif if (flags & DISP_MASK_TRIGGER) { all_fmt &= ~DISP_MASK; } @@ -1049,12 +1002,12 @@ int ls_main(int argc, char **argv) if (all_fmt & DISP_NOLIST) all_fmt &= ~DISP_RECURSIVE; /* no recurse if listing only dir */ #endif -#if defined (CONFIG_FEATURE_LS_TIMESTAMPS) && defined (CONFIG_FEATURE_LS_SORTFILES) - if (all_fmt & TIME_CHANGE) - all_fmt = (all_fmt & ~SORT_MASK) | SORT_CTIME; - if (all_fmt & TIME_ACCESS) - all_fmt = (all_fmt & ~SORT_MASK) | SORT_ATIME; -#endif + if (ENABLE_FEATURE_LS_TIMESTAMPS && ENABLE_FEATURE_LS_SORTFILES) { + if (all_fmt & TIME_CHANGE) + all_fmt = (all_fmt & ~SORT_MASK) | SORT_CTIME; + if (all_fmt & TIME_ACCESS) + all_fmt = (all_fmt & ~SORT_MASK) | SORT_ATIME; + } if ((all_fmt & STYLE_MASK) != STYLE_LONG) /* only for long list */ all_fmt &= ~(LIST_ID_NUMERIC|LIST_FULLTIME|LIST_ID_NAME|LIST_ID_NUMERIC); #ifdef CONFIG_FEATURE_LS_USERNAME @@ -1063,13 +1016,8 @@ int ls_main(int argc, char **argv) #endif /* choose a display format */ - if ((all_fmt & STYLE_MASK) == STYLE_AUTO) -#if STYLE_AUTO != 0 - all_fmt = (all_fmt & ~STYLE_MASK) - | (isatty(STDOUT_FILENO) ? STYLE_COLUMNS : STYLE_SINGLE); -#else + if (!(all_fmt & STYLE_MASK)) all_fmt |= (isatty(STDOUT_FILENO) ? STYLE_COLUMNS : STYLE_SINGLE); -#endif /* * when there are no cmd line args we have to supply a default "." arg. @@ -1114,9 +1062,7 @@ int ls_main(int argc, char **argv) } if (all_fmt & DISP_NOLIST) { -#ifdef CONFIG_FEATURE_LS_SORTFILES - dnsort(dnp, nfiles); -#endif + if (ENABLE_FEATURE_LS_SORTFILES) dnsort(dnp, nfiles); if (nfiles > 0) showfiles(dnp, nfiles); } else { @@ -1125,17 +1071,13 @@ int ls_main(int argc, char **argv) dndirs = countdirs(dnp, nfiles); dnfiles = nfiles - dndirs; if (dnfiles > 0) { -#ifdef CONFIG_FEATURE_LS_SORTFILES - dnsort(dnf, dnfiles); -#endif + if (ENABLE_FEATURE_LS_SORTFILES) dnsort(dnf, dnfiles); showfiles(dnf, dnfiles); if (ENABLE_FEATURE_CLEAN_UP) free(dnf); } if (dndirs > 0) { -#ifdef CONFIG_FEATURE_LS_SORTFILES - dnsort(dnd, dndirs); -#endif + if (ENABLE_FEATURE_LS_SORTFILES) dnsort(dnd, dndirs); showdirs(dnd, dndirs, dnfiles == 0); if (ENABLE_FEATURE_CLEAN_UP) free(dnd); diff --git a/coreutils/test.c b/coreutils/test.c index 4d92038..ab37936 100644 --- a/coreutils/test.c +++ b/coreutils/test.c @@ -19,14 +19,12 @@ * "This program is in the Public Domain." */ -#include +#include "busybox.h" #include #include #include -#include #include #include -#include "busybox.h" /* test(1) accepts the following grammar: oexpr ::= aexpr | aexpr "-o" oexpr ; @@ -482,8 +480,7 @@ static arith_t getn(const char *s) if (errno != 0) syntax(s, "out of range"); - /* p = bb_skip_whitespace(p); avoid const warning */ - if (*(bb_skip_whitespace(p))) + if (*(skip_whitespace(p))) syntax(s, "bad number"); return r; diff --git a/coreutils/uniq.c b/coreutils/uniq.c index be3d75c..956c507 100644 --- a/coreutils/uniq.c +++ b/coreutils/uniq.c @@ -10,12 +10,10 @@ /* BB_AUDIT SUSv3 compliant */ /* http://www.opengroup.org/onlinepubs/007904975/utilities/uniq.html */ -#include -#include +#include "busybox.h" #include #include #include -#include "busybox.h" static const char uniq_opts[] = "f:s:" "cdu\0\1\2\4"; @@ -77,7 +75,7 @@ int uniq_main(int argc, char **argv) while ((s1 = bb_get_chomped_line_from_file(in)) != NULL) { e1 = s1; for (i=skip_fields ; i ; i--) { - e1 = bb_skip_whitespace(e1); + e1 = skip_whitespace(e1); while (*e1 && !isspace(*e1)) { ++e1; } diff --git a/include/libbb.h b/include/libbb.h index 5877a4a..e9d7e75 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -200,7 +200,7 @@ extern void bb_warn_ignoring_args(int n); extern void chomp(char *s); extern void trim(char *s); -extern const char *bb_skip_whitespace(const char *); +extern char *skip_whitespace(const char *); extern struct BB_applet *find_applet_by_name(const char *name); void run_applet_by_name(const char *name, int argc, char **argv); diff --git a/libbb/dump.c b/libbb/dump.c index 1a54ebb..b12a8e2 100644 --- a/libbb/dump.c +++ b/libbb/dump.c @@ -10,11 +10,10 @@ * Original copyright notice is retained at the end of this file. */ -#include +#include "libbb.h" #include #include #include /* for isdigit() */ -#include "libbb.h" #include "dump.h" enum _vflag bb_dump_vflag = FIRST; @@ -83,9 +82,9 @@ int bb_dump_size(FS * fs) static void rewrite(FS * fs) { enum { NOTOKAY, USEBCNT, USEPREC } sokay; - register PR *pr, **nextpr = NULL; - register FU *fu; - register char *p1, *p2, *p3; + PR *pr, **nextpr = NULL; + FU *fu; + char *p1, *p2, *p3; char savech, *fmtp; const char *byte_count_str; int nconv, prec = 0; @@ -98,7 +97,7 @@ static void rewrite(FS * fs) for (nconv = 0, fmtp = fu->fmt; *fmtp; nextpr = &pr->nextpr) { /* NOSTRICT */ /* DBU:[dvae@cray.com] calloc so that forward ptrs start out NULL*/ - pr = (PR *) xzalloc(sizeof(PR)); + pr = xzalloc(sizeof(PR)); if (!fu->nextpr) fu->nextpr = pr; /* ignore nextpr -- its unused inside the loop and is @@ -246,8 +245,7 @@ static void rewrite(FS * fs) { savech = *p3; *p3 = '\0'; - if (!(pr->fmt = realloc(pr->fmt, strlen(pr->fmt)+(p3-p2)+1))) - bb_perror_msg_and_die("hexdump"); + pr->fmt = xrealloc(pr->fmt, strlen(pr->fmt)+(p3-p2)+1); strcat(pr->fmt, p2); *p3 = savech; p2 = p3; @@ -673,17 +671,16 @@ int bb_dump_dump(char **argv) void bb_dump_add(const char *fmt) { - register const char *p; - register char *p1; - register char *p2; + const char *p; + char *p1; + char *p2; static FS **nextfs; FS *tfs; FU *tfu, **nextfu; const char *savep; /* start new linked list of format units */ - /* NOSTRICT */ - tfs = (FS *) xzalloc(sizeof(FS)); /*DBU:[dave@cray.com] start out NULL */ + tfs = xzalloc(sizeof(FS)); /*DBU:[dave@cray.com] start out NULL */ if (!bb_dump_fshead) { bb_dump_fshead = tfs; } else { @@ -695,7 +692,7 @@ void bb_dump_add(const char *fmt) /* take the format string and break it up into format units */ for (p = fmt;;) { /* bb_dump_skip leading white space */ - p = bb_skip_whitespace(p); + p = skip_whitespace(p); if (!*p) { break; } @@ -703,7 +700,7 @@ void bb_dump_add(const char *fmt) /* allocate a new format unit and link it in */ /* NOSTRICT */ /* DBU:[dave@cray.com] calloc so that forward pointers start out NULL */ - tfu = (FU *) xzalloc(sizeof(FU)); + tfu = xzalloc(sizeof(FU)); *nextfu = tfu; nextfu = &tfu->nextfu; tfu->reps = 1; @@ -718,12 +715,12 @@ void bb_dump_add(const char *fmt) tfu->reps = atoi(savep); tfu->flags = F_SETREP; /* bb_dump_skip trailing white space */ - p = bb_skip_whitespace(++p); + p = skip_whitespace(++p); } /* bb_dump_skip slash and trailing white space */ if (*p == '/') { - p = bb_skip_whitespace(++p); + p = skip_whitespace(++p); } /* byte count */ @@ -734,7 +731,7 @@ void bb_dump_add(const char *fmt) } tfu->bcnt = atoi(savep); /* bb_dump_skip trailing white space */ - p = bb_skip_whitespace(++p); + p = skip_whitespace(++p); } /* format */ diff --git a/libbb/inet_common.c b/libbb/inet_common.c index c02c732..0051edb 100644 --- a/libbb/inet_common.c +++ b/libbb/inet_common.c @@ -8,13 +8,13 @@ * */ +#include "libbb.h" #include "inet_common.h" #include #include #include #include #include -#include "libbb.h" #ifdef DEBUG # include diff --git a/libbb/pw_encrypt.c b/libbb/pw_encrypt.c index a153399..9496713 100644 --- a/libbb/pw_encrypt.c +++ b/libbb/pw_encrypt.c @@ -20,9 +20,9 @@ * */ +#include "libbb.h" #include #include -#include "libbb.h" char *pw_encrypt(const char *clear, const char *salt) diff --git a/libbb/skip_whitespace.c b/libbb/skip_whitespace.c index fd5d725..02c1f58 100644 --- a/libbb/skip_whitespace.c +++ b/libbb/skip_whitespace.c @@ -4,30 +4,15 @@ * * Copyright (C) 2003 Manuel Novoa III * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ #include #include "libbb.h" -const char *bb_skip_whitespace(const char *s) +char *skip_whitespace(const char *s) { - while (isspace(*s)) { - ++s; - } + while (isspace(*s)) ++s; - return s; + return (char *) s; } diff --git a/libpwdgrp/pwd_grp.c b/libpwdgrp/pwd_grp.c index 4f4e041..98ecf40 100644 --- a/libpwdgrp/pwd_grp.c +++ b/libpwdgrp/pwd_grp.c @@ -17,6 +17,7 @@ * */ +#include "libbb.h" #include #include #include @@ -27,10 +28,9 @@ #include #include -#include "pwd_.h" -#include "grp_.h" -#include "shadow_.h" -#include "libbb.h" +//#include "pwd_.h" +//#include "grp_.h" +//#include "shadow_.h" #ifndef _PATH_SHADOW #define _PATH_SHADOW "/etc/shadow" diff --git a/networking/libiproute/ll_proto.c b/networking/libiproute/ll_proto.c index 9ee5ab2..2319530 100644 --- a/networking/libiproute/ll_proto.c +++ b/networking/libiproute/ll_proto.c @@ -9,8 +9,7 @@ * Authors: Alexey Kuznetsov, */ -#include -#include +#include "libbb.h" #include #include "rt_names.h" diff --git a/util-linux/hexdump.c b/util-linux/hexdump.c index e2cbcaf..17854cb 100644 --- a/util-linux/hexdump.c +++ b/util-linux/hexdump.c @@ -5,27 +5,12 @@ * Copyright (c) 1989 * The Regents of the University of California. All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Original copyright notice is retained at the end of this file. + * Licensed under GPLv2 or later, see file License in this tarball for details. */ +#include "busybox.h" #include -#include #include -#include "busybox.h" #include "dump.h" static void bb_dump_addfile(char *name) @@ -37,7 +22,7 @@ static void bb_dump_addfile(char *name) fp = bb_xfopen(name, "r"); while ((buf = bb_get_chomped_line_from_file(fp)) != NULL) { - p = (char *) bb_skip_whitespace(buf); + p = skip_whitespace(buf); if (*p && (*p != '#')) { bb_dump_add(p); @@ -116,31 +101,3 @@ int hexdump_main(int argc, char **argv) return(bb_dump_dump(argv)); } -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -- cgit v1.1