configedit.c
来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· C语言 代码 · 共 419 行
C
419 行
/* * Copyright (c) 2002, 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 environment * * $Id: configedit.c,v 1.1 2007/05/23 23:11:24 oliverschmidt Exp $ * */#include "contiki.h"#include "contiki-net.h"#include "ctk/ctk-draw-service.h"#include "net/packet-service.h"#include "ctk/ctk.h"#include "ctk/ctk-draw.h"#include "program-handler.h"#include "cfs/cfs.h"#include <stdio.h>#include <string.h>/* TCP/IP configuration window. */static struct ctk_window window;#define LABELMAXWIDTH 12static struct ctk_label cfslabel = {CTK_LABEL(0, 1, LABELMAXWIDTH, 1, "Disk driver")};static char cfs[25];static struct ctk_textentry cfstextentry = {CTK_TEXTENTRY(LABELMAXWIDTH + 1, 1, 16, 1, cfs, 24)};static struct ctk_label themelabel = {CTK_LABEL(0, 3, LABELMAXWIDTH, 1, "CTK theme")};static char theme[25];static struct ctk_textentry themetextentry = {CTK_TEXTENTRY(LABELMAXWIDTH + 1, 3, 16, 1, theme, 24)};static struct ctk_label driverlabel = {CTK_LABEL(0, 5, LABELMAXWIDTH, 1, "Net driver")};static char driver[25];static struct ctk_textentry drivertextentry = {CTK_TEXTENTRY(LABELMAXWIDTH + 1, 5, 16, 1, driver, 24)};static struct ctk_label screensaverlabel = {CTK_LABEL(0, 7, LABELMAXWIDTH, 1, "Screensaver")};static char screensaver[25];static struct ctk_textentry screensavertextentry = {CTK_TEXTENTRY(LABELMAXWIDTH + 1, 7, 16, 1, screensaver, 24)};static struct ctk_label ipaddrlabel = {CTK_LABEL(0, 9, LABELMAXWIDTH, 1, "IP address")};static char ipaddr[25];static struct ctk_textentry ipaddrtextentry = {CTK_TEXTENTRY(LABELMAXWIDTH + 1, 9, 16, 1, ipaddr, 24)};static struct ctk_label netmasklabel = {CTK_LABEL(0, 11, LABELMAXWIDTH, 1, "Netmask")};static char netmask[25];static struct ctk_textentry netmasktextentry = {CTK_TEXTENTRY(LABELMAXWIDTH + 1, 11, 16, 1, netmask, 24)};static struct ctk_label gatewaylabel = {CTK_LABEL(0, 13, LABELMAXWIDTH, 1, "Gateway")};static char gateway[25];static struct ctk_textentry gatewaytextentry = {CTK_TEXTENTRY(LABELMAXWIDTH + 1, 13, 16, 1, gateway, 24)};static struct ctk_label dnsserverlabel = {CTK_LABEL(0, 15, LABELMAXWIDTH, 1, "DNS server")};static char dnsserver[25];static struct ctk_textentry dnsservertextentry = {CTK_TEXTENTRY(LABELMAXWIDTH + 1, 15, 16, 1, dnsserver, 24)};static struct ctk_button savebutton = {CTK_BUTTON(0, 17, 12, "Save & close")};static struct ctk_button cancelbutton = {CTK_BUTTON(24, 17, 6, "Cancel")};PROCESS(configedit_process, "Configuration editor");/*-----------------------------------------------------------------------------------*/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 * __fastcall__copystr(char *dst, char *src, int len){ char *nt = nullterminate(src); strncpy(dst, src, len); return nt + 1;}/*-----------------------------------------------------------------------------------*/static char *loaddriver(char *str){ return copystr(driver, str, sizeof(driver));}/*-----------------------------------------------------------------------------------*/static char *loadtheme(char *str){ return copystr(theme, str, sizeof(theme));}/*-----------------------------------------------------------------------------------*/static char *loadcfs(char *str){ return copystr(cfs, str, sizeof(cfs));}/*-----------------------------------------------------------------------------------*/static char *loadscreensaver(char *str){ return copystr(screensaver, str, sizeof(screensaver));}/*-----------------------------------------------------------------------------------*/static char *ipaddrconf(char *str){ return copystr(ipaddr, str, sizeof(ipaddr));}/*-----------------------------------------------------------------------------------*/static char *netmaskconf(char *str){ return copystr(netmask, str, sizeof(netmask));}/*-----------------------------------------------------------------------------------*/static char *drconf(char *str){ return copystr(gateway, str, sizeof(gateway));}/*-----------------------------------------------------------------------------------*/static char *dnsconf(char *str){ return copystr(dnsserver, str, sizeof(dnsserver));}/*-----------------------------------------------------------------------------------*/static struct ptentry initparsetab[] = {{'n', loaddriver}, {'t', loadtheme}, {'c', loadcfs}, {'s', loadscreensaver}, {'i', ipaddrconf}, {'m', netmaskconf}, {'r', drconf}, {'d', dnsconf}, {'#', skipnewline}, /* Default action */ {0, skipnewline}};static voidinitscript(void){ char line[40], *lineptr; /* 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, initparsetab); } } cfs_close(f); return;}/*-----------------------------------------------------------------------------------*/static intmakeline(char *line, char c, char *str){ int len; len = strlen(str); line[0] = c; line[1] = ' '; strcpy(&line[2], str); line[2 + len] = '\n'; line[3 + len] = 0; return len + 3;}/*-----------------------------------------------------------------------------------*/static voidsavescript(void){ char line[40]; /* struct c64_fs_file f;*/ int f; f = cfs_open("@:config.cfg", CFS_WRITE); if(f == -1) { log_message("Could not open config.cfg", ""); return; } if(cfs[0] != 0) { cfs_write(f, line, makeline(line, 'c', cfs)); } if(theme[0] != 0) { cfs_write(f, line, makeline(line, 't', theme)); } if(driver[0] != 0) { cfs_write(f, line, makeline(line, 'n', driver)); } if(ipaddr[0] != 0) { cfs_write(f, line, makeline(line, 'i', ipaddr)); } if(netmask[0] != 0) { cfs_write(f, line, makeline(line, 'm', netmask)); } if(gateway[0] != 0) { cfs_write(f, line, makeline(line, 'r', gateway)); } if(dnsserver[0] != 0) { cfs_write(f, line, makeline(line, 'd', dnsserver)); } if(screensaver[0] != 0) { cfs_write(f, line, makeline(line, 's', screensaver)); } strcpy(line, ".\n\0\n\n\n"); cfs_write(f, line, strlen(line)); cfs_close(f); }/*-----------------------------------------------------------------------------------*/static voidquit_services(void){ /* cfs_init_init(NULL); ctk_draw_quit(); if(ek_service_find(&packetservice) == EK_ERR_OK) { ek_post(packetservice.id, EK_EVENT_REQUEST_EXIT, NULL); ek_service_reset(&packetservice); }*/}/*-----------------------------------------------------------------------------------*/PROCESS_THREAD(configedit_process, ev, data){ PROCESS_BEGIN(); /* Create window. */ ctk_window_new(&window, 32, 18, "Config editor"); CTK_WIDGET_ADD(&window, &cfslabel); CTK_WIDGET_ADD(&window, &cfstextentry); CTK_WIDGET_ADD(&window, &themelabel); CTK_WIDGET_ADD(&window, &themetextentry); CTK_WIDGET_ADD(&window, &driverlabel); CTK_WIDGET_ADD(&window, &drivertextentry); CTK_WIDGET_ADD(&window, &screensaverlabel); CTK_WIDGET_ADD(&window, &screensavertextentry); CTK_WIDGET_ADD(&window, &ipaddrlabel); CTK_WIDGET_ADD(&window, &ipaddrtextentry); CTK_WIDGET_ADD(&window, &netmasklabel); CTK_WIDGET_ADD(&window, &netmasktextentry); CTK_WIDGET_ADD(&window, &gatewaylabel); CTK_WIDGET_ADD(&window, &gatewaytextentry); CTK_WIDGET_ADD(&window, &dnsserverlabel); CTK_WIDGET_ADD(&window, &dnsservertextentry); CTK_WIDGET_ADD(&window, &savebutton); CTK_WIDGET_ADD(&window, &cancelbutton); CTK_WIDGET_FOCUS(&window, &cfstextentry); /* Fill the configuration strings with values from the current configuration */ initscript(); ctk_window_open(&window); while(1) { PROCESS_WAIT_EVENT(); if(ev == ctk_signal_button_activate) { if(data == &savebutton) { savescript(); quit_services(); ctk_window_close(&window); program_handler_load("config.prg", NULL); break; } else if(data == &cancelbutton) { ctk_window_close(&window); break; } } else if(ev == ctk_signal_window_close || ev == PROCESS_EVENT_EXIT) { ctk_window_close(&window); break; } } PROCESS_END();}/*-----------------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?