ref: 3475e7fba3bc57acde8ff0ec8091ea02ba1dd774
dir: /demos/src/common.c/
/* * 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. * [email protected] (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 */