1/* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19/* 20 * This file was copied from the following newsgroup posting: 21 * 22 * Newsgroups: mod.std.unix 23 * Subject: public domain AT&T getopt source 24 * Date: 3 Nov 85 19:34:15 GMT 25 * 26 * Here's something you've all been waiting for: the AT&T public domain 27 * source for getopt(3). It is the code which was given out at the 1985 28 * UNIFORUM conference in Dallas. I obtained it by electronic mail 29 * directly from AT&T. The people there assure me that it is indeed 30 * in the public domain. 31 */ 32 33#include <stdio.h> 34#include <string.h> 35 36static int opterr = 1; 37static int optind = 1; 38static int optopt; 39static char *optarg; 40 41static int getopt(int argc, char *argv[], char *opts) 42{ 43 static int sp = 1; 44 int c; 45 char *cp; 46 47 if (sp == 1) { 48 if (optind >= argc || 49 argv[optind][0] != '-' || argv[optind][1] == '\0') 50 return EOF; 51 else if (!strcmp(argv[optind], "--")) { 52 optind++; 53 return EOF; 54 } 55 } 56 optopt = c = argv[optind][sp]; 57 if (c == ':' || (cp = strchr(opts, c)) == NULL) { 58 fprintf(stderr, ": illegal option -- %c\n", c); 59 if (argv[optind][++sp] == '\0') { 60 optind++; 61 sp = 1; 62 } 63 return '?'; 64 } 65 if (*++cp == ':') { 66 if (argv[optind][sp+1] != '\0') 67 optarg = &argv[optind++][sp+1]; 68 else if(++optind >= argc) { 69 fprintf(stderr, ": option requires an argument -- %c\n", c); 70 sp = 1; 71 return '?'; 72 } else 73 optarg = argv[optind++]; 74 sp = 1; 75 } else { 76 if (argv[optind][++sp] == '\0') { 77 sp = 1; 78 optind++; 79 } 80 optarg = NULL; 81 } 82 83 return c; 84} 85