nes-proj/backyard/platform/c64/apps/config.c

242 lines
6.0 KiB
C

/*
* Copyright (c) 2003, Adam Dunkels.
* All rights reserved.
*
* 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. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
*
* This file is part of the Contiki desktop OS.
*
* $Id: config.c,v 1.1 2007/05/23 23:11:24 oliverschmidt Exp $
*
*/
#include "program-handler.h"
#include "contiki-net.h"
#include "cfs/cfs.h"
struct ptentry {
char c;
char * (* pfunc)(char *str);
};
/*-----------------------------------------------------------------------------------*/
static char *
parse(char *str, struct ptentry *t)
{
struct ptentry *p;
/* Loop over the parse table entries in t in order to find one that
matches the first character in str. */
for(p = t; p->c != 0; ++p) {
if(*str == p->c) {
/* Skip rest of the characters up to the first space. */
while(*str != ' ') {
++str;
}
/* Skip all spaces.*/
while(*str == ' ') {
++str;
}
/* Call parse table entry function and return. */
return p->pfunc(str);
}
}
/* Did not find matching entry in parse table. We just call the
default handler supplied by the caller and return. */
return p->pfunc(str);
}
/*-----------------------------------------------------------------------------------*/
static char *
skipnewline(char *str)
{
/* Skip all characters until the newline. */
while(*str != '\n') {
++str;
}
/* Return a pointer to the first character after the newline. */
return str + 1;
}
/*-----------------------------------------------------------------------------------*/
static char *
nullterminate(char *str)
{
char *nt;
/* Nullterminate string. Start with finding newline character. */
for(nt = str; *nt != '\r' &&
*nt != '\n'; ++nt);
/* Replace newline with a null char. */
*nt = 0;
/* Remove trailing spaces. */
while(nt > str && *(nt - 1) == ' ') {
*(nt - 1) = 0;
--nt;
}
/* Return pointer to null char. */
return nt;
}
/*-----------------------------------------------------------------------------------*/
static char *
loadfile(char *str)
{
char *nt;
nt = nullterminate(str);
/* Call loader function. */
program_handler_load(str, NULL);
return nt + 1;
}
/*-----------------------------------------------------------------------------------*/
static char *
screensaverconf(char *str)
{
char *nt;
nt = nullterminate(str);
program_handler_setscreensaver(str);
return nt + 1;
}
/*-----------------------------------------------------------------------------------*/
static u16_t addr[2];
static char *
ipaddrconf(char *str)
{
char *nt;
nt = nullterminate(str);
if(uiplib_ipaddrconv(str, (unsigned char *)addr)) {
uip_sethostaddr(addr);
}
return nt + 1;
}
/*-----------------------------------------------------------------------------------*/
static char *
netmaskconf(char *str)
{
char *nt;
nt = nullterminate(str);
if(uiplib_ipaddrconv(str, (unsigned char *)addr)) {
uip_setnetmask(addr);
}
return nt + 1;
}
/*-----------------------------------------------------------------------------------*/
static char *
drconf(char *str)
{
char *nt;
nt = nullterminate(str);
if(uiplib_ipaddrconv(str, (unsigned char *)addr)) {
uip_setdraddr(addr);
}
return nt + 1;
}
/*-----------------------------------------------------------------------------------*/
static char *
dnsconf(char *str)
{
char *nt;
nt = nullterminate(str);
if(uiplib_ipaddrconv(str, (unsigned char *)addr)) {
resolv_conf(addr);
}
return nt + 1;
}
/*-----------------------------------------------------------------------------------*/
static struct ptentry configparsetab[] =
{{'n', loadfile},
{'t', loadfile},
{'c', loadfile},
{'s', screensaverconf},
{'i', ipaddrconf},
{'m', netmaskconf},
{'r', drconf},
{'d', dnsconf},
{'#', skipnewline},
/* Default action */
{0, skipnewline}};
static void
configscript(void)
{
static char line[40], *lineptr;
/* static struct c64_fs_file f;*/
int f;
if((f = cfs_open("config.cfg", 0)) == -1) {
return;
}
line[0] = ' ';
while(line[0] != '.' &&
line[0] != 0) {
lineptr = line;
do {
if(cfs_read(f, lineptr, 1) != 1) {
cfs_close(f);
return;
}
++lineptr;
} while(*(lineptr - 1) != '\n' &&
*(lineptr - 1) != '\r');
*lineptr = 0;
if(line[0] != '.' &&
line[0] != 0) {
parse(line, configparsetab);
}
}
cfs_close(f);
return;
}
/*-----------------------------------------------------------------------------------*/
LOADER_INIT_FUNC(config_init, arg)
{
arg_free(arg);
program_handler_setscreensaver(NULL);
configscript();
LOADER_UNLOAD();
}
/*-----------------------------------------------------------------------------------*/