OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [or1ksim/] [or1ksim-0.5.1rc1/] [argtable2/] [arg_int.c] - Diff between revs 19 and 511

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 19 Rev 511
/*********************************************************************
/*********************************************************************
This file is part of the argtable2 library.
This file is part of the argtable2 library.
Copyright (C) 1998-2001,2003-2008 Stewart Heitmann
Copyright (C) 1998-2001,2003-2008 Stewart Heitmann
sheitmann@users.sourceforge.net
sheitmann@users.sourceforge.net
 
 
The argtable2 library is free software; you can redistribute it and/or
The argtable2 library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
License, or (at your option) any later version.
 
 
This software is distributed in the hope that it will be useful,
This software is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.
Library General Public License for more details.
 
 
You should have received a copy of the GNU Library General Public
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
USA.
**********************************************************************/
**********************************************************************/
 
 
/* config.h must be included before anything else */
/* config.h must be included before anything else */
#ifdef HAVE_CONFIG_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "config.h"
#endif
#endif
 
 
/* #ifdef HAVE_STDLIB_H */
/* #ifdef HAVE_STDLIB_H */
#include <stdlib.h>
#include <stdlib.h>
/* #endif */
/* #endif */
 
 
#include "argtable2.h"
#include "argtable2.h"
 
 
/* local error codes */
/* local error codes */
enum {EMINCOUNT=1,EMAXCOUNT,EBADINT};
enum {EMINCOUNT=1,EMAXCOUNT,EBADINT};
 
 
static void resetfn(struct arg_int *parent)
static void resetfn(struct arg_int *parent)
    {
    {
    /*printf("%s:resetfn(%p)\n",__FILE__,parent);*/
    /*printf("%s:resetfn(%p)\n",__FILE__,parent);*/
    parent->count=0;
    parent->count=0;
    }
    }
 
 
static int scanfn(struct arg_int *parent, const char *argval)
static int scanfn(struct arg_int *parent, const char *argval)
    {
    {
    int errorcode = 0;
    int errorcode = 0;
 
 
    if (parent->count == parent->hdr.maxcount)
    if (parent->count == parent->hdr.maxcount)
        {
        {
        /* maximum number of arguments exceeded */
        /* maximum number of arguments exceeded */
        errorcode = EMAXCOUNT;
        errorcode = EMAXCOUNT;
        }
        }
    else if (!argval)
    else if (!argval)
        {
        {
        /* a valid argument with no argument value was given. */
        /* a valid argument with no argument value was given. */
        /* This happens when an optional argument value was invoked. */
        /* This happens when an optional argument value was invoked. */
        /* leave parent arguiment value unaltered but still count the argument. */
        /* leave parent arguiment value unaltered but still count the argument. */
        parent->count++;
        parent->count++;
        }
        }
    else
    else
        {
        {
        int val;
        int val;
        char *end;
        char *end;
 
 
        /* extract base10 integer from argval into val */
        /* extract base10 integer from argval into val */
        val = (int)strtol(argval,&end,10);
        val = (int)strtol(argval,&end,10);
 
 
        /* if success then store result in parent->ival[] array otherwise return error*/
        /* if success then store result in parent->ival[] array otherwise return error*/
        if (*end==0)
        if (*end==0)
            parent->ival[parent->count++] = val;
            parent->ival[parent->count++] = val;
        else
        else
            errorcode = EBADINT;
            errorcode = EBADINT;
        }
        }
 
 
    /* printf("%s:scanfn(%p,%p) returns %d\n",__FILE__,parent,argval,errorcode); */
    /* printf("%s:scanfn(%p,%p) returns %d\n",__FILE__,parent,argval,errorcode); */
    return errorcode;
    return errorcode;
    }
    }
 
 
static int checkfn(struct arg_int *parent)
static int checkfn(struct arg_int *parent)
    {
    {
    int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
    int errorcode = (parent->count < parent->hdr.mincount) ? EMINCOUNT : 0;
    /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/
    /*printf("%s:checkfn(%p) returns %d\n",__FILE__,parent,errorcode);*/
    return errorcode;
    return errorcode;
    }
    }
 
 
