diff options
-rw-r--r-- | com32/lib/Makefile | 4 | ||||
-rw-r--r-- | com32/lib/exit.c | 42 | ||||
-rw-r--r-- | com32/libutil/Makefile | 6 | ||||
-rw-r--r-- | com32/libutil/ansiraw.c | 4 | ||||
-rw-r--r-- | com32/libutil/get_key.c | 145 | ||||
-rw-r--r-- | com32/libutil/include/consoles.h | 6 | ||||
-rw-r--r-- | com32/libutil/include/getkey.h | 66 | ||||
-rw-r--r-- | com32/modules/Makefile | 2 |
8 files changed, 264 insertions, 11 deletions
diff --git a/com32/lib/Makefile b/com32/lib/Makefile index 9896befd..8b622c8a 100644 --- a/com32/lib/Makefile +++ b/com32/lib/Makefile @@ -5,7 +5,7 @@ LIBOBJS = abort.o atexit.o atoi.o atol.o atoll.o calloc.o creat.o \ ctypes.o errno.o fgetc.o fgets.o fopen.o fprintf.o fputc.o \ fputs.o fread2.o fread.o free.o fwrite2.o fwrite.o getopt.o \ lrand48.o malloc.o memccpy.o memchr.o memcmp.o memcpy.o \ - memmem.o memmove.o memset.o memswap.o onexit.o perror.o \ + memmem.o memmove.o memset.o memswap.o exit.o onexit.o perror.o \ printf.o puts.o qsort.o realloc.o seed48.o snprintf.o \ sprintf.o srand48.o sscanf.o stack.o strcasecmp.o strcat.o \ strchr.o strcmp.o strcpy.o strdup.o strerror.o strlen.o \ @@ -20,7 +20,7 @@ LIBOBJS = abort.o atexit.o atoi.o atol.o atoll.o calloc.o creat.o \ libgcc/__moddi3.o sys/entry.o sys/exit.o sys/fileinfo.o \ sys/opendev.o sys/read.o sys/write.o sys/close.o sys/open.o \ sys/fileread.o sys/fileclose.o sys/isatty.o sys/openconsole.o \ - sys/line_input.o \ + sys/line_input.o \ sys/stdcon_read.o sys/stdcon_write.o \ sys/rawcon_read.o sys/rawcon_write.o \ sys/err_read.o sys/err_write.o \ diff --git a/com32/lib/exit.c b/com32/lib/exit.c index e69de29b..dcbbf373 100644 --- a/com32/lib/exit.c +++ b/com32/lib/exit.c @@ -0,0 +1,42 @@ +#ident "$Id$" +/* ----------------------------------------------------------------------- * + * + * Copyright 2004 H. Peter Anvin - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- */ + +/* + * exit.c + * + * The regular exit + */ + +#include <stdlib.h> + +extern __noreturn (*__exit_handler)(int); + +__noreturn exit(int rv) +{ + __exit_handler(rv); +} diff --git a/com32/libutil/Makefile b/com32/libutil/Makefile index 397f4d4d..d395a3fd 100644 --- a/com32/libutil/Makefile +++ b/com32/libutil/Makefile @@ -25,14 +25,14 @@ LD = ld -m elf_i386 AR = ar NASM = nasm RANLIB = ranlib -CFLAGS = -D__COM32__ -W -Wall -march=i386 -Os -fomit-frame-pointer -I../include +CFLAGS = -D__COM32__ -W -Wall -march=i386 -Os -fomit-frame-pointer -I./include -I../include SFLAGS = -D__COM32__ -march=i386 LDFLAGS = -T ../lib/com32.ld -LNXCFLAGS = -W -Wall -march=i386 -Os -g +LNXCFLAGS = -I./include -W -Wall -march=i386 -Os -g LNXSFLAGS = -march=i386 LNXLDFLAGS = -g OBJCOPY = objcopy -LIBOBJS = ansiline.o ansiraw.o +LIBOBJS = ansiline.o ansiraw.o get_key.o LNXLIBOBJS = $(patsubst %.o,%.lo,$(LIBOBJS)) .SUFFIXES: .lss .c .lo .o .elf .c32 .lnx diff --git a/com32/libutil/ansiraw.c b/com32/libutil/ansiraw.c index efb36243..03c57522 100644 --- a/com32/libutil/ansiraw.c +++ b/com32/libutil/ansiraw.c @@ -45,7 +45,7 @@ static void __attribute__((destructor)) console_cleanup(void) fputs("\033[0m\033[20l", stdout); } -void console_ansi_std(void) +void console_ansi_raw(void) { openconsole(&dev_rawcon_r, &dev_ansiserial_w); fputs("\033[0m\033[20h", stdout); @@ -70,7 +70,7 @@ static void __attribute__((destructor)) console_cleanup(void) } -void console_ansi_std(void) +void console_ansi_raw(void) { struct termios tio; diff --git a/com32/libutil/get_key.c b/com32/libutil/get_key.c new file mode 100644 index 00000000..0239d23b --- /dev/null +++ b/com32/libutil/get_key.c @@ -0,0 +1,145 @@ +#ident "$Id$" +/* ----------------------------------------------------------------------- * + * + * Copyright 2004 H. Peter Anvin - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- */ + +/* + * get_key.c + * + * Get a single key, and try to pick apart function key codes. + * This doesn't decode anywhere close to all possiblities, but + * hopefully is enough to be useful. + */ + +#include <stdio.h> +#include <string.h> +#include <getkey.h> + +struct keycode { + int code; + int seqlen; + const unsigned char *seq; +}; + +#define MAXLEN 8 +#define CODE(x,y) { x, (sizeof y)-1, y } + +static const struct keycode keycodes[] = { + /* First, the BIOS combined codes */ + CODE(KEY_F1, "\0\x3B"), + CODE(KEY_F2, "\0\x3C"), + CODE(KEY_F3, "\0\x3D"), + CODE(KEY_F4, "\0\x3E"), + CODE(KEY_F5, "\0\x3F"), + CODE(KEY_F6, "\0\x40"), + CODE(KEY_F7, "\0\x41"), + CODE(KEY_F8, "\0\x42"), + CODE(KEY_F9, "\0\x43"), + CODE(KEY_F10, "\0\x44"), + CODE(KEY_F11, "\0\x85"), + CODE(KEY_F12, "\0\x86"), + + CODE(KEY_UP, "\0\x48"), + CODE(KEY_DOWN, "\0\x50"), + CODE(KEY_LEFT, "\0\x4B"), + CODE(KEY_RIGHT,"\0\x4D"), + CODE(KEY_PGUP, "\0\x49"), + CODE(KEY_PGDN, "\0\x51"), + CODE(KEY_HOME, "\0\x47"), + CODE(KEY_END, "\0\x4F"), + CODE(KEY_INS, "\0\x52"), + CODE(KEY_DEL, "\0\x53"), + + /* Now, VT/xterm/Linux codes */ + CODE(KEY_F1, "\033[[A"), + CODE(KEY_F1, "\033OP"), + CODE(KEY_F2, "\033[[B"), + CODE(KEY_F2, "\033OQ"), + CODE(KEY_F3, "\033[[C"), + CODE(KEY_F3, "\033OR"), + CODE(KEY_F4, "\033[[D"), + CODE(KEY_F4, "\033OS"), + CODE(KEY_F5, "\033[[E"), + CODE(KEY_F5, "\033[15~"), + CODE(KEY_F6, "\033[17~"), + CODE(KEY_F7, "\033[18~"), + CODE(KEY_F8, "\033[19~"), + CODE(KEY_F9, "\033[20~"), + CODE(KEY_F10, "\033[21~"), + CODE(KEY_F11, "\033[23~"), + CODE(KEY_F12, "\033[24~"), + + CODE(KEY_UP, "\033[A"), + CODE(KEY_DOWN, "\033[B"), + CODE(KEY_LEFT, "\033[D"), + CODE(KEY_RIGHT,"\033[C"), + CODE(KEY_PGUP, "\033[5~"), + CODE(KEY_PGDN, "\033[6~"), + CODE(KEY_HOME, "\033[1~"), + CODE(KEY_HOME, "\033[H"), + CODE(KEY_END, "\033[4~"), + CODE(KEY_END, "\033[F"), + CODE(KEY_INS, "\033[2~"), + CODE(KEY_DEL, "\033[3~"), +}; +#define NCODES ((int)(sizeof keycodes/sizeof(struct keycode))) + +int get_key(FILE *f) +{ + unsigned char buffer[MAXLEN]; + int nc, ch, i; + const struct keycode *kc; + int another; + + nc = 0; + do { + ch = getc(f); + + if ( ch == EOF ) + return EOF; + + buffer[nc++] = ch; + + another = 0; + for ( i = 0, kc = keycodes ; i < NCODES ; i++, kc++ ) { + if ( nc == kc->seqlen && !memcmp(buffer, kc->seq, nc) ) + return kc->code; + else if ( nc < kc->seqlen && !memcmp(buffer, kc->seq, nc) ) { + another = 1; + break; + } + } + } while ( another ); + + /* We got an unrecognized sequence; return the first character */ + /* We really should remember this and return subsequent characters later */ + return buffer[0]; +} + + + + + diff --git a/com32/libutil/include/consoles.h b/com32/libutil/include/consoles.h index b0f961fd..81f17bf6 100644 --- a/com32/libutil/include/consoles.h +++ b/com32/libutil/include/consoles.h @@ -32,11 +32,11 @@ * Utility functions for common console configurations */ -#ifndef _LIBUTIL_CONSOLES_H -#define _LIBUTIL_CONSOLES_H +#ifndef LIBUTIL_CONSOLES_H +#define LIBUTIL_CONSOLES_H void console_ansi_std(void); void console_ansi_raw(void); -#endif /* _LIBUTIL_CONSOLES_H */ +#endif /* LIBUTIL_CONSOLES_H */ diff --git a/com32/libutil/include/getkey.h b/com32/libutil/include/getkey.h new file mode 100644 index 00000000..9b09ab4e --- /dev/null +++ b/com32/libutil/include/getkey.h @@ -0,0 +1,66 @@ +#ident "$Id$" +/* ----------------------------------------------------------------------- * + * + * Copyright 2004 H. Peter Anvin - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- */ + +/* + * getkey.h + * + * Function to get a key symbol and parse it + */ + +#ifndef LIBUTIL_GETKEY_H +#define LIBUTIL_GETKEY_H + +#include <stdio.h> + +#define KEY_F1 0x0100 +#define KEY_F2 0x0101 +#define KEY_F3 0x0102 +#define KEY_F4 0x0103 +#define KEY_F5 0x0104 +#define KEY_F6 0x0105 +#define KEY_F7 0x0106 +#define KEY_F8 0x0107 +#define KEY_F9 0x0108 +#define KEY_F10 0x0109 +#define KEY_F11 0x010A /* NOT SUPPORTED BY MOST BIOSES!!! */ +#define KEY_F12 0x010B /* NOT SUPPORTED BY MOST BIOSES!!! */ + +#define KEY_UP 0x0120 +#define KEY_DOWN 0x0121 +#define KEY_LEFT 0x0122 +#define KEY_RIGHT 0x0123 +#define KEY_PGUP 0x0124 +#define KEY_PGDN 0x0125 +#define KEY_HOME 0x0126 +#define KEY_END 0x0127 +#define KEY_INS 0x0128 +#define KEY_DEL 0x0129 + +int get_key(FILE *); + +#endif /* LIBUTIL_GETKEY_H */ diff --git a/com32/modules/Makefile b/com32/modules/Makefile index f02a5143..7f24159d 100644 --- a/com32/modules/Makefile +++ b/com32/modules/Makefile @@ -39,7 +39,7 @@ LNXLIBS = ../libutil/libutil_lnx.a .SUFFIXES: .lss .c .o .elf .c32 .lnx -all: hello.c32 fancyhello.c32 fancyhello.lnx +all: hello.c32 fancyhello.c32 fancyhello.lnx keytest.c32 keytest.lnx .PRECIOUS: %.o %.o: %.S |