1999-12-17 00:11:37 +01:00
|
|
|
/*
|
|
|
|
* This is a cheap replacement for getopt() because that routine is not
|
|
|
|
* available on some platforms and behaves differently on other platforms.
|
|
|
|
* This code was written from scratch without looking at any other
|
|
|
|
* implementation.
|
|
|
|
*
|
|
|
|
* This code is hereby expressly placed in the public domain.
|
|
|
|
* mleisher@crl.nmsu.edu (Mark Leisher)
|
|
|
|
* 10 October 1997
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef lint
|
|
|
|
#ifdef __GNUC__
|
|
|
|
static char rcsid[] __attribute__ ((unused)) = "$Id$";
|
|
|
|
#else
|
|
|
|
static char rcsid[] = "$Id$";
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Externals visible to programs.
|
|
|
|
*/
|
|
|
|
|
|
|
|
int opterr = 1;
|
|
|
|
int optind = 1;
|
|
|
|
char* optarg;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Internal variables that are used to detect when the global values
|
|
|
|
* need to be reset.
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int cmdac;
|
|
|
|
#ifdef __STDC__
|
|
|
|
static const char* cmdname;
|
|
|
|
static char* const* cmdav;
|
|
|
|
#else
|
|
|
|
static char* cmdname;
|
|
|
|
static char** cmdav;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int
|
|
|
|
#ifdef __STDC__
|
|
|
|
getopt( int ac, char* const* av, const char* pat )
|
|
|
|
#else
|
|
|
|
getopt( ac, av, pat )
|
|
|
|
int ac;
|
|
|
|
char** av;
|
|
|
|
char* pat;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
int opt;
|
|
|
|
#ifdef __STDC__
|
|
|
|
const char* p;
|
|
|
|
const char* pp;
|
|
|
|
#else
|
|
|
|
char* p;
|
|
|
|
char* pp;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If there is no pattern, indicate the parsing is done.
|
|
|
|
*/
|
|
|
|
if ( pat == 0 || *pat == 0 )
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Always reset the option argument to NULL.
|
|
|
|
*/
|
|
|
|
optarg = 0;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If the number of arguments or argument list do not match the last
|
|
|
|
* values seen, reset the internal pointers and the globals.
|
|
|
|
*/
|
|
|
|
if ( ac != cmdac || av != cmdav )
|
|
|
|
{
|
|
|
|
optind = 1;
|
|
|
|
cmdac = ac;
|
|
|
|
cmdav = av;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Determine the command name in case it is needed for warning
|
|
|
|
* messages.
|
|
|
|
*/
|
|
|
|
for ( cmdname = 0, p = av[0]; *p; p++ )
|
|
|
|
{
|
|
|
|
if ( *p == '/' || *p == '\\' )
|
|
|
|
cmdname = p;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Skip the path separator if the name was assigned.
|
|
|
|
*/
|
|
|
|
if ( cmdname )
|
|
|
|
cmdname++;
|
|
|
|
else
|
|
|
|
cmdname = av[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If the next index is greater than or equal to the number of
|
|
|
|
* arguments, then the command line is done.
|
|
|
|
*/
|
|
|
|
if ( optind >= ac )
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Test the next argument for one of three cases:
|
|
|
|
* 1. The next argument does not have an initial '-'.
|
|
|
|
* 2. The next argument is '-'.
|
|
|
|
* 3. The next argument is '--'.
|
|
|
|
*
|
|
|
|
* In either of these cases, command line processing is done.
|
|
|
|
*/
|
|
|
|
if ( av[optind][0] != '-' ||
|
|
|
|
strcmp( av[optind], "-" ) == 0 ||
|
|
|
|
strcmp( av[optind], "--" ) == 0 )
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Point at the next command line argument and increment the
|
|
|
|
* command line index.
|
|
|
|
*/
|
|
|
|
p = av[optind++];
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Look for the first character of the command line option.
|
|
|
|
*/
|
|
|
|
for ( opt = *(p + 1), pp = pat; *pp && *pp != opt; pp++ )
|
|
|
|
;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If nothing in the pattern was recognized, then issue a warning
|
|
|
|
* and return a '?'.
|
|
|
|
*/
|
|
|
|
if ( *pp == 0 )
|
|
|
|
{
|
|
|
|
if ( opterr )
|
|
|
|
fprintf( stderr, "%s: illegal option -- %c\n", cmdname, opt );
|
|
|
|
return '?';
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If the option expects an argument, get it.
|
|
|
|
*/
|
|
|
|
if ( *(pp + 1) == ':' && (optarg = av[optind]) == 0 )
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* If the option argument is NULL, issue a warning and return a '?'.
|
|
|
|
*/
|
|
|
|
if ( opterr )
|
|
|
|
fprintf( stderr, "%s: option requires an argument -- %c\n",
|
|
|
|
cmdname, opt );
|
|
|
|
opt = '?';
|
|
|
|
}
|
|
|
|
else if ( optarg )
|
|
|
|
/*
|
|
|
|
* Increment the option index past the argument.
|
|
|
|
*/
|
|
|
|
optind++;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Return the option character.
|
|
|
|
*/
|
|
|
|
return opt;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* The FreeType project -- a free and portable quality TrueType renderer. */
|
|
|
|
/* */
|
|
|
|
/* Copyright 1996-1998 by */
|
|
|
|
/* D. Turner, R.Wilhelm, and W. Lemberg */
|
|
|
|
/* */
|
|
|
|
/* ft_basename(): */
|
|
|
|
/* */
|
|
|
|
/* a stupid but useful function... */
|
|
|
|
/* */
|
|
|
|
/* rewritten by DavidT to get rid of GPLed programs in the FreeType demos. */
|
|
|
|
/* */
|
|
|
|
/****************************************************************************/
|
|
|
|
|
|
|
|
char*
|
|
|
|
#ifdef __STDC__
|
|
|
|
ft_basename ( const char* name )
|
|
|
|
#else
|
|
|
|
ft_basename ( name )
|
|
|
|
char* name;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
#ifdef __STDC__
|
|
|
|
const char* base;
|
|
|
|
const char* current;
|
|
|
|
#else
|
|
|
|
char* base;
|
|
|
|
char* current;
|
|
|
|
#endif
|
|
|
|
char c;
|
|
|
|
|
|
|
|
base = name;
|
|
|
|
current = name;
|
|
|
|
|
|
|
|
c = *current;
|
|
|
|
|
|
|
|
while ( c )
|
|
|
|
{
|
2000-03-02 02:09:28 +01:00
|
|
|
#ifndef macintosh
|
1999-12-17 00:11:37 +01:00
|
|
|
if ( c == '/' || c == '\\' )
|
2000-03-02 02:09:28 +01:00
|
|
|
#else
|
|
|
|
if ( c == ':' )
|
|
|
|
#endif
|
1999-12-17 00:11:37 +01:00
|
|
|
base = current + 1;
|
|
|
|
|
|
|
|
current++;
|
|
|
|
c = *current;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (char*)base;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __STDC__
|
|
|
|
void Panic( const char* fmt, ... )
|
|
|
|
#else
|
|
|
|
void Panic( fmt )
|
|
|
|
const char* fmt;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
|
|
|
|
va_start( ap, fmt );
|
|
|
|
vprintf( fmt, ap );
|
|
|
|
va_end( ap );
|
|
|
|
|
|
|
|
exit( 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* End */
|