summaryrefslogtreecommitdiffstats
path: root/eurephiadm/argparser.c
blob: cbfdc67261f9b1e03cb60d83b95265a3f784942e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* argparser.c  --  Simple argument parser - inspired by getopt, but simpler
 *
 *  GPLv2 - Copyright (C) 2008  David Sommerseth <dazo@users.sourceforge.net>
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; version 2
 *  of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ARGPARSER_C
#include "argparser.h"

char *optargs[MAX_ARGUMENTS];

int _eurephia_getopt(const char *module, int *curarg, int argc, char **argv, e_options *argopts) {
        int i = 0;
        char *arg = argv[*curarg];

        if( arg == NULL ) {
                return -1;
        }

        for( i = 0; argopts[i].longarg != NULL; i++ ) {
                if( (strcmp(argopts[i].longarg, arg) == 0)
                    || (strcmp(argopts[i].shortarg, arg) == 0) )
                        {
                                if( (argopts[i].param > 0) && (argc > (*curarg)+argopts[i].param) ) {
                                        int j = 0;
                                        for( j = 0; j < argopts[i].param; j++ ) {
                                                optargs[j] = argv[(*curarg)+j+1];
                                                (*curarg)++;
                                        }
                                } else if( (argopts[i].param > 0) ) {
                                        fprintf(stderr, "%s: ERROR :: Missing argument(s) to '%s'\n", module, arg);
                                        return -1;
                                }
                                return (int) *(&(*argopts[i].shortarg)+1);
                        }
        }
        fprintf(stderr, "%s: ERROR :: Unknown argument '%s'\n", module, arg);
        return -1;
}


// This function will take (argc,argv) and copy pointers over to (**outargv), starting from 
// the index given in stidx (start index).  The outargv array must have been allocated first
// by calloc(sizeof(char *), elmnts).  The outsize must not exceed the number of elements you
// have allocated space for.  The function returns number of elements copied (the new argc, kind of)
//
size_t eurephia_arraycp(int stidx, int inargc, char **inargv, char **outargv, size_t outsize) {
        int i, outargc;

        outargc = 0;
        for( i = stidx; ((i < inargc) && (outargc < outsize)); i++ ) {
                outargv[outargc++] = inargv[i];
        }

        return outargc;
}