1 //-------------------------------------------------------------------------
2 /*
3 Copyright (C) 2010-2019 EDuke32 developers and contributors
4 Copyright (C) 2019 Nuke.YKT
5 
6 This file is part of NBlood.
7 
8 NBlood is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License version 2
10 as published by the Free Software Foundation.
11 
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 
16 See the GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 */
22 //-------------------------------------------------------------------------
23 #include <stdlib.h>
24 #include <string.h>
25 #include "compat.h"
26 #include "getopt.h"
27 
28 int margc;
29 char const * const *margv;
30 
31 const char *OptArgv[16];
32 int OptArgc;
33 const char *OptFull;
34 const char *SwitchChars = "-/";
35 
GetOptions(SWITCH * switches)36 int GetOptions(SWITCH *switches)
37 {
38     static const char *pChar = NULL;
39     static int OptIndex = 1;
40     if (!pChar)
41     {
42         if (OptIndex >= margc)
43             return kOptEnd;
44         pChar = margv[OptIndex++];
45         if (!pChar)
46             return kOptEnd;
47     }
48     OptFull = pChar;
49     if (!strchr(SwitchChars, *pChar))
50     {
51         pChar = NULL;
52         return kOptFull;
53     }
54     pChar++;
55     int i;
56     int nID;
57     for (i = 0; true; i++)
58     {
59         if (!switches[i].name)
60             return kOptInvalid;
61         int nLength = strlen(switches[i].name);
62         if (!Bstrncasecmp(pChar, switches[i].name, nLength) && (pChar[nLength]=='=' || pChar[nLength]==0))
63         {
64             pChar += nLength;
65             if (*pChar=='=')
66             {
67                 pChar++;
68             }
69             else
70             {
71                 pChar = NULL;
72             }
73             break;
74         }
75     }
76     nID = switches[i].nID;
77     OptArgc = 0;
78     while (OptArgc < switches[i].nArgs)
79     {
80         if (!pChar)
81         {
82             if (OptIndex >= margc)
83                 break;
84             pChar = margv[OptIndex++];
85             if (strchr(SwitchChars, *pChar) != 0)
86                 break;
87         }
88         OptArgv[OptArgc++] = pChar;
89         pChar = NULL;
90     }
91     return nID;
92 }
93