From 3299997bcc5a672617095adb560b3834dced39a6 Mon Sep 17 00:00:00 2001 From: Thomas Balling Sørensen Date: Wed, 14 Jul 2010 00:34:56 +0200 Subject: vdpau changes --- configs/autoconf.in | 3 +++ configs/linux-dri | 7 +++---- configs/linux-dri-x86-64 | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) (limited to 'configs') diff --git a/configs/autoconf.in b/configs/autoconf.in index 3ef385a8a66..9abf1618024 100644 --- a/configs/autoconf.in +++ b/configs/autoconf.in @@ -138,6 +138,9 @@ DRI_DRIVER_SEARCH_DIR = @DRI_DRIVER_SEARCH_DIR@ # EGL driver install directory EGL_DRIVER_INSTALL_DIR = @EGL_DRIVER_INSTALL_DIR@ +# VDPAU library install directory +VDPAU_LIB_INSTALL_DIR=@VDPAU_LIB_INSTALL_DIR@ + # Xorg driver install directory (for xorg state-tracker) XORG_DRIVER_INSTALL_DIR = @XORG_DRIVER_INSTALL_DIR@ diff --git a/configs/linux-dri b/configs/linux-dri index 49e35790463..eca321bc6ac 100644 --- a/configs/linux-dri +++ b/configs/linux-dri @@ -58,12 +58,11 @@ PROGRAM_DIRS := egl/eglut egl/opengl $(PROGRAM_DIRS) EGL_DRIVERS_DIRS = glx DRIVER_DIRS = dri -GALLIUM_WINSYS_DIRS = sw sw/xlib drm/vmware drm/intel drm/i965 +GALLIUM_WINSYS_DIRS = sw sw/xlib GALLIUM_TARGET_DIRS = egl-swrast -GALLIUM_STATE_TRACKERS_DIRS = egl +GALLIUM_STATE_TRACKERS_DIRS = egl vdpau -DRI_DIRS = i810 i915 i965 mach64 mga r128 r200 r300 radeon \ - savage sis tdfx unichrome swrast +DRI_DIRS = r300 radeon swrast INTEL_LIBS = `pkg-config --libs libdrm_intel` INTEL_CFLAGS = `pkg-config --cflags libdrm_intel` diff --git a/configs/linux-dri-x86-64 b/configs/linux-dri-x86-64 index 656cf6140d7..90e6c215adb 100644 --- a/configs/linux-dri-x86-64 +++ b/configs/linux-dri-x86-64 @@ -20,5 +20,5 @@ EXTRA_LIB_PATH=-L/usr/X11R6/lib64 # the new interface. i810 are missing because there is no x86-64 # system where they could *ever* be used. # -DRI_DIRS = i915 i965 mach64 mga r128 r200 r300 radeon savage tdfx unichrome +DRI_DIRS = swrast -- cgit v1.2.3 From 501ac572c604ef248ed41311a065bc5f4746fcb3 Mon Sep 17 00:00:00 2001 From: Thomas Balling Sørensen Date: Sun, 24 Oct 2010 19:27:29 +0200 Subject: vl: va state-tracker configuration scripts --- configs/autoconf.in | 3 ++ configure.ac | 27 ++++++++++++++++-- src/gallium/state_trackers/va/Makefile | 2 +- src/gallium/state_trackers/va/ftab.c | 2 +- src/gallium/state_trackers/va/htab.c | 4 +++ src/gallium/state_trackers/va/va_private.h | 32 ++++++++++++++++++++++ .../state_trackers/vdpau/mpeg2_bitstream_parser.h | 9 ++---- src/gallium/state_trackers/vdpau/vdpau_private.h | 2 +- 8 files changed, 69 insertions(+), 12 deletions(-) (limited to 'configs') diff --git a/configs/autoconf.in b/configs/autoconf.in index d7eb162b684..df52b3f42f6 100644 --- a/configs/autoconf.in +++ b/configs/autoconf.in @@ -160,6 +160,9 @@ EGL_DRIVER_INSTALL_DIR = @EGL_DRIVER_INSTALL_DIR@ # VDPAU library install directory VDPAU_LIB_INSTALL_DIR=@VDPAU_LIB_INSTALL_DIR@ +# VA library install directory +VA_LIB_INSTALL_DIR=@VA_LIB_INSTALL_DIR@ + # Xorg driver install directory (for xorg state-tracker) XORG_DRIVER_INSTALL_DIR = @XORG_DRIVER_INSTALL_DIR@ diff --git a/configure.ac b/configure.ac index 0344be00703..59c2eb157b7 100644 --- a/configure.ac +++ b/configure.ac @@ -1345,6 +1345,13 @@ yes) fi HAVE_ST_VDPAU="yes" ;; + va) + # Check for libva? + if test "x$enable_gallium_g3dvl" != xyes; then + AC_MSG_ERROR([cannot build va state tracker without --enable-gallium-g3dvl]) + fi + HAVE_ST_VA="yes" + ;; esac if test -n "$tracker"; then @@ -1479,7 +1486,7 @@ dnl dnl Gallium helper functions dnl gallium_check_st() { - if test "x$HAVE_ST_DRI" = xyes || test "x$HAVE_ST_EGL" = xyes || test "x$HAVE_ST_XORG" = xyes || test "x$HAVE_ST_XVMC" = xyes || test "x$HAVE_ST_VDPAU" = xyes; then + if test "x$HAVE_ST_DRI" = xyes || test "x$HAVE_ST_EGL" = xyes || test "x$HAVE_ST_XORG" = xyes || test "x$HAVE_ST_XVMC" = xyes || test "x$HAVE_ST_VDPAU" = xyes || test "x$HAVE_ST_VA" = xyes; then GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS $1" fi if test "x$HAVE_ST_DRI" = xyes && test "x$2" != x; then @@ -1497,6 +1504,9 @@ gallium_check_st() { if test "x$HAVE_ST_VDPAU" = xyes && test "x$6" != x; then GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $6" fi + if test "x$HAVE_ST_VA" = xyes && test "x$7" != x; then + GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $7" + fi } @@ -1613,8 +1623,13 @@ AC_ARG_ENABLE([gallium-g3dvl], if test "x$enable_gallium_g3dvl" = xyes; then case "$mesa_driver" in xlib) + if test "x$HAVE_ST_VDPAU" = xyes; then GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS vdpau-softpipe" - ;; + fi + if test "x$HAVE_ST_VA" = xyes; then + GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS va-softpipe" + fi + ;; dri) GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS g3dvl/dri" ;; @@ -1628,6 +1643,14 @@ AC_ARG_WITH([vdpau-libdir], [VDPAU_LIB_INSTALL_DIR='${libdir}/vdpau']) AC_SUBST([VDPAU_LIB_INSTALL_DIR]) +dnl Directory for VA libs +AC_ARG_WITH([va-libdir], + [AS_HELP_STRING([--with-va-libdir=DIR], + [directory for the VA libraries @<:@default=${libdir}/va@:>@])], + [VA_LIB_INSTALL_DIR="$withval"], + [VA_LIB_INSTALL_DIR='${libdir}/va']) +AC_SUBST([VA_LIB_INSTALL_DIR]) + dnl dnl Gallium swrast configuration dnl diff --git a/src/gallium/state_trackers/va/Makefile b/src/gallium/state_trackers/va/Makefile index 28fe5d09694..15c6ee0ef6d 100644 --- a/src/gallium/state_trackers/va/Makefile +++ b/src/gallium/state_trackers/va/Makefile @@ -8,7 +8,7 @@ VA_MINOR = 3 LIBRARY_DEFINES = -DVER_MAJOR=$(VA_MAJOR) -DVER_MINOR=$(VA_MINOR) $(STATE_TRACKER_DEFINES) LIBRARY_INCLUDES = \ - $(shell pkg-config --cflags-only-I vdpau) \ + $(shell pkg-config --cflags-only-I va) \ -I$(TOP)/src/gallium/winsys/g3dvl C_SOURCES = htab.c \ diff --git a/src/gallium/state_trackers/va/ftab.c b/src/gallium/state_trackers/va/ftab.c index 694390b3464..034424cdee7 100644 --- a/src/gallium/state_trackers/va/ftab.c +++ b/src/gallium/state_trackers/va/ftab.c @@ -26,7 +26,7 @@ **************************************************************************/ #include -#include +#include const struct VADriverVTable vtable = { diff --git a/src/gallium/state_trackers/va/htab.c b/src/gallium/state_trackers/va/htab.c index 7b7c111a4be..069c7930927 100644 --- a/src/gallium/state_trackers/va/htab.c +++ b/src/gallium/state_trackers/va/htab.c @@ -29,6 +29,10 @@ #include #include "va_private.h" +#define VL_HANDLES + +typedef uint32_t vlHandle; + #ifdef VL_HANDLES static struct handle_table *htab = NULL; pipe_static_mutex(htab_lock); diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h index e69de29bb2d..8264c259ed1 100644 --- a/src/gallium/state_trackers/va/va_private.h +++ b/src/gallium/state_trackers/va/va_private.h @@ -0,0 +1,32 @@ +/************************************************************************** + * + * Copyright 2010 Thomas Balling Sørensen. + * 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, sub license, 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS 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. + * + **************************************************************************/ + + #ifndef VA_PRIVATE_H + #define VA_PRIVATE_H + + + #endif // VA_PRIVATE_H \ No newline at end of file diff --git a/src/gallium/state_trackers/vdpau/mpeg2_bitstream_parser.h b/src/gallium/state_trackers/vdpau/mpeg2_bitstream_parser.h index 414d6597c6c..25f3516f821 100644 --- a/src/gallium/state_trackers/vdpau/mpeg2_bitstream_parser.h +++ b/src/gallium/state_trackers/vdpau/mpeg2_bitstream_parser.h @@ -36,19 +36,14 @@ enum vdpMPEG2States { MPEG2_SEEK_HEADER, MPEG2_HEADER_DONE, - MPEG2_BITSTREAM_DONE - MPEG2 + MPEG2_BITSTREAM_DONE, + MPEG2_HEADER_START_CODE }; -enum vdpMPEG2Action -{ - MPEG2_ -}; struct vdpMPEG2BitstreamParser { enum vdpMPEG2States state; - enum vdpMPEG2Actions action; uint32_t cur_bitstream; const uint8_t *ptr_bitstream_end; const uint8_t *ptr_bitstream; diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h index d582b8e6c29..1deea3a67d3 100644 --- a/src/gallium/state_trackers/vdpau/vdpau_private.h +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2010 Younes Manton. + * Copyright 2010 Younes Manton & Thomas Balling Sørensen. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a -- cgit v1.2.3 From d6eb1f82570659b7b5a562faa06d804e63a0fc64 Mon Sep 17 00:00:00 2001 From: Christian König Date: Mon, 11 Jul 2011 11:28:23 +0200 Subject: pipe-video: merge fixes --- configs/linux-dri | 5 +- configs/linux-dri-x86-64 | 2 +- src/gallium/tests/trivial/.gitignore | 3 + src/gallium/tests/unit/Makefile | 49 ++++++++++++ src/gallium/tests/unit/pipe_barrier_test.c | 86 ++++++++++++++++++++ src/gallium/tests/unit/u_cache_test.c | 121 +++++++++++++++++++++++++++++ src/gallium/tests/unit/u_half_test.c | 32 ++++++++ 7 files changed, 294 insertions(+), 4 deletions(-) create mode 100644 src/gallium/tests/trivial/.gitignore create mode 100644 src/gallium/tests/unit/Makefile create mode 100644 src/gallium/tests/unit/pipe_barrier_test.c create mode 100644 src/gallium/tests/unit/u_cache_test.c create mode 100644 src/gallium/tests/unit/u_half_test.c (limited to 'configs') diff --git a/configs/linux-dri b/configs/linux-dri index e88d3f0ca72..c4132f47271 100644 --- a/configs/linux-dri +++ b/configs/linux-dri @@ -59,10 +59,9 @@ SRC_DIRS := glx egl $(SRC_DIRS) EGL_DRIVERS_DIRS = glx DRIVER_DIRS = dri - GALLIUM_WINSYS_DIRS = sw sw/xlib drm/vmware drm/intel drm/i965 -GALLIUM_TARGET_DIRS = egl-swrast -GALLIUM_STATE_TRACKERS_DIRS = egl vdpau +GALLIUM_TARGET_DIRS = +GALLIUM_STATE_TRACKERS_DIRS = egl DRI_DIRS = i810 i915 i965 mach64 mga nouveau r128 r200 r300 r600 radeon \ savage sis tdfx unichrome swrast diff --git a/configs/linux-dri-x86-64 b/configs/linux-dri-x86-64 index 90e6c215adb..656cf6140d7 100644 --- a/configs/linux-dri-x86-64 +++ b/configs/linux-dri-x86-64 @@ -20,5 +20,5 @@ EXTRA_LIB_PATH=-L/usr/X11R6/lib64 # the new interface. i810 are missing because there is no x86-64 # system where they could *ever* be used. # -DRI_DIRS = swrast +DRI_DIRS = i915 i965 mach64 mga r128 r200 r300 radeon savage tdfx unichrome diff --git a/src/gallium/tests/trivial/.gitignore b/src/gallium/tests/trivial/.gitignore new file mode 100644 index 00000000000..af6cdedbeba --- /dev/null +++ b/src/gallium/tests/trivial/.gitignore @@ -0,0 +1,3 @@ +tri +quad-tex +result.bmp diff --git a/src/gallium/tests/unit/Makefile b/src/gallium/tests/unit/Makefile new file mode 100644 index 00000000000..bb3039f3bc7 --- /dev/null +++ b/src/gallium/tests/unit/Makefile @@ -0,0 +1,49 @@ +# progs/gallium/simple/Makefile + +TOP = ../../../.. +include $(TOP)/configs/current + +INCLUDES = \ + -I. \ + -I$(TOP)/src/gallium/include \ + -I$(TOP)/src/gallium/auxiliary \ + -I$(TOP)/src/gallium/drivers \ + -I$(TOP)/src/gallium/winsys \ + $(PROG_INCLUDES) + +LINKS = \ + $(TOP)/src/gallium/drivers/trace/libtrace.a \ + $(TOP)/src/gallium/winsys/sw/null/libws_null.a \ + $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ + $(GALLIUM_AUXILIARIES) \ + $(PROG_LINKS) + +SOURCES = \ + pipe_barrier_test.c \ + u_cache_test.c \ + u_half_test.c \ + u_format_test.c \ + u_format_compatible_test.c \ + translate_test.c + + +OBJECTS = $(SOURCES:.c=.o) + +PROGS = $(OBJECTS:.o=) + +##### TARGETS ##### + +default: $(PROGS) + +clean: + -rm -f $(PROGS) + -rm -f *.o + -rm -f result.bmp + +##### RULES ##### + +$(OBJECTS): %.o: %.c + $(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $(PROG_DEFINES) $< -o $@ + +$(PROGS): %: %.o + $(CC) $(LDFLAGS) $< $(LINKS) -lm -lpthread -ldl -o $@ diff --git a/src/gallium/tests/unit/pipe_barrier_test.c b/src/gallium/tests/unit/pipe_barrier_test.c new file mode 100644 index 00000000000..f5d72b0abae --- /dev/null +++ b/src/gallium/tests/unit/pipe_barrier_test.c @@ -0,0 +1,86 @@ +/************************************************************************** + * + * Copyright 2009-2010 VMware, Inc. + * 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, sub license, 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS 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. + * + **************************************************************************/ + + +/* + * Test case for pipe_barrier. + * + * The test succeeds if no thread exits before all the other threads reach + * the barrier. + */ + + +#include + +#include "os/os_thread.h" +#include "os/os_time.h" + + +#define NUM_THREADS 10 + +static pipe_thread threads[NUM_THREADS]; +static pipe_barrier barrier; +static int thread_ids[NUM_THREADS]; + + +static PIPE_THREAD_ROUTINE(thread_function, thread_data) +{ + int thread_id = *((int *) thread_data); + + printf("thread %d starting\n", thread_id); + os_time_sleep(thread_id * 1000 * 1000); + printf("thread %d before barrier\n", thread_id); + pipe_barrier_wait(&barrier); + printf("thread %d exiting\n", thread_id); + + return NULL; +} + + +int main() +{ + int i; + + printf("pipe_barrier_test starting\n"); + + pipe_barrier_init(&barrier, NUM_THREADS); + + for (i = 0; i < NUM_THREADS; i++) { + thread_ids[i] = i; + threads[i] = pipe_thread_create(thread_function, (void *) &thread_ids[i]); + } + + for (i = 0; i < NUM_THREADS; i++ ) { + pipe_thread_wait(threads[i]); + } + + pipe_barrier_destroy(&barrier); + + printf("pipe_barrier_test exiting\n"); + + return 0; +} diff --git a/src/gallium/tests/unit/u_cache_test.c b/src/gallium/tests/unit/u_cache_test.c new file mode 100644 index 00000000000..0b62a765230 --- /dev/null +++ b/src/gallium/tests/unit/u_cache_test.c @@ -0,0 +1,121 @@ +/************************************************************************** + * + * Copyright 2010 VMware, Inc. + * 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, sub license, 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS 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. + * + **************************************************************************/ + + +/* + * Test case for u_cache. + */ + + +#include +#include + +#include "util/u_cache.h" +#include "util/u_hash.h" + + +typedef uint32_t cache_test_key; +typedef uint32_t cache_test_value; + + +static uint32_t +cache_test_hash(const void *key) +{ + return util_hash_crc32(key, sizeof(cache_test_key)); +} + + +static void +cache_test_destroy(void *key, void *value) +{ + free(key); + free(value); +} + + +static int +cache_test_compare(const void *key1, const void *key2) { + return !(key1 == key2); +} + + +int main() { + unsigned cache_size; + unsigned cache_count; + + for (cache_size = 2; cache_size < (1 << 15); cache_size *= 2) { + for (cache_count = (cache_size << 5); cache_count < (cache_size << 10); cache_count *= 2) { + struct util_cache * cache; + cache_test_key *key; + cache_test_value *value_in; + cache_test_value *value_out; + int i; + + printf("Testing cache size of %d with %d values.\n", cache_size, cache_count); + + cache = util_cache_create(cache_test_hash, + cache_test_compare, + cache_test_destroy, + cache_size); + + /* + * Retrieve a value from an empty cache. + */ + key = malloc(sizeof(cache_test_key)); + *key = 0xdeadbeef; + value_out = (cache_test_value *) util_cache_get(cache, key); + assert(value_out == NULL); + free(key); + + + /* + * Repeatedly insert into and retrieve values from the cache. + */ + for (i = 0; i < cache_count; i++) { + key = malloc(sizeof(cache_test_key)); + value_in = malloc(sizeof(cache_test_value)); + + *key = rand(); + *value_in = rand(); + util_cache_set(cache, key, value_in); + + value_out = util_cache_get(cache, key); + assert(value_out != NULL); + assert(value_in == value_out); + assert(*value_in == *value_out); + } + + /* + * In debug builds, this will trigger a self-check by the cache of + * the distribution of hits in its internal cache entries. + */ + util_cache_destroy(cache); + } + } + + return 0; +} diff --git a/src/gallium/tests/unit/u_half_test.c b/src/gallium/tests/unit/u_half_test.c new file mode 100644 index 00000000000..00bda7f50a6 --- /dev/null +++ b/src/gallium/tests/unit/u_half_test.c @@ -0,0 +1,32 @@ +#include +#include +#include + +#include "util/u_math.h" +#include "util/u_half.h" + +int +main(int argc, char **argv) +{ + unsigned i; + unsigned roundtrip_fails = 0; + for(i = 0; i < 1 << 16; ++i) + { + uint16_t h = (uint16_t) i; + union fi f; + uint16_t rh; + f.ui = util_half_to_floatui(h); + rh = util_floatui_to_half(f.ui); + if(h != rh) + { + printf("Roundtrip failed: %x -> %x = %f -> %x\n", h, f.ui, f.f, rh); + ++roundtrip_fails; + } + } + + if(roundtrip_fails) + printf("Failure! %u/65536 half floats failed a conversion to float and back.\n", roundtrip_fails); + else + printf("Success!\n"); + return 0; +} -- cgit v1.2.3