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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [or1ksim/] [or1ksim-0.5.0rc1/] [argtable2/] [arg_date.c] - Diff between revs 19 and 347

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

Rev 19 Rev 347
/*********************************************************************
/*********************************************************************
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.
**********************************************************************/
**********************************************************************/
/* glibc2 needs this for strptime */
/* glibc2 needs this for strptime */
#define _XOPEN_SOURCE 
#define _XOPEN_SOURCE 
 
 
/* SunOS also requires this for strptime */
/* SunOS also requires this for strptime */
#define _XOPEN_VERSION 4 
#define _XOPEN_VERSION 4 
 
 
/* 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
 
 
#ifdef HAVE_STRINGS_H
#ifdef HAVE_STRINGS_H
#include <strings.h>
#include <strings.h>
#endif
#endif
 
 
#include "argtable2.h"
#include "argtable2.h"
 
 
/* local error codes  */
/* local error codes  */
enum {EMINCOUNT=1,EMAXCOUNT,EBADDATE};
enum {EMINCOUNT=1,EMAXCOUNT,EBADDATE};
 
 
static void resetfn(struct arg_date *parent)
static void resetfn(struct arg_date *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_date *parent, const char *argval)
static int scanfn(struct arg_date *parent, const char *argval)
    {
    {
    int errorcode = 0;
    int errorcode = 0;
 
 
    if (parent->count == parent->hdr.maxcount )
    if (parent->count == parent->hdr.maxcount )
        errorcode = EMAXCOUNT;
        errorcode = EMAXCOUNT;
    else if (!argval)
    else if (!argval)
        {
        {
        /* no argument value was given, leave parent->tmval[] unaltered but still count it */
        /* no argument value was given, leave parent->tmval[] unaltered but still count it */
        parent->count++;
        parent->count++;
        }
        }
    else
    else
        {
        {
        const char *pend;
        const char *pend;
        struct tm tm = parent->tmval[parent->count];
        struct tm tm = parent->tmval[parent->count];
 
 
        /* parse the given argument value, store result in parent->tmval[] */
        /* parse the given argument value, store result in parent->tmval[] */
        pend = strptime(argval, parent->format, &tm);
        pend = strptime(argval, parent->format, &tm);
        if (pend && pend[0]=='\0')
        if (pend && pend[0]=='\0')
            parent->tmval[parent->count++] = tm;
            parent->tmval[parent->count++] = tm;
        else
        else
            errorcode = EBADDATE;
            errorcode = EBADDATE;
        }
        }
 
 
    /*printf("%s:scanfn(%p) returns %d\n",__FILE__,parent,errorcode);*/
    /*printf("%s:scanfn(%p) returns %d\n",__FILE__,parent,errorcode);*/
    return errorcode;
    return errorcode;
    }
    }
 
 
static int checkfn(struct arg_date *parent)
static int checkfn(struct arg_date *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_date *parent, FILE *fp, int errorcode, const char *argval, const char *progname)
static void errorfn(struct arg_date *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 EBADDATE:
        case EBADDATE:
            {
            {
            struct tm tm;
            struct tm tm;
            char buff[200];
            char buff[200];
 
 
            fprintf(fp,"illegal timestamp format \"%s\"\n",argval);
            fprintf(fp,"illegal timestamp format \"%s\"\n",argval);
            bzero(&tm,sizeof(tm));
            bzero(&tm,sizeof(tm));
            strptime("1999-12-31 23:59:59","%F %H:%M:%S",&tm);
            strptime("1999-12-31 23:59:59","%F %H:%M:%S",&tm);
            strftime(buff, sizeof(buff), parent->format, &tm);
            strftime(buff, sizeof(buff), parent->format, &tm);
            printf("correct format is \"%s\"\n", buff);
            printf("correct format is \"%s\"\n", buff);
            break;
            break;
            }
            }
        }
        }
    }
    }
 
 
 
 
struct arg_date* arg_date0(const char* shortopts,
struct arg_date* arg_date0(const char* shortopts,
                           const char* longopts,
                           const char* longopts,
                           const char* format,
                           const char* format,
                           const char *datatype,
                           const char *datatype,
                           const char *glossary)
                           const char *glossary)
    {
    {
    return arg_daten(shortopts,longopts,format,datatype,0,1,glossary);
    return arg_daten(shortopts,longopts,format,datatype,0,1,glossary);
    }
    }
 
 
struct arg_date* arg_date1(const char* shortopts,
struct arg_date* arg_date1(const char* shortopts,
                           const char* longopts,
                           const char* longopts,
                           const char* format,
                           const char* format,
                           const char *datatype,
                           const char *datatype,
                           const char *glossary)
                           const char *glossary)
    {
    {
    return arg_daten(shortopts,longopts,format,datatype,1,1,glossary);
    return arg_daten(shortopts,longopts,format,datatype,1,1,glossary);
    }
    }
 
 
 
 
struct arg_date* arg_daten(const char* shortopts,
struct arg_date* arg_daten(const char* shortopts,
                           const char* longopts,
                           const char* longopts,
                           const char* format,
                           const char* format,
                           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_date *result;
    struct arg_date *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;
 
 
    /* default time format is the national date format for the locale */
    /* default time format is the national date format for the locale */
    if (!format)
    if (!format)
        format = "%x";
        format = "%x";
 
 
    nbytes = sizeof(struct arg_date)         /* storage for struct arg_date */
    nbytes = sizeof(struct arg_date)         /* storage for struct arg_date */
           + maxcount*sizeof(struct tm);     /* storage for tmval[maxcount] array */
           + maxcount*sizeof(struct tm);     /* storage for tmval[maxcount] array */
 
 
    /* allocate storage for the arg_date struct + tmval[] array.    */
    /* allocate storage for the arg_date struct + tmval[] array.    */
    /* we use calloc because we want the tmval[] array zero filled. */
    /* we use calloc because we want the tmval[] array zero filled. */
    result = (struct arg_date*)calloc(1,nbytes);
    result = (struct arg_date*)calloc(1,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 : format;
        result->hdr.datatype  = datatype ? datatype : format;
        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 tmval[maxcount] array immediately after the arg_date struct */
        /* store the tmval[maxcount] array immediately after the arg_date struct */
        result->tmval  = (struct tm*)(result+1);
        result->tmval  = (struct tm*)(result+1);
 
 
        /* init the remaining arg_date member variables */
        /* init the remaining arg_date member variables */
        result->count = 0;
        result->count = 0;
        result->format = format;
        result->format = format;
        }
        }
 
 
    /*printf("arg_daten() returns %p\n",result);*/
    /*printf("arg_daten() 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.