blob: fe59e9b8cac5d371f24ca5b653e0d1a78b9cc1ae [file] [log] [blame]
/*
* 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 )
{
#ifndef macintosh
if ( c == '/' || c == '\\' )
#else
if ( c == ':' )
#endif
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 */