From 01c67843bd343499406dd79c7ab8660bcc4b33c6 Mon Sep 17 00:00:00 2001 From: hpa Date: Wed, 1 Dec 2004 01:30:07 +0000 Subject: [PATCH] Utility library which can be compiled either for Linux or for COM32 --- com32/Makefile | 2 +- com32/libutil/Makefile | 86 +++++++++++++++++++++++++++++++++++++ com32/libutil/ansiline.c | 92 ++++++++++++++++++++++++++++++++++++++++ com32/libutil/ansiraw.c | 92 ++++++++++++++++++++++++++++++++++++++++ com32/libutil/include/consoles.h | 42 ++++++++++++++++++ com32/modules/Makefile | 31 +++++++++----- com32/modules/fancyhello.c | 31 +------------- 7 files changed, 336 insertions(+), 40 deletions(-) create mode 100644 com32/libutil/Makefile create mode 100644 com32/libutil/ansiline.c create mode 100644 com32/libutil/ansiraw.c create mode 100644 com32/libutil/include/consoles.h diff --git a/com32/Makefile b/com32/Makefile index 66b1001..a1fcf5d 100644 --- a/com32/Makefile +++ b/com32/Makefile @@ -1,4 +1,4 @@ -SUBDIRS = lib modules +SUBDIRS = lib libutil modules all tidy clean spotless: for d in $(SUBDIRS); do $(MAKE) -C $$d $@; done diff --git a/com32/libutil/Makefile b/com32/libutil/Makefile new file mode 100644 index 0000000..397f4d4 --- /dev/null +++ b/com32/libutil/Makefile @@ -0,0 +1,86 @@ +#ident "$Id$" +## ----------------------------------------------------------------------- +## +## Copyright 2001-2004 H. Peter Anvin - All Rights Reserved +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139, +## USA; either version 2 of the License, or (at your option) any later +## version; incorporated herein by reference. +## +## ----------------------------------------------------------------------- + +## +## samples for syslinux users +## + +gcc_ok = $(shell if gcc $(1) -c -x c /dev/null -o /dev/null 2>/dev/null; \ + then echo $(1); else echo $(2); fi) + +M32 := $(call gcc_ok,-m32,) + +CC = gcc $(M32) +LD = ld -m elf_i386 +AR = ar +NASM = nasm +RANLIB = ranlib +CFLAGS = -D__COM32__ -W -Wall -march=i386 -Os -fomit-frame-pointer -I../include +SFLAGS = -D__COM32__ -march=i386 +LDFLAGS = -T ../lib/com32.ld +LNXCFLAGS = -W -Wall -march=i386 -Os -g +LNXSFLAGS = -march=i386 +LNXLDFLAGS = -g +OBJCOPY = objcopy +LIBOBJS = ansiline.o ansiraw.o +LNXLIBOBJS = $(patsubst %.o,%.lo,$(LIBOBJS)) + +.SUFFIXES: .lss .c .lo .o .elf .c32 .lnx + +all: libutil_com.a libutil_lnx.a + +libutil_com.a: $(LIBOBJS) + rm -f $@ + $(AR) cq $@ $(LIBOBJS) + $(RANLIB) $@ + +libutil_lnx.a: $(LNXLIBOBJS) + rm -f $@ + $(AR) cq $@ $(LNXLIBOBJS) + $(RANLIB) $@ + +.PRECIOUS: %.o +%.o: %.S + $(CC) $(SFLAGS) -c -o $@ $< + +.PRECIOUS: %.o +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +.PRECIOUS: %.elf +%.elf: %.o $(LIB) + $(LD) $(LDFLAGS) -o $@ $^ $(LIBGCC) + +.PRECIOUS: %.lo +%.lo: %.S + $(CC) $(LNXSFLAGS) -c -o $@ $< + +.PRECIOUS: %.lo +%.lo: %.c + $(CC) $(LNXCFLAGS) -c -o $@ $< + +.PRECIOUS: %.lnx +%.lnx: %.lo + $(CC) $(LNXCFLAGS) -o $@ $^ + +%.c32: %.elf + $(OBJCOPY) -O binary $< $@ + +tidy: + rm -f *.o *.lo *.lst *.elf + +clean: tidy + rm -f *.lss *.a *.c32 *.lnx *.com + +spotless: clean + rm -f *~ \#* diff --git a/com32/libutil/ansiline.c b/com32/libutil/ansiline.c new file mode 100644 index 0000000..f79d229 --- /dev/null +++ b/com32/libutil/ansiline.c @@ -0,0 +1,92 @@ +#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. + * + * ----------------------------------------------------------------------- */ + +/* + * ansiline.c + * + * Configures the console for ANSI output in line mode; versions + * for COM32 and Linux support. + */ + +#ifdef __COM32__ + +#include +#include +#include + +static void __attribute__((destructor)) console_cleanup(void) +{ + /* For the serial console, be nice and clean up */ + fputs("\033[0m\033[20l", stdout); +} + +void console_ansi_std(void) +{ + openconsole(&dev_stdcon_r, &dev_ansiserial_w); + fputs("\033[0m\033[20h", stdout); +} + +#else + +#include +#include + +static struct termios original_termios_settings; + +static void __attribute__((constructor)) console_init(void) +{ + tcgetattr(0, &original_termios_settings); +} + +static void __attribute__((destructor)) console_cleanup(void) +{ + fputs("\033[0m\033[20l", stdout); + tcsetattr(0, TCSANOW, &original_termios_settings); +} + + +void console_ansi_std(void) +{ + struct termios tio; + + /* Disable stdio buffering */ + setbuf(stdin, NULL); + setbuf(stdout, NULL); + setbuf(stderr, NULL); + + /* Set the termios flag so we behave the same as libcom32 */ + tcgetattr(0, &tio); + tio.c_iflag &= ~ICRNL; + tio.c_iflag |= IGNCR; + tio.c_cflag |= ICANON|ECHO; + tcsetattr(0, TCSANOW, &tio); + fputs("\033[0m\033[20h", stdout); +} + +#endif + diff --git a/com32/libutil/ansiraw.c b/com32/libutil/ansiraw.c new file mode 100644 index 0000000..efb3624 --- /dev/null +++ b/com32/libutil/ansiraw.c @@ -0,0 +1,92 @@ +#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. + * + * ----------------------------------------------------------------------- */ + +/* + * ansiraw.c + * + * Configures the console for ANSI output in raw mode; versions + * for COM32 and Linux support. + */ + +#ifdef __COM32__ + +#include +#include +#include + +static void __attribute__((destructor)) console_cleanup(void) +{ + /* For the serial console, be nice and clean up */ + fputs("\033[0m\033[20l", stdout); +} + +void console_ansi_std(void) +{ + openconsole(&dev_rawcon_r, &dev_ansiserial_w); + fputs("\033[0m\033[20h", stdout); +} + +#else + +#include +#include + +static struct termios original_termios_settings; + +static void __attribute__((constructor)) console_init(void) +{ + tcgetattr(0, &original_termios_settings); +} + +static void __attribute__((destructor)) console_cleanup(void) +{ + fputs("\033[0m\033[20l", stdout); + tcsetattr(0, TCSANOW, &original_termios_settings); +} + + +void console_ansi_std(void) +{ + struct termios tio; + + /* Disable stdio buffering */ + setbuf(stdin, NULL); + setbuf(stdout, NULL); + setbuf(stderr, NULL); + + /* Set the termios flag so we behave the same as libcom32 */ + tcgetattr(0, &tio); + tio.c_iflag &= ~ICRNL; + tio.c_iflag |= IGNCR; + tio.c_lflag &= ~(ISIG|ICANON|ECHO); + tcsetattr(0, TCSANOW, &tio); + fputs("\033[0m\033[20h", stdout); +} + +#endif + diff --git a/com32/libutil/include/consoles.h b/com32/libutil/include/consoles.h new file mode 100644 index 0000000..b0f961f --- /dev/null +++ b/com32/libutil/include/consoles.h @@ -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. + * + * ----------------------------------------------------------------------- */ + +/* + * consoles.h + * + * Utility functions for common console configurations + */ + +#ifndef _LIBUTIL_CONSOLES_H +#define _LIBUTIL_CONSOLES_H + +void console_ansi_std(void); +void console_ansi_raw(void); + +#endif /* _LIBUTIL_CONSOLES_H */ + diff --git a/com32/modules/Makefile b/com32/modules/Makefile index ed4e386..f02a514 100644 --- a/com32/modules/Makefile +++ b/com32/modules/Makefile @@ -25,14 +25,17 @@ LD = ld -m elf_i386 AR = ar NASM = nasm RANLIB = ranlib -CFLAGS = -W -Wall -march=i386 -Os -fomit-frame-pointer -I../include -D__COM32__ -LNXCFLAGS = -W -Wall -march=i386 -Os -g -SFLAGS = -march=i386 +CFLAGS = -W -Wall -march=i386 -Os -fomit-frame-pointer -I../libutil/include -I../include -D__COM32__ +LNXCFLAGS = -W -Wall -march=i386 -Os -g -I../libutil/include +LNXSFLAGS = -march=i386 +LNXLDFLAGS = -g +SFLAGS = -D__COM32__ -march=i386 LDFLAGS = -T ../lib/com32.ld OBJCOPY = objcopy PPMTOLSS16 = ../ppmtolss16 -LIB = ../lib/libcom32.a LIBGCC := $(shell $(CC) --print-libgcc) +LIBS = ../libutil/libutil_com.a ../lib/libcom32.a $(LIBGCC) +LNXLIBS = ../libutil/libutil_lnx.a .SUFFIXES: .lss .c .o .elf .c32 .lnx @@ -47,21 +50,29 @@ all: hello.c32 fancyhello.c32 fancyhello.lnx $(CC) $(CFLAGS) -c -o $@ $< .PRECIOUS: %.elf -%.elf: %.o $(LIB) - $(LD) $(LDFLAGS) -o $@ $^ $(LIBGCC) +%.elf: %.o $(LIBS) + $(LD) $(LDFLAGS) -o $@ $^ + +.PRECIOUS: %.lo +%.lo: %.S + $(CC) $(LNXSFLAGS) -c -o $@ $< + +.PRECIOUS: %.lo +%.lo: %.c + $(CC) $(LNXCFLAGS) -c -o $@ $< .PRECIOUS: %.lnx -%.lnx: %.c - $(CC) $(LNXCFLAGS) -o $@ $^ +%.lnx: %.lo $(LNXLIBS) + $(CC) $(LNXLDFLAGS) -o $@ $^ %.c32: %.elf $(OBJCOPY) -O binary $< $@ tidy: - rm -f *.o *.a *.lst *.elf + rm -f *.o *.lo *.a *.lst *.elf clean: tidy - rm -f *.lss *.o *.c32 *.lnx *.com + rm -f *.lss *.c32 *.lnx *.com spotless: clean rm -f *~ \#* diff --git a/com32/modules/fancyhello.c b/com32/modules/fancyhello.c index 5cfc064..cf255fb 100644 --- a/com32/modules/fancyhello.c +++ b/com32/modules/fancyhello.c @@ -22,40 +22,13 @@ #include #include -#ifdef __COM32__ - -#include - -static void console_init(void) -{ - /* Write both to the ANSI console and the serial port, if configured */ - openconsole(&dev_stdcon_r, &dev_ansiserial_w); -} - -#else - -#include -#include - -static void console_init(void) -{ - struct termios tio; - - /* Set the termios flag so we behave the same as libcom32 */ - tcgetattr(0, &tio); - tio.c_iflag &= ~ICRNL; - tio.c_iflag |= IGNCR; - tcsetattr(0, TCSANOW, &tio); -} - -#endif +#include /* Provided by libutil */ int main(void) { char buffer[1024]; - console_init(); - printf("\033[20h"); /* Automatically convert \r\n -> \n */ + console_ansi_std(); printf("\033[1;33;44m *** \033[37mHello, World!\033[33m *** \033[0m\n"); -- 2.7.4