getargv.c
Author: cmaier@cmassoc.net

    /*====================================================================*
     *
     *   Copyright (c) 2012 Qualcomm Atheros Inc.
     *
     *   Permission to use, copy, modify, and/or distribute this software
     *   for any purpose with or without fee is hereby granted, provided
     *   that the above copyright notice and this permission notice appear
     *   in all copies.
     *
     *   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
     *   WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
     *   WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
     *   THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
     *   CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
     *   LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
     *   NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     *   CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     *
     *--------------------------------------------------------------------*/

    /*====================================================================*
     *
     *   signed getargv (signed argc, char const * argv [])
     *
     *   symbol.h
     *
     *   read one line from stdin; fill argv [] with fields from that
     *   line; return the number of fields found; ignore blank lines
     *   and script style comment lines; this implementation inserts
     *   a program name at argv [0] to emulate a true argv [];
     *
     *--------------------------------------------------------------------*/

    #ifndef GETARGV_SOURCE
    #define GETARGV_SOURCE

    #include <stdio.h>
    #include <ctype.h>
    #include <memory.h>

    #include "../tools/symbol.h"
    #include "../tools/chars.h"

    signed getargv (signed argc, char const * argv [])

    {
    	extern char const * program_name;
    	static char string [1024];
    	char const ** argp = argv;
    	char * sp = string;
    	signed c = getc (stdin);
    	memset (string, 0, sizeof (string));
    	memset ((char **)(argv), 0, argc * sizeof (char const *));
    	while (nobreak (c))
    	{
    		if (isspace (c))
    		{
    			do
    			{
    				c = getc (stdin);
    			}
    			while (isspace (c));
    		}
    		if (c == '#')
    		{
    			do
    			{
    				c = getc (stdin);
    			}
    			while (nobreak (c));
    			c = getc (stdin);
    			continue;
    		}
    		*argp++ = program_name;
    		*argp++ = sp = string;
    		while (nobreak (c))
    		{
    			if (c == '#')
    			{
    				do
    				{
    					c = getc (stdin);
    				}
    				while (nobreak (c));
    				break;
    			}
    			if (isblank (c))
    			{
    				c = (char)(0);
    				*argp = sp + 1;
    			}
    			else if (sp == *argp)
    			{
    				if ((signed)(argp - argv) < argc)
    				{
    					argp++;
    				}
    			}
    			*sp++ = (char)(c);
    			c = getc (stdin);
    		}
    		*argp = (char const *)(0);
    		*sp = (char)(0);
    	}
    	return ((unsigned)(argp - argv));
    }

    #endif

[PREV] [HOME] [NEXT]