static void errorfn(struct arg_int *parent, FILE *fp, int errorcode, const char *argval, const char *progname)
static void errorfn(struct arg_int *parent, FILE *fp, int errorcode, const char *argval, const char *progname)
    {
    {
    const char *shortopts = parent->hdr.shortopts;
    const char *shortopts = parent->hdr.shortopts;
    const char *longopts  = parent->hdr.longopts;
    const char *longopts  = parent->hdr.longopts;
    const char *datatype  = parent->hdr.datatype;
    const char *datatype  = parent->hdr.datatype;
 
 
    /* make argval NULL safe */
    /* make argval NULL safe */
    argval = argval ? argval : "";
    argval = argval ? argval : "";
 
 
    fprintf(fp,"%s: ",progname);
    fprintf(fp,"%s: ",progname);
    switch(errorcode)
    switch(errorcode)
        {
        {
        case EMINCOUNT:
        case EMINCOUNT:
            fputs("missing option ",fp);
            fputs("missing option ",fp);
            arg_print_option(fp,shortopts,longopts,datatype,"\n");
            arg_print_option(fp,shortopts,longopts,datatype,"\n");
            break;
            break;
 
 
        case EMAXCOUNT:
        case EMAXCOUNT:
            fputs("excess option ",fp);
            fputs("excess option ",fp);
            arg_print_option(fp,shortopts,longopts,argval,"\n");
            arg_print_option(fp,shortopts,longopts,argval,"\n");
            break;
            break;
 
 
        case EBADINT:
        case EBADINT:
            fprintf(fp,"invalid argument \"%s\" to option ",argval);
            fprintf(fp,"invalid argument \"%s\" to option ",argval);
            arg_print_option(fp,shortopts,longopts,datatype,"\n");
            arg_print_option(fp,shortopts,longopts,datatype,"\n");
            break;
            break;
        }
        }
    }
    }
 
 
 
 
struct arg_int* arg_int0(const char* shortopts,
struct arg_int* arg_int0(const char* shortopts,
                         const char* longopts,
                         const char* longopts,
                         const char *datatype,
                         const char *datatype,
                         const char *glossary)
                         const char *glossary)
    {
    {
    return arg_intn(shortopts,longopts,datatype,0,1,glossary);
    return arg_intn(shortopts,longopts,datatype,0,1,glossary);
    }
    }
 
 
struct arg_int* arg_int1(const char* shortopts,
struct arg_int* arg_int1(const char* shortopts,
                         const char* longopts,
                         const char* longopts,
                         const char *datatype,
                         const char *datatype,
                         const char *glossary)
                         const char *glossary)
    {
    {
    return arg_intn(shortopts,longopts,datatype,1,1,glossary);
    return arg_intn(shortopts,longopts,datatype,1,1,glossary);
    }
    }
 
 
 
 
struct arg_int* arg_intn(const char* shortopts,
struct arg_int* arg_intn(const char* shortopts,
                         const char* longopts,
                         const char* longopts,
                         const char *datatype,
                         const char *datatype,
                         int mincount,
                         int mincount,
                         int maxcount,
                         int maxcount,
                         const char *glossary)
                         const char *glossary)
    {
    {
    size_t nbytes;
    size_t nbytes;
    struct arg_int *result;
    struct arg_int *result;
 
 
        /* foolproof things by ensuring maxcount is not less than mincount */
        /* foolproof things by ensuring maxcount is not less than mincount */
        maxcount = (maxcount<mincount) ? mincount : maxcount;
        maxcount = (maxcount<mincount) ? mincount : maxcount;
 
 
    nbytes = sizeof(struct arg_int)     /* storage for struct arg_int */
    nbytes = sizeof(struct arg_int)     /* storage for struct arg_int */
           + maxcount * sizeof(int);    /* storage for ival[maxcount] array */
           + maxcount * sizeof(int);    /* storage for ival[maxcount] array */
 
 
    result = (struct arg_int*)malloc(nbytes);
    result = (struct arg_int*)malloc(nbytes);
    if (result)
    if (result)
        {
        {
        /* init the arg_hdr struct */
        /* init the arg_hdr struct */
        result->hdr.flag      = ARG_HASVALUE;
        result->hdr.flag      = ARG_HASVALUE;
        result->hdr.shortopts = shortopts;
        result->hdr.shortopts = shortopts;
        result->hdr.longopts  = longopts;
        result->hdr.longopts  = longopts;
        result->hdr.datatype  = datatype ? datatype : "<int>";
        result->hdr.datatype  = datatype ? datatype : "<int>";
        result->hdr.glossary  = glossary;
        result->hdr.glossary  = glossary;
        result->hdr.mincount  = mincount;
        result->hdr.mincount  = mincount;
        result->hdr.maxcount  = maxcount;
        result->hdr.maxcount  = maxcount;
        result->hdr.parent    = result;
        result->hdr.parent    = result;
        result->hdr.resetfn   = (arg_resetfn*)resetfn;
        result->hdr.resetfn   = (arg_resetfn*)resetfn;
        result->hdr.scanfn    = (arg_scanfn*)scanfn;
        result->hdr.scanfn    = (arg_scanfn*)scanfn;
        result->hdr.checkfn   = (arg_checkfn*)checkfn;
        result->hdr.checkfn   = (arg_checkfn*)checkfn;
        result->hdr.errorfn   = (arg_errorfn*)errorfn;
        result->hdr.errorfn   = (arg_errorfn*)errorfn;
 
 
        /* store the ival[maxcount] array immediately after the arg_int struct */
        /* store the ival[maxcount] array immediately after the arg_int struct */
        result->ival  = (int*)(result+1);
        result->ival  = (int*)(result+1);
        result->count = 0;
        result->count = 0;
        }
        }
    /*printf("arg_intn() returns %p\n",result);*/
    /*printf("arg_intn() returns %p\n",result);*/
    return result;
    return result;
    }
    }
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.