@@ -45,6 +45,7 @@ libcaca_la_SOURCES = \ | |||||
event.c \ | event.c \ | ||||
time.c \ | time.c \ | ||||
prof.c \ | prof.c \ | ||||
getopt.c \ | |||||
$(codec_source) \ | $(codec_source) \ | ||||
$(driver_source) \ | $(driver_source) \ | ||||
$(NULL) | $(NULL) | ||||
@@ -138,6 +138,19 @@ struct caca_event | |||||
#endif | #endif | ||||
}; | }; | ||||
/** \brief Option parsing. | |||||
* | |||||
* This structure contains commandline parsing information for systems | |||||
* where getopt_long() is unavailable. | |||||
*/ | |||||
struct caca_option | |||||
{ | |||||
char const *name; | |||||
int has_arg; | |||||
int *flag; | |||||
int val; | |||||
}; | |||||
/** \brief Special key values. | /** \brief Special key values. | ||||
* | * | ||||
* Special key values returned by caca_get_event() for which there is no | * Special key values returned by caca_get_event() for which there is no | ||||
@@ -508,6 +521,18 @@ __extern int caca_get_event_resize_width(caca_event_t const *); | |||||
__extern int caca_get_event_resize_height(caca_event_t const *); | __extern int caca_get_event_resize_height(caca_event_t const *); | ||||
/* @} */ | /* @} */ | ||||
/** \defgroup caca_process libcaca process management | |||||
* | |||||
* These functions help with various process handling tasks such as | |||||
* option parsing, DLL injection. | |||||
* | |||||
* @{ */ | |||||
__extern int caca_optind; | |||||
__extern char *caca_optarg; | |||||
__extern int caca_getopt(int, char * const[], char const *, | |||||
struct caca_option const *, int *); | |||||
/* @} */ | |||||
/** \brief DOS colours | /** \brief DOS colours | ||||
* | * | ||||
* This enum lists the colour values for the DOS conio.h compatibility | * This enum lists the colour values for the DOS conio.h compatibility | ||||
@@ -11,39 +11,51 @@ | |||||
*/ | */ | ||||
/* | /* | ||||
* mygetopt.c: getopt_long reimplementation | |||||
* getopt.c: getopt_long reimplementation | |||||
*/ | */ | ||||
#include "config.h" | #include "config.h" | ||||
#if defined HAVE_STDINT_H | |||||
# include <stdint.h> | |||||
#elif defined HAVE_INTTYPES_H | |||||
# include <inttypes.h> | |||||
#if !defined __KERNEL__ | |||||
# include <stdio.h> | |||||
# include <string.h> | |||||
# if defined HAVE_GETOPT_H && defined HAVE_GETOPT_LONG | |||||
# include <getopt.h> | |||||
# endif | |||||
#endif | #endif | ||||
#include <stdio.h> | |||||
#include <string.h> | |||||
#include "caca.h" | |||||
#include "caca_internals.h" | |||||
#include "mygetopt.h" | |||||
int caca_optind = 1; | |||||
char *caca_optarg = NULL; | |||||
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) | |||||
int caca_getopt(int argc, char * const _argv[], char const *optstring, | |||||
struct caca_option const *longopts, int *longindex) | |||||
{ | { | ||||
#if defined HAVE_GETOPT_LONG | |||||
int ret; | |||||
optind = caca_optind; | |||||
optarg = caca_optarg; | |||||
ret = getopt_long(argc, _argv, optstring, | |||||
(struct option const *)longopts, longindex); | |||||
caca_optind = optind; | |||||
caca_optarg = optarg; | |||||
return ret; | |||||
#else | |||||
/* XXX: this getopt_long implementation should not be trusted for other | |||||
* applications without any serious peer reviewing. It “just works” with | |||||
* zzuf and a few libcaca programs but may fail miserably in other | |||||
* programs. */ | |||||
char **argv = (char **)(uintptr_t)_argv; | char **argv = (char **)(uintptr_t)_argv; | ||||
char *flag; | char *flag; | ||||
int i; | int i; | ||||
if(myoptind >= argc) | |||||
if(caca_optind >= argc) | |||||
return -1; | return -1; | ||||
flag = argv[myoptind]; | |||||
flag = argv[caca_optind]; | |||||
if(flag[0] == '-' && flag[1] != '-') | if(flag[0] == '-' && flag[1] != '-') | ||||
{ | { | ||||
@@ -57,21 +69,21 @@ int mygetopt(int argc, char * const _argv[], const char *optstring, | |||||
if(!tmp || ret == ':') | if(!tmp || ret == ':') | ||||
return '?'; | return '?'; | ||||
myoptind++; | |||||
caca_optind++; | |||||
if(tmp[1] == ':') | if(tmp[1] == ':') | ||||
{ | { | ||||
if(flag[2] != '\0') | if(flag[2] != '\0') | ||||
myoptarg = flag + 2; | |||||
caca_optarg = flag + 2; | |||||
else | else | ||||
myoptarg = argv[myoptind++]; | |||||
caca_optarg = argv[caca_optind++]; | |||||
return ret; | return ret; | ||||
} | } | ||||
if(flag[2] != '\0') | if(flag[2] != '\0') | ||||
{ | { | ||||
flag[1] = '-'; | flag[1] = '-'; | ||||
myoptind--; | |||||
argv[myoptind]++; | |||||
caca_optind--; | |||||
argv[caca_optind]++; | |||||
} | } | ||||
return ret; | return ret; | ||||
@@ -96,15 +108,15 @@ int mygetopt(int argc, char * const _argv[], const char *optstring, | |||||
goto bad_opt; | goto bad_opt; | ||||
if(longindex) | if(longindex) | ||||
*longindex = i; | *longindex = i; | ||||
myoptind++; | |||||
myoptarg = flag + 2 + l + 1; | |||||
caca_optind++; | |||||
caca_optarg = flag + 2 + l + 1; | |||||
return longopts[i].val; | return longopts[i].val; | ||||
case '\0': | case '\0': | ||||
if(longindex) | if(longindex) | ||||
*longindex = i; | *longindex = i; | ||||
myoptind++; | |||||
caca_optind++; | |||||
if(longopts[i].has_arg) | if(longopts[i].has_arg) | ||||
myoptarg = argv[myoptind++]; | |||||
caca_optarg = argv[caca_optind++]; | |||||
return longopts[i].val; | return longopts[i].val; | ||||
default: | default: | ||||
break; | break; | ||||
@@ -116,5 +128,6 @@ int mygetopt(int argc, char * const _argv[], const char *optstring, | |||||
} | } | ||||
return -1; | return -1; | ||||
#endif | |||||
} | } | ||||
@@ -468,6 +468,10 @@ | |||||
RelativePath="frame.c" | RelativePath="frame.c" | ||||
> | > | ||||
</File> | </File> | ||||
<File | |||||
RelativePath="getopt.c" | |||||
> | |||||
</File> | |||||
<File | <File | ||||
RelativePath="graphics.c" | RelativePath="graphics.c" | ||||
> | > | ||||
@@ -132,7 +132,6 @@ AC_CHECK_FUNCS(getopt_long, | |||||
if test "$ac_cv_have_getopt_long" != "no"; then | 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.) | AC_DEFINE(HAVE_GETOPT_LONG, 1, Define to 1 if you have the ‘getopt_long’ function.) | ||||
fi | fi | ||||
AM_CONDITIONAL(NEED_GETOPT_LONG, test "$ac_cv_have_getopt_long" = "no") | |||||
AC_SUBST(GETOPT_LIBS) | AC_SUBST(GETOPT_LIBS) | ||||
AC_MSG_CHECKING(for Sleep) | AC_MSG_CHECKING(for Sleep) | ||||
@@ -40,9 +40,5 @@ else | |||||
fcntl_programs = | fcntl_programs = | ||||
endif | endif | ||||
if NEED_GETOPT_LONG | |||||
GETOPT = mygetopt.c mygetopt.h | |||||
endif | |||||
echo-sources: ; echo $(SOURCES) | echo-sources: ; echo $(SOURCES) | ||||
@@ -19,18 +19,6 @@ | |||||
# include <stdlib.h> | # include <stdlib.h> | ||||
#endif | #endif | ||||
#if !defined HAVE_GETOPT_LONG | |||||
# include "mygetopt.h" | |||||
#elif defined HAVE_GETOPT_H | |||||
# include <getopt.h> | |||||
#endif | |||||
#if defined HAVE_GETOPT_LONG | |||||
# define mygetopt getopt_long | |||||
# define myoptind optind | |||||
# define myoptarg optarg | |||||
# define myoption option | |||||
#endif | |||||
#include "caca.h" | #include "caca.h" | ||||
#include "common-image.h" | #include "common-image.h" | ||||
@@ -110,7 +98,7 @@ int main(int argc, char **argv) | |||||
for(;;) | for(;;) | ||||
{ | { | ||||
int option_index = 0; | int option_index = 0; | ||||
static struct myoption long_options[] = | |||||
static struct caca_option long_options[] = | |||||
{ | { | ||||
{ "width", 1, NULL, 'W' }, | { "width", 1, NULL, 'W' }, | ||||
{ "height", 1, NULL, 'H' }, | { "height", 1, NULL, 'H' }, | ||||
@@ -124,38 +112,39 @@ int main(int argc, char **argv) | |||||
{ "help", 0, NULL, 'h' }, | { "help", 0, NULL, 'h' }, | ||||
{ "version", 0, NULL, 'v' }, | { "version", 0, NULL, 'v' }, | ||||
}; | }; | ||||
int c = mygetopt(argc, argv, "W:H:f:d:g:b:c:hvx:y:", long_options, &option_index); | |||||
int c = caca_getopt(argc, argv, "W:H:f:d:g:b:c:hvx:y:", | |||||
long_options, &option_index); | |||||
if(c == -1) | if(c == -1) | ||||
break; | break; | ||||
switch(c) | switch(c) | ||||
{ | { | ||||
case 'W': /* --width */ | case 'W': /* --width */ | ||||
cols = atoi(myoptarg); | |||||
cols = atoi(caca_optarg); | |||||
break; | break; | ||||
case 'H': /* --height */ | case 'H': /* --height */ | ||||
lines = atoi(myoptarg); | |||||
lines = atoi(caca_optarg); | |||||
break; | break; | ||||
case 'x': /* --width */ | case 'x': /* --width */ | ||||
font_width = atoi(myoptarg); | |||||
font_width = atoi(caca_optarg); | |||||
break; | break; | ||||
case 'y': /* --height */ | case 'y': /* --height */ | ||||
font_height = atoi(myoptarg); | |||||
font_height = atoi(caca_optarg); | |||||
break; | break; | ||||
case 'f': /* --format */ | case 'f': /* --format */ | ||||
format = myoptarg; | |||||
format = caca_optarg; | |||||
break; | break; | ||||
case 'd': /* --dither */ | case 'd': /* --dither */ | ||||
dither = myoptarg; | |||||
dither = caca_optarg; | |||||
break; | break; | ||||
case 'g': /* --gamma */ | case 'g': /* --gamma */ | ||||
gamma = atof(myoptarg); | |||||
gamma = atof(caca_optarg); | |||||
break; | break; | ||||
case 'b': /* --brightness */ | case 'b': /* --brightness */ | ||||
brightness = atof(myoptarg); | |||||
brightness = atof(caca_optarg); | |||||
break; | break; | ||||
case 'c': /* --contrast */ | case 'c': /* --contrast */ | ||||
contrast = atof(myoptarg); | |||||
contrast = atof(caca_optarg); | |||||
break; | break; | ||||
case 'h': /* --help */ | case 'h': /* --help */ | ||||
usage(argc, argv); | usage(argc, argv); | ||||
@@ -1,29 +0,0 @@ | |||||
/* | |||||
* libcaca Colour ASCII-Art library | |||||
* Copyright (c) 2002-2010 Sam Hocevar <sam@hocevar.net> | |||||
* All Rights Reserved | |||||
* | |||||
* 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 *); | |||||