diff options
Diffstat (limited to 'com32/libutil')
-rw-r--r-- | com32/libutil/Makefile | 17 | ||||
-rw-r--r-- | com32/libutil/ansiraw.c | 19 | ||||
-rw-r--r-- | com32/libutil/get_key.c | 172 | ||||
-rw-r--r-- | com32/libutil/include/getkey.h | 3 | ||||
-rw-r--r-- | com32/libutil/quicksort.c | 59 |
5 files changed, 89 insertions, 181 deletions
diff --git a/com32/libutil/Makefile b/com32/libutil/Makefile index 83e23a0a..5aa7ceb8 100644 --- a/com32/libutil/Makefile +++ b/com32/libutil/Makefile @@ -31,19 +31,18 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk -LIBOBJS = ansiline.o ansiraw.o get_key.o keyname.o \ +LIBOBJS = ansiline.o ansiraw.o keyname.o \ sha1hash.o unbase64.o \ - md5.o crypt-md5.o sha256crypt.o sha512crypt.o base64.o + md5.o crypt-md5.o sha256crypt.o sha512crypt.o base64.o \ + quicksort.o LNXLIBOBJS = $(patsubst %.o,%.lo,$(LIBOBJS)) -all: libutil_com.a libutil_lnx.a +all: libutil.c32 libutil_lnx.a -libutil_com.a: $(LIBOBJS) - rm -f $@ - $(AR) cq $@ $(LIBOBJS) - $(RANLIB) $@ +libutil.elf: $(LIBOBJS) + $(LD) $(LDFLAGS) -soname $(patsubst %.elf,%.c32,$(@F)) -o $@ $^ libutil_lnx.a: $(LNXLIBOBJS) rm -f $@ @@ -62,6 +61,6 @@ spotless: clean install: all mkdir -m 755 -p $(INSTALLROOT)$(COM32DIR) - install -m 644 libutil_com.a libutil_lnx.a $(INSTALLROOT)$(COM32DIR) + install -m 644 libutil_lnx.a $(INSTALLROOT)$(COM32DIR) -include .*.d diff --git a/com32/libutil/ansiraw.c b/com32/libutil/ansiraw.c index 2afd48a7..b67768c5 100644 --- a/com32/libutil/ansiraw.c +++ b/com32/libutil/ansiraw.c @@ -47,6 +47,7 @@ void console_ansi_raw(void) #include <stdio.h> #include <termios.h> +#include <unistd.h> static struct termios original_termios_settings; @@ -82,4 +83,22 @@ void console_ansi_raw(void) tcsetattr(0, TCSAFLUSH, &tio); } +int raw_read(int fd, void *buf, size_t count) +{ + struct termios tio, rtio; + int rv; + + tcgetattr(fd, &tio); + + cfmakeraw(&rtio); + tcsetattr(fd, 0, &rtio); + + rv = read(fd, buf, count); + + /* Restore settings */ + tcsetattr(fd, 0, &tio); + + return rv; +} + #endif diff --git a/com32/libutil/get_key.c b/com32/libutil/get_key.c deleted file mode 100644 index f277b43b..00000000 --- a/com32/libutil/get_key.c +++ /dev/null @@ -1,172 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004-2008 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 <errno.h> -#include <unistd.h> -#include <time.h> -#include <sys/times.h> -#include <getkey.h> -#include <libutil.h> - -struct keycode { - int code; - int seqlen; - const unsigned char *seq; -}; - -#define MAXLEN 8 -#define CODE(x,y) { x, (sizeof y)-1, (const unsigned char *)(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_INSERT, "\0\x52"), - CODE(KEY_DELETE, "\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_PGUP, "\033[V"), - CODE(KEY_PGDN, "\033[6~"), - CODE(KEY_PGDN, "\033[U"), - CODE(KEY_HOME, "\033[1~"), - CODE(KEY_HOME, "\033[H"), - CODE(KEY_END, "\033[4~"), - CODE(KEY_END, "\033[F"), - CODE(KEY_END, "\033OF"), - CODE(KEY_INSERT, "\033[2~"), - CODE(KEY_INSERT, "\033[@"), - CODE(KEY_DELETE, "\033[3~"), -}; - -#define NCODES ((int)(sizeof keycodes/sizeof(struct keycode))) - -#define KEY_TIMEOUT ((CLK_TCK+9)/10) - -int get_key(FILE * f, clock_t timeout) -{ - unsigned char buffer[MAXLEN]; - int nc, i, rv; - const struct keycode *kc; - int another; - unsigned char ch; - clock_t start; - - /* We typically start in the middle of a clock tick */ - if (timeout) - timeout++; - - nc = 0; - start = times(NULL); - do { - rv = read(fileno(f), &ch, 1); - if (rv == 0 || (rv == -1 && errno == EAGAIN)) { - clock_t lateness = times(NULL) - start; - if (nc && lateness > 1 + KEY_TIMEOUT) { - if (nc == 1) - return buffer[0]; /* timeout in sequence */ - else if (timeout && lateness > timeout) - return KEY_NONE; - } else if (!nc && timeout && lateness > timeout) - return KEY_NONE; /* timeout before sequence */ - - do_idle(); - - another = 1; - continue; - } - - start = times(NULL); - - 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/getkey.h b/com32/libutil/include/getkey.h index a46de812..0733723b 100644 --- a/com32/libutil/include/getkey.h +++ b/com32/libutil/include/getkey.h @@ -77,8 +77,11 @@ #define KEY_MAX 0x012a +#define KEY_MAXLEN 8 + int get_key(FILE *, clock_t); int key_name_to_code(const char *); const char *key_code_to_name(int); +int get_key_decode(char *, int, int *); #endif /* LIBUTIL_GETKEY_H */ diff --git a/com32/libutil/quicksort.c b/com32/libutil/quicksort.c new file mode 100644 index 00000000..32ac0f01 --- /dev/null +++ b/com32/libutil/quicksort.c @@ -0,0 +1,59 @@ +/* + * sort.c - Sample ELF module providing a quick sort function + * + * Created on: Aug 11, 2008 + * Author: Stefan Bucur <stefanb@zytor.com> + */ + +#include <stdlib.h> + +static inline void swap(int *x, int *y) +{ + int tmp; + tmp = *x; + *x = *y; + *y = tmp; +} + +static inline int randint(int l, int u) +{ + return l + (rand() % (u - l + 1)); +} + +/** + * quick_sort_range - A small and efficient version of quicksort. + * @nums: The numbers to sort + * @l: The lower index in the vector (inclusive) + * @u: The upper index in the vector (inclusive) + * + * The implementation is taken from "Beautiful Code", by O'Reilly, the + * book students received from Google as a gift for their acceptance + * in the GSoC 2008 program. The code belongs to Jon Bentley, who + * wrote the third chapter of the book. Since ELF modules were written + * as part of this program, the author of the module considered + * the book had to be put to some use. :) + */ +static void quick_sort_range(int *nums, int l, int u) +{ + int i, m; + if (l >= u) + return; + + swap(&nums[l], &nums[randint(l, u)]); + + m = l; + for (i = l + 1; i <= u; i++) { + if (nums[i] < nums[l]) + swap(&nums[++m], &nums[i]); + } + + swap(&nums[l], &nums[m]); + + quick_sort_range(nums, l, m - 1); + quick_sort_range(nums, m + 1, u); +} + +void quick_sort(int *nums, int count) +{ + quick_sort_range(nums, 0, count - 1); +} |