/*      $NetBSD: parse.c,v 1.8 2016/11/25 17:37:04 tsutsui Exp $        */

/*
* Copyright (c) 1992 OMRON Corporation.
*
* This code is derived from software contributed to Berkeley by
* OMRON Corporation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
*    must display the following acknowledgement:
*      This product includes software developed by the University of
*      California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
*    may be used to endorse or promote products derived from this software
*    without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*      @(#)parse.c     8.1 (Berkeley) 6/10/93
*/
/*
* Copyright (c) 1992, 1993
*      The Regents of the University of California.  All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* OMRON Corporation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
*    may be used to endorse or promote products derived from this software
*    without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*      @(#)parse.c     8.1 (Berkeley) 6/10/93
*/

/*
* parse.c -- command parser
* by A.Fujita, JAN-30-1992
*/

#include <lib/libkern/libkern.h>
#include <luna68k/stand/boot/samachdep.h>
#include <luna68k/stand/boot/status.h>

static int cmd_help(int, char *[]);

int
check_args(int argc, char *argv[])
{
       int i;

       for (i = 0; i < argc; i++)
               printf("argv[%d] = \"%s\"\n", i, argv[i]);

       return ST_NORMAL;
}

int
exit_program(int argc, char *argv[])
{

       return ST_EXIT;
}

static const char helpmsg[] =
       "commands are:\n"
       "boot [device(unit,part)filename] [-ads]\n"
       " (ex. \"boot sd(6,0)netbsd\", \"boot le()netbsd.old\" etc.)\n"
       "  Note unit number for SCSI device is (ctlr) * 10 + (id).\n"
       "ls [device(unit, part)[path]]\n"
       " (ex. \"ls sd(0,0)/bin\")\n"
       "help\n"
       "exit\n"
#if 0 /* debug commands */
       "checkargs\n"
       "disklabel\n"
       "howto\n"
       "screen\n"
       "scsi\n"
#endif
;

static int
cmd_help(int argc, char *argv[])
{

       printf(helpmsg);
       return ST_NORMAL;
}

struct command_entry {
       char *name;
       int (*func)(int, char **);
};

static const struct command_entry entries[] = {
       { "b",          boot         },
       { "boot",       boot         },
       { "chkargs",    check_args   },
       { "disklabel",  disklabel    },
       { "exit",       exit_program },
#ifdef notyet
       { "fsdump",     fsdump       },
       { "fsrestore",  fsrestore    },
#endif
       { "help",       cmd_help     },
       { "ls",         cmd_ls       },
       { "screen",     screen       },
#ifdef notyet
       { "tape",       tape         },
       { "tp",         tape         },
#endif
       { "scsi",       scsi         },
       { "quit",       exit_program },
       { NULL, NULL }
};


int
parse(int argc, char *argv[])
{
       int i, status = ST_NOTFOUND;

       for (i = 0; entries[i].name != NULL; i++) {
               if (!strcmp(argv[0], entries[i].name)) {
                       status = (*entries[i].func)(argc, argv);
                       break;
               }
       }

       return status;
}



/*
* getargs -- make argument arrays
*/

int
getargs(char buffer[], char *argv[], int maxargs)
{
       int n = 0;
       char *p = buffer;

       argv[n++] = p;
       while (*p != '\0') {
               if (*p == ' ') {
                       *p = '\0';
               } else if (p != buffer && *(p - 1) == '\0') {
                       if (n < maxargs)
                               argv[n++] = p;
               }
               p++;
       }

       return n;
}