mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-25 19:13:46 +08:00
initical commit
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
indent -kr -i8 -ts8 -sob -l80 -ss -bs -psl "$@"
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# This script creates the proper /dev/ entries for IDE devices
|
||||
# on the primary, secondary, tertiary, and quaternary interfaces.
|
||||
# See ../Documentation/ide.txt for more information.
|
||||
#
|
||||
makedev () {
|
||||
rm -f /dev/$1
|
||||
echo mknod /dev/$1 $2 $3 $4
|
||||
mknod /dev/$1 $2 $3 $4
|
||||
chown root:disk /dev/$1
|
||||
chmod 660 /dev/$1
|
||||
}
|
||||
|
||||
makedevs () {
|
||||
rm -f /dev/$1*
|
||||
makedev $1 b $2 $3
|
||||
for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
||||
do
|
||||
makedev $1$part b $2 `expr $3 + $part`
|
||||
done
|
||||
}
|
||||
|
||||
makedevs hda 3 0
|
||||
makedevs hdb 3 64
|
||||
makedevs hdc 22 0
|
||||
makedevs hdd 22 64
|
||||
makedevs hde 33 0
|
||||
makedevs hdf 33 64
|
||||
makedevs hdg 34 0
|
||||
makedevs hdh 34 64
|
||||
makedevs hdi 56 0
|
||||
makedevs hdj 56 64
|
||||
makedevs hdk 57 0
|
||||
makedevs hdl 57 64
|
||||
makedevs hdm 88 0
|
||||
makedevs hdn 88 64
|
||||
makedevs hdo 89 0
|
||||
makedevs hdp 89 64
|
||||
makedevs hdq 90 0
|
||||
makedevs hdr 90 64
|
||||
makedevs hds 91 0
|
||||
makedevs hdt 91 64
|
||||
|
||||
for tape in 0 1 2 3 4 5 6 7
|
||||
do
|
||||
makedev ht$tape c 37 $tape
|
||||
makedev nht$tape c 37 `expr $tape + 128`
|
||||
done
|
||||
@@ -0,0 +1,4 @@
|
||||
SUBDIRS=lxdialog
|
||||
|
||||
EXTRA_DIST=Menuconfig mkconfig
|
||||
|
||||
+1439
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,194 @@
|
||||
Menuconfig gives the Linux kernel configuration a long needed face
|
||||
lift. Featuring text based color menus and dialogs, it does not
|
||||
require X Windows. With this utility you can easily select a kernel
|
||||
option to modify without sifting through 100 other options.
|
||||
|
||||
Overview
|
||||
--------
|
||||
Some kernel features may be built directly into the kernel.
|
||||
Some may be made into loadable runtime modules. Some features
|
||||
may be completely removed altogether. There are also certain
|
||||
kernel parameters which are not really features, but must be
|
||||
entered in as decimal or hexadecimal numbers or possibly text.
|
||||
|
||||
Menu items beginning with [*], <M> or [ ] represent features
|
||||
configured to be built in, modularized or removed respectively.
|
||||
Pointed brackets <> represent module capable features.
|
||||
more...
|
||||
|
||||
To change any of these features, highlight it with the cursor
|
||||
keys and press <Y> to build it in, <M> to make it a module or
|
||||
<N> to removed it. You may also press the <Space Bar> to cycle
|
||||
through the available options (ie. Y->N->M->Y).
|
||||
|
||||
Items beginning with numbers or other text within parenthesis can
|
||||
be changed by highlighting the item and pressing <Enter>. Then
|
||||
enter the new parameter into the dialog box that pops up.
|
||||
|
||||
|
||||
Some additional keyboard hints:
|
||||
|
||||
Menus
|
||||
----------
|
||||
o Use the Up/Down arrow keys (cursor keys) to highlight the item
|
||||
you wish to change or submenu wish to select and press <Enter>.
|
||||
Submenus are designated by "--->".
|
||||
|
||||
Shortcut: Press the option's highlighted letter (hotkey).
|
||||
Pressing a hotkey more than once will sequence
|
||||
through all visible items which use that hotkey.
|
||||
|
||||
You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll
|
||||
unseen options into view.
|
||||
|
||||
o To exit a menu use the cursor keys to highlight the <Exit> button
|
||||
and press <ENTER>.
|
||||
|
||||
Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey
|
||||
using those letters. You may press a single <ESC>, but
|
||||
there is a delayed response which you may find annoying.
|
||||
|
||||
Also, the <TAB> and cursor keys will cycle between <Select>,
|
||||
<Exit> and <Help>
|
||||
|
||||
o To get help with an item, use the cursor keys to highlight <Help>
|
||||
and Press <ENTER>.
|
||||
|
||||
Shortcut: Press <H> or <?>.
|
||||
|
||||
|
||||
Radiolists (Choice lists)
|
||||
-----------
|
||||
o Use the cursor keys to select the option you wish to set and press
|
||||
<S> or the <SPACE BAR>.
|
||||
|
||||
Shortcut: Press the first letter of the option you wish to set then
|
||||
press <S> or <SPACE BAR>.
|
||||
|
||||
o To see available help for the item, use the cursor keys to highlight
|
||||
<Help> and Press <ENTER>.
|
||||
|
||||
Shortcut: Press <H> or <?>.
|
||||
|
||||
Also, the <TAB> and cursor keys will cycle between <Select> and
|
||||
<Help>
|
||||
|
||||
|
||||
Data Entry
|
||||
-----------
|
||||
o Enter the requested information and press <ENTER>
|
||||
If you are entering hexadecimal values, it is not necessary to
|
||||
add the '0x' prefix to the entry.
|
||||
|
||||
o For help, use the <TAB> or cursor keys to highlight the help option
|
||||
and press <ENTER>. You can try <TAB><H> as well.
|
||||
|
||||
|
||||
Text Box (Help Window)
|
||||
--------
|
||||
o Use the cursor keys to scroll up/down/left/right. The VI editor
|
||||
keys h,j,k,l function here as do <SPACE BAR> and <B> for those
|
||||
who are familiar with less and lynx.
|
||||
|
||||
o Press <E>, <X>, <Enter> or <Esc><Esc> to exit.
|
||||
|
||||
|
||||
Final Acceptance
|
||||
----------------
|
||||
With the exception of the old style sound configuration,
|
||||
YOUR CHANGES ARE NOT FINAL. You will be given a last chance to
|
||||
confirm them prior to exiting Menuconfig.
|
||||
|
||||
If Menuconfig quits with an error while saving your configuration,
|
||||
you may look in the file /usr/src/linux/.menuconfig.log for
|
||||
information which may help you determine the cause.
|
||||
|
||||
Alternate Configuration Files
|
||||
-----------------------------
|
||||
Menuconfig supports the use of alternate configuration files for
|
||||
those who, for various reasons, find it necessary to switch
|
||||
between different kernel configurations.
|
||||
|
||||
At the end of the main menu you will find two options. One is
|
||||
for saving the current configuration to a file of your choosing.
|
||||
The other option is for loading a previously saved alternate
|
||||
configuration.
|
||||
|
||||
Even if you don't use alternate configuration files, but you
|
||||
find during a Menuconfig session that you have completely messed
|
||||
up your settings, you may use the "Load Alternate..." option to
|
||||
restore your previously saved settings from ".config" without
|
||||
restarting Menuconfig.
|
||||
|
||||
Other information
|
||||
-----------------
|
||||
The windowing utility, lxdialog, will only be rebuilt if your kernel
|
||||
source tree is fresh, or changes are patched into it via a kernel
|
||||
patch or you do 'make mrproper'. If changes to lxdialog are patched
|
||||
in, most likely the rebuild time will be short. You may force a
|
||||
complete rebuild of lxdialog by changing to it's directory and doing
|
||||
'make clean all'
|
||||
|
||||
If you use Menuconfig in an XTERM window make sure you have your
|
||||
$TERM variable set to point to a xterm definition which supports color.
|
||||
Otherwise, Menuconfig will look rather bad. Menuconfig will not
|
||||
display correctly in a RXVT window because rxvt displays only one
|
||||
intensity of color, bright.
|
||||
|
||||
Menuconfig will display larger menus on screens or xterms which are
|
||||
set to display more than the standard 25 row by 80 column geometry.
|
||||
In order for this to work, the "stty size" command must be able to
|
||||
display the screen's current row and column geometry. I STRONGLY
|
||||
RECOMMEND that you make sure you do NOT have the shell variables
|
||||
LINES and COLUMNS exported into your environment. Some distributions
|
||||
export those variables via /etc/profile. Some ncurses programs can
|
||||
become confused when those variables (LINES & COLUMNS) don't reflect
|
||||
the true screen size.
|
||||
|
||||
|
||||
NOTICE: lxdialog requires the ncurses libraries to compile. If you
|
||||
don't already have ncurses you really should get it.
|
||||
|
||||
The makefile for lxdialog attempts to find your ncurses
|
||||
header file. Although it should find the header for older
|
||||
versions of ncurses, it is probably a good idea to get the
|
||||
latest ncurses anyway.
|
||||
|
||||
If you have upgraded your ncurses libraries, MAKE SURE you
|
||||
remove the old ncurses header files. If you don't you
|
||||
will most certainly get a segmentation fault.
|
||||
|
||||
WARNING: It is not recommended that you change any defines in
|
||||
lxdialog's header files. If you have a grayscale display and
|
||||
are brave, you may tinker with color.h to tune the colors to
|
||||
your preference.
|
||||
|
||||
COMPATIBILITY ISSUE:
|
||||
There have been some compatibility problems reported with
|
||||
older versions of bash and sed. I am trying to work these
|
||||
out but it is preferable that you upgrade those utilities.
|
||||
|
||||
|
||||
******** IMPORTANT, OPTIONAL ALTERNATE PERSONALITY AVAILABLE ********
|
||||
******** ********
|
||||
If you prefer to have all of the kernel options listed in a single
|
||||
menu, rather than the default multimenu hierarchy, you may edit the
|
||||
Menuconfig script and change the line "single_menu_mode=" to
|
||||
"single_menu_mode=TRUE".
|
||||
|
||||
This mode is not recommended unless you have a fairly fast machine.
|
||||
*********************************************************************
|
||||
|
||||
|
||||
Propaganda
|
||||
----------
|
||||
The windowing support utility (lxdialog) is a VERY modified version of
|
||||
the dialog utility by Savio Lam <lam836@cs.cuhk.hk>. Although lxdialog
|
||||
is significantly different from dialog, I have left Savio's copyrights
|
||||
intact. Please DO NOT contact Savio with questions about lxdialog.
|
||||
He will not be able to assist.
|
||||
|
||||
William Roadcap was the original author of Menuconfig.
|
||||
Michael Elizabeth Chastain <mec@shout.net> is the current maintainer.
|
||||
|
||||
<END OF FILE>
|
||||
@@ -0,0 +1,65 @@
|
||||
#! /usr/bin/perl
|
||||
#
|
||||
# checkconfig: find uses of CONFIG_* names without matching definitions.
|
||||
# Copyright abandoned, 1998, Michael Elizabeth Chastain <mailto:mec@shout.net>.
|
||||
|
||||
use integer;
|
||||
|
||||
$| = 1;
|
||||
|
||||
foreach $file (@ARGV)
|
||||
{
|
||||
# Open this file.
|
||||
open(FILE, $file) || die "Can't open $file: $!\n";
|
||||
|
||||
# Initialize variables.
|
||||
my $fInComment = 0;
|
||||
my $fInString = 0;
|
||||
my $fUseConfig = 0;
|
||||
my $iLinuxConfig = 0;
|
||||
my %configList = ();
|
||||
|
||||
LINE: while ( <FILE> )
|
||||
{
|
||||
# Strip comments.
|
||||
$fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next);
|
||||
m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1)));
|
||||
|
||||
# Pick up definitions.
|
||||
if ( m/^\s*#/o )
|
||||
{
|
||||
$iLinuxConfig = $. if m/^\s*#\s*include\s*"linux\/config\.h"/o;
|
||||
$configList{uc $1} = 1 if m/^\s*#\s*include\s*"config\/(\S*)\.h"/o;
|
||||
}
|
||||
|
||||
# Strip strings.
|
||||
$fInString && (s+^.*?"+ +o ? ($fInString = 0) : next);
|
||||
m+"+o && (s+".*?"+ +go, (s+".*$+ +o && ($fInString = 1)));
|
||||
|
||||
# Pick up definitions.
|
||||
if ( m/^\s*#/o )
|
||||
{
|
||||
$iLinuxConfig = $. if m/^\s*#\s*include\s*<linux\/config\.h>/o;
|
||||
$configList{uc $1} = 1 if m/^\s*#\s*include\s*<config\/(\S*)\.h>/o;
|
||||
$configList{$1} = 1 if m/^\s*#\s*define\s+CONFIG_(\w*)/o;
|
||||
$configList{$1} = 1 if m/^\s*#\s*undef\s+CONFIG_(\w*)/o;
|
||||
}
|
||||
|
||||
# Look for usages.
|
||||
next unless m/CONFIG_/o;
|
||||
WORD: while ( m/\bCONFIG_(\w+)/og )
|
||||
{
|
||||
$fUseConfig = 1;
|
||||
last LINE if $iLinuxConfig;
|
||||
next WORD if exists $configList{$1};
|
||||
print "$file: $.: need CONFIG_$1.\n";
|
||||
$configList{$1} = 0;
|
||||
}
|
||||
}
|
||||
|
||||
# Report superfluous includes.
|
||||
if ( $iLinuxConfig && ! $fUseConfig )
|
||||
{ print "$file: $iLinuxConfig: linux/config.h not needed.\n"; }
|
||||
|
||||
close(FILE);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/perl
|
||||
# checkhelp.pl - finds configuration options that have no
|
||||
# corresponding section in the help file
|
||||
#
|
||||
# made by Meelis Roos (mroos@tartu.cyber.ee)
|
||||
|
||||
# read the help file
|
||||
@options=split /\n/, `grep '^CONFIG' Documentation/Configure.help`;
|
||||
die "Can't read Documentation/Configure.help\n" if $#options == -1;
|
||||
|
||||
#read all the files
|
||||
foreach $file (@ARGV)
|
||||
{
|
||||
open (FILE, $file) || die "Can't open $file: $!\n";
|
||||
while (<FILE>) {
|
||||
# repeat until no CONFIG_* are left
|
||||
while (/^\s*(bool|tristate|dep_tristate|string|int|hex).*' *(.*)'.*(CONFIG_\w*)/) {
|
||||
$what=$3;
|
||||
$name=$2;
|
||||
s/$3//;
|
||||
@found = grep (/$what$/, @options);
|
||||
if ($#found == -1) {
|
||||
next if $nohelp{$what};
|
||||
print "$name\n$what\n No help for $what\n\n";
|
||||
$nohelp{$what}=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
close (FILE);
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# checkincludes: Find files included more than once in (other) files.
|
||||
# Copyright abandoned, 2000, Niels Kristian Bech Jensen <nkbj@image.dk>.
|
||||
|
||||
foreach $file (@ARGV) {
|
||||
open(FILE, $file) or die "Cannot open $file: $!.\n";
|
||||
|
||||
my %includedfiles = ();
|
||||
|
||||
while (<FILE>) {
|
||||
if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
|
||||
++$includedfiles{$1};
|
||||
}
|
||||
}
|
||||
|
||||
foreach $filename (keys %includedfiles) {
|
||||
if ($includedfiles{$filename} > 1) {
|
||||
print "$file: $filename is included more than once.\n";
|
||||
}
|
||||
}
|
||||
|
||||
close(FILE);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
if [ -z "$scripts_objtree" ]
|
||||
then
|
||||
X=`$TOPDIR/scripts/gen-all-syms "$*"`
|
||||
$TOPDIR/scripts/docproc $X
|
||||
else
|
||||
X=`${scripts_objtree}gen-all-syms "$*"`
|
||||
TOPDIR=. ${scripts_objtree}docproc $X
|
||||
fi
|
||||
@@ -0,0 +1,104 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
/*
|
||||
* A simple filter for the templates
|
||||
*/
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char buf[1024];
|
||||
char *vec[8192];
|
||||
char *fvec[200];
|
||||
char **svec;
|
||||
char type[64];
|
||||
int i;
|
||||
int vp=2;
|
||||
int ret=0;
|
||||
pid_t pid;
|
||||
|
||||
|
||||
if(chdir(getenv("TOPDIR")))
|
||||
{
|
||||
perror("chdir");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Build the exec array ahead of time.
|
||||
*/
|
||||
vec[0]="kernel-doc";
|
||||
vec[1]="-docbook";
|
||||
for(i=1;vp<8189;i++)
|
||||
{
|
||||
if(argv[i]==NULL)
|
||||
break;
|
||||
vec[vp++]=type;
|
||||
vec[vp++]=argv[i];
|
||||
}
|
||||
vec[vp++]=buf+2;
|
||||
vec[vp++]=NULL;
|
||||
|
||||
/*
|
||||
* Now process the template
|
||||
*/
|
||||
|
||||
while(fgets(buf, 1024, stdin))
|
||||
{
|
||||
if(*buf!='!') {
|
||||
printf("%s", buf);
|
||||
continue;
|
||||
}
|
||||
|
||||
fflush(stdout);
|
||||
svec = vec;
|
||||
if(buf[1]=='E')
|
||||
strcpy(type, "-function");
|
||||
else if(buf[1]=='I')
|
||||
strcpy(type, "-nofunction");
|
||||
else if(buf[1]=='F') {
|
||||
int snarf = 0;
|
||||
fvec[0] = "kernel-doc";
|
||||
fvec[1] = "-docbook";
|
||||
strcpy (type, "-function");
|
||||
vp = 2;
|
||||
for (i = 2; buf[i]; i++) {
|
||||
if (buf[i] == ' ' || buf[i] == '\n') {
|
||||
buf[i] = '\0';
|
||||
snarf = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (snarf) {
|
||||
snarf = 0;
|
||||
fvec[vp++] = type;
|
||||
fvec[vp++] = &buf[i];
|
||||
}
|
||||
}
|
||||
fvec[vp++] = &buf[2];
|
||||
fvec[vp] = NULL;
|
||||
svec = fvec;
|
||||
} else
|
||||
{
|
||||
fprintf(stderr, "Unknown ! escape.\n");
|
||||
exit(1);
|
||||
}
|
||||
switch(pid=fork())
|
||||
{
|
||||
case -1:
|
||||
perror("fork");
|
||||
exit(1);
|
||||
case 0:
|
||||
execvp("scripts/kernel-doc", svec);
|
||||
perror("exec scripts/kernel-doc");
|
||||
exit(1);
|
||||
default:
|
||||
waitpid(pid, &ret ,0);
|
||||
}
|
||||
}
|
||||
exit(ret);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
#! /bin/bash -x
|
||||
# extracts .config info from a [b]zImage file
|
||||
# uses: binoffset (new), dd, zcat, strings, grep
|
||||
# $arg1 is [b]zImage filename
|
||||
|
||||
HDR=`binoffset $1 0x1f 0x8b 0x08 0x0`
|
||||
PID=$$
|
||||
TMPFILE="$1.vmlin.$PID"
|
||||
|
||||
# dd if=$1 bs=1 skip=$HDR | zcat - | strings /dev/stdin \
|
||||
# | grep "[A-Za-z_0-9]=[ynm]$" | sed "s/^/CONFIG_/" > $1.oldconfig.$PID
|
||||
# exit
|
||||
|
||||
dd if=$1 bs=1 skip=$HDR | zcat - > $TMPFILE
|
||||
strings $TMPFILE | grep "^[\#[:blank:]]*CONFIG_[A-Za-z_0-9]*" > $1.oldconfig.$PID
|
||||
wc $1.oldconfig.$PID
|
||||
rm $TMPFILE
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
for i in $*
|
||||
do
|
||||
grep "EXPORT_SYMBOL.*(.*)" "$i" \
|
||||
| sed -e "s/EXPORT_SYMBOL.*(/ /" \
|
||||
| sed -e "s/).*$//" | sed -e "s/^ //"
|
||||
done
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
||||
# Read the .depend files, extract the dependencies for .h targets, convert
|
||||
# relative names to absolute and write the result to stdout. It is part of
|
||||
# building the global .h dependency graph for kbuild 2.4. KAO
|
||||
|
||||
/^[^ ]/ { copy = 0; fn = "/error/"; }
|
||||
/^[^ ][^ ]*\.h:/ { copy = 1; fn = FILENAME; sub(/\.depend/, "", fn); }
|
||||
!copy { next; }
|
||||
{
|
||||
indent = $0; sub(/[^ ].*/, "", indent);
|
||||
if ($1 != "" && $1 !~ /^[@$\/\\]/) { $1 = fn $1 };
|
||||
if ($2 != "" && $2 !~ /^[@$\/\\]/) { $2 = fn $2 };
|
||||
$1 = $1; # ensure $0 is rebuilt
|
||||
$0 = indent $0;
|
||||
print;
|
||||
}
|
||||
+1723
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,2 @@
|
||||
EXTRA_DIST=colors.h inputbox.c lxdialog.c makefile.lx msgbox.c yesno.c \
|
||||
checklist.c menubox.c util.c dialog.h textbox.c
|
||||
@@ -0,0 +1,369 @@
|
||||
/*
|
||||
* checklist.c -- implements the checklist box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
|
||||
* Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
static int list_width, check_x, item_x, checkflag;
|
||||
|
||||
/*
|
||||
* Print list item
|
||||
*/
|
||||
static void
|
||||
print_item (WINDOW * win, const char *item, int status,
|
||||
int choice, int selected)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Clear 'residue' of last item */
|
||||
wattrset (win, menubox_attr);
|
||||
wmove (win, choice, 0);
|
||||
for (i = 0; i < list_width; i++)
|
||||
waddch (win, ' ');
|
||||
|
||||
wmove (win, choice, check_x);
|
||||
wattrset (win, selected ? check_selected_attr : check_attr);
|
||||
if (checkflag == FLAG_CHECK)
|
||||
wprintw (win, "[%c]", status ? 'X' : ' ');
|
||||
else
|
||||
wprintw (win, "(%c)", status ? 'X' : ' ');
|
||||
|
||||
wattrset (win, selected ? tag_selected_attr : tag_attr);
|
||||
mvwaddch(win, choice, item_x, item[0]);
|
||||
wattrset (win, selected ? item_selected_attr : item_attr);
|
||||
waddstr (win, (char *)item+1);
|
||||
if (selected) {
|
||||
wmove (win, choice, check_x+1);
|
||||
wrefresh (win);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the scroll indicators.
|
||||
*/
|
||||
static void
|
||||
print_arrows (WINDOW * win, int choice, int item_no, int scroll,
|
||||
int y, int x, int height)
|
||||
{
|
||||
wmove(win, y, x);
|
||||
|
||||
if (scroll > 0) {
|
||||
wattrset (win, uarrow_attr);
|
||||
waddch (win, ACS_UARROW);
|
||||
waddstr (win, "(-)");
|
||||
}
|
||||
else {
|
||||
wattrset (win, menubox_attr);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
}
|
||||
|
||||
y = y + height + 1;
|
||||
wmove(win, y, x);
|
||||
|
||||
if ((height < item_no) && (scroll + choice < item_no - 1)) {
|
||||
wattrset (win, darrow_attr);
|
||||
waddch (win, ACS_DARROW);
|
||||
waddstr (win, "(+)");
|
||||
}
|
||||
else {
|
||||
wattrset (win, menubox_border_attr);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the termination buttons
|
||||
*/
|
||||
static void
|
||||
print_buttons( WINDOW *dialog, int height, int width, int selected)
|
||||
{
|
||||
int x = width / 2 - 11;
|
||||
int y = height - 2;
|
||||
|
||||
print_button (dialog, "Select", y, x, selected == 0);
|
||||
print_button (dialog, " Help ", y, x + 14, selected == 1);
|
||||
|
||||
wmove(dialog, y, x+1 + 14*selected);
|
||||
wrefresh (dialog);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a dialog box with a list of options that can be turned on or off
|
||||
* The `flag' parameter is used to select between radiolist and checklist.
|
||||
*/
|
||||
int
|
||||
dialog_checklist (const char *title, const char *prompt, int height, int width,
|
||||
int list_height, int item_no, const char * const * items, int flag)
|
||||
|
||||
{
|
||||
int i, x, y, box_x, box_y;
|
||||
int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
|
||||
WINDOW *dialog, *list;
|
||||
|
||||
checkflag = flag;
|
||||
|
||||
/* Allocate space for storing item on/off status */
|
||||
if ((status = malloc (sizeof (int) * item_no)) == NULL) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nCan't allocate memory in dialog_checklist().\n");
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
/* Initializes status */
|
||||
for (i = 0; i < item_no; i++) {
|
||||
status[i] = !strcasecmp (items[i * 3 + 2], "on");
|
||||
if (!choice && status[i])
|
||||
choice = i;
|
||||
}
|
||||
|
||||
max_choice = MIN (list_height, item_no);
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||
|
||||
list_width = width - 6;
|
||||
box_y = height - list_height - 5;
|
||||
box_x = (width - list_width) / 2 - 1;
|
||||
|
||||
/* create new window for the list */
|
||||
list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1);
|
||||
|
||||
keypad (list, TRUE);
|
||||
|
||||
/* draw a box around the list items */
|
||||
draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
|
||||
menubox_border_attr, menubox_attr);
|
||||
|
||||
/* Find length of longest item in order to center checklist */
|
||||
check_x = 0;
|
||||
for (i = 0; i < item_no; i++)
|
||||
check_x = MAX (check_x, + strlen (items[i * 3 + 1]) + 4);
|
||||
|
||||
check_x = (list_width - check_x) / 2;
|
||||
item_x = check_x + 4;
|
||||
|
||||
if (choice >= list_height) {
|
||||
scroll = choice - list_height + 1;
|
||||
choice -= scroll;
|
||||
}
|
||||
|
||||
/* Print the list */
|
||||
for (i = 0; i < max_choice; i++) {
|
||||
print_item (list, items[(scroll+i) * 3 + 1],
|
||||
status[i+scroll], i, i == choice);
|
||||
}
|
||||
|
||||
print_arrows(dialog, choice, item_no, scroll,
|
||||
box_y, box_x + check_x + 5, list_height);
|
||||
|
||||
print_buttons(dialog, height, width, 0);
|
||||
|
||||
wnoutrefresh (list);
|
||||
wnoutrefresh (dialog);
|
||||
doupdate ();
|
||||
|
||||
while (key != ESC) {
|
||||
key = wgetch (dialog);
|
||||
|
||||
for (i = 0; i < max_choice; i++)
|
||||
if (toupper(key) == toupper(items[(scroll+i)*3+1][0]))
|
||||
break;
|
||||
|
||||
|
||||
if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
|
||||
key == '+' || key == '-' ) {
|
||||
if (key == KEY_UP || key == '-') {
|
||||
if (!choice) {
|
||||
if (!scroll)
|
||||
continue;
|
||||
/* Scroll list down */
|
||||
if (list_height > 1) {
|
||||
/* De-highlight current first item */
|
||||
print_item (list, items[scroll * 3 + 1],
|
||||
status[scroll], 0, FALSE);
|
||||
scrollok (list, TRUE);
|
||||
wscrl (list, -1);
|
||||
scrollok (list, FALSE);
|
||||
}
|
||||
scroll--;
|
||||
print_item (list, items[scroll * 3 + 1],
|
||||
status[scroll], 0, TRUE);
|
||||
wnoutrefresh (list);
|
||||
|
||||
print_arrows(dialog, choice, item_no, scroll,
|
||||
box_y, box_x + check_x + 5, list_height);
|
||||
|
||||
wrefresh (dialog);
|
||||
|
||||
continue; /* wait for another key press */
|
||||
} else
|
||||
i = choice - 1;
|
||||
} else if (key == KEY_DOWN || key == '+') {
|
||||
if (choice == max_choice - 1) {
|
||||
if (scroll + choice >= item_no - 1)
|
||||
continue;
|
||||
/* Scroll list up */
|
||||
if (list_height > 1) {
|
||||
/* De-highlight current last item before scrolling up */
|
||||
print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
|
||||
status[scroll + max_choice - 1],
|
||||
max_choice - 1, FALSE);
|
||||
scrollok (list, TRUE);
|
||||
scroll (list);
|
||||
scrollok (list, FALSE);
|
||||
}
|
||||
scroll++;
|
||||
print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
|
||||
status[scroll + max_choice - 1],
|
||||
max_choice - 1, TRUE);
|
||||
wnoutrefresh (list);
|
||||
|
||||
print_arrows(dialog, choice, item_no, scroll,
|
||||
box_y, box_x + check_x + 5, list_height);
|
||||
|
||||
wrefresh (dialog);
|
||||
|
||||
continue; /* wait for another key press */
|
||||
} else
|
||||
i = choice + 1;
|
||||
}
|
||||
if (i != choice) {
|
||||
/* De-highlight current item */
|
||||
print_item (list, items[(scroll + choice) * 3 + 1],
|
||||
status[scroll + choice], choice, FALSE);
|
||||
/* Highlight new item */
|
||||
choice = i;
|
||||
print_item (list, items[(scroll + choice) * 3 + 1],
|
||||
status[scroll + choice], choice, TRUE);
|
||||
wnoutrefresh (list);
|
||||
wrefresh (dialog);
|
||||
}
|
||||
continue; /* wait for another key press */
|
||||
}
|
||||
switch (key) {
|
||||
case 'H':
|
||||
case 'h':
|
||||
case '?':
|
||||
delwin (dialog);
|
||||
free (status);
|
||||
return 1;
|
||||
case TAB:
|
||||
case KEY_LEFT:
|
||||
case KEY_RIGHT:
|
||||
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||
? 1 : (button > 1 ? 0 : button);
|
||||
|
||||
print_buttons(dialog, height, width, button);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case 'S':
|
||||
case 's':
|
||||
case ' ':
|
||||
case '\n':
|
||||
if (!button) {
|
||||
if (flag == FLAG_CHECK) {
|
||||
status[scroll + choice] = !status[scroll + choice];
|
||||
wmove (list, choice, check_x);
|
||||
wattrset (list, check_selected_attr);
|
||||
wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
|
||||
} else {
|
||||
if (!status[scroll + choice]) {
|
||||
for (i = 0; i < item_no; i++)
|
||||
status[i] = 0;
|
||||
status[scroll + choice] = 1;
|
||||
for (i = 0; i < max_choice; i++)
|
||||
print_item (list, items[(scroll + i) * 3 + 1],
|
||||
status[scroll + i], i, i == choice);
|
||||
}
|
||||
}
|
||||
wnoutrefresh (list);
|
||||
wrefresh (dialog);
|
||||
|
||||
for (i = 0; i < item_no; i++) {
|
||||
if (status[i]) {
|
||||
if (flag == FLAG_CHECK) {
|
||||
fprintf (stderr, "\"%s\" ", items[i * 3]);
|
||||
} else {
|
||||
fprintf (stderr, "%s", items[i * 3]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
delwin (dialog);
|
||||
free (status);
|
||||
return button;
|
||||
case 'X':
|
||||
case 'x':
|
||||
key = ESC;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Now, update everything... */
|
||||
doupdate ();
|
||||
}
|
||||
|
||||
|
||||
delwin (dialog);
|
||||
free (status);
|
||||
return -1; /* ESC pressed */
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
/*
|
||||
* colors.h -- color attribute definitions
|
||||
*
|
||||
* AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Default color definitions
|
||||
*
|
||||
* *_FG = foreground
|
||||
* *_BG = background
|
||||
* *_HL = highlight?
|
||||
*/
|
||||
#define SCREEN_FG COLOR_CYAN
|
||||
#define SCREEN_BG COLOR_BLUE
|
||||
#define SCREEN_HL TRUE
|
||||
|
||||
#define SHADOW_FG COLOR_BLACK
|
||||
#define SHADOW_BG COLOR_BLACK
|
||||
#define SHADOW_HL TRUE
|
||||
|
||||
#define DIALOG_FG COLOR_BLACK
|
||||
#define DIALOG_BG COLOR_WHITE
|
||||
#define DIALOG_HL FALSE
|
||||
|
||||
#define TITLE_FG COLOR_YELLOW
|
||||
#define TITLE_BG COLOR_WHITE
|
||||
#define TITLE_HL TRUE
|
||||
|
||||
#define BORDER_FG COLOR_WHITE
|
||||
#define BORDER_BG COLOR_WHITE
|
||||
#define BORDER_HL TRUE
|
||||
|
||||
#define BUTTON_ACTIVE_FG COLOR_WHITE
|
||||
#define BUTTON_ACTIVE_BG COLOR_BLUE
|
||||
#define BUTTON_ACTIVE_HL TRUE
|
||||
|
||||
#define BUTTON_INACTIVE_FG COLOR_BLACK
|
||||
#define BUTTON_INACTIVE_BG COLOR_WHITE
|
||||
#define BUTTON_INACTIVE_HL FALSE
|
||||
|
||||
#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE
|
||||
#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE
|
||||
#define BUTTON_KEY_ACTIVE_HL TRUE
|
||||
|
||||
#define BUTTON_KEY_INACTIVE_FG COLOR_RED
|
||||
#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE
|
||||
#define BUTTON_KEY_INACTIVE_HL FALSE
|
||||
|
||||
#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW
|
||||
#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE
|
||||
#define BUTTON_LABEL_ACTIVE_HL TRUE
|
||||
|
||||
#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK
|
||||
#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE
|
||||
#define BUTTON_LABEL_INACTIVE_HL TRUE
|
||||
|
||||
#define INPUTBOX_FG COLOR_BLACK
|
||||
#define INPUTBOX_BG COLOR_WHITE
|
||||
#define INPUTBOX_HL FALSE
|
||||
|
||||
#define INPUTBOX_BORDER_FG COLOR_BLACK
|
||||
#define INPUTBOX_BORDER_BG COLOR_WHITE
|
||||
#define INPUTBOX_BORDER_HL FALSE
|
||||
|
||||
#define SEARCHBOX_FG COLOR_BLACK
|
||||
#define SEARCHBOX_BG COLOR_WHITE
|
||||
#define SEARCHBOX_HL FALSE
|
||||
|
||||
#define SEARCHBOX_TITLE_FG COLOR_YELLOW
|
||||
#define SEARCHBOX_TITLE_BG COLOR_WHITE
|
||||
#define SEARCHBOX_TITLE_HL TRUE
|
||||
|
||||
#define SEARCHBOX_BORDER_FG COLOR_WHITE
|
||||
#define SEARCHBOX_BORDER_BG COLOR_WHITE
|
||||
#define SEARCHBOX_BORDER_HL TRUE
|
||||
|
||||
#define POSITION_INDICATOR_FG COLOR_YELLOW
|
||||
#define POSITION_INDICATOR_BG COLOR_WHITE
|
||||
#define POSITION_INDICATOR_HL TRUE
|
||||
|
||||
#define MENUBOX_FG COLOR_BLACK
|
||||
#define MENUBOX_BG COLOR_WHITE
|
||||
#define MENUBOX_HL FALSE
|
||||
|
||||
#define MENUBOX_BORDER_FG COLOR_WHITE
|
||||
#define MENUBOX_BORDER_BG COLOR_WHITE
|
||||
#define MENUBOX_BORDER_HL TRUE
|
||||
|
||||
#define ITEM_FG COLOR_BLACK
|
||||
#define ITEM_BG COLOR_WHITE
|
||||
#define ITEM_HL FALSE
|
||||
|
||||
#define ITEM_SELECTED_FG COLOR_WHITE
|
||||
#define ITEM_SELECTED_BG COLOR_BLUE
|
||||
#define ITEM_SELECTED_HL TRUE
|
||||
|
||||
#define TAG_FG COLOR_YELLOW
|
||||
#define TAG_BG COLOR_WHITE
|
||||
#define TAG_HL TRUE
|
||||
|
||||
#define TAG_SELECTED_FG COLOR_YELLOW
|
||||
#define TAG_SELECTED_BG COLOR_BLUE
|
||||
#define TAG_SELECTED_HL TRUE
|
||||
|
||||
#define TAG_KEY_FG COLOR_YELLOW
|
||||
#define TAG_KEY_BG COLOR_WHITE
|
||||
#define TAG_KEY_HL TRUE
|
||||
|
||||
#define TAG_KEY_SELECTED_FG COLOR_YELLOW
|
||||
#define TAG_KEY_SELECTED_BG COLOR_BLUE
|
||||
#define TAG_KEY_SELECTED_HL TRUE
|
||||
|
||||
#define CHECK_FG COLOR_BLACK
|
||||
#define CHECK_BG COLOR_WHITE
|
||||
#define CHECK_HL FALSE
|
||||
|
||||
#define CHECK_SELECTED_FG COLOR_WHITE
|
||||
#define CHECK_SELECTED_BG COLOR_BLUE
|
||||
#define CHECK_SELECTED_HL TRUE
|
||||
|
||||
#define UARROW_FG COLOR_GREEN
|
||||
#define UARROW_BG COLOR_WHITE
|
||||
#define UARROW_HL TRUE
|
||||
|
||||
#define DARROW_FG COLOR_GREEN
|
||||
#define DARROW_BG COLOR_WHITE
|
||||
#define DARROW_HL TRUE
|
||||
|
||||
/* End of default color definitions */
|
||||
|
||||
#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
|
||||
#define COLOR_NAME_LEN 10
|
||||
#define COLOR_COUNT 8
|
||||
|
||||
/*
|
||||
* Global variables
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
char name[COLOR_NAME_LEN];
|
||||
int value;
|
||||
} color_names_st;
|
||||
|
||||
extern color_names_st color_names[];
|
||||
extern int color_table[][3];
|
||||
@@ -0,0 +1,184 @@
|
||||
|
||||
/*
|
||||
* dialog.h -- common declarations for all dialog modules
|
||||
*
|
||||
* AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include CURSES_LOC
|
||||
|
||||
/*
|
||||
* Colors in ncurses 1.9.9e do not work properly since foreground and
|
||||
* background colors are OR'd rather than separately masked. This version
|
||||
* of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
|
||||
* with standard curses. The simplest fix (to make this work with standard
|
||||
* curses) uses the wbkgdset() function, not used in the original hack.
|
||||
* Turn it off if we're building with 1.9.9e, since it just confuses things.
|
||||
*/
|
||||
#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
|
||||
#define OLD_NCURSES 1
|
||||
#undef wbkgdset
|
||||
#define wbkgdset(w,p) /*nothing*/
|
||||
#else
|
||||
#define OLD_NCURSES 0
|
||||
#endif
|
||||
|
||||
#define TR(params) _tracef params
|
||||
|
||||
#define ESC 27
|
||||
#define TAB 9
|
||||
#define MAX_LEN 2048
|
||||
#define BUF_SIZE (10*1024)
|
||||
#define MIN(x,y) (x < y ? x : y)
|
||||
#define MAX(x,y) (x > y ? x : y)
|
||||
|
||||
|
||||
#ifndef ACS_ULCORNER
|
||||
#define ACS_ULCORNER '+'
|
||||
#endif
|
||||
#ifndef ACS_LLCORNER
|
||||
#define ACS_LLCORNER '+'
|
||||
#endif
|
||||
#ifndef ACS_URCORNER
|
||||
#define ACS_URCORNER '+'
|
||||
#endif
|
||||
#ifndef ACS_LRCORNER
|
||||
#define ACS_LRCORNER '+'
|
||||
#endif
|
||||
#ifndef ACS_HLINE
|
||||
#define ACS_HLINE '-'
|
||||
#endif
|
||||
#ifndef ACS_VLINE
|
||||
#define ACS_VLINE '|'
|
||||
#endif
|
||||
#ifndef ACS_LTEE
|
||||
#define ACS_LTEE '+'
|
||||
#endif
|
||||
#ifndef ACS_RTEE
|
||||
#define ACS_RTEE '+'
|
||||
#endif
|
||||
#ifndef ACS_UARROW
|
||||
#define ACS_UARROW '^'
|
||||
#endif
|
||||
#ifndef ACS_DARROW
|
||||
#define ACS_DARROW 'v'
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Attribute names
|
||||
*/
|
||||
#define screen_attr attributes[0]
|
||||
#define shadow_attr attributes[1]
|
||||
#define dialog_attr attributes[2]
|
||||
#define title_attr attributes[3]
|
||||
#define border_attr attributes[4]
|
||||
#define button_active_attr attributes[5]
|
||||
#define button_inactive_attr attributes[6]
|
||||
#define button_key_active_attr attributes[7]
|
||||
#define button_key_inactive_attr attributes[8]
|
||||
#define button_label_active_attr attributes[9]
|
||||
#define button_label_inactive_attr attributes[10]
|
||||
#define inputbox_attr attributes[11]
|
||||
#define inputbox_border_attr attributes[12]
|
||||
#define searchbox_attr attributes[13]
|
||||
#define searchbox_title_attr attributes[14]
|
||||
#define searchbox_border_attr attributes[15]
|
||||
#define position_indicator_attr attributes[16]
|
||||
#define menubox_attr attributes[17]
|
||||
#define menubox_border_attr attributes[18]
|
||||
#define item_attr attributes[19]
|
||||
#define item_selected_attr attributes[20]
|
||||
#define tag_attr attributes[21]
|
||||
#define tag_selected_attr attributes[22]
|
||||
#define tag_key_attr attributes[23]
|
||||
#define tag_key_selected_attr attributes[24]
|
||||
#define check_attr attributes[25]
|
||||
#define check_selected_attr attributes[26]
|
||||
#define uarrow_attr attributes[27]
|
||||
#define darrow_attr attributes[28]
|
||||
|
||||
/* number of attributes */
|
||||
#define ATTRIBUTE_COUNT 29
|
||||
|
||||
/*
|
||||
* Global variables
|
||||
*/
|
||||
extern bool use_colors;
|
||||
extern bool use_shadow;
|
||||
|
||||
extern chtype attributes[];
|
||||
|
||||
extern const char *backtitle;
|
||||
|
||||
/*
|
||||
* Function prototypes
|
||||
*/
|
||||
extern void create_rc (const char *filename);
|
||||
extern int parse_rc (void);
|
||||
|
||||
|
||||
void init_dialog (void);
|
||||
void end_dialog (void);
|
||||
void attr_clear (WINDOW * win, int height, int width, chtype attr);
|
||||
void dialog_clear (void);
|
||||
void color_setup (void);
|
||||
void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x);
|
||||
void print_button (WINDOW * win, const char *label, int y, int x, int selected);
|
||||
void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box,
|
||||
chtype border);
|
||||
void draw_shadow (WINDOW * win, int y, int x, int height, int width);
|
||||
|
||||
int first_alpha (const char *string, const char *exempt);
|
||||
int dialog_yesno (const char *title, const char *prompt, int height, int width);
|
||||
int dialog_msgbox (const char *title, const char *prompt, int height,
|
||||
int width, int pause);
|
||||
int dialog_textbox (const char *title, const char *file, int height, int width);
|
||||
int dialog_menu (const char *title, const char *prompt, int height, int width,
|
||||
int menu_height, const char *choice, int item_no,
|
||||
const char * const * items);
|
||||
int dialog_checklist (const char *title, const char *prompt, int height,
|
||||
int width, int list_height, int item_no,
|
||||
const char * const * items, int flag);
|
||||
extern unsigned char dialog_input_result[];
|
||||
int dialog_inputbox (const char *title, const char *prompt, int height,
|
||||
int width, const char *init);
|
||||
|
||||
/*
|
||||
* This is the base for fictitious keys, which activate
|
||||
* the buttons.
|
||||
*
|
||||
* Mouse-generated keys are the following:
|
||||
* -- the first 32 are used as numbers, in addition to '0'-'9'
|
||||
* -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
|
||||
* -- uppercase chars are used to invoke the button (M_EVENT + 'O')
|
||||
*/
|
||||
#define M_EVENT (KEY_MAX+1)
|
||||
|
||||
|
||||
/*
|
||||
* The `flag' parameter in checklist is used to select between
|
||||
* radiolist and checklist
|
||||
*/
|
||||
#define FLAG_CHECK 1
|
||||
#define FLAG_RADIO 0
|
||||
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* inputbox.c -- implements the input box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
unsigned char dialog_input_result[MAX_LEN + 1];
|
||||
|
||||
/*
|
||||
* Print the termination buttons
|
||||
*/
|
||||
static void
|
||||
print_buttons(WINDOW *dialog, int height, int width, int selected)
|
||||
{
|
||||
int x = width / 2 - 11;
|
||||
int y = height - 2;
|
||||
|
||||
print_button (dialog, " Ok ", y, x, selected==0);
|
||||
print_button (dialog, " Help ", y, x + 14, selected==1);
|
||||
|
||||
wmove(dialog, y, x+1+14*selected);
|
||||
wrefresh(dialog);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a dialog box for inputing a string
|
||||
*/
|
||||
int
|
||||
dialog_inputbox (const char *title, const char *prompt, int height, int width,
|
||||
const char *init)
|
||||
{
|
||||
int i, x, y, box_y, box_x, box_width;
|
||||
int input_x = 0, scroll = 0, key = 0, button = -1;
|
||||
unsigned char *instr = dialog_input_result;
|
||||
WINDOW *dialog;
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||
|
||||
/* Draw the input field box */
|
||||
box_width = width - 6;
|
||||
getyx (dialog, y, x);
|
||||
box_y = y + 2;
|
||||
box_x = (width - box_width) / 2;
|
||||
draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
|
||||
border_attr, dialog_attr);
|
||||
|
||||
print_buttons(dialog, height, width, 0);
|
||||
|
||||
/* Set up the initial value */
|
||||
wmove (dialog, box_y, box_x);
|
||||
wattrset (dialog, inputbox_attr);
|
||||
|
||||
if (!init)
|
||||
instr[0] = '\0';
|
||||
else
|
||||
strcpy (instr, init);
|
||||
|
||||
input_x = strlen (instr);
|
||||
|
||||
if (input_x >= box_width) {
|
||||
scroll = input_x - box_width + 1;
|
||||
input_x = box_width - 1;
|
||||
for (i = 0; i < box_width - 1; i++)
|
||||
waddch (dialog, instr[scroll + i]);
|
||||
} else
|
||||
waddstr (dialog, instr);
|
||||
|
||||
wmove (dialog, box_y, box_x + input_x);
|
||||
|
||||
wrefresh (dialog);
|
||||
|
||||
while (key != ESC) {
|
||||
key = wgetch (dialog);
|
||||
|
||||
if (button == -1) { /* Input box selected */
|
||||
switch (key) {
|
||||
case TAB:
|
||||
case KEY_UP:
|
||||
case KEY_DOWN:
|
||||
break;
|
||||
case KEY_LEFT:
|
||||
continue;
|
||||
case KEY_RIGHT:
|
||||
continue;
|
||||
case KEY_BACKSPACE:
|
||||
case 127:
|
||||
if (input_x || scroll) {
|
||||
wattrset (dialog, inputbox_attr);
|
||||
if (!input_x) {
|
||||
scroll = scroll < box_width - 1 ?
|
||||
0 : scroll - (box_width - 1);
|
||||
wmove (dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch (dialog, instr[scroll + input_x + i] ?
|
||||
instr[scroll + input_x + i] : ' ');
|
||||
input_x = strlen (instr) - scroll;
|
||||
} else
|
||||
input_x--;
|
||||
instr[scroll + input_x] = '\0';
|
||||
mvwaddch (dialog, box_y, input_x + box_x, ' ');
|
||||
wmove (dialog, box_y, input_x + box_x);
|
||||
wrefresh (dialog);
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
if (key < 0x100 && isprint (key)) {
|
||||
if (scroll + input_x < MAX_LEN) {
|
||||
wattrset (dialog, inputbox_attr);
|
||||
instr[scroll + input_x] = key;
|
||||
instr[scroll + input_x + 1] = '\0';
|
||||
if (input_x == box_width - 1) {
|
||||
scroll++;
|
||||
wmove (dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width - 1; i++)
|
||||
waddch (dialog, instr[scroll + i]);
|
||||
} else {
|
||||
wmove (dialog, box_y, input_x++ + box_x);
|
||||
waddch (dialog, key);
|
||||
}
|
||||
wrefresh (dialog);
|
||||
} else
|
||||
flash (); /* Alarm user about overflow */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
switch (key) {
|
||||
case 'O':
|
||||
case 'o':
|
||||
delwin (dialog);
|
||||
return 0;
|
||||
case 'H':
|
||||
case 'h':
|
||||
delwin (dialog);
|
||||
return 1;
|
||||
case KEY_UP:
|
||||
case KEY_LEFT:
|
||||
switch (button) {
|
||||
case -1:
|
||||
button = 1; /* Indicates "Cancel" button is selected */
|
||||
print_buttons(dialog, height, width, 1);
|
||||
break;
|
||||
case 0:
|
||||
button = -1; /* Indicates input box is selected */
|
||||
print_buttons(dialog, height, width, 0);
|
||||
wmove (dialog, box_y, box_x + input_x);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case 1:
|
||||
button = 0; /* Indicates "OK" button is selected */
|
||||
print_buttons(dialog, height, width, 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TAB:
|
||||
case KEY_DOWN:
|
||||
case KEY_RIGHT:
|
||||
switch (button) {
|
||||
case -1:
|
||||
button = 0; /* Indicates "OK" button is selected */
|
||||
print_buttons(dialog, height, width, 0);
|
||||
break;
|
||||
case 0:
|
||||
button = 1; /* Indicates "Cancel" button is selected */
|
||||
print_buttons(dialog, height, width, 1);
|
||||
break;
|
||||
case 1:
|
||||
button = -1; /* Indicates input box is selected */
|
||||
print_buttons(dialog, height, width, 0);
|
||||
wmove (dialog, box_y, box_x + input_x);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ' ':
|
||||
case '\n':
|
||||
delwin (dialog);
|
||||
return (button == -1 ? 0 : button);
|
||||
case 'X':
|
||||
case 'x':
|
||||
key = ESC;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
return -1; /* ESC pressed */
|
||||
}
|
||||
@@ -0,0 +1,226 @@
|
||||
/*
|
||||
* dialog - Display simple dialog boxes from shell scripts
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
static void Usage (const char *name);
|
||||
|
||||
typedef int (jumperFn) (const char *title, int argc, const char * const * argv);
|
||||
|
||||
struct Mode {
|
||||
char *name;
|
||||
int argmin, argmax, argmod;
|
||||
jumperFn *jumper;
|
||||
};
|
||||
|
||||
jumperFn j_menu, j_checklist, j_radiolist, j_yesno, j_textbox, j_inputbox;
|
||||
jumperFn j_msgbox, j_infobox;
|
||||
|
||||
static struct Mode modes[] =
|
||||
{
|
||||
{"--menu", 9, 0, 3, j_menu},
|
||||
{"--checklist", 9, 0, 3, j_checklist},
|
||||
{"--radiolist", 9, 0, 3, j_radiolist},
|
||||
{"--yesno", 5,5,1, j_yesno},
|
||||
{"--textbox", 5,5,1, j_textbox},
|
||||
{"--inputbox", 5, 6, 1, j_inputbox},
|
||||
{"--msgbox", 5, 5, 1, j_msgbox},
|
||||
{"--infobox", 5, 5, 1, j_infobox},
|
||||
{NULL, 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
static struct Mode *modePtr;
|
||||
|
||||
#ifdef LOCALE
|
||||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
main (int argc, const char * const * argv)
|
||||
{
|
||||
int offset = 0, clear_screen = 0, end_common_opts = 0, retval;
|
||||
const char *title = NULL;
|
||||
|
||||
#ifdef LOCALE
|
||||
(void) setlocale (LC_ALL, "");
|
||||
#endif
|
||||
|
||||
#ifdef TRACE
|
||||
trace(TRACE_CALLS|TRACE_UPDATE);
|
||||
#endif
|
||||
if (argc < 2) {
|
||||
Usage (argv[0]);
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
while (offset < argc - 1 && !end_common_opts) { /* Common options */
|
||||
if (!strcmp (argv[offset + 1], "--title")) {
|
||||
if (argc - offset < 3 || title != NULL) {
|
||||
Usage (argv[0]);
|
||||
exit (-1);
|
||||
} else {
|
||||
title = argv[offset + 2];
|
||||
offset += 2;
|
||||
}
|
||||
} else if (!strcmp (argv[offset + 1], "--backtitle")) {
|
||||
if (backtitle != NULL) {
|
||||
Usage (argv[0]);
|
||||
exit (-1);
|
||||
} else {
|
||||
backtitle = argv[offset + 2];
|
||||
offset += 2;
|
||||
}
|
||||
} else if (!strcmp (argv[offset + 1], "--clear")) {
|
||||
if (clear_screen) { /* Hey, "--clear" can't appear twice! */
|
||||
Usage (argv[0]);
|
||||
exit (-1);
|
||||
} else if (argc == 2) { /* we only want to clear the screen */
|
||||
init_dialog ();
|
||||
refresh (); /* init_dialog() will clear the screen for us */
|
||||
end_dialog ();
|
||||
return 0;
|
||||
} else {
|
||||
clear_screen = 1;
|
||||
offset++;
|
||||
}
|
||||
} else /* no more common options */
|
||||
end_common_opts = 1;
|
||||
}
|
||||
|
||||
if (argc - 1 == offset) { /* no more options */
|
||||
Usage (argv[0]);
|
||||
exit (-1);
|
||||
}
|
||||
/* use a table to look for the requested mode, to avoid code duplication */
|
||||
|
||||
for (modePtr = modes; modePtr->name; modePtr++) /* look for the mode */
|
||||
if (!strcmp (argv[offset + 1], modePtr->name))
|
||||
break;
|
||||
|
||||
if (!modePtr->name)
|
||||
Usage (argv[0]);
|
||||
if (argc - offset < modePtr->argmin)
|
||||
Usage (argv[0]);
|
||||
if (modePtr->argmax && argc - offset > modePtr->argmax)
|
||||
Usage (argv[0]);
|
||||
|
||||
|
||||
|
||||
init_dialog ();
|
||||
retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
|
||||
|
||||
if (clear_screen) { /* clear screen before exit */
|
||||
attr_clear (stdscr, LINES, COLS, screen_attr);
|
||||
refresh ();
|
||||
}
|
||||
end_dialog();
|
||||
|
||||
exit (retval);
|
||||
}
|
||||
|
||||
/*
|
||||
* Print program usage
|
||||
*/
|
||||
static void
|
||||
Usage (const char *name)
|
||||
{
|
||||
fprintf (stderr, "\
|
||||
\ndialog, by Savio Lam (lam836@cs.cuhk.hk).\
|
||||
\n patched by Stuart Herbert (S.Herbert@shef.ac.uk)\
|
||||
\n modified/gutted for use as a Linux kernel config tool by \
|
||||
\n William Roadcap (roadcapw@cfw.com)\
|
||||
\n\
|
||||
\n* Display dialog boxes from shell scripts *\
|
||||
\n\
|
||||
\nUsage: %s --clear\
|
||||
\n %s [--title <title>] [--backtitle <backtitle>] --clear <Box options>\
|
||||
\n\
|
||||
\nBox options:\
|
||||
\n\
|
||||
\n --menu <text> <height> <width> <menu height> <tag1> <item1>...\
|
||||
\n --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
|
||||
\n --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
|
||||
\n --textbox <file> <height> <width>\
|
||||
\n --inputbox <text> <height> <width> [<init>]\
|
||||
\n --yesno <text> <height> <width>\
|
||||
\n", name, name);
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* These are the program jumpers
|
||||
*/
|
||||
|
||||
int
|
||||
j_menu (const char *t, int ac, const char * const * av)
|
||||
{
|
||||
return dialog_menu (t, av[2], atoi (av[3]), atoi (av[4]),
|
||||
atoi (av[5]), av[6], (ac - 6) / 2, av + 7);
|
||||
}
|
||||
|
||||
int
|
||||
j_checklist (const char *t, int ac, const char * const * av)
|
||||
{
|
||||
return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]),
|
||||
atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_CHECK);
|
||||
}
|
||||
|
||||
int
|
||||
j_radiolist (const char *t, int ac, const char * const * av)
|
||||
{
|
||||
return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]),
|
||||
atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_RADIO);
|
||||
}
|
||||
|
||||
int
|
||||
j_textbox (const char *t, int ac, const char * const * av)
|
||||
{
|
||||
return dialog_textbox (t, av[2], atoi (av[3]), atoi (av[4]));
|
||||
}
|
||||
|
||||
int
|
||||
j_yesno (const char *t, int ac, const char * const * av)
|
||||
{
|
||||
return dialog_yesno (t, av[2], atoi (av[3]), atoi (av[4]));
|
||||
}
|
||||
|
||||
int
|
||||
j_inputbox (const char *t, int ac, const char * const * av)
|
||||
{
|
||||
int ret = dialog_inputbox (t, av[2], atoi (av[3]), atoi (av[4]),
|
||||
ac == 6 ? av[5] : (char *) NULL);
|
||||
if (ret == 0)
|
||||
fprintf(stderr, dialog_input_result);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
j_msgbox (const char *t, int ac, const char * const * av)
|
||||
{
|
||||
return dialog_msgbox (t, av[2], atoi (av[3]), atoi (av[4]), 1);
|
||||
}
|
||||
|
||||
int
|
||||
j_infobox (const char *t, int ac, const char * const * av)
|
||||
{
|
||||
return dialog_msgbox (t, av[2], atoi (av[3]), atoi (av[4]), 0);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
HOSTCFLAGS += -DLOCALE
|
||||
LIBS = -lncurses
|
||||
|
||||
ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
|
||||
HOSTCFLAGS += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
|
||||
else
|
||||
ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
|
||||
HOSTCFLAGS += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
|
||||
else
|
||||
ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
|
||||
HOSTCFLAGS += -DCURSES_LOC="<ncurses.h>"
|
||||
else
|
||||
HOSTCFLAGS += -DCURSES_LOC="<curses.h>"
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
OBJS = checklist.o menubox.o textbox.o yesno.o inputbox.o \
|
||||
util.o lxdialog.o msgbox.o
|
||||
|
||||
%.o: %.c
|
||||
$(HOSTCC) $(HOSTCFLAGS) -c -o $@ $<
|
||||
|
||||
all: ncurses lxdialog
|
||||
|
||||
lxdialog: $(OBJS)
|
||||
$(HOSTCC) -o lxdialog $(OBJS) $(LIBS)
|
||||
|
||||
ncurses:
|
||||
@echo "main() {}" > lxtemp.c
|
||||
@if $(HOSTCC) -lncurses lxtemp.c ; then \
|
||||
rm -f lxtemp.c a.out; \
|
||||
else \
|
||||
rm -f lxtemp.c; \
|
||||
echo -e "\007" ;\
|
||||
echo ">> Unable to find the Ncurses libraries." ;\
|
||||
echo ">>" ;\
|
||||
echo ">> You must have Ncurses installed in order" ;\
|
||||
echo ">> to use 'make menuconfig'" ;\
|
||||
echo ;\
|
||||
exit 1 ;\
|
||||
fi
|
||||
|
||||
clean:
|
||||
rm -f core *.o *~ lxdialog
|
||||
@@ -0,0 +1,443 @@
|
||||
/*
|
||||
* menubox.c -- implements the menu box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Changes by Clifford Wolf (god@clifford.at)
|
||||
*
|
||||
* [ 1998-06-13 ]
|
||||
*
|
||||
* *) A bugfix for the Page-Down problem
|
||||
*
|
||||
* *) Formerly when I used Page Down and Page Up, the cursor would be set
|
||||
* to the first position in the menu box. Now lxdialog is a bit
|
||||
* smarter and works more like other menu systems (just have a look at
|
||||
* it).
|
||||
*
|
||||
* *) Formerly if I selected something my scrolling would be broken because
|
||||
* lxdialog is re-invoked by the Menuconfig shell script, can't
|
||||
* remember the last scrolling position, and just sets it so that the
|
||||
* cursor is at the bottom of the box. Now it writes the temporary file
|
||||
* lxdialog.scrltmp which contains this information. The file is
|
||||
* deleted by lxdialog if the user leaves a submenu or enters a new
|
||||
* one, but it would be nice if Menuconfig could make another "rm -f"
|
||||
* just to be sure. Just try it out - you will recognise a difference!
|
||||
*
|
||||
* [ 1998-06-14 ]
|
||||
*
|
||||
* *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
|
||||
* and menus change their size on the fly.
|
||||
*
|
||||
* *) If for some reason the last scrolling position is not saved by
|
||||
* lxdialog, it sets the scrolling so that the selected item is in the
|
||||
* middle of the menu box, not at the bottom.
|
||||
*
|
||||
* 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
|
||||
* Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
|
||||
* This fixes a bug in Menuconfig where using ' ' to descend into menus
|
||||
* would leave mis-synchronized lxdialog.scrltmp files lying around,
|
||||
* fscanf would read in 'scroll', and eventually that value would get used.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
static int menu_width, item_x;
|
||||
|
||||
/*
|
||||
* Print menu item
|
||||
*/
|
||||
static void
|
||||
print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey)
|
||||
{
|
||||
int j;
|
||||
char menu_item[menu_width+1];
|
||||
|
||||
strncpy(menu_item, item, menu_width);
|
||||
menu_item[menu_width] = 0;
|
||||
j = first_alpha(menu_item, "YyNnMm");
|
||||
|
||||
/* Clear 'residue' of last item */
|
||||
wattrset (win, menubox_attr);
|
||||
wmove (win, choice, 0);
|
||||
#if OLD_NCURSES
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < menu_width; i++)
|
||||
waddch (win, ' ');
|
||||
}
|
||||
#else
|
||||
wclrtoeol(win);
|
||||
#endif
|
||||
wattrset (win, selected ? item_selected_attr : item_attr);
|
||||
mvwaddstr (win, choice, item_x, menu_item);
|
||||
if (hotkey) {
|
||||
wattrset (win, selected ? tag_key_selected_attr : tag_key_attr);
|
||||
mvwaddch(win, choice, item_x+j, menu_item[j]);
|
||||
}
|
||||
if (selected) {
|
||||
wmove (win, choice, item_x+1);
|
||||
wrefresh (win);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the scroll indicators.
|
||||
*/
|
||||
static void
|
||||
print_arrows (WINDOW * win, int item_no, int scroll,
|
||||
int y, int x, int height)
|
||||
{
|
||||
int cur_y, cur_x;
|
||||
|
||||
getyx(win, cur_y, cur_x);
|
||||
|
||||
wmove(win, y, x);
|
||||
|
||||
if (scroll > 0) {
|
||||
wattrset (win, uarrow_attr);
|
||||
waddch (win, ACS_UARROW);
|
||||
waddstr (win, "(-)");
|
||||
}
|
||||
else {
|
||||
wattrset (win, menubox_attr);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
}
|
||||
|
||||
y = y + height + 1;
|
||||
wmove(win, y, x);
|
||||
|
||||
if ((height < item_no) && (scroll + height < item_no)) {
|
||||
wattrset (win, darrow_attr);
|
||||
waddch (win, ACS_DARROW);
|
||||
waddstr (win, "(+)");
|
||||
}
|
||||
else {
|
||||
wattrset (win, menubox_border_attr);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
}
|
||||
|
||||
wmove(win, cur_y, cur_x);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the termination buttons.
|
||||
*/
|
||||
static void
|
||||
print_buttons (WINDOW *win, int height, int width, int selected)
|
||||
{
|
||||
int x = width / 2 - 16;
|
||||
int y = height - 2;
|
||||
|
||||
print_button (win, "Select", y, x, selected == 0);
|
||||
print_button (win, " Exit ", y, x + 12, selected == 1);
|
||||
print_button (win, " Help ", y, x + 24, selected == 2);
|
||||
|
||||
wmove(win, y, x+1+12*selected);
|
||||
wrefresh (win);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a menu for choosing among a number of options
|
||||
*/
|
||||
int
|
||||
dialog_menu (const char *title, const char *prompt, int height, int width,
|
||||
int menu_height, const char *current, int item_no,
|
||||
const char * const * items)
|
||||
|
||||
{
|
||||
int i, j, x, y, box_x, box_y;
|
||||
int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice;
|
||||
WINDOW *dialog, *menu;
|
||||
FILE *f;
|
||||
|
||||
max_choice = MIN (menu_height, item_no);
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height - 3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
wbkgdset (dialog, dialog_attr & A_COLOR);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||
|
||||
menu_width = width - 6;
|
||||
box_y = height - menu_height - 5;
|
||||
box_x = (width - menu_width) / 2 - 1;
|
||||
|
||||
/* create new window for the menu */
|
||||
menu = subwin (dialog, menu_height, menu_width,
|
||||
y + box_y + 1, x + box_x + 1);
|
||||
keypad (menu, TRUE);
|
||||
|
||||
/* draw a box around the menu items */
|
||||
draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2,
|
||||
menubox_border_attr, menubox_attr);
|
||||
|
||||
/*
|
||||
* Find length of longest item in order to center menu.
|
||||
* Set 'choice' to default item.
|
||||
*/
|
||||
item_x = 0;
|
||||
for (i = 0; i < item_no; i++) {
|
||||
item_x = MAX (item_x, MIN(menu_width, strlen (items[i * 2 + 1]) + 2));
|
||||
if (strcmp(current, items[i*2]) == 0) choice = i;
|
||||
}
|
||||
|
||||
item_x = (menu_width - item_x) / 2;
|
||||
|
||||
/* get the scroll info from the temp file */
|
||||
if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) {
|
||||
if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) &&
|
||||
(scroll+max_choice > choice) && (scroll >= 0) &&
|
||||
(scroll+max_choice <= item_no) ) {
|
||||
first_item = scroll;
|
||||
choice = choice - scroll;
|
||||
fclose(f);
|
||||
} else {
|
||||
scroll=0;
|
||||
remove("lxdialog.scrltmp");
|
||||
fclose(f);
|
||||
f=NULL;
|
||||
}
|
||||
}
|
||||
if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
|
||||
if (choice >= item_no-max_choice/2)
|
||||
scroll = first_item = item_no-max_choice;
|
||||
else
|
||||
scroll = first_item = choice - max_choice/2;
|
||||
choice = choice - scroll;
|
||||
}
|
||||
|
||||
/* Print the menu */
|
||||
for (i=0; i < max_choice; i++) {
|
||||
print_item (menu, items[(first_item + i) * 2 + 1], i, i == choice,
|
||||
(items[(first_item + i)*2][0] != ':'));
|
||||
}
|
||||
|
||||
wnoutrefresh (menu);
|
||||
|
||||
print_arrows(dialog, item_no, scroll,
|
||||
box_y, box_x+item_x+1, menu_height);
|
||||
|
||||
print_buttons (dialog, height, width, 0);
|
||||
wmove (menu, choice, item_x+1);
|
||||
wrefresh (menu);
|
||||
|
||||
while (key != ESC) {
|
||||
key = wgetch(menu);
|
||||
|
||||
if (key < 256 && isalpha(key)) key = tolower(key);
|
||||
|
||||
if (strchr("ynm", key))
|
||||
i = max_choice;
|
||||
else {
|
||||
for (i = choice+1; i < max_choice; i++) {
|
||||
j = first_alpha(items[(scroll+i)*2+1], "YyNnMm");
|
||||
if (key == tolower(items[(scroll+i)*2+1][j]))
|
||||
break;
|
||||
}
|
||||
if (i == max_choice)
|
||||
for (i = 0; i < max_choice; i++) {
|
||||
j = first_alpha(items[(scroll+i)*2+1], "YyNnMm");
|
||||
if (key == tolower(items[(scroll+i)*2+1][j]))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < max_choice ||
|
||||
key == KEY_UP || key == KEY_DOWN ||
|
||||
key == '-' || key == '+' ||
|
||||
key == KEY_PPAGE || key == KEY_NPAGE) {
|
||||
|
||||
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
|
||||
(items[(scroll+choice)*2][0] != ':'));
|
||||
|
||||
if (key == KEY_UP || key == '-') {
|
||||
if (choice < 2 && scroll) {
|
||||
/* Scroll menu down */
|
||||
scrollok (menu, TRUE);
|
||||
wscrl (menu, -1);
|
||||
scrollok (menu, FALSE);
|
||||
|
||||
scroll--;
|
||||
|
||||
print_item (menu, items[scroll * 2 + 1], 0, FALSE,
|
||||
(items[scroll*2][0] != ':'));
|
||||
} else
|
||||
choice = MAX(choice - 1, 0);
|
||||
|
||||
} else if (key == KEY_DOWN || key == '+') {
|
||||
|
||||
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
|
||||
(items[(scroll+choice)*2][0] != ':'));
|
||||
|
||||
if ((choice > max_choice-3) &&
|
||||
(scroll + max_choice < item_no)
|
||||
) {
|
||||
/* Scroll menu up */
|
||||
scrollok (menu, TRUE);
|
||||
scroll (menu);
|
||||
scrollok (menu, FALSE);
|
||||
|
||||
scroll++;
|
||||
|
||||
print_item (menu, items[(scroll+max_choice-1)*2+1],
|
||||
max_choice-1, FALSE,
|
||||
(items[(scroll+max_choice-1)*2][0] != ':'));
|
||||
} else
|
||||
choice = MIN(choice+1, max_choice-1);
|
||||
|
||||
} else if (key == KEY_PPAGE) {
|
||||
scrollok (menu, TRUE);
|
||||
for (i=0; (i < max_choice); i++) {
|
||||
if (scroll > 0) {
|
||||
wscrl (menu, -1);
|
||||
scroll--;
|
||||
print_item (menu, items[scroll * 2 + 1], 0, FALSE,
|
||||
(items[scroll*2][0] != ':'));
|
||||
} else {
|
||||
if (choice > 0)
|
||||
choice--;
|
||||
}
|
||||
}
|
||||
scrollok (menu, FALSE);
|
||||
|
||||
} else if (key == KEY_NPAGE) {
|
||||
for (i=0; (i < max_choice); i++) {
|
||||
if (scroll+max_choice < item_no) {
|
||||
scrollok (menu, TRUE);
|
||||
scroll(menu);
|
||||
scrollok (menu, FALSE);
|
||||
scroll++;
|
||||
print_item (menu, items[(scroll+max_choice-1)*2+1],
|
||||
max_choice-1, FALSE,
|
||||
(items[(scroll+max_choice-1)*2][0] != ':'));
|
||||
} else {
|
||||
if (choice+1 < max_choice)
|
||||
choice++;
|
||||
}
|
||||
}
|
||||
|
||||
} else
|
||||
choice = i;
|
||||
|
||||
print_item (menu, items[(scroll+choice)*2+1], choice, TRUE,
|
||||
(items[(scroll+choice)*2][0] != ':'));
|
||||
|
||||
print_arrows(dialog, item_no, scroll,
|
||||
box_y, box_x+item_x+1, menu_height);
|
||||
|
||||
wnoutrefresh (dialog);
|
||||
wrefresh (menu);
|
||||
|
||||
continue; /* wait for another key press */
|
||||
}
|
||||
|
||||
switch (key) {
|
||||
case KEY_LEFT:
|
||||
case TAB:
|
||||
case KEY_RIGHT:
|
||||
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||
? 2 : (button > 2 ? 0 : button);
|
||||
|
||||
print_buttons(dialog, height, width, button);
|
||||
wrefresh (menu);
|
||||
break;
|
||||
case ' ':
|
||||
case 's':
|
||||
case 'y':
|
||||
case 'n':
|
||||
case 'm':
|
||||
/* save scroll info */
|
||||
if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
|
||||
fprintf(f,"%d\n",scroll);
|
||||
fclose(f);
|
||||
}
|
||||
delwin (dialog);
|
||||
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]);
|
||||
switch (key) {
|
||||
case 's': return 3;
|
||||
case 'y': return 3;
|
||||
case 'n': return 4;
|
||||
case 'm': return 5;
|
||||
case ' ': return 6;
|
||||
}
|
||||
return 0;
|
||||
case 'h':
|
||||
case '?':
|
||||
button = 2;
|
||||
case '\n':
|
||||
delwin (dialog);
|
||||
if (button == 2)
|
||||
fprintf(stderr, "%s \"%s\"\n",
|
||||
items[(scroll + choice) * 2],
|
||||
items[(scroll + choice) * 2 + 1] +
|
||||
first_alpha(items[(scroll + choice) * 2 + 1],""));
|
||||
else
|
||||
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]);
|
||||
|
||||
remove("lxdialog.scrltmp");
|
||||
return button;
|
||||
case 'e':
|
||||
case 'x':
|
||||
key = ESC;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
remove("lxdialog.scrltmp");
|
||||
return -1; /* ESC pressed */
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* msgbox.c -- implements the message box and info box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
/*
|
||||
* Display a message box. Program will pause and display an "OK" button
|
||||
* if the parameter 'pause' is non-zero.
|
||||
*/
|
||||
int
|
||||
dialog_msgbox (const char *title, const char *prompt, int height, int width,
|
||||
int pause)
|
||||
{
|
||||
int i, x, y, key = 0;
|
||||
WINDOW *dialog;
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 2);
|
||||
|
||||
if (pause) {
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height - 3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
print_button (dialog, " Ok ",
|
||||
height - 2, width / 2 - 4, TRUE);
|
||||
|
||||
wrefresh (dialog);
|
||||
while (key != ESC && key != '\n' && key != ' ' &&
|
||||
key != 'O' && key != 'o' && key != 'X' && key != 'x')
|
||||
key = wgetch (dialog);
|
||||
} else {
|
||||
key = '\n';
|
||||
wrefresh (dialog);
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
return key == ESC ? -1 : 0;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,359 @@
|
||||
/*
|
||||
* util.c
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
|
||||
/* use colors by default? */
|
||||
bool use_colors = 1;
|
||||
|
||||
const char *backtitle = NULL;
|
||||
|
||||
const char *dialog_result;
|
||||
|
||||
/*
|
||||
* Attribute values, default is for mono display
|
||||
*/
|
||||
chtype attributes[] =
|
||||
{
|
||||
A_NORMAL, /* screen_attr */
|
||||
A_NORMAL, /* shadow_attr */
|
||||
A_NORMAL, /* dialog_attr */
|
||||
A_BOLD, /* title_attr */
|
||||
A_NORMAL, /* border_attr */
|
||||
A_REVERSE, /* button_active_attr */
|
||||
A_DIM, /* button_inactive_attr */
|
||||
A_REVERSE, /* button_key_active_attr */
|
||||
A_BOLD, /* button_key_inactive_attr */
|
||||
A_REVERSE, /* button_label_active_attr */
|
||||
A_NORMAL, /* button_label_inactive_attr */
|
||||
A_NORMAL, /* inputbox_attr */
|
||||
A_NORMAL, /* inputbox_border_attr */
|
||||
A_NORMAL, /* searchbox_attr */
|
||||
A_BOLD, /* searchbox_title_attr */
|
||||
A_NORMAL, /* searchbox_border_attr */
|
||||
A_BOLD, /* position_indicator_attr */
|
||||
A_NORMAL, /* menubox_attr */
|
||||
A_NORMAL, /* menubox_border_attr */
|
||||
A_NORMAL, /* item_attr */
|
||||
A_REVERSE, /* item_selected_attr */
|
||||
A_BOLD, /* tag_attr */
|
||||
A_REVERSE, /* tag_selected_attr */
|
||||
A_BOLD, /* tag_key_attr */
|
||||
A_REVERSE, /* tag_key_selected_attr */
|
||||
A_BOLD, /* check_attr */
|
||||
A_REVERSE, /* check_selected_attr */
|
||||
A_BOLD, /* uarrow_attr */
|
||||
A_BOLD /* darrow_attr */
|
||||
};
|
||||
|
||||
|
||||
#include "colors.h"
|
||||
|
||||
/*
|
||||
* Table of color values
|
||||
*/
|
||||
int color_table[][3] =
|
||||
{
|
||||
{SCREEN_FG, SCREEN_BG, SCREEN_HL},
|
||||
{SHADOW_FG, SHADOW_BG, SHADOW_HL},
|
||||
{DIALOG_FG, DIALOG_BG, DIALOG_HL},
|
||||
{TITLE_FG, TITLE_BG, TITLE_HL},
|
||||
{BORDER_FG, BORDER_BG, BORDER_HL},
|
||||
{BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
|
||||
{BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
|
||||
{BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
|
||||
{BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
|
||||
{BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
|
||||
{BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
|
||||
BUTTON_LABEL_INACTIVE_HL},
|
||||
{INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
|
||||
{INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
|
||||
{SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
|
||||
{SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
|
||||
{SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
|
||||
{POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
|
||||
{MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
|
||||
{MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
|
||||
{ITEM_FG, ITEM_BG, ITEM_HL},
|
||||
{ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
|
||||
{TAG_FG, TAG_BG, TAG_HL},
|
||||
{TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
|
||||
{TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
|
||||
{TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
|
||||
{CHECK_FG, CHECK_BG, CHECK_HL},
|
||||
{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
|
||||
{UARROW_FG, UARROW_BG, UARROW_HL},
|
||||
{DARROW_FG, DARROW_BG, DARROW_HL},
|
||||
}; /* color_table */
|
||||
|
||||
/*
|
||||
* Set window to attribute 'attr'
|
||||
*/
|
||||
void
|
||||
attr_clear (WINDOW * win, int height, int width, chtype attr)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
wattrset (win, attr);
|
||||
for (i = 0; i < height; i++) {
|
||||
wmove (win, i, 0);
|
||||
for (j = 0; j < width; j++)
|
||||
waddch (win, ' ');
|
||||
}
|
||||
touchwin (win);
|
||||
}
|
||||
|
||||
void dialog_clear (void)
|
||||
{
|
||||
attr_clear (stdscr, LINES, COLS, screen_attr);
|
||||
/* Display background title if it exists ... - SLH */
|
||||
if (backtitle != NULL) {
|
||||
int i;
|
||||
|
||||
wattrset (stdscr, screen_attr);
|
||||
mvwaddstr (stdscr, 0, 1, (char *)backtitle);
|
||||
wmove (stdscr, 1, 1);
|
||||
for (i = 1; i < COLS - 1; i++)
|
||||
waddch (stdscr, ACS_HLINE);
|
||||
}
|
||||
wnoutrefresh (stdscr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do some initialization for dialog
|
||||
*/
|
||||
void
|
||||
init_dialog (void)
|
||||
{
|
||||
initscr (); /* Init curses */
|
||||
keypad (stdscr, TRUE);
|
||||
cbreak ();
|
||||
noecho ();
|
||||
|
||||
|
||||
if (use_colors) /* Set up colors */
|
||||
color_setup ();
|
||||
|
||||
|
||||
dialog_clear ();
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup for color display
|
||||
*/
|
||||
void
|
||||
color_setup (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (has_colors ()) { /* Terminal supports color? */
|
||||
start_color ();
|
||||
|
||||
/* Initialize color pairs */
|
||||
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
||||
init_pair (i + 1, color_table[i][0], color_table[i][1]);
|
||||
|
||||
/* Setup color attributes */
|
||||
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
||||
attributes[i] = C_ATTR (color_table[i][2], i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* End using dialog functions.
|
||||
*/
|
||||
void
|
||||
end_dialog (void)
|
||||
{
|
||||
endwin ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Print a string of text in a window, automatically wrap around to the
|
||||
* next line if the string is too long to fit on one line. Newline
|
||||
* characters '\n' are replaced by spaces. We start on a new line
|
||||
* if there is no room for at least 4 nonblanks following a double-space.
|
||||
*/
|
||||
void
|
||||
print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
|
||||
{
|
||||
int newl, cur_x, cur_y;
|
||||
int i, prompt_len, room, wlen;
|
||||
char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
|
||||
|
||||
strcpy (tempstr, prompt);
|
||||
|
||||
prompt_len = strlen(tempstr);
|
||||
|
||||
/*
|
||||
* Remove newlines
|
||||
*/
|
||||
for(i=0; i<prompt_len; i++) {
|
||||
if(tempstr[i] == '\n') tempstr[i] = ' ';
|
||||
}
|
||||
|
||||
if (prompt_len <= width - x * 2) { /* If prompt is short */
|
||||
wmove (win, y, (width - prompt_len) / 2);
|
||||
waddstr (win, tempstr);
|
||||
} else {
|
||||
cur_x = x;
|
||||
cur_y = y;
|
||||
newl = 1;
|
||||
word = tempstr;
|
||||
while (word && *word) {
|
||||
sp = index(word, ' ');
|
||||
if (sp)
|
||||
*sp++ = 0;
|
||||
|
||||
/* Wrap to next line if either the word does not fit,
|
||||
or it is the first word of a new sentence, and it is
|
||||
short, and the next word does not fit. */
|
||||
room = width - cur_x;
|
||||
wlen = strlen(word);
|
||||
if (wlen > room ||
|
||||
(newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
|
||||
&& (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
|
||||
cur_y++;
|
||||
cur_x = x;
|
||||
}
|
||||
wmove (win, cur_y, cur_x);
|
||||
waddstr (win, word);
|
||||
getyx (win, cur_y, cur_x);
|
||||
cur_x++;
|
||||
if (sp && *sp == ' ') {
|
||||
cur_x++; /* double space */
|
||||
while (*++sp == ' ');
|
||||
newl = 1;
|
||||
} else
|
||||
newl = 0;
|
||||
word = sp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print a button
|
||||
*/
|
||||
void
|
||||
print_button (WINDOW * win, const char *label, int y, int x, int selected)
|
||||
{
|
||||
int i, temp;
|
||||
|
||||
wmove (win, y, x);
|
||||
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
||||
waddstr (win, "<");
|
||||
temp = strspn (label, " ");
|
||||
label += temp;
|
||||
wattrset (win, selected ? button_label_active_attr
|
||||
: button_label_inactive_attr);
|
||||
for (i = 0; i < temp; i++)
|
||||
waddch (win, ' ');
|
||||
wattrset (win, selected ? button_key_active_attr
|
||||
: button_key_inactive_attr);
|
||||
waddch (win, label[0]);
|
||||
wattrset (win, selected ? button_label_active_attr
|
||||
: button_label_inactive_attr);
|
||||
waddstr (win, (char *)label + 1);
|
||||
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
||||
waddstr (win, ">");
|
||||
wmove (win, y, x + temp + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Draw a rectangular box with line drawing characters
|
||||
*/
|
||||
void
|
||||
draw_box (WINDOW * win, int y, int x, int height, int width,
|
||||
chtype box, chtype border)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
wattrset (win, 0);
|
||||
for (i = 0; i < height; i++) {
|
||||
wmove (win, y + i, x);
|
||||
for (j = 0; j < width; j++)
|
||||
if (!i && !j)
|
||||
waddch (win, border | ACS_ULCORNER);
|
||||
else if (i == height - 1 && !j)
|
||||
waddch (win, border | ACS_LLCORNER);
|
||||
else if (!i && j == width - 1)
|
||||
waddch (win, box | ACS_URCORNER);
|
||||
else if (i == height - 1 && j == width - 1)
|
||||
waddch (win, box | ACS_LRCORNER);
|
||||
else if (!i)
|
||||
waddch (win, border | ACS_HLINE);
|
||||
else if (i == height - 1)
|
||||
waddch (win, box | ACS_HLINE);
|
||||
else if (!j)
|
||||
waddch (win, border | ACS_VLINE);
|
||||
else if (j == width - 1)
|
||||
waddch (win, box | ACS_VLINE);
|
||||
else
|
||||
waddch (win, box | ' ');
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Draw shadows along the right and bottom edge to give a more 3D look
|
||||
* to the boxes
|
||||
*/
|
||||
void
|
||||
draw_shadow (WINDOW * win, int y, int x, int height, int width)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (has_colors ()) { /* Whether terminal supports color? */
|
||||
wattrset (win, shadow_attr);
|
||||
wmove (win, y + height, x + 2);
|
||||
for (i = 0; i < width; i++)
|
||||
waddch (win, winch (win) & A_CHARTEXT);
|
||||
for (i = y + 1; i < y + height + 1; i++) {
|
||||
wmove (win, i, x + width);
|
||||
waddch (win, winch (win) & A_CHARTEXT);
|
||||
waddch (win, winch (win) & A_CHARTEXT);
|
||||
}
|
||||
wnoutrefresh (win);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the position of the first alphabetic character in a string.
|
||||
*/
|
||||
int
|
||||
first_alpha(const char *string, const char *exempt)
|
||||
{
|
||||
int i, in_paren=0, c;
|
||||
|
||||
for (i = 0; i < strlen(string); i++) {
|
||||
c = tolower(string[i]);
|
||||
|
||||
if (strchr("<[(", c)) ++in_paren;
|
||||
if (strchr(">])", c)) --in_paren;
|
||||
|
||||
if ((! in_paren) && isalpha(c) &&
|
||||
strchr(exempt, c) == 0)
|
||||
return i;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* yesno.c -- implements the yes/no box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
/*
|
||||
* Display termination buttons
|
||||
*/
|
||||
static void
|
||||
print_buttons(WINDOW *dialog, int height, int width, int selected)
|
||||
{
|
||||
int x = width / 2 - 10;
|
||||
int y = height - 2;
|
||||
|
||||
print_button (dialog, " Yes ", y, x, selected == 0);
|
||||
print_button (dialog, " No ", y, x + 13, selected == 1);
|
||||
|
||||
wmove(dialog, y, x+1 + 13*selected );
|
||||
wrefresh (dialog);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a dialog box with two buttons - Yes and No
|
||||
*/
|
||||
int
|
||||
dialog_yesno (const char *title, const char *prompt, int height, int width)
|
||||
{
|
||||
int i, x, y, key = 0, button = 0;
|
||||
WINDOW *dialog;
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||
|
||||
print_buttons(dialog, height, width, 0);
|
||||
|
||||
while (key != ESC) {
|
||||
key = wgetch (dialog);
|
||||
switch (key) {
|
||||
case 'Y':
|
||||
case 'y':
|
||||
delwin (dialog);
|
||||
return 0;
|
||||
case 'N':
|
||||
case 'n':
|
||||
delwin (dialog);
|
||||
return 1;
|
||||
|
||||
case TAB:
|
||||
case KEY_LEFT:
|
||||
case KEY_RIGHT:
|
||||
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||
? 1 : (button > 1 ? 0 : button);
|
||||
|
||||
print_buttons(dialog, height, width, button);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case ' ':
|
||||
case '\n':
|
||||
delwin (dialog);
|
||||
return button;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
return -1; /* ESC pressed */
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
HEADER=header.tk
|
||||
TAIL=tail.tk
|
||||
|
||||
# Previous versions always remade kconfig.tk because they always depended
|
||||
# on soundscript. This runs fairly fast, and I can't find all the
|
||||
# Config.in files to depend on anyways. So I'll force it to remake.
|
||||
|
||||
kconfig.tk: dummy
|
||||
|
||||
kconfig.tk: ${TOPDIR}/Makefile ${TOPDIR}/arch/${ARCH}/config.in \
|
||||
tkparse ${HEADER} ${TAIL}
|
||||
@if [ -f /usr/local/bin/wish ]; then \
|
||||
echo '#!'"/usr/local/bin/wish -f" > kconfig.tk; \
|
||||
else \
|
||||
echo '#!'"/usr/bin/wish -f" > kconfig.tk; \
|
||||
fi
|
||||
cat ${HEADER} >> ./kconfig.tk
|
||||
./tkparse < ../arch/${ARCH}/config.in >> kconfig.tk
|
||||
KERNTYPE=`sed -n 's_^/\* Kernel type \(.*\) \*/_\1_p' /boot/kernel.h 2>/dev/null`; \
|
||||
if [ -f configs/*-$KERNTYPE.config ]; then \
|
||||
conf=`echo configs/*-$KERNELTYPE.config`; \
|
||||
echo "set defaults \"${conf}\"" >> kconfig.tk; \
|
||||
else \
|
||||
echo "set defaults \"arch/${ARCH}/defconfig\"" >> kconfig.tk; \
|
||||
fi
|
||||
echo "set ARCH \"${ARCH}\"" >> kconfig.tk
|
||||
cat ${TAIL} >> kconfig.tk
|
||||
chmod 755 kconfig.tk
|
||||
|
||||
tkparse: tkparse.o tkcond.o tkgen.o
|
||||
${HOSTCC} -o tkparse tkparse.o tkcond.o tkgen.o
|
||||
|
||||
tkparse.o: tkparse.c tkparse.h
|
||||
|
||||
tkcond.o: tkcond.c tkparse.h
|
||||
|
||||
tkgen.o: tkgen.c tkparse.h
|
||||
|
||||
tkparse.o tkcond.o tkgen.o:
|
||||
$(HOSTCC) $(HOSTCFLAGS) -c -o $@ $(@:.o=.c)
|
||||
|
||||
docproc.o: docproc.c
|
||||
$(HOSTCC) $(HOSTCFLAGS) -c -o $@ $(@:.o=.c)
|
||||
|
||||
docproc: docproc.o
|
||||
${HOSTCC} -o docproc docproc.o
|
||||
|
||||
clean:
|
||||
rm -f *~ kconfig.tk *.o tkparse mkdep split-include docproc
|
||||
|
||||
include $(TOPDIR)/Rules.make
|
||||
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
# A script to dump mixed source code & assembly
|
||||
# with correct relocations from System.map
|
||||
# Requires the following lines in Rules.make.
|
||||
# Author(s): DJ Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
|
||||
# William Stearns <wstearns@pobox.com>
|
||||
#%.lst: %.c
|
||||
# $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -g -c -o $*.o $<
|
||||
# $(TOPDIR)/scripts/makelst $* $(TOPDIR) $(OBJDUMP)
|
||||
#
|
||||
# Copyright (C) 2000 IBM Corporation
|
||||
# Author(s): DJ Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
|
||||
#
|
||||
|
||||
t1=`$3 --syms $2/$1.o | grep .text | grep " F " | head -n 1`
|
||||
t2=`echo $t1 | gawk '{ print $6 }'`
|
||||
t3=`grep $t2 $2/System.map`
|
||||
t4=`echo $t3 | gawk '{ print $1 }'`
|
||||
t5=`echo $t1 | gawk '{ print $1 }'`
|
||||
t6=`echo $t4 - $t5 | sed -e s/a/A/g -e s/b/B/g -e s/c/C/g -e s/d/D/g -e s/e/E/g -e s/f/F/g`
|
||||
t7=`( echo ibase=16 ; echo $t6 ) | bc`
|
||||
$3 --source --adjust-vma=$t7 $2/$1.o > $2/$1.lst
|
||||
Executable
+259
@@ -0,0 +1,259 @@
|
||||
#!/bin/bash
|
||||
# This script is used to make the configure script: config-mnu.
|
||||
|
||||
MNU_CONFIG=.config
|
||||
FEATURE_IN=configs/feature.in
|
||||
CONFIG_MNU=config-mnu
|
||||
|
||||
prefix=/usr/local
|
||||
CC=gcc
|
||||
TARGET=i386-linux
|
||||
HOST=i386-linux
|
||||
CFLAGS=
|
||||
LDFLAGS=
|
||||
|
||||
CONFIGURE_HELP=.config_help
|
||||
|
||||
if [ ! -f configure ]; then
|
||||
echo "configure not exist, execute autogen to make it"
|
||||
./autogen.sh
|
||||
fi
|
||||
|
||||
./configure --help > $CONFIGURE_HELP
|
||||
|
||||
echo "#!/bin/sh" > $CONFIG_MNU
|
||||
echo "# Automatically generated by make menuconfig." >> $CONFIG_MNU
|
||||
echo >> $CONFIG_MNU
|
||||
echo "rm config.cache config.status -f" >> $CONFIG_MNU
|
||||
echo >> $CONFIG_MNU
|
||||
|
||||
SAVEIFS=$IFS
|
||||
IFS==
|
||||
|
||||
function check_def_yes () {
|
||||
if grep "$1" $CONFIGURE_HELP | grep "<default=yes>" > /dev/null; then
|
||||
return 0
|
||||
else
|
||||
return -1
|
||||
fi
|
||||
}
|
||||
|
||||
function check_def_no () {
|
||||
if grep "$1" $CONFIGURE_HELP | grep "<default=no>" > /dev/null; then
|
||||
return 0
|
||||
else
|
||||
return -1
|
||||
fi
|
||||
}
|
||||
|
||||
function check_exist () {
|
||||
if grep "$1" $MNU_CONFIG > /dev/null; then
|
||||
return 0
|
||||
else
|
||||
return -1
|
||||
fi
|
||||
}
|
||||
|
||||
function check_value () {
|
||||
if [ -s $MNU_CONFIG ]; then
|
||||
while read var_config value
|
||||
do
|
||||
|
||||
if [ "$var_config" = "$1" ]; then
|
||||
if [ "$value" = "y" ]; then
|
||||
return 0
|
||||
else
|
||||
return -1
|
||||
fi
|
||||
fi
|
||||
|
||||
done < $MNU_CONFIG
|
||||
return -1
|
||||
fi
|
||||
}
|
||||
|
||||
function get_value () {
|
||||
if [ -s $2 ]; then
|
||||
while read var_config nowvalue
|
||||
|
||||
do
|
||||
|
||||
if [ "$var_config" = "$1" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
done < $2
|
||||
return -1
|
||||
|
||||
fi
|
||||
}
|
||||
|
||||
function get_mnu_value () {
|
||||
if get_value $1 $MNU_CONFIG; then
|
||||
return 0
|
||||
else
|
||||
return -1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
if get_mnu_value "PREFIX"; then
|
||||
echo ""
|
||||
prefix=$nowvalue
|
||||
echo "install prefix = $prefix"
|
||||
fi
|
||||
if get_mnu_value "CC"; then
|
||||
CC=$nowvalue
|
||||
echo "compiler = $CC"
|
||||
fi
|
||||
if get_mnu_value "TARGET"; then
|
||||
TARGET=$nowvalue
|
||||
echo "target = $TARGET"
|
||||
fi
|
||||
if get_mnu_value "HOST"; then
|
||||
HOST=$nowvalue
|
||||
echo "host = $HOST"
|
||||
fi
|
||||
|
||||
|
||||
# set CFLAGS and LDFLAGS for uClinux
|
||||
# -----------------------------------------------------------------
|
||||
if check_value "CONFIG_OS_UCLINUX"; then
|
||||
|
||||
CFLAGS="-Os -D__uClinux__ -fno-builtin"
|
||||
|
||||
if get_mnu_value "UC_KERNEL_HEADER"; then
|
||||
CFLAGS="$CFLAGS -I$nowvalue"
|
||||
fi
|
||||
if get_mnu_value "UCLIBC_HEADER"; then
|
||||
CFLAGS="$CFLAGS -I$nowvalue -I$nowvalue/../"
|
||||
fi
|
||||
|
||||
LDFLAGS="-Wl,-elf2flt -Wl,-move-rodata"
|
||||
if get_mnu_value "UCLIBC_LIB"; then
|
||||
LDFLAGS="$LDFLAGS -L$nowvalue -L$nowvalue/../"
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_COMPILER_M68K_ELF"; then
|
||||
|
||||
if check_value "CONFIG_TARGET_M68K_XCOPILOT"; then
|
||||
CFLAGS="$CFLAGS -m68000 -mid-shared-library -mshared-library-id=0"
|
||||
LDFLAGS="$LDFLAGS -Wl,-shared-lib-id,0"
|
||||
fi
|
||||
if check_value "CONFIG_TARGET_M68K_68EZ328"; then
|
||||
CFLAGS="$CFLAGS -m68000 -mid-shared-library -mshared-library-id=0"
|
||||
LDFLAGS="$LDFLAGS -Wl,-shared-lib-id,0"
|
||||
fi
|
||||
if check_value "CONFIG_TARGET_M68K_CF5200"; then
|
||||
CFLAGS="$CFLAGS -m5200 -Wa,-S -Wa,-m5200 -msep-data"
|
||||
fi
|
||||
if check_value "CONFIG_TARGET_M68K_CF5307"; then
|
||||
CFLAGS="$CFLAGS -m5307 -Wa,-S -Wa,-m5307 -msep-data"
|
||||
fi
|
||||
|
||||
|
||||
if get_mnu_value "UCLIBC_LIB"; then
|
||||
LDFLAGS="$LDFLAGS -Wl,-R,$nowvalue/../libc.gdb"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_COMPILER_ARM_ELF"; then
|
||||
CFLAGS="$CFLAGS -D__PIC__ -fpic -msingle-pic-base"
|
||||
fi
|
||||
|
||||
LDFLAGS="$LDFLAGS -lc"
|
||||
|
||||
echo "CFLAGS = $CFLAGS"
|
||||
echo "LDFLAGS = $LDFLAGS"
|
||||
|
||||
fi
|
||||
# uClinux -----------------------------------------------------------
|
||||
|
||||
# set CFLAGS and LDFLAGS for eCos
|
||||
# -----------------------------------------------------------------
|
||||
if check_value "CONFIG_OS_ECOS"; then
|
||||
CFLAGS="$CFLAGS -D__ECOS -D__NOUNIX__ -DUNIX=1"
|
||||
LDFLAGS="$LDFLAGS -nostdlib"
|
||||
fi
|
||||
# -----------------------------------------------------------------
|
||||
|
||||
if get_mnu_value "ADD_CFLAGS"; then
|
||||
CFLAGS="$CFLAGS $nowvalue"
|
||||
fi
|
||||
if get_mnu_value "ADD_LDFLAGS"; then
|
||||
LDFLAGS="$LDFLAGS $nowvalue"
|
||||
fi
|
||||
|
||||
|
||||
echo "CC=$CC \\" >> $CONFIG_MNU
|
||||
echo "CFLAGS=\"$CFLAGS\" \\" >> $CONFIG_MNU
|
||||
echo "LDFLAGS=\"$LDFLAGS\" \\" >> $CONFIG_MNU
|
||||
echo "./configure \\" >> $CONFIG_MNU
|
||||
echo " --prefix=$prefix \\" >> $CONFIG_MNU
|
||||
echo " --target=$TARGET \\" >> $CONFIG_MNU
|
||||
echo " --host=$HOST \\" >> $CONFIG_MNU
|
||||
|
||||
if check_value "CONFIG_NO_SHARE"; then
|
||||
echo " --disable-shared \\" >> $CONFIG_MNU
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_OS_LINUX"; then
|
||||
echo " --with-osname=linux\\" >> $CONFIG_MNU
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_OS_UCLINUX"; then
|
||||
echo " --with-osname=uclinux\\" >> $CONFIG_MNU
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_OS_ECOS"; then
|
||||
echo " --with-osname=ecos\\" >> $CONFIG_MNU
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_OS_UCOSII"; then
|
||||
echo " --with-osname=ucos2\\" >> $CONFIG_MNU
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_LF_FASHION"; then
|
||||
echo " --enable-fashionlf\\" >> $CONFIG_MNU
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_LF_FLAT"; then
|
||||
echo " --enable-flatlf\\" >> $CONFIG_MNU
|
||||
fi
|
||||
|
||||
if check_value "CONFIG_LF_TINY"; then
|
||||
echo " --enable-tinylf\\" >> $CONFIG_MNU
|
||||
fi
|
||||
|
||||
if [ -s $FEATURE_IN ]; then
|
||||
while read var_config feature
|
||||
do
|
||||
|
||||
if [ "$feature" != "" ]; then
|
||||
if check_exist $var_config; then
|
||||
|
||||
if check_value $var_config; then
|
||||
if check_def_no $feature; then
|
||||
echo " --enable-$feature \\" >> $CONFIG_MNU
|
||||
fi
|
||||
else
|
||||
if check_def_yes $feature; then
|
||||
echo " --disable-$feature \\" >> $CONFIG_MNU
|
||||
fi
|
||||
fi
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
done < $FEATURE_IN
|
||||
fi
|
||||
|
||||
echo " --build=i386-linux" >> $CONFIG_MNU
|
||||
|
||||
|
||||
rm $CONFIGURE_HELP
|
||||
chmod +x $CONFIG_MNU
|
||||
|
||||
IFS=$SAVEIFS
|
||||
|
||||
@@ -0,0 +1,181 @@
|
||||
/***************************************************************************
|
||||
* mkconfigs.c
|
||||
* (C) 2002 Randy Dunlap <rddunlap@osdl.org>
|
||||
|
||||
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
# Rules for scripts/mkconfigs.c input.config output.c
|
||||
# to generate configs.c from linux/.config:
|
||||
# - drop lines that begin with '#'
|
||||
# - drop blank lines
|
||||
# - lines that use double-quotes must \\-escape-quote them
|
||||
|
||||
################## skeleton configs.c file: ####################
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
static char *configs[] __initdata =
|
||||
|
||||
<insert lines selected lines of .config, quoted, with added '\n'>,
|
||||
|
||||
;
|
||||
|
||||
################### end configs.c file ######################
|
||||
|
||||
* Changelog for ver. 0.2, 2002-02-15, rddunlap@osdl.org:
|
||||
- strip leading "CONFIG_" from config option strings;
|
||||
- use "static" and "__attribute__((unused))";
|
||||
- don't use EXPORT_SYMBOL();
|
||||
- separate each config line with \newline instead of space;
|
||||
|
||||
* Changelog for ver. 0.3, 2002-02-18, rddunlap@osdl.org:
|
||||
- keep all "not set" comment lines from .config so that 'make *config'
|
||||
will be happy, but don't keep other comments;
|
||||
- keep leading "CONFIG_" on each line;
|
||||
|
||||
****************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define VERSION "0.2"
|
||||
#define LINE_SIZE 1000
|
||||
|
||||
int include_all_lines = 1; // whether to include "=n" lines in the output
|
||||
|
||||
void usage (const char *progname)
|
||||
{
|
||||
fprintf (stderr, "%s ver. %s\n", progname, VERSION);
|
||||
fprintf (stderr, "usage: %s input.config.name path/configs.c\n",
|
||||
progname);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
void make_intro (FILE *sourcefile)
|
||||
{
|
||||
fprintf (sourcefile, "#include <linux/init.h>\n");
|
||||
///// fprintf (sourcefile, "#include <linux/module.h>\n");
|
||||
fprintf (sourcefile, "\n");
|
||||
///// fprintf (sourcefile, "char *configs[] __initdata = {\n");
|
||||
fprintf (sourcefile, "static char __attribute__ ((unused)) *configs[] __initdata = {\n");
|
||||
fprintf (sourcefile, " \"CONFIG_BEGIN=n\\n\" ,\n");
|
||||
}
|
||||
|
||||
void make_ending (FILE *sourcefile)
|
||||
{
|
||||
fprintf (sourcefile, " \"CONFIG_END=n\\n\"\n");
|
||||
fprintf (sourcefile, "};\n");
|
||||
///// fprintf (sourcefile, "EXPORT_SYMBOL (configs);\n");
|
||||
}
|
||||
|
||||
void make_lines (FILE *configfile, FILE *sourcefile)
|
||||
{
|
||||
char cfgline[LINE_SIZE];
|
||||
char *ch;
|
||||
|
||||
while (fgets (cfgline, LINE_SIZE, configfile)) {
|
||||
/* kill the trailing newline in cfgline */
|
||||
cfgline[strlen (cfgline) - 1] = '\0';
|
||||
|
||||
/* don't keep #-only line or an empty/blank line */
|
||||
if ((cfgline[0] == '#' && cfgline[1] == '\0') ||
|
||||
cfgline[0] == '\0')
|
||||
continue;
|
||||
|
||||
if (!include_all_lines &&
|
||||
cfgline[0] == '#') // strip out all comment lines
|
||||
continue;
|
||||
|
||||
/* really only want to keep lines that begin with
|
||||
* "CONFIG_" or "# CONFIG_" */
|
||||
if (strncmp (cfgline, "CONFIG_", 7) &&
|
||||
strncmp (cfgline, "# CONFIG_", 9))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* use strchr() to check for "-quote in cfgline;
|
||||
* if not found, output the line, quoted;
|
||||
* if found, output a char at a time, with \\-quote
|
||||
* preceding double-quote chars
|
||||
*/
|
||||
if (!strchr (cfgline, '"')) {
|
||||
fprintf (sourcefile, " \"%s\\n\" ,\n", cfgline);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* go to char-at-a-time mode for this config and
|
||||
* precede any double-quote with a backslash */
|
||||
fprintf (sourcefile, " \""); /* lead-in */
|
||||
for (ch = cfgline; *ch; ch++) {
|
||||
if (*ch == '"')
|
||||
fputc ('\\', sourcefile);
|
||||
fputc (*ch, sourcefile);
|
||||
}
|
||||
fprintf (sourcefile, "\\n\" ,\n");
|
||||
}
|
||||
}
|
||||
|
||||
int make_configs (FILE *configfile, FILE *sourcefile)
|
||||
{
|
||||
make_intro (sourcefile);
|
||||
make_lines (configfile, sourcefile);
|
||||
make_ending (sourcefile);
|
||||
}
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
char *progname = argv[0];
|
||||
char *configname, *sourcename;
|
||||
FILE *configfile, *sourcefile;
|
||||
|
||||
if (argc != 3)
|
||||
usage (progname);
|
||||
|
||||
configname = argv[1];
|
||||
sourcename = argv[2];
|
||||
|
||||
configfile = fopen (configname, "r");
|
||||
if (!configfile) {
|
||||
fprintf (stderr, "%s: cannot open '%s'\n",
|
||||
progname, configname);
|
||||
exit (2);
|
||||
}
|
||||
sourcefile = fopen (sourcename, "w");
|
||||
if (!sourcefile) {
|
||||
fprintf (stderr, "%s: cannot open '%s'\n",
|
||||
progname, sourcename);
|
||||
exit (2);
|
||||
}
|
||||
|
||||
make_configs (configfile, sourcefile);
|
||||
|
||||
if (fclose (sourcefile)) {
|
||||
fprintf (stderr, "%s: error %d closing '%s'\n",
|
||||
progname, errno, sourcename);
|
||||
exit (3);
|
||||
}
|
||||
if (fclose (configfile)) {
|
||||
fprintf (stderr, "%s: error %d closing '%s'\n",
|
||||
progname, errno, configname);
|
||||
exit (3);
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
/* end mkconfigs.c */
|
||||
Executable
BIN
Binary file not shown.
+650
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,77 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Output a simple RPM spec file that uses no fancy features requring
|
||||
# RPM v4. This is intended to work with any RPM distro.
|
||||
#
|
||||
# The only gothic bit here is redefining install_post to avoid
|
||||
# stripping the symbols from files in the kernel which we want
|
||||
#
|
||||
# Patched for non-x86 by Opencon (L) 2002 <opencon@rio.skydome.net>
|
||||
#
|
||||
# That's the voodoo to see if it's a x86.
|
||||
ISX86=`arch | grep -ie i.86`
|
||||
if [ ! -z $ISX86 ]; then
|
||||
PC=1
|
||||
else
|
||||
PC=0
|
||||
fi
|
||||
# starting to output the spec
|
||||
if [ "`grep CONFIG_DRM=y .config | cut -f2 -d\=`" = "y" ]; then
|
||||
PROVIDES=kernel-drm
|
||||
fi
|
||||
|
||||
PROVIDES="$PROVIDES kernel-$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION"
|
||||
|
||||
echo "Name: kernel"
|
||||
echo "Summary: The Linux Kernel"
|
||||
echo "Version: "$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION | sed -e "s/-//g"
|
||||
# we need to determine the NEXT version number so that uname and
|
||||
# rpm -q will agree
|
||||
echo "Release: `. scripts/mkversion`"
|
||||
echo "License: GPL"
|
||||
echo "Group: System Environment/Kernel"
|
||||
echo "Vendor: The Linux Community"
|
||||
echo "URL: http://www.kernel.org"
|
||||
echo -n "Source: kernel-$VERSION.$PATCHLEVEL.$SUBLEVEL"
|
||||
echo "$EXTRAVERSION.tar.gz" | sed -e "s/-//g"
|
||||
echo "BuildRoot: /var/tmp/%{name}-%{PACKAGE_VERSION}-root"
|
||||
echo "Provides: $PROVIDES"
|
||||
echo "%define __spec_install_post /usr/lib/rpm/brp-compress || :"
|
||||
echo ""
|
||||
echo "%description"
|
||||
echo "The Linux Kernel, the operating system core itself"
|
||||
echo ""
|
||||
echo "%prep"
|
||||
echo "%setup -q"
|
||||
echo ""
|
||||
echo "%build"
|
||||
# This is the first 'disagreement' between x86 and other archs.
|
||||
if [ $PC = 1 ]; then
|
||||
echo "make oldconfig dep clean bzImage modules"
|
||||
else
|
||||
echo "make oldconfig dep clean vmlinux modules"
|
||||
fi
|
||||
# Back on track
|
||||
echo ""
|
||||
echo "%install"
|
||||
echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules'
|
||||
echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make modules_install'
|
||||
# And that's the second
|
||||
if [ $PC = 1 ]; then
|
||||
echo 'cp arch/i386/boot/bzImage $RPM_BUILD_ROOT'"/boot/vmlinuz-$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION"
|
||||
else
|
||||
echo 'cp vmlinux $RPM_BUILD_ROOT'"/boot/vmlinux-$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION"
|
||||
fi
|
||||
# Back on track, again
|
||||
echo 'cp System.map $RPM_BUILD_ROOT'"/boot/System.map-$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION"
|
||||
echo 'cp .config $RPM_BUILD_ROOT'"/boot/config-$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION"
|
||||
echo ""
|
||||
echo "%clean"
|
||||
echo '#echo -rf $RPM_BUILD_ROOT'
|
||||
echo ""
|
||||
echo "%files"
|
||||
echo '%defattr (-, root, root)'
|
||||
echo "%dir /lib/modules"
|
||||
echo "/lib/modules/$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION"
|
||||
echo "/boot/*"
|
||||
echo ""
|
||||
@@ -0,0 +1,6 @@
|
||||
if [ ! -f .version ]
|
||||
then
|
||||
echo 1
|
||||
else
|
||||
expr 0`cat .version` + 1
|
||||
fi
|
||||
Executable
+202
@@ -0,0 +1,202 @@
|
||||
#! /bin/sh
|
||||
# Script to apply kernel patches.
|
||||
# usage: patch-kernel [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
|
||||
# The source directory defaults to /usr/src/linux, and the patch
|
||||
# directory defaults to the current directory.
|
||||
# e.g.
|
||||
# scripts/patch-kernel . ..
|
||||
# Update the kernel tree in the current directory using patches in the
|
||||
# directory above to the latest Linus kernel
|
||||
# scripts/patch-kernel . .. -ac
|
||||
# Get the latest Linux kernel and patch it with the latest ac patch
|
||||
# scripts/patch-kernel . .. 2.4.9
|
||||
# Gets standard kernel 2.4.9
|
||||
# scripts/patch-kernel . .. 2.4.9 -ac
|
||||
# Gets 2.4.9 with latest ac patches
|
||||
# scripts/patch-kernel . .. 2.4.9 -ac11
|
||||
# Gets 2.4.9 with ac patch ac11
|
||||
# Note: It uses the patches relative to the Linus kernels, not the
|
||||
# ac to ac relative patches
|
||||
#
|
||||
# It determines the current kernel version from the top-level Makefile.
|
||||
# It then looks for patches for the next sublevel in the patch directory.
|
||||
# This is applied using "patch -p1 -s" from within the kernel directory.
|
||||
# A check is then made for "*.rej" files to see if the patch was
|
||||
# successful. If it is, then all of the "*.orig" files are removed.
|
||||
#
|
||||
# Nick Holloway <Nick.Holloway@alfie.demon.co.uk>, 2nd January 1995.
|
||||
#
|
||||
# Added support for handling multiple types of compression. What includes
|
||||
# gzip, bzip, bzip2, zip, compress, and plaintext.
|
||||
#
|
||||
# Adam Sulmicki <adam@cfar.umd.edu>, 1st January 1997.
|
||||
#
|
||||
# Added ability to stop at a given version number
|
||||
# Put the full version number (i.e. 2.3.31) as the last parameter
|
||||
# Dave Gilbert <linux@treblig.org>, 11th December 1999.
|
||||
|
||||
# Fixed previous patch so that if we are already at the correct version
|
||||
# not to patch up.
|
||||
#
|
||||
# Added -ac option, use -ac or -ac9 (say) to stop at a particular version
|
||||
# Dave Gilbert <linux@treblig.org>, 29th September 2001.
|
||||
|
||||
# Set directories from arguments, or use defaults.
|
||||
sourcedir=${1-/usr/src/linux}
|
||||
patchdir=${2-.}
|
||||
stopvers=${3-imnotaversion}
|
||||
|
||||
if [ "$1" = -h -o "$1" = --help -o ! -r "$sourcedir/Makefile" ]; then
|
||||
cat << USAGE
|
||||
usage: patch-kernel [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
|
||||
The source directory defaults to /usr/src/linux, and
|
||||
the patch directory defaults to the current directory.
|
||||
USAGE
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# See if we have any -ac options
|
||||
for PARM in $*
|
||||
do
|
||||
case $PARM in
|
||||
-ac*)
|
||||
gotac=$PARM;
|
||||
|
||||
esac;
|
||||
done
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Find a file, first parameter is basename of file
|
||||
# it tries many compression mechanisms and sets variables to say how to get it
|
||||
findFile () {
|
||||
filebase=$1;
|
||||
|
||||
if [ -r ${filebase}.gz ]; then
|
||||
ext=".gz"
|
||||
name="gzip"
|
||||
uncomp="gunzip -dc"
|
||||
elif [ -r ${filebase}.bz ]; then
|
||||
ext=".bz"
|
||||
name="bzip"
|
||||
uncomp="bunzip -dc"
|
||||
elif [ -r ${filebase}.bz2 ]; then
|
||||
ext=".bz2"
|
||||
name="bzip2"
|
||||
uncomp="bunzip2 -dc"
|
||||
elif [ -r ${filebase}.zip ]; then
|
||||
ext=".zip"
|
||||
name="zip"
|
||||
uncomp="unzip -d"
|
||||
elif [ -r ${filebase}.Z ]; then
|
||||
ext=".Z"
|
||||
name="uncompress"
|
||||
uncomp="uncompress -c"
|
||||
elif [ -r ${filebase} ]; then
|
||||
ext=""
|
||||
name="plaintext"
|
||||
uncomp="cat"
|
||||
else
|
||||
return 1;
|
||||
fi
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Apply a patch and check it goes in cleanly
|
||||
# First param is patch name (e.g. patch-2.4.9-ac5) - without path or extension
|
||||
|
||||
applyPatch () {
|
||||
echo -n "Applying $1 (${name})... "
|
||||
if $uncomp ${patchdir}/$1${ext} | patch -p1 -s -N -E -d $sourcedir
|
||||
then
|
||||
echo "done."
|
||||
else
|
||||
echo "failed. Clean up yourself."
|
||||
return 1;
|
||||
fi
|
||||
if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ]
|
||||
then
|
||||
echo "Aborting. Reject files found."
|
||||
return 1;
|
||||
fi
|
||||
# Remove backup files
|
||||
find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
# set current VERSION, PATCHLEVEL, SUBLEVEL, EXTERVERSION
|
||||
eval `sed -n -e 's/^\([A-Z]*\) = \([0-9]*\)$/\1=\2/p' -e 's/^\([A-Z]*\) = \(-[-a-z0-9]*\)$/\1=\2/p' $sourcedir/Makefile`
|
||||
if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ]
|
||||
then
|
||||
echo "unable to determine current kernel version" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION}"
|
||||
|
||||
if [ x$EXTRAVERSION != "x" ]
|
||||
then
|
||||
echo "I'm sorry but patch-kernel can't work with a kernel source tree that is not a base version"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
while :
|
||||
do
|
||||
CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
|
||||
if [ $stopvers = $CURRENTFULLVERSION ]
|
||||
then
|
||||
echo "Stoping at $CURRENTFULLVERSION base as requested."
|
||||
break
|
||||
fi
|
||||
|
||||
SUBLEVEL=`expr $SUBLEVEL + 1`
|
||||
FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
|
||||
|
||||
patch=patch-$FULLVERSION
|
||||
|
||||
# See if the file exists and find extension
|
||||
findFile $patchdir/${patch} || break
|
||||
|
||||
# Apply the patch and check all is OK
|
||||
applyPatch $patch || break
|
||||
done
|
||||
|
||||
if [ x$gotac != x ]; then
|
||||
# Out great user wants the -ac patches
|
||||
# They could have done -ac (get latest) or -acxx where xx=version they want
|
||||
if [ $gotac == "-ac" ]
|
||||
then
|
||||
# They want the latest version
|
||||
HIGHESTPATCH=0
|
||||
for PATCHNAMES in $patchdir/patch-${CURRENTFULLVERSION}-ac*\.*
|
||||
do
|
||||
ACVALUE=`echo $PATCHNAMES | sed -e 's/^.*patch-[0-9.]*-ac\([0-9]*\).*/\1/'`
|
||||
# Check it is actually a recognised patch type
|
||||
findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${ACVALUE} || break
|
||||
|
||||
if [ $ACVALUE -gt $HIGHESTPATCH ]
|
||||
then
|
||||
HIGHESTPATCH=$ACVALUE
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $HIGHESTPATCH -ne 0 ]
|
||||
then
|
||||
findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} || break
|
||||
applyPatch patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH}
|
||||
else
|
||||
echo "No ac patches found"
|
||||
fi
|
||||
else
|
||||
# They want an exact version
|
||||
findFile $patchdir/patch-${CURRENTFULLVERSION}${gotac} || {
|
||||
echo "Sorry, I couldn't find the $gotac patch for $CURRENTFULLVERSION. Hohum."
|
||||
exit 1
|
||||
}
|
||||
applyPatch patch-${CURRENTFULLVERSION}${gotac}
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
UP=
|
||||
DN=${PWD:?}
|
||||
TP=${TOPDIR:?}
|
||||
|
||||
while [ ! $TP/$UP/. -ef $DN ] ;do
|
||||
UP=`basename $PWD`/$UP
|
||||
cd ..
|
||||
if [ "$PWD" = "/" ]; then echo "Lost"; exit 1; fi
|
||||
done
|
||||
|
||||
echo $UP
|
||||
exit 0
|
||||
@@ -0,0 +1,226 @@
|
||||
/*
|
||||
* split-include.c
|
||||
*
|
||||
* Copyright abandoned, Michael Chastain, <mailto:mec@shout.net>.
|
||||
* This is a C version of syncdep.pl by Werner Almesberger.
|
||||
*
|
||||
* This program takes autoconf.h as input and outputs a directory full
|
||||
* of one-line include files, merging onto the old values.
|
||||
*
|
||||
* Think of the configuration options as key-value pairs. Then there
|
||||
* are five cases:
|
||||
*
|
||||
* key old value new value action
|
||||
*
|
||||
* KEY-1 VALUE-1 VALUE-1 leave file alone
|
||||
* KEY-2 VALUE-2A VALUE-2B write VALUE-2B into file
|
||||
* KEY-3 - VALUE-3 write VALUE-3 into file
|
||||
* KEY-4 VALUE-4 - write an empty file
|
||||
* KEY-5 (empty) - leave old empty file alone
|
||||
*/
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define ERROR_EXIT(strExit) \
|
||||
{ \
|
||||
const int errnoSave = errno; \
|
||||
fprintf(stderr, "%s: ", str_my_name); \
|
||||
errno = errnoSave; \
|
||||
perror((strExit)); \
|
||||
exit(1); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(int argc, const char * argv [])
|
||||
{
|
||||
const char * str_my_name;
|
||||
const char * str_file_autoconf;
|
||||
const char * str_dir_config;
|
||||
|
||||
FILE * fp_config;
|
||||
FILE * fp_target;
|
||||
FILE * fp_find;
|
||||
|
||||
int buffer_size;
|
||||
|
||||
char * line;
|
||||
char * old_line;
|
||||
char * list_target;
|
||||
char * ptarget;
|
||||
|
||||
struct stat stat_buf;
|
||||
|
||||
/* Check arg count. */
|
||||
if (argc != 3)
|
||||
{
|
||||
fprintf(stderr, "%s: wrong number of arguments.\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
str_my_name = argv[0];
|
||||
str_file_autoconf = argv[1];
|
||||
str_dir_config = argv[2];
|
||||
|
||||
/* Find a buffer size. */
|
||||
if (stat(str_file_autoconf, &stat_buf) != 0)
|
||||
ERROR_EXIT(str_file_autoconf);
|
||||
buffer_size = 2 * stat_buf.st_size + 4096;
|
||||
|
||||
/* Allocate buffers. */
|
||||
if ( (line = malloc(buffer_size)) == NULL
|
||||
|| (old_line = malloc(buffer_size)) == NULL
|
||||
|| (list_target = malloc(buffer_size)) == NULL )
|
||||
ERROR_EXIT(str_file_autoconf);
|
||||
|
||||
/* Open autoconfig file. */
|
||||
if ((fp_config = fopen(str_file_autoconf, "r")) == NULL)
|
||||
ERROR_EXIT(str_file_autoconf);
|
||||
|
||||
/* Make output directory if needed. */
|
||||
if (stat(str_dir_config, &stat_buf) != 0)
|
||||
{
|
||||
if (mkdir(str_dir_config, 0755) != 0)
|
||||
ERROR_EXIT(str_dir_config);
|
||||
}
|
||||
|
||||
/* Change to output directory. */
|
||||
if (chdir(str_dir_config) != 0)
|
||||
ERROR_EXIT(str_dir_config);
|
||||
|
||||
/* Put initial separator into target list. */
|
||||
ptarget = list_target;
|
||||
*ptarget++ = '\n';
|
||||
|
||||
/* Read config lines. */
|
||||
while (fgets(line, buffer_size, fp_config))
|
||||
{
|
||||
const char * str_config;
|
||||
int is_same;
|
||||
int itarget;
|
||||
|
||||
if (line[0] != '#')
|
||||
continue;
|
||||
if ((str_config = strstr(line, "CONFIG_")) == NULL)
|
||||
continue;
|
||||
|
||||
/* Make the output file name. */
|
||||
str_config += sizeof("CONFIG_") - 1;
|
||||
for (itarget = 0; !isspace((int)str_config[itarget]); itarget++)
|
||||
{
|
||||
char c = str_config[itarget];
|
||||
if (isupper((int)c)) c = tolower((int)c);
|
||||
if (c == '_') c = '/';
|
||||
ptarget[itarget] = c;
|
||||
}
|
||||
ptarget[itarget++] = '.';
|
||||
ptarget[itarget++] = 'h';
|
||||
ptarget[itarget++] = '\0';
|
||||
|
||||
/* Check for existing file. */
|
||||
is_same = 0;
|
||||
if ((fp_target = fopen(ptarget, "r")) != NULL)
|
||||
{
|
||||
fgets(old_line, buffer_size, fp_target);
|
||||
if (fclose(fp_target) != 0)
|
||||
ERROR_EXIT(ptarget);
|
||||
if (!strcmp(line, old_line))
|
||||
is_same = 1;
|
||||
}
|
||||
|
||||
if (!is_same)
|
||||
{
|
||||
/* Auto-create directories. */
|
||||
int islash;
|
||||
for (islash = 0; islash < itarget; islash++)
|
||||
{
|
||||
if (ptarget[islash] == '/')
|
||||
{
|
||||
ptarget[islash] = '\0';
|
||||
if (stat(ptarget, &stat_buf) != 0
|
||||
&& mkdir(ptarget, 0755) != 0)
|
||||
ERROR_EXIT( ptarget );
|
||||
ptarget[islash] = '/';
|
||||
}
|
||||
}
|
||||
|
||||
/* Write the file. */
|
||||
if ((fp_target = fopen(ptarget, "w" )) == NULL)
|
||||
ERROR_EXIT(ptarget);
|
||||
fputs(line, fp_target);
|
||||
if (ferror(fp_target) || fclose(fp_target) != 0)
|
||||
ERROR_EXIT(ptarget);
|
||||
}
|
||||
|
||||
/* Update target list */
|
||||
ptarget += itarget;
|
||||
*(ptarget-1) = '\n';
|
||||
}
|
||||
|
||||
/*
|
||||
* Close autoconfig file.
|
||||
* Terminate the target list.
|
||||
*/
|
||||
if (fclose(fp_config) != 0)
|
||||
ERROR_EXIT(str_file_autoconf);
|
||||
*ptarget = '\0';
|
||||
|
||||
/*
|
||||
* Fix up existing files which have no new value.
|
||||
* This is Case 4 and Case 5.
|
||||
*
|
||||
* I re-read the tree and filter it against list_target.
|
||||
* This is crude. But it avoids data copies. Also, list_target
|
||||
* is compact and contiguous, so it easily fits into cache.
|
||||
*
|
||||
* Notice that list_target contains strings separated by \n,
|
||||
* with a \n before the first string and after the last.
|
||||
* fgets gives the incoming names a terminating \n.
|
||||
* So by having an initial \n, strstr will find exact matches.
|
||||
*/
|
||||
|
||||
fp_find = popen("find * -type f -name \"*.h\" -print", "r");
|
||||
if (fp_find == 0)
|
||||
ERROR_EXIT( "find" );
|
||||
|
||||
line[0] = '\n';
|
||||
while (fgets(line+1, buffer_size, fp_find))
|
||||
{
|
||||
if (strstr(list_target, line) == NULL)
|
||||
{
|
||||
/*
|
||||
* This is an old file with no CONFIG_* flag in autoconf.h.
|
||||
*/
|
||||
|
||||
/* First strip the \n. */
|
||||
line[strlen(line)-1] = '\0';
|
||||
|
||||
/* Grab size. */
|
||||
if (stat(line+1, &stat_buf) != 0)
|
||||
ERROR_EXIT(line);
|
||||
|
||||
/* If file is not empty, make it empty and give it a fresh date. */
|
||||
if (stat_buf.st_size != 0)
|
||||
{
|
||||
if ((fp_target = fopen(line+1, "w")) == NULL)
|
||||
ERROR_EXIT(line);
|
||||
if (fclose(fp_target) != 0)
|
||||
ERROR_EXIT(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pclose(fp_find) != 0)
|
||||
ERROR_EXIT("find");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# split-man: create man pages from kernel-doc -man output
|
||||
#
|
||||
# Author: Tim Waugh <twaugh@redhat.com>
|
||||
# Modified by: Christoph Hellwig <hch@infradead.org>
|
||||
#
|
||||
|
||||
use strict;
|
||||
|
||||
die "$0: where do I put the results?\n" unless ($#ARGV >= 0);
|
||||
die "$0: can't create $ARGV[0]: $!\n" unless mkdir $ARGV[0], 0777;
|
||||
|
||||
my $state = 0;
|
||||
|
||||
while (<STDIN>) {
|
||||
s/&(\w+)/\\fB\1\\fP/g; # fix smgl uglinesses
|
||||
if (/^\.TH \"[^\"]*\" 9 \"([^\"]*)\"/) {
|
||||
close OUT unless ($state++ == 0);
|
||||
my $fn = "$ARGV[0]/$1.9";
|
||||
if (open OUT, ">$fn") {
|
||||
print STDERR "creating $fn\n";
|
||||
} else {
|
||||
die "can't open $fn: $!\n";
|
||||
}
|
||||
|
||||
print OUT $_;
|
||||
} elsif ($state != 0) {
|
||||
print OUT $_;
|
||||
}
|
||||
}
|
||||
|
||||
close OUT;
|
||||
@@ -0,0 +1,89 @@
|
||||
# FILE: tail.tk
|
||||
# This file is boilerplate TCL/TK function definitions for 'make xconfig'.
|
||||
#
|
||||
# CHANGES
|
||||
# =======
|
||||
#
|
||||
# 8 January 1998, Michael Elizabeth Chastain, <mec@shout.net>
|
||||
# Arrange buttons in three columns for better screen fitting.
|
||||
#
|
||||
|
||||
#
|
||||
# Read the user's settings from .config. These will override whatever is
|
||||
# in config.in. Don't do this if the user specified a -D to force
|
||||
# the defaults.
|
||||
#
|
||||
if { [file readable .config] == 1} then {
|
||||
if { $argc > 0 } then {
|
||||
if { [lindex $argv 0] != "-D" } then {
|
||||
read_config .config
|
||||
}
|
||||
else
|
||||
{
|
||||
read_config $defaults
|
||||
}
|
||||
} else {
|
||||
read_config .config
|
||||
}
|
||||
} else {
|
||||
read_config $defaults
|
||||
}
|
||||
|
||||
update_define 1 $total_menus 0
|
||||
update_mainmenu
|
||||
|
||||
button .f0.right.save -anchor w -text "Save and Exit" -underline 0\
|
||||
-command { catch {exec cp -f .config .config.old}; \
|
||||
writeconfig .config include/linux/autoconf.h; wrapup .wrap }
|
||||
|
||||
button .f0.right.quit -anchor w -text "Quit Without Saving" -underline 0\
|
||||
-command { maybe_exit .maybe }
|
||||
|
||||
button .f0.right.load -anchor w -text "Load Configuration from File" \
|
||||
-command { load_configfile .load "Load Configuration from file" read_config_file
|
||||
}
|
||||
|
||||
button .f0.right.store -anchor w -text "Store Configuration to File" \
|
||||
-command { load_configfile .load "Store Configuration to file" write_config_file }
|
||||
|
||||
#
|
||||
# Now pack everything.
|
||||
#
|
||||
|
||||
pack .f0.right.store .f0.right.load .f0.right.quit .f0.right.save \
|
||||
-padx 0 -pady 0 -side bottom -fill x
|
||||
pack .f0.left .f0.middle .f0.right -side left -padx 5 -pady 0 -fill y
|
||||
pack .f0 -padx 5 -pady 5
|
||||
|
||||
update idletasks
|
||||
set winy [expr 10 + [winfo reqheight .f0]]
|
||||
set scry [lindex [wm maxsize .] 1]
|
||||
set winx [expr 10 + [winfo reqwidth .f0]]
|
||||
set scrx [lindex [wm maxsize .] 0]
|
||||
if {$winx < $scrx} then {set maxx -1} else {set maxx $winx}
|
||||
if {$winy < $scry} then {set maxy -1} else {set maxy $winy}
|
||||
.f0 configure -width $winx -height $winy
|
||||
wm maxsize . $maxx $maxy
|
||||
|
||||
#
|
||||
# If we cannot write our config files, disable the write button.
|
||||
#
|
||||
if { [file exists .config] == 1 } then {
|
||||
if { [file writable .config] == 0 } then {
|
||||
.f0.right.save configure -state disabled
|
||||
}
|
||||
} else {
|
||||
if { [file writable .] == 0 } then {
|
||||
.f0.right.save configure -state disabled
|
||||
}
|
||||
}
|
||||
|
||||
if { [file exists include/linux/autoconf.h] == 1 } then {
|
||||
if { [file writable include/linux/autoconf.h] == 0 } then {
|
||||
.f0.right.save configure -state disabled
|
||||
}
|
||||
} else {
|
||||
if { [file writable include/linux/] == 0 } then {
|
||||
.f0.right.save configure -state disabled
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
+1535
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* tkparse.h
|
||||
*/
|
||||
|
||||
/*
|
||||
* Token types (mostly statement types).
|
||||
*/
|
||||
|
||||
enum e_token
|
||||
{
|
||||
token_UNKNOWN,
|
||||
token_bool,
|
||||
token_choice_header,
|
||||
token_choice_item,
|
||||
token_comment,
|
||||
token_define_bool,
|
||||
token_define_hex,
|
||||
token_define_int,
|
||||
token_define_string,
|
||||
token_define_tristate,
|
||||
token_dep_bool,
|
||||
token_dep_mbool,
|
||||
token_dep_tristate,
|
||||
token_else,
|
||||
token_endmenu,
|
||||
token_fi,
|
||||
token_hex,
|
||||
token_if,
|
||||
token_int,
|
||||
token_mainmenu_name,
|
||||
token_mainmenu_option,
|
||||
token_source,
|
||||
token_string,
|
||||
token_then,
|
||||
token_tristate,
|
||||
token_unset,
|
||||
};
|
||||
|
||||
/*
|
||||
* Operator types for conditionals.
|
||||
*/
|
||||
|
||||
enum operator
|
||||
{
|
||||
op_eq,
|
||||
op_neq,
|
||||
op_and,
|
||||
op_and1,
|
||||
op_or,
|
||||
op_bang,
|
||||
op_lparen,
|
||||
op_rparen,
|
||||
op_constant,
|
||||
op_variable,
|
||||
op_true,
|
||||
op_false,
|
||||
op_nuked
|
||||
};
|
||||
|
||||
/*
|
||||
* Conditions come in linked lists.
|
||||
* Some operators take strings:
|
||||
*
|
||||
* op_constant "foo"
|
||||
* op_variable "$ARCH", "$CONFIG_PMAC", "$CONFIG_EXPERIMENTAL"
|
||||
*
|
||||
* Most "$..." constructs refer to a variable which is defined somewhere
|
||||
* in the script. Note that it is legal to test variables which are never
|
||||
* defined, such as variables that are meaningful only on other architectures.
|
||||
*/
|
||||
|
||||
struct condition
|
||||
{
|
||||
struct condition * next;
|
||||
enum operator op;
|
||||
const char * str; /* op_constant */
|
||||
int nameindex; /* op_variable */
|
||||
};
|
||||
|
||||
/*
|
||||
* Dependency list for dep_bool, dep_mbool, dep_tristate
|
||||
*/
|
||||
|
||||
struct dependency
|
||||
{
|
||||
char * name;
|
||||
struct dependency * next;
|
||||
};
|
||||
|
||||
/*
|
||||
* A statement from a config.in file
|
||||
*/
|
||||
|
||||
struct kconfig
|
||||
{
|
||||
struct kconfig * next;
|
||||
enum e_token token;
|
||||
int nameindex;
|
||||
char * label;
|
||||
char * value;
|
||||
struct condition * cond;
|
||||
struct dependency * depend; /* token_dep_tristate */
|
||||
struct kconfig * cfg_parent; /* token_choice_item */
|
||||
|
||||
/* used only in tkgen.c */
|
||||
int menu_number;
|
||||
int menu_line;
|
||||
struct kconfig * menu_next;
|
||||
};
|
||||
|
||||
struct variable
|
||||
{
|
||||
char * name;
|
||||
char defined;
|
||||
char global_written;
|
||||
};
|
||||
|
||||
extern struct variable *vartable;
|
||||
extern int max_varnum;
|
||||
|
||||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
|
||||
extern void fix_conditionals ( struct kconfig * scfg ); /* tkcond.c */
|
||||
extern void dump_tk_script ( struct kconfig * scfg ); /* tkgen.c */
|
||||
extern int get_varnum ( char * name ); /* tkparse.c */
|
||||
@@ -0,0 +1,72 @@
|
||||
#!/bin/sh
|
||||
# Before running this script please ensure that your PATH is
|
||||
# typical as you use for compilation/istallation. I use
|
||||
# /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may
|
||||
# differ on your system.
|
||||
#
|
||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH
|
||||
echo 'If some fields are empty or look unusual you may have an old version.'
|
||||
echo 'Compare to the current minimal requirements in Documentation/Changes.'
|
||||
echo ' '
|
||||
|
||||
uname -a
|
||||
echo ' '
|
||||
|
||||
echo "Gnu C " `gcc --version`
|
||||
|
||||
make --version 2>&1 | awk -F, '{print $1}' | awk \
|
||||
'/GNU Make/{print "Gnu make ",$NF}'
|
||||
|
||||
ld -v 2>&1 | awk -F\) '{print $1}' | awk \
|
||||
'/BFD/{print "binutils ",$NF}'
|
||||
|
||||
fdformat --version | awk -F\- '{print "util-linux ", $NF}'
|
||||
|
||||
mount --version | awk -F\- '{print "mount ", $NF}'
|
||||
|
||||
insmod -V 2>&1 | awk 'NR==1 {print "modutils ",$NF}'
|
||||
|
||||
tune2fs 2>&1 | grep "^tune2fs" | sed 's/,//' | awk \
|
||||
'NR==1 {print "e2fsprogs ", $2}'
|
||||
|
||||
reiserfsck 2>&1 | grep reiserfsprogs | awk \
|
||||
'NR==1{print "reiserfsprogs ", $NF}'
|
||||
|
||||
cardmgr -V 2>&1| grep version | awk \
|
||||
'NR==1{print "pcmcia-cs ", $3}'
|
||||
|
||||
pppd --version 2>&1| grep version | awk \
|
||||
'NR==1{print "PPP ", $3}'
|
||||
|
||||
isdnctrl 2>&1 | grep version | awk \
|
||||
'NR==1{print "isdn4k-utils ", $NF}'
|
||||
|
||||
ls -l `ldd /bin/sh | awk '/libc/{print $3}'` | sed \
|
||||
-e 's/\.so$//' | awk -F'[.-]' '{print "Linux C Library " \
|
||||
$(NF-2)"."$(NF-1)"."$NF}'
|
||||
|
||||
ldd -v > /dev/null 2>&1 && ldd -v || ldd --version |head -1 | awk \
|
||||
'NR==1{print "Dynamic linker (ldd) ", $NF}'
|
||||
|
||||
ls -l /usr/lib/lib{g,stdc}++.so 2>/dev/null | awk -F. \
|
||||
'{print "Linux C++ Library " $4"."$5"."$6}'
|
||||
|
||||
ps --version 2>&1 | awk 'NR==1{print "Procps ", $NF}'
|
||||
|
||||
ifconfig --version 2>&1 | grep tools | awk \
|
||||
'NR==1{print "Net-tools ", $NF}'
|
||||
|
||||
# Kbd needs 'loadkeys -h',
|
||||
loadkeys -h 2>&1 | awk \
|
||||
'(NR==1 && ($3 !~ /option/)) {print "Kbd ", $3}'
|
||||
|
||||
# while console-tools needs 'loadkeys -V'.
|
||||
loadkeys -V 2>&1 | awk \
|
||||
'(NR==1 && ($2 ~ /console-tools/)) {print "Console-tools ", $3}'
|
||||
|
||||
expr --v 2>&1 | awk 'NR==1{print "Sh-utils ", $NF}'
|
||||
|
||||
if [ -e /proc/modules ]; then
|
||||
X=`cat /proc/modules | sed -e "s/ .*$//"`
|
||||
echo "Modules Loaded "$X
|
||||
fi
|
||||
Reference in New Issue
Block a user