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_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 | |||
CFLAGS="${CFLAGS} -g -O2 -fno-strength-reduce -fomit-frame-pointer" | |||
@@ -2,8 +2,12 @@ | |||
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/pipi | |||
if NEED_GETOPT_LONG | |||
GETOPT = mygetopt.c mygetopt.h | |||
endif | |||
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 "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> | |||
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; | |||
} | |||
@@ -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 *); | |||