git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2258 92316355-f0b4-4df1-b90c-862c8a59935fremotes/tiles
| @@ -25,7 +25,19 @@ AC_LIBTOOL_CXX | |||||
| AC_C_CONST | AC_C_CONST | ||||
| AC_C_INLINE | AC_C_INLINE | ||||
| AC_CHECK_HEADERS(stdio.h stdarg.h inttypes.h endian.h stdint.h) | |||||
| AC_CHECK_HEADERS(stdio.h stdarg.h inttypes.h endian.h stdint.h getopt.h) | |||||
| ac_cv_have_getopt_long="no" | |||||
| AC_CHECK_FUNCS(getopt_long, | |||||
| [ac_cv_have_getopt_long="yes"], | |||||
| [AC_CHECK_LIB(gnugetopt, getopt_long, | |||||
| [ac_cv_have_getopt_long="yes" | |||||
| GETOPT_LIBS="${GETOPT_LIBS} -lgnugetopt"])]) | |||||
| if test "$ac_cv_have_getopt_long" != "no"; then | |||||
| AC_DEFINE(HAVE_GETOPT_LONG, 1, Define to 1 if you have the `getopt_long' function.) | |||||
| fi | |||||
| AM_CONDITIONAL(NEED_GETOPT_LONG, test "$ac_cv_have_getopt_long" = "no") | |||||
| AC_SUBST(GETOPT_LIBS) | |||||
| # Optimizations | # Optimizations | ||||
| CFLAGS="${CFLAGS} -g -O2 -fno-strength-reduce -fomit-frame-pointer" | CFLAGS="${CFLAGS} -g -O2 -fno-strength-reduce -fomit-frame-pointer" | ||||
| @@ -2,8 +2,12 @@ | |||||
| AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/pipi | AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/pipi | ||||
| if NEED_GETOPT_LONG | |||||
| GETOPT = mygetopt.c mygetopt.h | |||||
| endif | |||||
| bin_PROGRAMS = genethumb | bin_PROGRAMS = genethumb | ||||
| genethumb_SOURCES = genethumb.c | |||||
| genethumb_LDADD = ../pipi/libpipi.la | |||||
| genethumb_SOURCES = genethumb.c $(GETOPT) | |||||
| genethumb_LDADD = ../pipi/libpipi.la $(GETOPT_LIBS) | |||||
| @@ -1,17 +1,73 @@ | |||||
| #include "config.h" | #include "config.h" | ||||
| #include "common.h" | #include "common.h" | ||||
| #if !defined HAVE_GETOPT_LONG | |||||
| # include "mygetopt.h" | |||||
| #elif defined HAVE_GETOPT_H | |||||
| # include <getopt.h> | |||||
| #endif | |||||
| #include <stdio.h> | |||||
| #include <stdlib.h> | |||||
| #include <string.h> | |||||
| #include <pipi.h> | #include <pipi.h> | ||||
| int main(void) | |||||
| #if defined HAVE_GETOPT_LONG | |||||
| # define mygetopt getopt_long | |||||
| # define myoptind optind | |||||
| # define myoptarg optarg | |||||
| # define myoption option | |||||
| #endif | |||||
| #define MOREINFO "Try `%s --help' for more information.\n" | |||||
| int main(int argc, char *argv[]) | |||||
| { | { | ||||
| pipi_image_t *i, *j; | |||||
| char *srcname = NULL, *dstname = NULL; | |||||
| pipi_image_t *src, *dst; | |||||
| int i, w = 0, h = 0; | |||||
| for(;;) | |||||
| { | |||||
| int option_index = 0; | |||||
| static struct myoption long_options[] = | |||||
| { | |||||
| { "geometry", 1, NULL, 'g' }, | |||||
| }; | |||||
| int c = mygetopt(argc, argv, "g:", long_options, &option_index); | |||||
| if(c == -1) | |||||
| break; | |||||
| switch(c) | |||||
| { | |||||
| case 'g': | |||||
| w = atoi(myoptarg); | |||||
| if(strchr(myoptarg, 'x')) | |||||
| h = atoi(strchr(myoptarg, 'x') + 1); | |||||
| break; | |||||
| default: | |||||
| fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c); | |||||
| printf(MOREINFO, argv[0]); | |||||
| return EXIT_FAILURE; | |||||
| } | |||||
| } | |||||
| for(i = myoptind; i < argc; i++) | |||||
| { | |||||
| if(!srcname) | |||||
| srcname = argv[i]; | |||||
| else | |||||
| dstname = argv[i]; | |||||
| } | |||||
| i = pipi_load("irc.png"); | |||||
| j = pipi_resize(i, 180, 180); | |||||
| pipi_save(j, "irc.bmp"); | |||||
| pipi_free(i); | |||||
| pipi_free(j); | |||||
| src = pipi_load(srcname); | |||||
| dst = pipi_resize(src, w, h); | |||||
| pipi_save(dst, dstname); | |||||
| pipi_free(src); | |||||
| pipi_free(dst); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -0,0 +1,129 @@ | |||||
| /* | |||||
| * zzuf - general purpose fuzzer | |||||
| * Copyright (c) 2002, 2007 Sam Hocevar <sam@zoy.org> | |||||
| * All Rights Reserved | |||||
| * | |||||
| * $Id: mygetopt.c 271 2007-02-02 11:58:06Z sam $ | |||||
| * | |||||
| * This program is free software. It comes without any warranty, to | |||||
| * the extent permitted by applicable law. You can redistribute it | |||||
| * and/or modify it under the terms of the Do What The Fuck You Want | |||||
| * To Public License, Version 2, as published by Sam Hocevar. See | |||||
| * http://sam.zoy.org/wtfpl/COPYING for more details. | |||||
| */ | |||||
| /* | |||||
| * mygetopt.c: getopt_long reimplementation | |||||
| */ | |||||
| #include "config.h" | |||||
| #if defined HAVE_STDINT_H | |||||
| # include <stdint.h> | |||||
| #elif defined HAVE_INTTYPES_H | |||||
| # include <inttypes.h> | |||||
| #endif | |||||
| /* DOS / Kernel driver */ | |||||
| #ifndef __intptr_t_defined | |||||
| #ifndef _UINTPTR_T | |||||
| typedef unsigned int uintptr_t; | |||||
| #endif | |||||
| #endif | |||||
| #include <stdio.h> | |||||
| #include <string.h> | |||||
| #include "mygetopt.h" | |||||
| int myoptind = 1; | |||||
| char *myoptarg = NULL; | |||||
| /* XXX: this getopt_long implementation should not be trusted for other | |||||
| * applications without any serious peer reviewing. It “just works” with | |||||
| * zzuf but may fail miserably in other programs. */ | |||||
| int mygetopt(int argc, char * const _argv[], const char *optstring, | |||||
| const struct myoption *longopts, int *longindex) | |||||
| { | |||||
| char **argv = (char **)(uintptr_t)_argv; | |||||
| char *flag; | |||||
| int i; | |||||
| if(myoptind >= argc) | |||||
| return -1; | |||||
| flag = argv[myoptind]; | |||||
| if(flag[0] == '-' && flag[1] != '-') | |||||
| { | |||||
| char *tmp; | |||||
| int ret = flag[1]; | |||||
| if(ret == '\0') | |||||
| return -1; | |||||
| tmp = strchr(optstring, ret); | |||||
| if(!tmp || ret == ':') | |||||
| return '?'; | |||||
| myoptind++; | |||||
| if(tmp[1] == ':') | |||||
| { | |||||
| if(flag[2] != '\0') | |||||
| myoptarg = tmp + 2; | |||||
| else | |||||
| myoptarg = argv[myoptind++]; | |||||
| return ret; | |||||
| } | |||||
| if(flag[2] != '\0') | |||||
| { | |||||
| flag[1] = '-'; | |||||
| myoptind--; | |||||
| argv[myoptind]++; | |||||
| } | |||||
| return ret; | |||||
| } | |||||
| if(flag[0] == '-' && flag[1] == '-') | |||||
| { | |||||
| if(flag[2] == '\0') | |||||
| return -1; | |||||
| for(i = 0; longopts[i].name; i++) | |||||
| { | |||||
| size_t l = strlen(longopts[i].name); | |||||
| if(strncmp(flag + 2, longopts[i].name, l)) | |||||
| continue; | |||||
| switch(flag[2 + l]) | |||||
| { | |||||
| case '=': | |||||
| if(!longopts[i].has_arg) | |||||
| goto bad_opt; | |||||
| if(longindex) | |||||
| *longindex = i; | |||||
| myoptind++; | |||||
| myoptarg = flag + 2 + l + 1; | |||||
| return longopts[i].val; | |||||
| case '\0': | |||||
| if(longindex) | |||||
| *longindex = i; | |||||
| myoptind++; | |||||
| if(longopts[i].has_arg) | |||||
| myoptarg = argv[myoptind++]; | |||||
| return longopts[i].val; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| } | |||||
| bad_opt: | |||||
| fprintf(stderr, "%s: unrecognized option `%s'\n", argv[0], flag); | |||||
| return '?'; | |||||
| } | |||||
| return -1; | |||||
| } | |||||
| @@ -0,0 +1,31 @@ | |||||
| /* | |||||
| * zzuf - general purpose fuzzer | |||||
| * Copyright (c) 2002, 2007 Sam Hocevar <sam@zoy.org> | |||||
| * All Rights Reserved | |||||
| * | |||||
| * $Id: mygetopt.h 268 2007-02-01 22:33:07Z sam $ | |||||
| * | |||||
| * This program is free software. It comes without any warranty, to | |||||
| * the extent permitted by applicable law. You can redistribute it | |||||
| * and/or modify it under the terms of the Do What The Fuck You Want | |||||
| * To Public License, Version 2, as published by Sam Hocevar. See | |||||
| * http://sam.zoy.org/wtfpl/COPYING for more details. | |||||
| */ | |||||
| /* | |||||
| * mygetopt.h: getopt_long reimplementation | |||||
| */ | |||||
| struct myoption | |||||
| { | |||||
| const char *name; | |||||
| int has_arg; | |||||
| int *flag; | |||||
| int val; | |||||
| }; | |||||
| extern int myoptind; | |||||
| extern char *myoptarg; | |||||
| int mygetopt(int, char * const[], const char *, const struct myoption *, int *); | |||||