Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 36 → Rev 35

/shark/trunk/config/hconf/hconf
0,0 → 1,182
ELFŽ4dF4 (44€4€ÀÀôô€ô€€€—@—@ @ Ð Ð BÒÒ¨¨ /lib/ld-linux.so.2GNU%=%5:;! 7',89<4& 1/20
+&üÑ;ÀÒÄÒÈÒ%ÈÔ)ÌÔ1ÐÔ9LÑPÑTÑXÑ\Ñ`ÑdÑ hÑ
+¶BƒÀ“u¶B…Àu
+¿¹Cÿ9ÁtƒÄøhA¼ÿ5ÀÒèHüÿÿƒÄôjÿèîýÿÿ‹ŽƒÄôSèFƒÄ…Àt+ƒÄôSÿ5¨ãPh`¼ÿ5ÀÒèüÿÿƒÄ ƒÄôjþè³ýÿÿvƒ=¬ÐuƒÄüSh ¼ÿ5ÀÒèãûÿÿƒÄôjýè‰ýÿÿƒÄôSèˆ(è³ ƒÄôSè&ƒÄ …ÿt ƒÄôSèn&1Àeè[^_ÉАU‰åƒì WVS‹u‹] ‹…Àt ƒÄôPèRýÿÿƒÄ‰ß°ü¹ÿÿÿÿò®÷уÄôQè¸ûÿÿ‰ƒÄ…ÀtƒÄøSPèÅýÿÿ1À됸œÿÿÿeè[^_ÉÍvU‰åƒì WVS1Û;´Ð}<¿àÞ¾äލvƒÄø‹EPÿ6èûÿÿƒÄ…Àu ‰ø덴&ƒÇƒÆC;´Ð|Ñ1Àeè[^_ÉÍvU‰åƒìS‹]ƒÄôSè‘ÿÿÿƒÄ…ÀuZ¡´Ðƒø?PÁàǀäÞƒÄøSäÞPèÿÿÿ¡´ÐÁà‹U ‰àÞǀèÞǀìÞàÞÿ´Ðë‰ö1À‹]èÉÐU‰åƒì WVS1Û;¸Ð}4¿àâ1öƒÄø‹EPÿ¶àâè,úÿÿƒÄ…Àu‰øëƒÇ ƒÆ C;¸Ð|Ó1Àeè[^_ÉÍvU‰åƒì¡¸ÐƒøT@ÁàǀàâƒÄøÿuàâPèCþÿÿ¡¸Ð@Áàǀäâǀèâàâÿ¸Ðë ´&1ÀÉÃU‰åƒìS‹]ƒÄôj èèùÿÿ…Àu1Àë0ÇÇ@Ç@‹S…Òu‰Cë‰Ñ‹…Òuø‰¶‹]èÉÍvU‰åƒìS‹]ƒÄôj è”ùÿÿ…Àu1Àë,ÇÇ@Ç@‹S…Òu‰Cë ‰Ñ‹…Òuø‰‰ö‹]èÉÍvU‰åƒìS‹]ƒÄôj èDùÿÿ…Àu1Àë,Ç@Nj…Òu ‰ët&‰Ñ‹Q…Òu÷‰At&‹]èÉÍvU‰åƒì WVS‹]è“&…Àu
+ƒÄôSèxë+‰ö‰Æ¿
+½¹
+¸³þÿÿ덶ƒÄôSèSeè[^_ÉÍvU‰åƒì WVS1ۃÄôÿuè~þÿÿ‰EüƒÄ…Àu ¸áÿÿÿé ‰ö‹EüÇÇ@èG%…Àu
+¸àÿÿÿéçƒÄôPèüÿÿƒÄ…Àu=¸Üÿÿÿé͍v¸ÞÿÿÿéÀ¶¸Ýÿÿÿ鰍¶¸Ùÿÿÿ頍¶‹Uü‰B€H ëpt&‰Æ¿½¹ü¨ó¦u=ƒÄô‹EüPè%ýÿÿ‰ÃƒÄ…Ût˜è¯$…ÀtŸ€8"ušÇCƒÄø@PCPèûÿÿƒÄë…ÛtŒè3$ƒÄôCPèÓýÿÿƒÄ…Àuèk$‰Æ¿½¹
+ü¨ó¦…xÿÿÿ1Àeè[^_ÉÉöU‰åƒìWVSƒÄôÿuè@ýÿÿ‰EøƒÄ…Àu¸áÿÿÿéߍt&‹EøÇÇ@Ç@Ç@èù#‰Ã…Ûu
+¸àÿÿÿ騀;"t
+¸ßÿÿÿ陋EøÇ@ƒÄøCP‹EøƒÀPè1úÿÿÇEôÇEüèª#‰ÃƒÄ…Ûu
+‹Eø‰pÇEôè†"‰Ã…Û„ÿÿÿ‰Þ¿#½¹
+ü¨ó¦…ÿÿÿ‹Eü…Àtƒ}ôu ¸Ûÿÿÿ됍t&ƒÄôPè'öÿÿ1ÀeØ[^_ÉÐU‰åƒìVSƒÄôÿuè1ûÿÿ‰ÆƒÄ…öu¸Îÿÿÿéˍ¶Çè"…Àu¸Íÿÿÿ鬍´&€8"t ¸Éÿÿÿ閐ÇFƒÄø@PFPè;øÿÿèÂ!ƒÄ…Àu¸ÌÿÿÿëmƒÄøjPèÙøÿÿ‰ÃƒÄ…Ûu¸ËÿÿÿëR‰^è‘!€8"t è7!ƒÄôjèáóÿÿ‰CÆn‹CÆ@1Àë%€xtÇCƒÄø@PCPèÅ÷ÿÿ1À됸Êÿÿÿeè[^ÉÃU‰åƒìƒÄôÿuè;úÿÿ…ÀtÇ1Àë
+t&¸ÎÿÿÿÉÐU‰åì WVSƒÄôÿuè úÿÿ‰ÆƒÄ…öu
+ƒÄøjSè±÷ÿÿ‰ÇƒÄ…ÿu ¸Áÿÿÿéî‰ö‰~èd ‰Ã…Ût=jj
+jSèFóÿÿƒÄ‰F…Àu¶ƒÀÐu¶C…Àt ¸½ÿÿÿ鮉öè' ‰Ã…Ûu
+¸¾ÿÿÿé—jj
+jSèÿòÿÿƒÄ‰F…Àu¶ƒÀÐu¶C…Àt¸¼ÿÿÿëjèå‰Ã…Ûu¸»ÿÿÿëXjj
+t&ƒÄøh¼½ÿ5ÀÒèíÿÿƒÄƒÄüÿ3hͽÿ5ÀÒèíÿÿƒÄøÿ5ÀÒj
+èîÿÿƒÃFƒÄ ;5´Ð|†eè[^ÉАU‰åƒì‹E…ÀtÇ@ ƒÄøh Pè¾îÿÿÉÃU‰åƒì‹E…ÀtÇ@ƒÄøhPèšîÿÿÉÃU‰åƒì‹E…ÀtÇ@ ƒÄøh PèvîÿÿÉÃU‰åƒì‹E…ÀtÇ@ƒÄøhPèRîÿÿÉÃU‰åƒì‹E…ÀtÇ@ƒÄøhPè.îÿÿÉÃU‰åƒì‹E…ÀtÇ@ ƒÄøh Pè
+áÿÿƒÄ ƒøqt(ƒø
+„ªƒøté@ÿÿÿ=t=tBé-ÿÿÿ‹EìéՍt&‹…À„ÿÿÿ‰Ç¡ÄÐH9Eø} ÿEøéÿÿÿ‹Uü‹‰UüéóþÿÿvƒÄøW‹E ÿpèþÿÿ‰ÃƒÄ…Û„Ôþÿÿ‰ßƒ}øt ÿMøéÄþÿÿt&ƒÄø‹UüR‹E ÿpèÒýÿÿ‰EüƒÄé£þÿÿv‹U ‹B‹P‰ÁöB u ‹Gö@ t€Mì‹A‹@Æn‹E ‰x‹G‹@Æyéeþÿÿt&eØ[^_ÉÃU‰åì WVSƒÄøjjjjj¡ÈЃÀöPjj‹ÄЃÂý‰ÐÁèÂÁúRÿuèFõÿÿƒÄ0¡ÈЃÀöPj¡¼ÐƒÀP¡ÄЃÀý‰ÂÁêÐÁøÀÐPè•óÿÿ‰ÆƒÄôVè:ñÿÿƒÄ ƒÄôVèºßÿÿ‹U ‹BƒÄjj
+jÿpè£ÞÿÿƒÄ‰Ã½ÿÿÿƒÄôVèñÿÿƒÄüjjVèòÞÿÿƒÄ S‹E ÿphà¾VèÝßÿÿƒÄôVè¤ßÿÿƒÄ ƒÄôVèèÝÿÿƒÄôÿ5ÈÔè
+ßÿÿƒÄ ƒøqt"ƒø
+tƒøt뜍t&=t>=tI눃ÄüShí¾WèqßÿÿƒÄøW‹U ‹BƒÀPè~áÿÿƒÄ ƒÄôVè’Þÿÿ¸ë+‹E ;XŽGÿÿÿKéAÿÿÿ‹U ;Z5ÿÿÿCé/ÿÿÿ´&¥èþÿÿ[^_ÉÐU‰åƒìWVS1ö1ÿ‰}ü»‰]øöÃtƒË ]øöÃt1ÿöÃtfÇ ãƒÄô‹E ÿpèmúÿÿƒÄ…ÿu‰Ç…öu ‰þÇEü¡ÄУ¤ãƒÄô‹E ÿpè÷ƒÄô‹EPè§ïÿÿƒÄ ƒÄô‹EPè$Þÿÿ1ۃăÄô‹EüPjjW‹EPèÆøÿÿƒÄ ƒÄô‹EPè‹ÜÿÿƒÄôÿ5ÈÔè­ÝÿÿƒÄ ƒøqt(ƒø
+ƒÄøhRÀ闃ÄøhPÀ銃ÄøhPÀé}ƒÄühÀÙhTÀhÀÕè©ÕÿÿƒÄƒøu!ƒÄôhÀÙè”ØÿÿƒÄ…ÀtVƒÄøh^Àë@vhÚhÀÙh`ÀhÀÕègÕÿÿƒÄƒøu(ƒÄôhÀÙèRØÿÿƒÄ…ÀtƒÄøhÚƒÀPèÚ×ÿÿƒÄƒÄüShhÀÕèÔÿÿƒÄ…À…¹þÿÿƒÄôSèàÔÿÿ1À‹]èÉÐU‰åìS‹]ƒÄøhpÀSèýÓÿÿƒÄ…ÀuƒÄøj.SèÛÒÿÿƒÄ…ÀtƃÄøSÿÿÿSèqÕÿÿƒÄƒÄøhtÀSè`ÔÿÿƒÄôSèþÿÿ1À‹èþÿÿÉАU‰åƒìƒÄøhwÀÿuèºÔÿÿ£ÀރąÀtCǨãÆÀÚƒÄøhzÀhÀÚè»Ôÿÿ‹E £ÄÞÇÈÞÇÌÞ1Àë¸ÿÿÿÿÉÃU‰åƒìöÄÞt$ƒÄøh}Àÿ5ÀÒèBÒÿÿƒÄôÿ5ÀÒèTÒÿÿƒÄ ƒ=ÈÞtè³Òÿÿv¡ÌÞ£ÈÞÉÃU‰åƒìS¡ÈÞ…ÀtD£ÌÞÇÈÞöÄÞt"ƒÄüPh‡Àÿ5ÀÒèØÑÿÿƒÄôÿ5ÀÒèêÑÿÿ¡ÌÞéÃÄøhzÀjèáÓÿÿ‰ÃƒÄ…ÛuƒÄüÿ5ÀÞhhÀÚè@Òÿÿ‰Ã¡¨ãP‰¨ãƒÄöÄÞt'ƒÄü‰ÐPhŒÀÿ5ÀÒè^ÑÿÿƒÄôÿ5ÀÒèpÑÿÿƒÄ …ÛtlƒÄøhzÀhÀÚègÓÿÿ‰ÃƒÄ…Ût†€;#t€;"…ðƒÄøSh@Úè‚ÓÿÿƒÄƒÄøj"hAÚèÀÐÿÿƒÄ…À…‚ƒÄøh“ÀjèÓÿÿ‰ÃƒÄ…Ûu1öÄÞt!ƒÄøh‘Àÿ5ÀÒèÁÐÿÿƒÄôÿ5ÀÒèÓÐÿÿ1À鯃Äøh•Àh@Úè
+ÒÿÿƒÄøSh@ÚèüÑÿÿƒÄ ƒÄøj"hAÚè:ÐÿÿƒÄ…ÀtÆöÄÞt&ƒÄüh@Úh‡Àÿ5ÀÒèOÐÿÿƒÄôÿ5ÀÒèaÐÿÿ¸@Ú£ÌÞë8t&öÄÞt"ƒÄüSh‡Àÿ5ÀÒèÐÿÿƒÄôÿ5ÀÒè%Ðÿÿ‰Ìމ؋]èÉÃU‰åƒìƒÄôÿ5ÀÞètÑÿÿÉАU‰åƒìS»0у=0Ñÿt ‹ÿЃÃüƒ;ÿuô[ÉÃU‰åƒìÉÃU‰åƒìSè[ÃhèKÒÿÿ[ÉÃa filename must be supplied!
+-mcommand line error!
+
+error %i on line %i reading %s!
+
+no main menu found on %s file!
+booltristaterangesubmenuswitchchoiceseparatorendswitchcaseendchoicen0%iendmenutitleߜ œߜߜÀœmenucaptionmainVARIABLES TABLE
+---------------
+
+name: -%s-
+value: "%s"
+value: NO VALUE
+flags: 0x%04x
+ %s use <ESC> to exit, <ENTER> to enter/toggle,arrows keys to move%sy[%c] %sn<%c> %s %s (%s) %s ---> *********************** @@@¨À¨ ¨°¨à¨€¨Шªpª$ª`ª€ªPª(%c) %s %s : %8i%i %sà²вè²ø²Á²ð²#define %s 0
+#define %s 1
+#undef %s
+#define %s %s
+wt%s
+/* var %s %s */
+rt# by a script (do not edit by hand)
+at
+#
+# the following lines are generated
+# by a script (do not edit by hand)
+#
+
+#
+
+%s=%s
+.in.h.makrt#define %s %sym#undef %sn/* var %s %s */.in.hrt
+<<UNGET>><%s>[%i]
+" <Ñ $=/*
+ * This file is generated by a script
+ *
+ * (run hconf to change)
+ */
+
+Ì»(ˆ†¸‚
+ @Ñ`œ‰d‰8þÿÿo4‰ÿÿÿoðÿÿo¸ˆGCC: (GNU) 2.95.2 19991024 (release)GCC: (GNU) 2.95.2 19991024 (release)GCC: (GNU) 2.95.2 20000116 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000116 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000116 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000116 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000116 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000116 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000116 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000116 (Debian GNU/Linux)GCC: (GNU) 2.95.2 19991024 (release)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.bss.comment.noteô€ô# 1((7 ¸‚¸Ð?ˆ†ˆ0Gÿÿÿo¸ˆ¸zTþÿÿo4‰4 0c d‰d l l‰l 0u œ‰œ ` ~üŠü
+U ´Xúô€(¸‚ˆ†¸ˆ4‰d‰l‰ œ‰
+Ù èð gcc2_compiled.Letextcrtstuff.cp.3__DTOR_LIST__completed.4__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.11frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__hconf.cparse.cresolvshow.cwhichcolorblanks.105findprevwrite.cvisitcasevisitmenuwritevarwrite_hvarfoutwrite_hwrite_makread.cread_hvaluenamebuffertoken.cfinflagslasttokentokenstringshowtitlecaptionstrchr@@GLIBC_2.0newchoicefindvardone_tokenizer_normal_DYNAMICnextmenufindmenureadconfigin_etextstart_color__register_frame_info@@GLIBC_2.0showchoicewndparserangestrcmp@@GLIBC_2.0showtristate_fp_hwfprintf@@GLIBC_2.0endwinfflush@@GLIBC_2.0gettokeninit_pairnewmenu_shadownewvarBRnument_borderboxucolorlinenewcasereadconfigftell@@GLIBC_2.0_initscreen_defaultcolorBCvartableparsemenuparsetitle_initwriteconfigmakshowchoiceSCmalloc@@GLIBC_2.0_boxcolormenutableshowrange__deregister_frame_info@@GLIBC_2.0expandmenuparsetristatewrefreshcbreakstderr@@GLIBC_2.0showseparatorabort@@GLIBC_2.0nmax_startkeypadfgets@@GLIBC_2.0truncate@@GLIBC_2.0SRstrstr@@GLIBC_2.0NLparseboolparsemenufield__strtol_internal@@GLIBC_2.0noecho_endscreennewwinwaddchresolvmenuentriesfputc@@GLIBC_2.0mainmenu__bss_startmainparsesubmenuinitscrcur_term__libc_start_main@@GLIBC_2.0_titlecolorungettoken_settitledumpvariableswmoveputpstrcat@@GLIBC_2.0showsubmenudelwindata_startacs_mapwriteconfig_finifclose@@GLIBC_2.1showboolwgetchparsecaseshowrangewndnewmenuentryinit_tokenizerstdscrNCshowexit@@GLIBC_2.0parsesscanf@@GLIBC_2.0_edata_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endparseseparatorwclearCOLSmemset@@GLIBC_2.0expandcasefopen@@GLIBC_2.1wbkgdsetenteron_createwinshowmenuwclrtoeol_IO_stdin_usedstrtok@@GLIBC_2.0_inversecopystringsprintf@@GLIBC_2.0showmenuentriesparsecaption__data_startLINESparsechoice_borderboxdcolorhmessagewprintwnextvariable_box__gmon_start__strcpy@@GLIBC_2.0
\ No newline at end of file
/shark/trunk/config/hconf/old/ppp
0,0 → 1,792
/*
*
*
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
#include "hconf.h"
 
struct variable vartable[MAXVARIABLES];
long varhelp[MAXVARIABLES];
struct menu menutable[MAXMENUS];
 
#if 0
#define printd(fmt,args...) fprintf(stderr,fmt,##args)
#else
#define printd(fmt,args...)
#endif
 
struct menu *mainmenu=NULL;
char *caption=NULL;
 
/*
*
*/
 
int copystring(char **dstptr, char *src)
{
int sz;
if (*dstptr!=NULL) free(*dstptr);
sz=strlen(src)+1;
*dstptr=(char*)malloc(sz);
if (*dstptr==NULL) return -100;
strcpy(*dstptr,src);
return 0;
}
 
/*
*
*/
 
int nextvariable=0;
 
struct variable *findvar(char *s)
{
int i;
i=0;
while (i<nextvariable) {
if (!strcmp(vartable[i].name,s)) return vartable+i;
i++;
}
return NULL;
}
 
struct variable *newvar(char *s, int type)
{
/* safety test */
if (findvar(s)!=NULL) return NULL;
 
if (nextvariable>=MAXVARIABLES) return NULL;
vartable[nextvariable].name=NULL;
copystring(&vartable[nextvariable].name,s);
vartable[nextvariable].type=type;
vartable[nextvariable].value=NULL;
vartable[nextvariable].flags=0;
 
return vartable+nextvariable++;
}
 
/* -- */
 
int nextmenu=0;
 
struct menu *findmenu(char *s)
{
int i;
i=0;
while (i<nextmenu) {
if (!strcmp(menutable[i].name,s)) return menutable+i;
i++;
}
return NULL;
}
 
struct menu *newmenu(char *s)
{
if (nextmenu>=MAXMENUS) return NULL;
menutable[nextmenu].name=NULL;
copystring(&menutable[nextmenu].name,s);
menutable[nextmenu].title=NULL;
menutable[nextmenu].entries=NULL;
return menutable+nextmenu++;
}
 
/*
*
*
*
*/
 
struct _case *newcase(struct menuentry *menuent)
{
struct _case *c;
struct _case *n;
c=malloc(sizeof(struct _case));
if (c==NULL) return NULL;
c->next=NULL;
c->value=NULL;
c->list=NULL;
if (menuent->x._case.list==NULL) {
menuent->x._case.list=c;
return c;
}
n=menuent->x._case.list;
for (;;) {
if (n->next==NULL) {
n->next=c;
return c;
}
n=n->next;
}
}
 
struct choice *newchoice(struct menuentry *menuent)
{
struct choice *c;
struct choice *n;
c=malloc(sizeof(struct choice));
if (c==NULL) return NULL;
c->next=NULL;
c->text=NULL;
c->var=NULL;
if (menuent->x.choice.list==NULL) {
menuent->x.choice.list=c;
return c;
}
n=menuent->x.choice.list;
for (;;) {
if (n->next==NULL) {
n->next=c;
return c;
}
n=n->next;
}
}
 
struct menuentry *newmenuentry(struct menuentry **ptr)
{
struct menuentry *n;
struct menuentry *p;
n=malloc(sizeof(struct menuentry));
if (n==NULL) return NULL;
n->next=NULL;
n->type=0;
if (*ptr==NULL) {
*ptr=n;
return n;
}
p=*ptr;
for (;;) {
if (p->next==NULL) {
p->next=n;
return n;
}
p=p->next;
}
}
 
/*
*
*
*
*/
 
/*
*
*
*
*/
 
int parsebool(struct menuentry **ptr);
int parsetristate(struct menuentry **ptr);
int parserange(struct menuentry **ptr);
int parsesubmenu(struct menuentry **ptr);
int parsecase(struct menuentry **ptr);
int parsechoice(struct menuentry **ptr);
int parseseparator(struct menuentry **ptr);
 
int parsemenufield(struct menuentry **ptr)
{
char *s;
 
s=gettoken();
if (s==NULL) return -999;
 
if (!strcmp(s,"bool")) return parsebool(ptr);
if (!strcmp(s,"tristate")) return parsetristate(ptr);
if (!strcmp(s,"range")) return parserange(ptr);
if (!strcmp(s,"submenu")) return parsesubmenu(ptr);
if (!strcmp(s,"switch")) return parsecase(ptr);
if (!strcmp(s,"choice")) return parsechoice(ptr);
if (!strcmp(s,"separator")) return parseseparator(ptr);
 
return -333;
}
 
/* --- */
 
int parsecase(struct menuentry **ptr)
{
char *s;
struct menuentry *ent;
struct _case *cas=NULL;
struct variable *v;
int res;
 
printd("start parseswitch()\n");
 
ent=newmenuentry(ptr);
if (ent==NULL) return -31;
ent->type=CASEENTRY;
ent->x._case.list=NULL;
s=gettoken();
if (s==NULL) return -32;
v=findvar(s);
if (v==NULL) return -36;
ent->x._case.var=v;
v->flags|=FLAG_M;
 
for (;;) {
s=gettoken();
if (!strcmp(s,"endswitch")) break;
if (!strcmp(s,"case")) {
cas=newcase(ent);
if (cas==NULL) return -34;
s=gettoken();
if (s==NULL) return -35;
if (*s!='\"') return -35;
cas->value=NULL;
copystring(&cas->value,s+1);
continue;
}
 
if (cas==NULL) return -39;
 
ungettoken();
res=parsemenufield(&cas->list);
if (res) return res;
}
 
return 0;
}
 
int parsechoice(struct menuentry **ptr)
{
struct menuentry *ent;
struct choice *cho;
struct variable *v;
char *def;
int defdone;
char *s;
 
printd("start parsechoice()\n");
 
ent=newmenuentry(ptr);
if (ent==NULL) return -31;
ent->type=CHOICEENTRY;
ent->x.choice.list=NULL;
ent->x.choice.act=NULL;
ent->x.choice.numchoices=0;
 
s=gettoken();
if (s==NULL) return -32;
if (*s!='\"') return -33;
ent->x.choice.text=NULL;
copystring(&ent->x.choice.text,s+1);
 
defdone=0;
def=NULL;
s=gettoken();
if (s==NULL) return -39;
if (*s!='\"') {
copystring(&def,s);
} else
ungettoken();
 
for (;;) {
s=gettoken();
if (s==NULL) return -34;
if (!strcmp(s,"endchoice")) {
if (def==NULL||!defdone) return -37;
free(def);
break;
}
 
if (*s!='\"') return -38;
 
cho=newchoice(ent);
ent->x.choice.numchoices++;
if (cho==NULL) return -33;
cho->text=NULL;
copystring(&cho->text,s+1);
s=gettoken();
if (s==NULL) return -34;
v=newvar(s,CHOICEVAR);
if (v==NULL) return -37;
cho->var=v;
v->value=NULL;
copystring(&v->value,"n");
 
if (def==NULL) {
ent->x.choice.act=cho;
copystring(&def,s);
defdone=1;
} else if (!strcmp(def,s)) {
ent->x.choice.act=cho;
defdone=1;
}
}
 
return 0;
}
 
int parsebool(struct menuentry **ptr)
{
struct menuentry *ent;
struct variable *var;
char *s;
 
printd("start parsebool()\n");
 
ent=newmenuentry(ptr);
if (ent==NULL) return -50;
ent->type=BOOLENTRY;
 
s=gettoken();
if (s==NULL) return -51;
if (*s!='\"') return -55;
ent->x.bool.text=NULL;
copystring(&ent->x.bool.text,s+1);
s=gettoken();
if (s==NULL) return -52;
var=newvar(s,BOOLVAR);
if (var==NULL) return -53;
ent->x.bool.var=var;
 
s=gettoken();
if (*s!='\"') {
ungettoken();
var->value=(char *)malloc(2);
var->value[0]='n';
var->value[1]='\0';
return 0;
}
if (*(s+1)=='\0') return -54;
var->value=NULL;
copystring(&var->value,s+1);
 
return 0;
}
 
int parseseparator(struct menuentry **ptr)
{
struct menuentry *ent;
 
printd("start parseseparator()\n");
 
ent=newmenuentry(ptr);
if (ent==NULL) return -50;
ent->type=SEPARATORENTRY;
 
return 0;
}
 
int parserange(struct menuentry **ptr)
{
struct menuentry *ent;
struct variable *var;
char *s;
int v;
 
printd("start parserange()\n");
 
ent=newmenuentry(ptr);
if (ent==NULL) return -60;
ent->type=RANGEENTRY;
 
s=gettoken();
if (s==NULL) return -61;
if (*s!='\"') return -65;
ent->x.range.text=NULL;
copystring(&ent->x.range.text,s+1);
 
s=gettoken();
if (s==NULL) return -62;
var=newvar(s,RANGEVAR);
if (var==NULL) return -63;
ent->x.range.var=var;
 
s=gettoken();
if (s==NULL) return -66;
ent->x.range.minval=atoi(s);
if (ent->x.range.minval==0&&strcmp(s,"0")) return -67;
 
s=gettoken();
if (s==NULL) return -66;
ent->x.range.maxval=atoi(s);
if (ent->x.range.maxval==0&&strcmp(s,"0")) return -68;
 
s=gettoken();
if (s==NULL) return -69;
v=atoi(s);
if (v==0&&strcmp(s,"0")) {
ungettoken();
v=ent->x.range.minval;
}
 
{
char buffer[256];
sprintf(buffer,"%i",v);
var->value=NULL;
copystring(&var->value,buffer);
}
return 0;
}
 
int parsetristate(struct menuentry **ptr)
{
struct menuentry *ent;
struct variable *var;
char *s;
 
printd("start parsetristate()\n");
 
ent=newmenuentry(ptr);
if (ent==NULL) return -50;
ent->type=TRISTATEENTRY;
 
s=gettoken();
if (s==NULL) return -51;
if (*s!='\"') return -55;
ent->x.tristate.text=NULL;
copystring(&ent->x.tristate.text,s+1);
 
s=gettoken();
if (s==NULL) return -52;
var=newvar(s,TRISTATEVAR);
if (var==NULL) return -53;
ent->x.tristate.var=var;
 
s=gettoken();
if (*s!='\"') {
ungettoken();
var->value=(char *)malloc(2);
var->value[0]='n';
var->value[1]='\0';
return 0;
}
if (*(s+1)=='\0') return -54;
var->value=NULL;
copystring(&var->value,s+1);
 
return 0;
}
 
int parsesubmenu(struct menuentry **ptr)
{
struct menuentry *ent;
char *s;
 
printd("start parsesubmenu()\n");
 
ent=newmenuentry(ptr);
if (ent==NULL) return -40;
ent->type=SUBMENUENTRY;
s=gettoken();
if (s==NULL) return -41;
if (*s!='\"') return -43;
ent->x.submenu.text=NULL;
copystring(&ent->x.submenu.text,s+1);
 
s=gettoken();
if (s==NULL) return -42;
ent->x.submenu.menuname=NULL;
ent->x.submenu.menu=NULL;
copystring(&ent->x.submenu.menuname,s);
 
return 0;
}
 
int parsetitle(struct menu *ptr)
{
char *s;
 
printd("start parsetitle()\n");
 
s=gettoken();
if (s==NULL) return -71;
ptr->title=NULL;
copystring(&ptr->title,s+1);
return 0;
}
 
int parsecaption(void)
{
char *s;
 
printd("start parsecaption()\n");
 
s=gettoken();
if (s==NULL) return -91;
caption=NULL;
copystring(&caption,s+1);
return 0;
}
 
int parsemenu(void)
{
struct menu *ptr;
char *s;
int ret;
 
printd("start parsemenu()\n");
ret=0;
 
s=gettoken();
if (s==NULL) return -12;
ptr=newmenu(s);
if (ptr==NULL) return -15;
 
for (;;) {
s=gettoken();
if (!strcmp(s,"endmenu")) return 0;
 
if (!strcmp(s,"title")) {
ret=parsetitle(ptr);
if (ret) return ret;
continue;
}
 
ungettoken();
ret=parsemenufield(&ptr->entries);
if (ret) break;
}
 
return ret;
}
 
/*
*
*/
 
int resolvmenuentries(struct menuentry *ptr)
{
struct _case *ca;
int res,i;
 
while (ptr!=NULL) {
switch(ptr->type) {
case BOOLENTRY:
break;
case TRISTATEENTRY:
break;
case SUBMENUENTRY:
ptr->x.submenu.menu=findmenu(ptr->x.submenu.menuname);
if (ptr->x.submenu.menu==NULL) return -10;
break;
case CHOICEENTRY:
break;
case CASEENTRY:
ca=ptr->x._case.list;
i=1;
while (ca!=NULL) {
res=resolvmenuentries(ca->list);
if (res) return res;
ca=ca->next;
i++;
}
break;
}
ptr=ptr->next;
}
 
return 0;
}
 
static int resolv(void)
{
int res,i;
 
i=0;
while (i<nextmenu) {
res=resolvmenuentries(menutable[i].entries);
if (res) return res;
i++;
}
 
return 0;
}
 
/*
*
*/
 
int parse(void)
{
char *s;
int ret;
ret=0;
while ((s=gettoken())!=NULL) {
if (!strcmp(s,"menu")) ret=parsemenu();
else if (!strcmp(s,"caption")) ret=parsecaption();
else ret=-1;
if (ret) break;
}
return ret;
}
 
int parsehelp(char *filename)
{
char buffer[256];
FILE *fin;
fin=fopen(filename,"rt");
if (fin==NULL) return 0;
 
fclose(fin);
}
 
int readconfigin(char *filename)
{
char buffer[256];
char *ptr;
int res,i;
 
for (i=0;i<MAXVARIABLES;i++)
varhelp[i]=0;
res=init_tokenizer(filename,0x01);
if (res) return res;
 
res=parse();
if (res) return res;
 
res=done_tokenizer();
if (res) return res;
 
res=resolv();
if (res) return res;
 
mainmenu=findmenu("main");
if (mainmenu==NULL) return -97;
 
/* -- */
ptr=strstr(filename,".in");
if (ptr!=NULL) *ptr='\0';
else {
ptr=strchr(filename,'.');
if (ptr!=NULL) *ptr='\0';
}
 
strcpy(buffer,filename);
strcat(buffer,".hlp");
 
res=parsehelp(buffer);
if (res) return res;
return 0;
}
 
/*
*
*
*
*/
 
void dumpvariables(void)
{
int i;
 
fprintf(stderr,"VARIABLES TABLE\n---------------\n\n");
i=0;
while (i<nextvariable) {
fprintf(stderr,"name: -%s-\n",vartable[i].name);
if (vartable[i].value!=NULL)
fprintf(stderr,"value: \"%s\"\n",vartable[i].value);
else
fprintf(stderr,"value: NO VALUE\n");
fprintf(stderr,"flags: 0x%04x\n",vartable[i].flags);
fputc('\n',stderr);
i++;
}
}
 
#if 0
 
void dumpmenuentrytype(struct menuentry *ptr,char *s)
{
fprintf(stderr,"%s entry type : ",s);
switch(ptr->type) {
case BOOLENTRY: fprintf(stderr,"bool\n"); break;
case SUBMENUENTRY: fprintf(stderr,"submenu\n"); break;
case TRISTATEENTRY: fprintf(stderr,"tristate\n"); break;
case CHOICEENTRY: fprintf(stderr,"choice\n"); break;
case CASEENTRY: fprintf(stderr,"case\n"); break;
default: fprintf(stderr,"unknown\n"); break;
}
}
 
void dumpmenuentries(struct menuentry *ptr,int x)
{
struct choice *cho;
struct _case *ca;
char blanks[64];
int i;
memset(blanks,' ',sizeof(blanks));
blanks[x-1]='\0';
while (ptr!=NULL) {
dumpmenuentrytype(ptr,blanks);
switch(ptr->type) {
case BOOLENTRY:
fprintf(stderr,"%s text : '%s'\n",blanks,ptr->x.bool.text);
fprintf(stderr,"%s variable : %s\n",blanks,ptr->x.bool.var->name);
break;
case TRISTATEENTRY:
fprintf(stderr,"%s text : '%s'\n",blanks,ptr->x.tristate.text);
fprintf(stderr,"%s variable : %s\n",blanks,ptr->x.tristate.var->name);
break;
case SUBMENUENTRY:
fprintf(stderr,"%s text : '%s'\n",blanks,ptr->x.submenu.text);
fprintf(stderr,"%s submenu : %s\n",blanks,ptr->x.submenu.menu->name);
break;
case CHOICEENTRY:
fprintf(stderr,"%s text : '%s'\n",blanks,ptr->x.choice.text);
fprintf(stderr,"%s def variable: %s\n",blanks,ptr->x.choice.act->var->name);
i=1;
cho=ptr->x.choice.list;
while (cho!=NULL) {
fprintf(stderr,"%s text %i : '%s'\n",blanks,i,cho->text);
fprintf(stderr,"%s variable %i : %s\n",blanks,i,cho->var->name);
i++;
cho=cho->next;
}
break;
case CASEENTRY:
fprintf(stderr,"%s variable : %s\n",blanks,ptr->x._case.var->name);
fputc('\n',stderr);
ca=ptr->x._case.list;
i=1;
while (ca!=NULL) {
fprintf(stderr,"%s value %i : '%s'\n",blanks,i,ca->value);
dumpmenuentries(ca->list,x+2);
ca=ca->next;
i++;
}
break;
}
fputc('\n',stderr);
ptr=ptr->next;
}
}
 
void dumpmenus(void)
{
int i;
 
fprintf(stderr,"MENUS TABLE\n-----------\n\n");
i=0;
while (i<nextmenu) {
fprintf(stderr,"name: %s\n",menutable[i].name);
fprintf(stderr,"text: '%s'\n",menutable[i].comment);
fputc('\n',stderr);
dumpmenuentries(menutable[i].entries,2);
//fputc('\n',stderr);
i++;
}
}
#endif
 
 
/shark/trunk/config/hconf/old/shower.c
0,0 → 1,817
/*
*
*
*/
 
#include <stdio.h>
#include <stdlib.h>
 
 
/* per sleep() */
#include <unistd.h>
 
 
#if defined(USE_NCURSES)
#include <curses.h>
#elif defined(USE_CONIO)
#include <conio.o>
#else
#error USE_NCURSES or USE_CONIO must be defined
#endif
 
#include "hconf.h"
 
/*
*
* CONIO
*
*/
 
#ifdef USE_CONIO
 
#define DEFAULT_BG BLUE
 
#define NORMAL_FG WHITE
#define NORMAL_BG BLUE
 
#define INVERSE_FG BLACK
#define INVERSE_BG RED
 
/* -- */
 
struct text_info info;
 
void _initscreen(void)
{
textbackground(DEFAULT_BG);
clrscr();
gettextinfo(&info);
}
 
void _endscreen(void)
{
clrscr();
}
 
static __inline__ int _cols(void)
{
return info.screenwidth;
}
 
static __inline__ int _rows(void)
{
return info.screenheight;
}
 
int _gotorc(int r, int c)
{
/* zero based */
gotoxy(c,r);
}
 
#define _printw(fmt,args...) cprintf(fmt,##args)
#define _refresh()
 
void _normal(void)
{
textbackground(NORMAL_BG);
textcolor(NORMAL_FG);
}
 
#endif
 
/*
*
* NCURSES
*
*/
 
#ifdef USE_NCURSES
 
// with bold
#define DEFAULT_FG COLOR_CYAN
#define DEFAULT_BG COLOR_BLUE
 
#define NORMAL_FG COLOR_BLACK
#define NORMAL_BG COLOR_WHITE
 
// with bold
#define INVERSE_FG COLOR_WHITE
#define INVERSE_BG COLOR_BLUE
 
//with bold
#define BOX_BORDERFGU COLOR_WHITE
#define BOX_BORDERBGU COLOR_WHITE
 
#define BOX_BORDERFGD COLOR_BLACK
#define BOX_BORDERBGD COLOR_WHITE
 
#define BOX_FG COLOR_BLACK
#define BOX_BG COLOR_WHITE
 
#define SHADOW_FG COLOR_BLACK
#define SHADOW_BG COLOR_BLACK
 
#define TITLE_FG COLOR_YELLOW
#define TITLE_BG COLOR_WHITE
 
#define _KEY_OK 0x1b
#define _KEY_DOWN KEY_DOWN
#define _KEY_UP KEY_UP
#define _KEY_TOGGLE 0x0a
 
/* -- */
 
#define _BACKGROUND 1
#define _NORMAL 2
#define _INVERSE 3
#define _BORDERBOXU 4
#define _BORDERBOXD 5
#define _BOX 6
#define _SHADOW 7
#define _TITLE 8
#define _DEFAULT 9
 
#define STDWIN stdscr
 
/* (U-upper,L-lower) (L-left,R-right) */
#define _UL ACS_BSSB
#define _LL ACS_SSBB
#define _UR ACS_BBSS
#define _LR ACS_SBBS
#define _HH ACS_BSBS
#define _VV ACS_SBSB
 
void _defaultcolor(WINDOW *w)
{
wattrset(w,COLOR_PAIR(_DEFAULT)|A_BOLD);
wbkgdset(w,COLOR_PAIR(_DEFAULT)|A_BOLD);
}
 
void _normal(WINDOW *w)
{
wattrset(w,COLOR_PAIR(_NORMAL));
wbkgdset(w,COLOR_PAIR(_NORMAL));
}
 
void _inverse(WINDOW *w)
{
wattrset(w,COLOR_PAIR(_INVERSE)|A_BOLD);
wbkgdset(w,COLOR_PAIR(_INVERSE)|A_BOLD);
}
 
void _shadow(WINDOW *w)
{
wattrset(w,COLOR_PAIR(_SHADOW));
wbkgdset(w,COLOR_PAIR(_SHADOW));
}
 
void _boxcolor(WINDOW *w)
{
wattrset(w,COLOR_PAIR(_BOX));
wbkgdset(w,COLOR_PAIR(_BOX));
}
 
void _titlecolor(WINDOW *w)
{
wattrset(w,COLOR_PAIR(_TITLE)|A_BOLD);
wbkgdset(w,COLOR_PAIR(_TITLE)|A_BOLD);
}
 
void _borderboxucolor(WINDOW *w)
{
wattrset(w,COLOR_PAIR(_BORDERBOXU)|A_BOLD);
wbkgdset(w,COLOR_PAIR(_BORDERBOXU)|A_BOLD);
}
 
void _borderboxdcolor(WINDOW *w)
{
wattrset(w,COLOR_PAIR(_BORDERBOXD));
wbkgdset(w,COLOR_PAIR(_BORDERBOXD));
}
 
void _initscreen(void)
{
initscr();
start_color();
init_pair(_BACKGROUND,DEFAULT_BG,DEFAULT_BG);
init_pair(_DEFAULT,DEFAULT_FG,DEFAULT_BG);
init_pair(_NORMAL,NORMAL_FG,NORMAL_BG);
init_pair(_INVERSE,INVERSE_FG,INVERSE_BG);
init_pair(_BORDERBOXU,BOX_BORDERFGU,BOX_BORDERBGU);
init_pair(_BORDERBOXD,BOX_BORDERFGD,BOX_BORDERBGD);
init_pair(_BOX,BOX_FG,BOX_BG);
init_pair(_SHADOW,SHADOW_FG,SHADOW_BG);
init_pair(_TITLE,TITLE_FG,TITLE_BG);
bkgdset(COLOR_PAIR(_BACKGROUND));
clear();
cbreak(); /* input one char at time (don't wait for \n) */
noecho();
keypad(stdscr,TRUE);
_normal(stdscr);
refresh();
}
 
void _endscreen(void)
{
endwin();
}
 
static __inline__ int _cols(void)
{
return COLS;
}
 
static __inline__ int _rows(void)
{
return LINES;
}
 
static __inline__ void _gotorc(WINDOW *w,int r, int c)
{
/* zero based */
wmove(w,r,c);
}
 
#define _printw(w,fmt,args...) wprintw(w,fmt,##args)
 
void _refresh(WINDOW *w)
{
wrefresh(w);
}
 
WINDOW *_createwin(int str, int stc, int lines, int cols)
{
WINDOW *wnd;
wnd=newwin(lines,cols,str,stc);
if (wnd!=NULL) {
//wbkgdset(wnd,COLOR_PAIR(_BACKGROUND));
//wclear(wnd);
//_normal(wnd);
}
return wnd;
}
 
#define _deletewin(w) delwin(w)
 
#define _putch(w,c) waddch(w,c)
#define _getch() getch()
#define _clreol(w) wclrtoeol(w)
#define _clrscr(w) wclear(w)
 
#define _bell() addch('\07');
 
#endif
 
/*
*
*
*
*/
 
static void whichcolor(WINDOW *wnd, int up, int inv)
{
if (((inv==1)&&(up==1))||((inv==0)&&(up==0))) _borderboxdcolor(wnd);
else _borderboxucolor(wnd);
}
 
void _settitle(WINDOW *wnd,
int sy, int sx,
int lines, int cols,
int bordy, int bordx,
char *title,
int shad, int inv)
{
int x;
 
sx-=bordx+1;
sy-=bordy+1;
cols+=2*(bordx+1);
lines+=2*(bordy+1);
 
whichcolor(wnd,1,inv);
_gotorc(wnd,sy,sx+1);
for (x=0;x<cols-2;x++) _putch(wnd,_HH);
 
if (title!=NULL) {
_titlecolor(wnd);
_gotorc(wnd,sy,sx+(cols-strlen(title)-2)/2);
_printw(wnd," %s ",title);
 
_normal(wnd);
_gotorc(wnd,sy+2,sx+2);
_printw(wnd,"use <ESC> to exit, <ENTER> to enter/toggle,");
_gotorc(wnd,sy+3,sx+2);
_printw(wnd,"arrows keys to move");
}
 
 
_refresh(wnd);
}
 
void _box(WINDOW *wnd,
int sy, int sx,
int lines, int cols,
int bordy, int bordx,
char *title,
int shad, int inv)
{
int x,y;
 
sx-=bordx+1;
sy-=bordy+1;
cols+=2*(bordx+1);
lines+=2*(bordy+1);
 
{
char blanks[180];
memset(blanks,' ',sizeof(blanks));
blanks[cols]='\0';
_boxcolor(wnd);
for (y=0;y<lines;y++) {
_gotorc(wnd,sy+y,sx);
_printw(wnd,"%s",blanks);
}
}
 
whichcolor(wnd,1,inv);
_gotorc(wnd,sy,sx);
_putch(wnd,_UL);
for (x=0;x<cols-2;x++) _putch(wnd,_HH);
whichcolor(wnd,0,inv);
_putch(wnd,_UR);
 
for (y=1;y<lines-1;y++) {
whichcolor(wnd,1,inv);
_gotorc(wnd,sy+y,sx);
_putch(wnd,_VV);
whichcolor(wnd,0,inv);
_gotorc(wnd,sy+y,sx+cols-1);
_putch(wnd,_VV);
if (shad) {
_shadow(wnd);
_putch(wnd,' ');
_putch(wnd,' ');
}
}
 
whichcolor(wnd,1,inv);
_gotorc(wnd,sy+lines-1,sx);
_putch(wnd,_LL);
whichcolor(wnd,0,inv);
for (x=0;x<cols-2;x++) _putch(wnd,_HH);
_putch(wnd,_LR);
if (shad) {
_shadow(wnd);
_putch(wnd,' ');
_putch(wnd,' ');
}
 
if (shad) {
_shadow(wnd);
_gotorc(wnd,sy+lines,sx+1);
for (x=0;x<cols+1;x++) _putch(wnd,' ');
}
 
sx+=bordx+1;
sy+=bordy+1;
cols-=2*(bordx+1);
lines-=2*(bordy+1);
 
_settitle(wnd,sy,sx,lines,cols,bordy,bordx,title,shad,inv);
 
/* refresh made by _settitle() */
}
 
void showtitle(char *s);
 
/* -- */
 
 
void showbol(WINDOW *wnd, struct menuentry *ptr)
{
struct variable *var;
char ch;
var=ptr->x.bool.var;
if (!strcmp(var->value,"y")) ch='*';
else ch=' ';
_printw(wnd,"[%c] %s",ch,ptr->x.bool.text);
_normal(wnd);
_clreol(wnd);
}
 
void showtristate(WINDOW *wnd, struct menuentry *ptr)
{
struct variable *var;
char ch;
var=ptr->x.bool.var;
if (!strcmp(var->value,"y")) ch='*';
else if (!strcmp(var->value,"n")) ch=' ';
else ch='M';
_printw(wnd,"<%c> %s",ch,ptr->x.bool.text);
_normal(wnd);
_clreol(wnd);
}
 
void showchoice(WINDOW *wnd, struct menuentry *ptr)
{
_printw(wnd," %s (%s)",ptr->x.choice.text,ptr->x.choice.act->text);
_normal(wnd);
_clreol(wnd);
}
 
void showsubmenu(WINDOW *wnd, struct menuentry *ptr)
{
_printw(wnd," %s --->",ptr->x.submenu.text);
_normal(wnd);
_clreol(wnd);
}
 
/* -- */
 
int nmax; // numero linee massimo
 
void showmenuentries(WINDOW *wnd,struct menuentry *ptr, int r, int c, int rcur)
{
int i;
 
i=0;
while (ptr!=NULL) {
_gotorc(wnd,r,c);
if (r==rcur) _inverse(wnd);
else _normal(wnd);
r++;
switch(ptr->type) {
case BOOLENTRY:
showbol(wnd,ptr);
break;
case TRISTATEENTRY:
showtristate(wnd,ptr);
break;
case CHOICEENTRY:
showchoice(wnd,ptr);
break;
case SUBMENUENTRY:
showsubmenu(wnd,ptr);
break;
default:
_printw(wnd,"@@@");
break;
}
ptr=ptr->n;
i++;
if (i==nmax) return;
}
}
 
/* --- */
 
struct menuentry *expandcase(struct menuentry *menuent);
struct menuentry *expandmenu(struct menuentry *menuent);
 
struct menuentry *expandcase(struct menuentry *menuent)
{
struct _case *list;
list=menuent->x._case.list;
while (list!=NULL) {
if (!strcmp(list->value,menuent->x._case.var->value)) {
return expandmenu(list->list);
}
list=list->next;
}
return NULL;
}
 
int nument;
 
struct menuentry *expandmenu(struct menuentry *menuent)
{
struct menuentry *start,*ptr,*ent,*prev,*p;
int ne;
 
ne=0;
ptr=menuent;
prev=NULL;
start=NULL;
while (ptr!=NULL) {
switch(ptr->type) {
 
case CASEENTRY:
ent=expandcase(ptr);
if (ent==NULL) {
if (prev!=NULL) prev->n=ptr->next;
ptr=ptr->next;
break;
}
if (start==NULL) start=ent;
 
if (prev!=NULL) prev->n=ent;
ent->p=prev;
p=ent;
while (p->n!=NULL) p=p->n;
p->n=ptr->next;
 
prev=p;
ptr=ptr->next;
break;
 
default:
if (start==NULL) start=ptr;
ne++;
 
ptr->p=prev;
ptr->n=ptr->next;
prev=ptr;
ptr=ptr->next;
break;
}
}
 
nument+=ne;
return start;
}
 
/* -- */
 
#define MUSTREDISPLAY 0x01
#define MUSTREBUILD 0x02
 
int showmenu(WINDOW *wnd, struct menu *menu);
int showchoicewnd(WINDOW *wnd, struct menuentry *menu);
 
int enteron(WINDOW *wnd,struct menuentry *ptr)
{
struct variable *var;
 
switch(ptr->type) {
 
case BOOLENTRY:
var=ptr->x.bool.var;
if (*var->value=='y') *var->value='n';
else *var->value='y';
if (var->flags&FLAG_M) return MUSTREBUILD;
break;
 
case TRISTATEENTRY:
var=ptr->x.tristate.var;
if (*var->value=='y') *var->value='n';
else if (*var->value=='n') *var->value='m';
else *var->value='y';
if (var->flags&FLAG_M) return MUSTREBUILD;
break;
 
case CHOICEENTRY:
return showchoicewnd(wnd,ptr)|MUSTREDISPLAY;
 
case SUBMENUENTRY:
return showmenu(wnd,ptr->x.submenu.menu)|MUSTREDISPLAY;
 
default:
_bell();
break;
}
 
return 0;
}
 
/* --- */
 
int SC=9;
int SR=9;
int NL=36;
int NC=61;
int BR=0;
int BC=4;
 
/* --- */
 
/* sigh :-( */
static struct choice *findprev(struct choice *list, struct choice *cur)
{
struct choice *c,*p;
c=list;
p=NULL;
while (c!=NULL) {
if (c==cur) return p;
p=c;
c=c->next;
}
return NULL;
}
 
int showchoicewnd(WINDOW *wnd, struct menuentry *ent)
{
struct choice *first; // first menuentry of the list
struct choice *cur; // selected menuentry
struct choice *fline; // menuentry to show on the first line
struct choice *p;
int ch;
int rcur;
int i,r,c;
int ret;
 
ret=MUSTREDISPLAY;
 
first=fline=cur=ent->x.choice.list;
rcur=0;
 
showtitle(ent->x.choice.text);
_clrscr(wnd);
for (;;) {
r=c=0;
 
p=fline;
i=0;
while (p!=NULL) {
_gotorc(wnd,r,c);
if (r==rcur) _inverse(wnd);
else _normal(wnd);
r++;
 
_printw(wnd,"(%c) %s",p==ent->x.choice.act?'X':' ',p->text);
_clreol(wnd);
p=p->next;
i++;
if (i==nmax) break;
}
 
_refresh(wnd);
 
ch=getch();
switch (ch) {
 
case _KEY_OK:
return ret;
 
case _KEY_DOWN:
if (cur->next==NULL) break;
cur=cur->next;
if (rcur<NL-1) {
rcur++;
break;
}
fline=fline->next;
break;
 
case _KEY_UP:
p=findprev(ent->x.choice.list,cur);
if (p==NULL) break;
cur=p;
if (rcur!=0) {
rcur=rcur--;
break;
}
fline=findprev(ent->x.choice.list,fline);
break;
 
case _KEY_TOGGLE:
if ((ent->x.choice.act->var->flags&FLAG_M)||(cur->var->flags&FLAG_M))
ret|=MUSTREBUILD;
*(ent->x.choice.act->var->value)='n';
ent->x.choice.act=cur;
*(ent->x.choice.act->var->value)='y';
break;
}
}
}
 
int showmenu(WINDOW *wnd, struct menu *menu)
{
struct menuentry *first; // first menuentry of the list
struct menuentry *cur; // selected menuentry
struct menuentry *fline; // menuentry to show on the first line
int redo;
int ch;
int rcur;
int ret;
 
first=fline=cur=NULL;
rcur=0;
redo=1;
ret=MUSTREDISPLAY;
 
for (;;) {
if (redo&MUSTREBUILD) redo|=MUSTREDISPLAY;
ret|=redo;
if (redo&MUSTREBUILD) {
fline=NULL;
}
if (redo&MUSTREDISPLAY) {
nument=0;
first=expandmenu(menu->entries);
if (fline==NULL) {
fline=first;
if (cur==NULL) {
cur=fline;
rcur=0;
}
}
nmax=NL;
showtitle(menu->title);
_normal(wnd);
_clrscr(wnd);
redo=0;
}
showmenuentries(wnd,fline,0,0,rcur);
_refresh(wnd);
 
ch=getch();
switch (ch) {
 
case _KEY_OK:
return ret;
 
case _KEY_DOWN:
if (cur->n==NULL) break;
cur=cur->n;
if (rcur<NL-1) {
rcur++;
break;
}
fline=fline->n;
break;
 
case _KEY_UP:
if (cur->p==NULL) break;
cur=cur->p;
if (rcur!=0) {
rcur=rcur--;
break;
}
fline=fline->p;
break;
 
case _KEY_TOGGLE:
redo=enteron(wnd,cur);
break;
 
default:
/*
_normal(STDWIN);
_gotorc(STDWIN,0,0);
_printw(STDWIN,"%04x",ch);
_refresh(STDWIN);
*/
}
}
 
}
 
void showtitle(char *s)
{
_settitle(STDWIN,SR-6,SC-2,NL+8,NC+4,BR,BC,s,1,0);
}
 
/*
*
*/
 
int show(void)
{
WINDOW *wnd;
int i;
 
_initscreen();
 
SC=9;
SR=9;
NL=_rows()-5-SR-BR*2;
NC=_cols()-2-SC-BC*2;
BR=0;
BC=4;
 
_defaultcolor(STDWIN);
_gotorc(STDWIN,0,0);
_printw(STDWIN," Hartik4 (Lego) version 4.0pre1 - Configuration");
_gotorc(STDWIN,1,1);
for (i=0;i<_cols()-2;i++) _putch(STDWIN,_HH);
 
_box(STDWIN,SR-6,SC-2,NL+8,NC+4,BR,BC,NULL,1,0);
_box(STDWIN,SR,SC,NL,NC,BR,BC,NULL,0,1);
wnd=_createwin(SR,SC,NL,NC);
 
 
 
 
 
 
 
//showmenu(wnd,mainmenu);
 
 
 
 
 
_endscreen();
 
return 0;
}