Summary: Ref T7785. This prepares for (but does not yet use) a pure PHP implementation of Figlet parsing and rendering. Figlet is somewhat complex, but a parser already exists in PEAR. I'll make sure it's suitable and hook it up in the next diff. Test Plan: N/A, code not reachable Reviewers: chad Reviewed By: chad Maniphest Tasks: T9408, T7785 Differential Revision: https://secure.phabricator.com/D14101
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * *    @(#)getopt.c    2.3 (smail) 5/30/87 
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 * Here's something you've all been waiting for:  the AT&T public domain
 | 
						|
 * source for getopt(3).  It is the code which was given out at the 1985
 | 
						|
 * UNIFORUM conference in Dallas. I obtained it by electronic mail directly
 | 
						|
 * from AT&T.  The people there assure me that it is indeed in the public
 | 
						|
 * domain. 
 | 
						|
 *
 | 
						|
 * There is no manual page. That is because the one they gave out at UNIFORUM
 | 
						|
 * was slightly different from the current System V Release 2 manual page. 
 | 
						|
 * The difference apparently involved a note about the famous rules 5 and 6,
 | 
						|
 * recommending using white space between an option and its first argument,
 | 
						|
 * and not grouping options that have arguments. Getopt itself is currently
 | 
						|
 * lenient about both of these things White space is allowed, but not
 | 
						|
 * mandatory, and the last option in a group can have an argument.  That
 | 
						|
 * particular version of the man page evidently has no official existence,
 | 
						|
 * and my source at AT&T did not send a copy. The current SVR2 man page
 | 
						|
 * reflects the actual behavior of this getopt. However, I am not about to
 | 
						|
 * post a copy of anything licensed by AT&T. 
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef BSD
 | 
						|
 #include <strings.h>
 | 
						|
#else
 | 
						|
 #define index strchr
 | 
						|
 #include <string.h>
 | 
						|
#endif
 | 
						|
 | 
						|
/* LINTLIBRARY */
 | 
						|
#ifndef NULL
 | 
						|
#define NULL    0
 | 
						|
#endif
 | 
						|
 | 
						|
#define EOF    (-1)
 | 
						|
#define ERR(s, c)    if(opterr){\
 | 
						|
    extern int write(int, void *, unsigned);\
 | 
						|
    char errbuf[2];\
 | 
						|
    errbuf[0] = (char)c; errbuf[1] = '\n';\
 | 
						|
    (void) write(2, strlwr(argv[0]), (unsigned)strlen(argv[0]));\
 | 
						|
    (void) write(2, s, (unsigned)strlen(s));\
 | 
						|
    (void) write(2, errbuf, 2);}
 | 
						|
 | 
						|
extern char    *index();
 | 
						|
 | 
						|
int             opterr = 1;
 | 
						|
int             optind = 1;
 | 
						|
int             optopt;
 | 
						|
char           *optarg;
 | 
						|
 | 
						|
int getopt(int argc, char *argv[], char *opts)
 | 
						|
{
 | 
						|
      static int      sp = 1;
 | 
						|
      register int    c;
 | 
						|
      register char  *cp;
 | 
						|
 | 
						|
      if (sp == 1)
 | 
						|
      {
 | 
						|
            if (optind >= argc || argv[optind][0] != '-' ||
 | 
						|
                  argv[optind][1] == '\0')
 | 
						|
                        return (EOF);
 | 
						|
            else if (strcmp(argv[optind], "--") == 0)
 | 
						|
            {
 | 
						|
                  optind++;
 | 
						|
                  return (EOF);
 | 
						|
            }
 | 
						|
      }
 | 
						|
      optopt = c = argv[optind][sp];
 | 
						|
      if (c == ':' || (cp = index(opts, c)) == NULL)
 | 
						|
      {
 | 
						|
            ERR(": illegal option -- ", c);
 | 
						|
            if (argv[optind][++sp] == '\0')
 | 
						|
            {
 | 
						|
                  optind++;
 | 
						|
                  sp = 1;
 | 
						|
            }
 | 
						|
            return ('?');
 | 
						|
      }
 | 
						|
      if (*++cp == ':')
 | 
						|
      {
 | 
						|
            if (argv[optind][sp + 1] != '\0')
 | 
						|
                  optarg = &argv[optind++][sp + 1];
 | 
						|
            else if (++optind >= argc)
 | 
						|
            {
 | 
						|
                  ERR(": option requires an argument -- ", c);
 | 
						|
                  sp = 1;
 | 
						|
                  return ('?');
 | 
						|
            }
 | 
						|
            else  optarg = argv[optind++];
 | 
						|
            sp = 1;
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
            if (argv[optind][++sp] == '\0')
 | 
						|
            {
 | 
						|
                  sp = 1;
 | 
						|
                  optind++;
 | 
						|
            }
 | 
						|
            optarg = NULL;
 | 
						|
      }
 | 
						|
      return (c);
 | 
						|
}
 |