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 *); | |||||