bitchx/bx-conf/file_cpy.c

1296 lines
40 KiB
C

/*
* Program source is Copyright 1998 Colten Edwards.
* Written specifically for configuring BitchX config.h
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#ifdef __EMX__
#include <sys/types.h>
#endif
#include <ncurses.h>
#include "ds_cell.h"
#include "ds_keys.h"
#include "func_pr.h"
extern int mapcolors;
/*extern _DS_CONFIG config;*/
extern int desc_changed;
/* Default answer replies for yes/no prompts*/
_default default_answer[5] = {
{'Y', TRUE},
{'N', FALSE},
{13, FALSE},
{27, FALSE},
{'\0', FALSE}
};
#define YN_ROW 18
#define YN_COL 5
#define PATHCOL 9
#define MAXLEN 280
/* Some local function prototypes */
int update_select(CELL *c);
char *fmt_long(unsigned long int val);
int main_dir (CELL *c);
int compile_dir (CELL *c);
int edit_dir (CELL *c);
int flood_dir (CELL *c);
int userlist_dir (CELL *c);
int toggle_select (CELL *c);
int edit_enter (CELL *c);
int save_file (CELL *c);
int exit_program(CELL *c);
int dcc_dir (CELL *c);
int server_dir (CELL *c);
int various_dir (CELL *c);
int load_dir (CELL *c);
#define USER_PATH 20
#define TOGGLE_FILES 21
#define NONE_TYPE 0
#define BOOL_TYPE 1
#define INT_TYPE 2
#define STR_TYPE 3
/* Function Table for file routines */
struct FuncTable file_cpy_table[] = {
{LS_END , ls_end},
{LS_HOME , ls_home},
{LS_PGUP , ls_pgup},
{LS_PGDN , ls_pgdn},
{CURSOR_UP , cursor_up},
{CURSOR_DN , cursor_dn},
{LS_QUIT , ls_quit},
{WRAP_CURSOR_UP , NULL},
{WRAP_CURSOR_DN , NULL},
{DO_SHELL , NULL},
{LS_ENTER , update_select },
{UPFUNC , NULL },
{TOGGLE , NULL },
{PLUS_IT , plus_it},
{MINUS_IT , minus_it},
{0 , NULL}};
struct FuncTable compile_cpy_table[] = {
{LS_END , ls_end},
{LS_HOME , ls_home},
{LS_PGUP , ls_pgup},
{LS_PGDN , ls_pgdn},
{CURSOR_UP , cursor_up},
{CURSOR_DN , cursor_dn},
{LS_QUIT , ls_quit},
{WRAP_CURSOR_UP , NULL},
{WRAP_CURSOR_DN , NULL},
{DO_SHELL , NULL},
{LS_ENTER , toggle_select },
{UPFUNC , NULL },
{TOGGLE , NULL },
{PLUS_IT , plus_it},
{MINUS_IT , minus_it},
{0 , NULL}};
struct FuncTable edit_cpy_table[] = {
{LS_END , ls_end},
{LS_HOME , ls_home},
{LS_PGUP , ls_pgup},
{LS_PGDN , ls_pgdn},
{CURSOR_UP , cursor_up},
{CURSOR_DN , cursor_dn},
{LS_QUIT , ls_quit},
{WRAP_CURSOR_UP , NULL},
{WRAP_CURSOR_DN , NULL},
{DO_SHELL , NULL},
{LS_ENTER , edit_enter },
{0 , NULL}};
/* Menu Table for File routines */
struct KeyTable file_cpy_menu[] = {
{KEY_END,LS_END,"End"},
{KEY_HOME, LS_HOME, "Home"},
{KEY_PPAGE, LS_PGUP, "PgUp"},
{KEY_NPAGE, LS_PGDN, "PgDn"},
{KEY_UP, CURSOR_UP, "Up"},
{KEY_DOWN, CURSOR_DN, "Down"},
{ESC, LS_QUIT, "Quit"},
{ALT_X, LS_QUIT, "Quit"},
{KEY_F(9), DO_SHELL, "Shell"},
{SPACE, TOGGLE, "Toggle On/Off"},
{'\n', LS_ENTER, "Change Dir"},
{'\r', LS_ENTER, "Change Dir"},
{'+', PLUS_IT, "Add Mark"},
{'-', MINUS_IT,"Take Mark"},
{-1, -1, ""}};
typedef struct _config_type {
char *option;
char *help;
char *out;
int integer;
int type;
int (*func)(CELL *c);
} Configure;
Configure config_type[] = {
{ "Compile Defaults", "Compile time defaults within the client", NULL, 0, 0, compile_dir },
{ "Flood Settings", "Change the flood protection settings", NULL, 0, 0, flood_dir },
{ "Userlist/Shitlist", "Change settings for the Userlist Shitlist options", NULL, 0, 0, userlist_dir },
{ "DCC Settings", "Change various DCC settings", NULL, 0, 0, dcc_dir },
{ "Server Settings", "Change various server and away settings", NULL, 0, 0, server_dir },
{ "Various Settings", "Change Miscellaneous settings", NULL, 0, 0, various_dir },
{ "Save .config.h", "Save .config.h", NULL, 0, 0, save_file},
{ "Load .config.h", "Load a saved .config.h", NULL, 0, 0, load_dir},
{ "Exit", "Exit this program", NULL, 0, 0, exit_program},
{ NULL, NULL, NULL, 0, 0, NULL }
};
#define ON 1
#define OFF 0
Configure compile_default[] = {
{ "Lite BitchX", "Disables ALOT of options below to make the client smaller", "BITCHX_LITE", OFF, BOOL_TYPE, NULL },
{ "Link Looker", "Enable LinkLook. This is deprecated as well as dangerous", "WANT_LLOOK", ON, BOOL_TYPE, NULL },
{ "Plugin support", "Enable plugins on supported OS\'s", "WANT_DLL", ON, BOOL_TYPE, NULL },
{ "OperView", "Enable OperView window support", "WANT_OPERVIEW", ON, BOOL_TYPE, NULL },
{ "CDCC support", "Enable builtin cdcc which is a XDCC file offer clone", "WANT_CDCC", ON, BOOL_TYPE, NULL },
{ "DCC ftp support", "Enable builtin ftp support", "WANT_FTP", ON, BOOL_TYPE, NULL },
{ "Internal Screen", "Enable builtin screen utility for /detach", "WANT_DETACH", ON, BOOL_TYPE, NULL },
{ "EPIC help file support", "Enable epic helpfile support and /ehelp", "WANT_EPICHELP", ON, BOOL_TYPE, NULL},
{ "Humble\'s Hades color","Another color option from the dark days of BX.", "HUMBLE", OFF, BOOL_TYPE, NULL },
{ "Xwindows Window create","Xwindows/screen can /window create to create a new \"screen\"", "WINDOW_CREATE", ON, BOOL_TYPE, NULL},
{ "Flow Control", "Leave this enabled, unless you know it's needed","USE_FLOW_CONTROL", ON, BOOL_TYPE, NULL},
{ "Allow Ctrl-Z", "Does Ctrl-Z background BX.", "ALLOW_STOP_IRC", ON, BOOL_TYPE, NULL},
{ "Only Std Chars", "Use only standard chars instead of ibmpc charset", "ONLY_STD_CHARS", OFF, BOOL_TYPE, NULL},
{ "Latin1 Char Set", "Use only the latin1 charset.", "LATIN1", OFF, BOOL_TYPE, NULL},
{ "Ascii Logos", "Use the alternate ASCII logos", "ASCII_LOGO", OFF, BOOL_TYPE, NULL},
{ "Reverse Color", "Reverse black and white colors for Xterms", "REVERSE_WHITE_BLACK", OFF, BOOL_TYPE, NULL},
{ "Emacs Keybinds", "If you have trouble with your keyboard, change this", "EMACS_KEYBINDS", OFF, BOOL_TYPE, NULL},
{ "Identd Faking", "Allow identd faking", "IDENT_FAKE", OFF, BOOL_TYPE, NULL},
{ "cidentd support", "Use cidentd .authlie for fake username", "CIDENTD", OFF, BOOL_TYPE, NULL},
{ "wdidentd support", "Use wdidentd for fake username. Do no enable both cidentd and this", "WDIDENT", OFF, BOOL_TYPE, NULL},
{ "Include glob support","File Globbing support","INCLUDE_GLOB_FUNCTION", ON, BOOL_TYPE, NULL},
{ "Exec Command", "Enable the /exec command", "EXEC_COMMAND", ON, BOOL_TYPE, NULL},
{ "Public Access Enabled","This disables the dangerous commands, making them unsable", "PUBLIC_ACCESS", OFF, BOOL_TYPE, NULL},
{ "Hebrew Language support", "Hebrew Language Support", "HEBREW", ON, BOOL_TYPE, NULL},
{ "Translation Tables", "Keyboard Translation tables", "TRANSLATE", ON, BOOL_TYPE, NULL},
{ "Mirc resume support"," Support Mirc\'s Broken resume","MIRC_BROKEN_DCC_RESUME", ON, BOOL_TYPE, NULL},
{ "Mode Compression", "Code for performing mode compression on mass mode changes", "COMPRESS_MODES", ON, BOOL_TYPE, NULL},
{ "MAX # of urls in list", "Max Number of URLS to save in memory", "DEFAULT_MAX_URLS", 30, INT_TYPE, edit_dir },
{ "Want Userlist", "", "WANT_USERLIST", ON, BOOL_TYPE, NULL },
{ NULL, NULL, NULL, 0, 0, NULL }
};
Configure userlist_default[] = {
{ "Userlist", "", "DEFAULT_USERLIST", ON, BOOL_TYPE, NULL },
{ "Auto-op", "", "DEFAULT_AOP_VAR", OFF, BOOL_TYPE, NULL },
{ "Auto Invite", "", "DEFAULT_AINV", 0, INT_TYPE, edit_dir },
{ "Kick ops", "", "DEFAULT_KICK_OPS", ON, BOOL_TYPE, NULL },
{ "Annoy Kick", "", "DEFAULT_ANNOY_KICK", OFF, BOOL_TYPE, NULL },
{ "Lamenick", "", "DEFAULT_LAMELIST", ON, BOOL_TYPE, NULL },
{ "Lame Ident", "", "DEFAULT_LAME_IDENT", OFF, BOOL_TYPE, NULL },
{ "Shitlist", "", "DEFAULT_SHITLIST", ON, BOOL_TYPE, NULL },
{ "Auto Rejoin Channel", "", "DEFAULT_AUTO_REJOIN", ON, BOOL_TYPE, NULL },
{ "Deop Flood", "", "DEFAULT_DEOPFLOOD", ON, BOOL_TYPE, NULL },
{ "Deop Flood Time", "", "DEFAULT_DEOPFLOOD_TIME", 30,INT_TYPE, edit_dir },
{ "Deop After \'X\' deops", "", "DEFAULT_DEOP_ON_DEOPFLOOD", 3,INT_TYPE, edit_dir },
{ "Deop After \'X\' kicks", "", "DEFAULT_DEOP_ON_KICKFLOOD", 3,INT_TYPE, edit_dir },
{ "Join Flood", "", "DEFAULT_JOINFLOOD", ON, BOOL_TYPE, NULL },
{ "Join Flood Time", "", "DEFAULT_JOINFLOOD_TIME", 50,INT_TYPE, edit_dir },
{ "Kick Flood", "", "DEFAULT_KICKFLOOD", ON, BOOL_TYPE, NULL },
{ "Kick Flood Time", "", "DEFAULT_KICKFLOOD_TIME", 30,INT_TYPE, edit_dir },
{ "Kick on \'X\' Kicks", "", "DEFAULT_KICK_ON_KICKFLOOD", 4,INT_TYPE, edit_dir },
{ "Kick on \'X\' Deops", "", "DEFAULT_KICK_ON_DEOPFLOOD", 3,INT_TYPE, edit_dir },
{ "Kick On \'X\' Joins", "", "DEFAULT_KICK_ON_JOINFLOOD", 4,INT_TYPE, edit_dir },
{ "Nick Flood", "", "DEFAULT_NICKFLOOD", ON, BOOL_TYPE, NULL },
{ "Nick Flood Time", "", "DEFAULT_NICKFLOOD_TIME", 30,INT_TYPE, edit_dir },
{ "Kick on \'X\' Nick Changes", "", "DEFAULT_KICK_ON_NICKFLOOD", 3,INT_TYPE, edit_dir },
{ "Public Flood", "", "DEFAULT_PUBFLOOD", OFF, BOOL_TYPE, NULL },
{ "Public Flood Time", "", "DEFAULT_PUBFLOOD_TIME", 20,INT_TYPE, edit_dir },
{ "Kick on Public flood", "", "DEFAULT_KICK_ON_PUBFLOOD", 30,INT_TYPE, edit_dir },
{ "Kick on ban match", "", "DEFAULT_KICK_IF_BANNED", OFF, BOOL_TYPE, NULL },
{ "Server op protection", "Values 0 for none, 1 for deop, 2 for announce only", "DEFAULT_HACKING", 0,INT_TYPE, edit_dir }, /* 0 1 2 */
{"Auto-Unban time", "", "DEFAULT_AUTO_UNBAN", 600, INT_TYPE, edit_dir },
{"Default Ban time", "", "DEFAULT_BANTIME", 600, INT_TYPE, edit_dir },
{"Send ctcp msg", "Send notice when ctcp command received", "DEFAULT_SEND_CTCP_MSG", ON, BOOL_TYPE, NULL },
{"Send Op msg", "Send notice when auto-op sent", "DEFAULT_SEND_OP_MSG", ON, BOOL_TYPE, NULL },
{ NULL, NULL, NULL, 0, 0, NULL }
};
Configure flood_default[] = {
{ "Flood Prot", "", "DEFAULT_FLOOD_PROTECTION", ON, BOOL_TYPE, NULL },
{ "Ctcp Flood Prot", "", "DEFAULT_CTCP_FLOOD_PROTECTION", ON, BOOL_TYPE, NULL },
{ "Ctcp Flood after", "", "DEFAULT_CTCP_FLOOD_AFTER", 10, INT_TYPE, edit_dir },
{ "Ctcp Flood rate", "", "DEFAULT_CTCP_FLOOD_RATE", 3, INT_TYPE, edit_dir},
{ "Flood Kick", "", "DEFAULT_FLOOD_KICK", ON, BOOL_TYPE, NULL },
{ "Flood Rate", "", "DEFAULT_FLOOD_RATE", 5, INT_TYPE, edit_dir },
{ "Flood After", "", "DEFAULT_FLOOD_AFTER", 4, INT_TYPE, edit_dir },
{ "Flood Users", "", "DEFAULT_FLOOD_USERS", 10, INT_TYPE, edit_dir },
{ "Flood Warning", "", "DEFAULT_FLOOD_WARNING", OFF, BOOL_TYPE, NULL },
{ "No CTCP flood", "", "DEFAULT_NO_CTCP_FLOOD", ON, BOOL_TYPE, NULL },
{ "CDCC flood after", "", "DEFAULT_CDCC_FLOOD_AFTER", 3, INT_TYPE, edit_dir },
{ "CDCC flood rate", "", "DEFAULT_CDCC_FLOOD_RATE", 4, INT_TYPE, edit_dir },
{ "CTCP delay", "", "DEFAULT_CTCP_DELAY", 3, INT_TYPE, edit_dir },
{ "CTCP flood ban", "", "DEFAULT_CTCP_FLOOD_BAN", ON, BOOL_TYPE, NULL },
{ "CTCP verbose", "", "DEFAULT_VERBOSE_CTCP", ON, BOOL_TYPE, NULL },
{ "CDCC on/off", "", "DEFAULT_CDCC", ON, BOOL_TYPE, NULL },
{"Ignore time on flood","", "DEFAULT_IGNORE_TIME", 600, INT_TYPE, edit_dir },
{ NULL, NULL, NULL, 0, 0, NULL }
};
Configure dcc_default[] = {
{ "DCC Fast", "Enable DCC fast support on supported hosts.", "DEFAULT_DCC_FAST", ON, BOOL_TYPE, NULL},
{ "DCC block size", "", "DEFAULT_DCC_BLOCK_SIZE", 2048, INT_TYPE, edit_dir},
{ "DCC auto-rename", "", "DEFAULT_DCC_AUTORENAME", ON, BOOL_TYPE, NULL},
{ "DCC auto-resume", "", "DEFAULT_DCC_AUTORESUME", OFF, BOOL_TYPE, NULL},
{ "DCC display bar", " 0 for color bargraph, 1 for non-color bar", "DEFAULT_DCC_BAR_TYPE", 0, INT_TYPE, edit_dir },
{ "DCC Autoget", "", "DEFAULT_DCC_AUTOGET", OFF, BOOL_TYPE, NULL},
{ "DCC Max DCC gets", "", "DEFAULT_DCC_GET_LIMIT", 0, INT_TYPE, edit_dir},
{ "DCC Max DCC sends", "", "DEFAULT_DCC_SEND_LIMIT", 5, INT_TYPE, edit_dir},
{ "DCC Queue Limit", "", "DEFAULT_DCC_QUEUE_LIMIT", 10, INT_TYPE, edit_dir},
{ "DCC Limit get/send", "", "DEFAULT_DCC_LIMIT", 10, INT_TYPE, edit_dir },
{ "DCC Idle dcc timeout", "", "DEFAULT_DCCTIMEOUT", 600, INT_TYPE, edit_dir },
{ "CDCC Queue timeout", "", "DEFAULT_QUEUE_SENDS", 0, INT_TYPE, edit_dir },
{ "DCC MAX dcc filesize get", "", "DEFAULT_MAX_AUTOGET_SIZE", 2000000, INT_TYPE, edit_dir },
{ NULL, NULL, NULL, 0, 0, NULL }
};
Configure server_default[] = {
{"Auto-Away system on/off", "", "DEFAULT_AUTO_AWAY", ON, BOOL_TYPE, NULL },
{"Send Away to Channel", "", "DEFAULT_SEND_AWAY_MSG", OFF, BOOL_TYPE, NULL },
{"# of seconds for auto-away", "", "DEFAULT_AUTO_AWAY_TIME", 600, INT_TYPE, edit_dir },
{"auto-unmark away", "", "DEFAULT_AUTO_UNMARK_AWAY", OFF, BOOL_TYPE, NULL },
{"Channel Name width", "", "DEFAULT_CHANNEL_NAME_WIDTH", 10, INT_TYPE, NULL },
{"Socks Port default", "", "DEFAULT_SOCKS_PORT", 1080, INT_TYPE, edit_dir },
{"Turn Notify on/off", "", "DEFAULT_NOTIFY", ON, BOOL_TYPE, NULL},
{"Max # of server reconnects", "", "DEFAULT_MAX_SERVER_RECONNECT", 2, INT_TYPE, edit_dir },
{"# of Seconds for connect", "", "DEFAULT_CONNECT_TIMEOUT", 30, INT_TYPE, edit_dir },
{"Send unknown commands", "", "DEFAULT_DISPATCH_UNKNOWN_COMMANDS", OFF, BOOL_TYPE, NULL},
{"Ignore Server write errors", "", "DEFAULT_NO_FAIL_DISCONNECT", OFF, BOOL_TYPE, NULL},
{"Enable Server groups", "", "DEFAULT_SERVER_GROUPS", OFF, BOOL_TYPE, NULL},
{"Kill window on part OS/2", "", "DEFAULT_WINDOW_DESTROY_PART", OFF, BOOL_TYPE, NULL},
{"Display server MOTD", "", "DEFAULT_SUPPRESS_SERVER_MOTD", ON, BOOL_TYPE, NULL},
{"Reconnect on kill", "", "DEFAULT_AUTO_RECONNECT", ON, BOOL_TYPE, NULL},
{"Show away once", "", "DEFAULT_SHOW_AWAY_ONCE", ON, BOOL_TYPE, NULL},
{"Show Nicks on channel join", "", "DEFAULT_SHOW_CHANNEL_NAMES", ON, BOOL_TYPE, NULL},
{"Show end of server msgs", "", "DEFAULT_SHOW_END_OF_MSGS", OFF, BOOL_TYPE, NULL},
{"Display Numerics", "", "DEFAULT_SHOW_NUMERICS", OFF, BOOL_TYPE, NULL},
{"Show ALL status vars", "", "DEFAULT_SHOW_STATUS_ALL", OFF, BOOL_TYPE, NULL},
{"Show who hop count", "", "DEFAULT_SHOW_WHO_HOPCOUNT", OFF, BOOL_TYPE, NULL},
{"Send ignore msg on ignore", "", "DEFAULT_SEND_IGNORE_MSG", OFF, BOOL_TYPE, NULL},
{"Hide Private channels", "", "DEFAULT_HIDE_PRIVATE_CHANNELS", OFF, BOOL_TYPE, NULL},
{"Default IRC server port", "", "IRC_PORT", 6667, INT_TYPE, edit_dir },
{"After # of second turn on", "", "DEFAULT_CPU_SAVER_AFTER", 0, INT_TYPE, edit_dir },
{"Every # of seconds allow", "", "DEFAULT_CPU_SAVER_EVERY", 0, INT_TYPE, edit_dir },
{ NULL, NULL, NULL, 0, 0, NULL }
};
Configure various_default[] = {
{"Ping type", "0 1 2", "DEFAULT_PING_TYPE", 1, INT_TYPE, edit_dir },
{"Cloak", "Which ctcp\'s do we respond too. 0 all. 1. ping 2. none", "DEFAULT_CLOAK", 1, INT_TYPE, NULL },
{"Msg Logging while away", "", "DEFAULT_MSGLOG", ON, BOOL_TYPE, NULL},
{"Auto-nslookup", "", "DEFAULT_AUTO_NSLOOKUP", OFF, BOOL_TYPE, NULL},
{"LinkLook on/off", "", "DEFAULT_LLOOK", OFF, BOOL_TYPE, NULL},
{"LinkLook Delay", "", "DEFAULT_LLOOK_DELAY", 120, INT_TYPE, edit_dir },
{"Split biggest window", "", "DEFAULT_ALWAYS_SPLIT_BIGGEST", ON, BOOL_TYPE, NULL},
{"Auto whowas", "", "DEFAULT_AUTO_WHOWAS", OFF, BOOL_TYPE, NULL},
{"Command Mode", "", "DEFAULT_COMMAND_MODE", OFF, BOOL_TYPE, NULL},
{"Comment Hack for /*", "", "DEFAULT_COMMENT_HACK", ON, BOOL_TYPE, NULL},
{"Display on/off", "", "DEFAULT_DISPLAY", ON, BOOL_TYPE, NULL},
{"8-bit chars", "", "DEFAULT_EIGHT_BIT_CHARACTERS", ON, BOOL_TYPE, NULL},
{"Enable exec protection", "", "DEFAULT_EXEC_PROTECTION", ON, BOOL_TYPE, NULL},
{"Escape chars > 127", "", "DEFAULT_HIGH_BIT_ESCAPE", OFF, BOOL_TYPE, NULL},
{"History", "", "DEFAULT_HISTORY", 100, INT_TYPE, edit_dir },
{"Screen paging", "", "DEFAULT_HOLD_MODE", OFF, BOOL_TYPE, NULL},
{"Max lines to hold", "", "DEFAULT_HOLD_MODE_MAX", 0, INT_TYPE, edit_dir },
{"Lastlog items", "", "DEFAULT_LASTLOG", 1000, INT_TYPE, edit_dir },
{"Logging on/off", "", "DEFAULT_LOG", OFF, BOOL_TYPE, NULL},
{"Enable Mail Check", " 0 1 2", "DEFAULT_MAIL", 2, INT_TYPE, edit_dir },
{"Notify on Terminate", "", "DEFAULT_NOTIFY_ON_TERMINATION", OFF, BOOL_TYPE, NULL},
{"Scroll Enabled", "", "DEFAULT_SCROLL_LINES", ON, BOOL_TYPE, NULL},
{"Process limit", "", "DEFAULT_SHELL_LIMIT", 0, INT_TYPE, edit_dir },
{"Number of Key Meta\'s", "", "DEFAULT_META_STATES", 5, INT_TYPE, edit_dir },
{"Max Deops", "", "DEFAULT_MAX_DEOPS", 2, INT_TYPE, edit_dir },
{"Max Idle check kicks", "", "DEFAULT_MAX_IDLEKICKS", 2, INT_TYPE, edit_dir },
{"Max Number bans", "", "DEFAULT_NUM_BANMODES", 4, INT_TYPE, edit_dir },
{"Num of kicks", "", "DEFAULT_NUM_KICKS", 4, INT_TYPE, edit_dir },
{"Num of Whowas", "", "DEFAULT_NUM_OF_WHOWAS", 4, INT_TYPE, edit_dir },
{"Num of OPmodes", "", "DEFAULT_NUM_OPMODES", 4, INT_TYPE, edit_dir },
{"Enable Help Pager", "", "DEFAULT_HELP_PAGER", ON, BOOL_TYPE, NULL},
{"Enable Help Prompt", "", "DEFAULT_HELP_PROMPT", ON, BOOL_TYPE, NULL},
{"Enable Help Window", "", "DEFAULT_HELP_WINDOW", OFF, BOOL_TYPE, NULL},
{"FTP address grab", "", "DEFAULT_FTP_GRAB", OFF, BOOL_TYPE, NULL},
{"HTTP address grab", "", "DEFAULT_HTTP_GRAB", OFF, BOOL_TYPE, NULL},
{"Nick Completion on/off", "", "DEFAULT_NICK_COMPLETION", ON, BOOL_TYPE, NULL},
{"Len of nick for complete", "", "DEFAULT_NICK_COMPLETION_LEN", 2, INT_TYPE, edit_dir },
{"Nick complete type", " 0 1 2", "DEFAULT_NICK_COMPLETION_TYPE", 0, INT_TYPE, edit_dir },
{"Full Status bar", "", "DEFAULT_FULL_STATUS_LINE", ON, BOOL_TYPE, NULL},
{"Allow %> to repeat", "", "DEFAULT_STATUS_NO_REPEAT", ON, BOOL_TYPE, NULL},
{"Double Status line", "", "DEFAULT_DOUBLE_STATUS_LINE", ON, BOOL_TYPE, NULL},
{"Expand $ vars in status", "", "DEFAULT_STATUS_DOES_EXPANDOS", OFF, BOOL_TYPE, NULL},
{"Operview window hide", "", "DEFAULT_OPERVIEW_HIDE", 0, INT_TYPE, edit_dir },
{"Operview on/off", "", "DEFAULT_OPER_VIEW", OFF, BOOL_TYPE, NULL},
{"Enable tabs", "", "DEFAULT_TAB", ON, BOOL_TYPE, NULL},
{"# of Chars to a tab", "", "DEFAULT_TAB_MAX", 8, INT_TYPE, edit_dir },
{"Beep on/off", "", "DEFAULT_BEEP", ON, BOOL_TYPE, NULL},
{"Beep MAX", "", "DEFAULT_BEEP_MAX", 3, INT_TYPE, edit_dir },
{"Beep when away", "", "DEFAULT_BEEP_WHEN_AWAY", OFF, BOOL_TYPE, NULL},
{"Enable Bold video", "", "DEFAULT_BOLD_VIDEO", ON, BOOL_TYPE, NULL},
{"Enable Blink video", "", "DEFAULT_BLINK_VIDEO", ON, BOOL_TYPE, NULL},
{"Enable Inverse video", "", "DEFAULT_INVERSE_VIDEO", ON, BOOL_TYPE, NULL},
{"Enable Underline video", "", "DEFAULT_UNDERLINE_VIDEO", ON, BOOL_TYPE, NULL},
{"Clock display on/off", "", "DEFAULT_CLOCK", ON, BOOL_TYPE, NULL},
{"24-Hour Clock display", "", "DEFAULT_CLOCK_24HOUR", OFF, BOOL_TYPE, NULL},
{"Floating point math", "", "DEFAULT_FLOATING_POINT_MATH", OFF, BOOL_TYPE, NULL},
{"Indent on/off", "", "DEFAULT_INDENT", ON, BOOL_TYPE, NULL},
{"Enable Input aliases", "", "DEFAULT_INPUT_ALIASES", OFF, BOOL_TYPE, NULL},
{"Enable insert mode", "", "DEFAULT_INSERT_MODE", ON, BOOL_TYPE, NULL},
{"Display Ansi on/off", "", "DEFAULT_DISPLAY_ANSI", ON, BOOL_TYPE, NULL},
{"Display char Mangling", "", "DEFAULT_DISPLAY_PC_CHARACTERS", 4, INT_TYPE, edit_dir },
{"# of Scrollback lines", "", "DEFAULT_SCROLLBACK_LINES", 512, INT_TYPE, edit_dir },
{"Scrollback ratio", "", "DEFAULT_SCROLLBACK_RATIO", 50, INT_TYPE, edit_dir },
{"MAX ND space", "", "DEFAULT_ND_SPACE_MAX", 160, INT_TYPE, edit_dir },
{"TabKey", "", "WANT_TABKEY", ON, BOOL_TYPE, NULL },
{"NSlookup", "", "WANT_NSLOOKUP", ON, BOOL_TYPE, NULL },
{"Bhelp command", "", "WANT_CHELP", ON, BOOL_TYPE, NULL },
{"TimeStamp", "", "DEFAULT_TIMESTAMP", OFF, BOOL_TYPE, NULL },
{ "Default Alt Charset","Use the default ALT charset", "DEFAULT_ALT_CHARSET", ON, BOOL_TYPE, NULL},
{ NULL, NULL, NULL, 0, 0, NULL }
};
/* Mark file and operated on special chars */
int mark_char = '*'; /* '*'; 0x10;*/
int old_mark_char = '-'; /*= 0xfe;*/
int changed = 0;
/* Current path and filename storage areas */
char current_path[MAXPATH + 1];
char current_filename[MAXPATH + 1];
#define COLOR_MAIN 1
#define COLOR_DIALOG 2
#define COLOR_STATUS 3
#define COLOR_HELP 4
#define COLOR_DIRECTORY 5
#define COLOR_ONVOL 6
#define COLOR_SELECTED 7
#define COLOR_BOTTOM 8
#define COLOR_TITLE 9
char main_foreground = COLOR_WHITE, main_background = COLOR_BLUE,
dialog_foreground, dialog_background;
char status_foreground, status_background,
help_foreground, help_background;
char directory_foreground, directory_background,
onvol_foreground, onvol_background;
char selected_foreground = COLOR_BLUE, selected_background = COLOR_WHITE,
bottom_foreground, bottom_background;
char title_foreground, title_background;
#include "save.c"
#include "load.c"
int load_dir(CELL *c)
{
load_file(current_path);
return TRUE;
}
int exit_program (CELL *c)
{
changed = 0;
c->termkey = ALT_X;
return TRUE;
}
void setup_colors()
{
/* Sets up color */
if (has_colors())
{
init_pair(COLOR_MAIN, main_foreground, main_background);
init_pair(COLOR_DIALOG, dialog_foreground, dialog_background);
init_pair(COLOR_STATUS, status_foreground, status_background);
init_pair(COLOR_HELP, help_foreground, help_background);
init_pair(COLOR_DIRECTORY, directory_foreground, directory_background);
init_pair(COLOR_ONVOL, onvol_foreground, onvol_background);
init_pair(COLOR_SELECTED, selected_foreground, selected_background);
init_pair(COLOR_BOTTOM, bottom_foreground, bottom_background);
init_pair(COLOR_TITLE, title_foreground, title_background);
}
}
/* Initialize the linked list to NULL */
void init_dlist ( CELL *c )
{
c->start = c->end = c->list_start = c->list_end = c->current = NULL;
}
int toggle_select (CELL *c)
{
if (c->current->datainfo.type == BOOL_TYPE)
{
if (c->current->datainfo.integer)
c->current->datainfo.integer = 0;
else
c->current->datainfo.integer = 1;
c->redraw = TRUE;
return TRUE;
}
if (c->current->datainfo.func)
return (*c->current->datainfo.func) (c);
return TRUE;
}
/* Add mark to current highlighted item */
int plus_it(CELL *c)
{
if (c->current->datainfo.type == INT_TYPE)
{
c->current->datainfo.integer++;
c->redraw = TRUE;
}
return TRUE;
}
/* Take away mark from current highlighted item */
int minus_it(CELL *c) {
if (c->current->datainfo.type == INT_TYPE && c->current->datainfo.integer)
{
c->current->datainfo.integer--;
c->redraw = TRUE;
}
return TRUE;
}
int update_select(CELL *c)
{
if (c->current->datainfo.func)
return (*c->current->datainfo.func) (c);
return TRUE;
}
/* clear list of files to play.. Make sure user wants this behavior */
int clear_marks(CELL *c)
{
dlistptr ptr;
ptr = c->start;
while (ptr)
{
ptr->datainfo.mark = 0;
ptr = ptr->nextlistptr;
}
c->redraw = TRUE;
return TRUE;
}
/* cleate all parts ot the the linked list */
int clear_dlist (CELL *c)
{
dlistptr ptr;
while (c->start != NULL ) {
ptr = c->start;
c->start = c->start->nextlistptr;
free(ptr->datainfo.option);
free(ptr->datainfo.help);
free(ptr->datainfo.save);
free(ptr);
}
c->end = NULL;
return TRUE;
}
int List_Exit(CELL *c) {
clear_dlist(c);
return TRUE;
}
/*
* Update status information including number of files, number of marked files
* etc.
*/
int status_update(CELL *c) {
char tmp[(200 + 1) * 2];
int center;
center = ((c->ecol - 2) / 2) - (strlen(c->filename) / 2);
memset(tmp, ' ', sizeof tmp - 1);
if (c->ecol - 2 < sizeof tmp)
tmp[c->ecol - 2] = 0;
else
tmp[sizeof tmp - 1] = 0;
mvwaddstr (c->window, c->srow - 2 , c->scol, tmp);
wattron(c->window,A_REVERSE);
mvwaddstr (c->window, c->srow - 2 , center, c->filename);
wattroff(c->window,A_REVERSE);
if (c->current->datainfo.help)
{
snprintf(tmp, sizeof tmp, " %-75s ", c->current->datainfo.help);
mvwaddstr(c->window, c->max_rows - 3, c->scol, tmp);
}
else
mvwaddstr(c->window, c->max_rows - 2, c->scol, tmp);
return TRUE;
}
/* Insert an item into the list. IN this case a filename and it's current
* attribute's are stored in the list. Item is added to the end of the list.
* and pointers are updated.
*/
int insert_fdlist (CELL *c, struct _config_type *current) {
dlistptr ptr = NULL;
ptr = (dlistptr) calloc(1, sizeof(struct dlistmem));
if (c->start == NULL) /* start of new list */
c->start = ptr;
else
{
ptr->prevlistptr = c->end;
c->end->nextlistptr = ptr;
}
c->end = ptr;
ptr->datainfo.option = (char *) malloc(strlen(current->option)+1);
strcpy(ptr->datainfo.option, current->option);
ptr->datainfo.help = (char *) malloc(strlen(current->help)+1);
strcpy(ptr->datainfo.help, current->help);
ptr->datainfo.func = current->func;
ptr->datainfo.integer = current->integer;
ptr->datainfo.type = current->type;
return TRUE;
}
/* on entry to file list routine, setup screen windows and put menu options
* on screen.
* initilize the list.
* Use findfirst/findnext to add filenames into list
* Set display begin/end to start of list.
* finally sort the list
*/
int File_Entry(CELL *c) {
wmove(c->window,c->srow - 2, c->scol - 1);
wborder(c->window,0,0,0,0,0,0,0,0);
mvwaddch(c->window, c->srow - 1, c->max_cols, ACS_RTEE);
mvwaddch(c->window, c->srow - 1, c->scol - 1, ACS_LTEE);
wmove(c->window,c->srow - 1, c->scol);
whline(c->window, ACS_HLINE, c->max_cols - c->scol);
mvwaddch(c->window, c->erow + 1, c->scol - 1, ACS_LTEE);
mvwaddch(c->window, c->erow + 1, c->max_cols, ACS_RTEE);
wmove(c->window,c->erow + 1, c->scol);
whline(c->window, ACS_HLINE, c->max_cols - c->scol);
wrefresh(c->window);
c->current = c->list_start = c->list_end = c->start;
return TRUE;
}
/*
* screen Display function, formats file info into displayable format
* Uses some magic numbers for masking information.
*/
char *fDisplay (dlistptr *ptr)
{
static char p[100];
snprintf(p, sizeof p, " %-36s ", (*ptr)->datainfo.option);
return p;
}
/*
* File redraw routine. Draws current list on screen.
*/
int fredraw (CELL * c)
{
register int row = c->srow;
dlistptr p = c->list_start;
int i = 0;
char buff[200];
if (c->ecol >= c->scol)
snprintf(buff, sizeof buff, "%*s", c->ecol - c->scol + 1, " ");
while (i <= c->erow - c->srow && p != NULL)
{
if (p == c->current) wattron(c->window,A_REVERSE);
mvaddstr (row , c->scol, fDisplay(&p));
if (p == c->current) wattroff(c->window,A_REVERSE);
row++; i++;
p = p->nextlistptr;
}
if (row <= c -> erow)
for (; row <= c -> erow ; row++)
mvaddstr(row, c->scol, buff);
wrefresh(c->window);
c -> redraw = FALSE;
return TRUE;
}
char *cDisplay (dlistptr *ptr)
{
static char p[100];
if ((*ptr)->datainfo.type == BOOL_TYPE)
snprintf(p, sizeof p, " %-28s %8s",
(*ptr)->datainfo.option, (*ptr)->datainfo.integer? "On":"Off");
else if ((*ptr)->datainfo.type == INT_TYPE)
snprintf(p, sizeof p, " %-28s %8d",
(*ptr)->datainfo.option, (*ptr)->datainfo.integer);
return p;
}
/*
* File redraw routine. Draws current list on screen.
*/
int credraw (CELL * c)
{
register int row = c->srow;
dlistptr p = c->list_start;
int i = 0;
char buff[200];
if (c->ecol >= c->scol)
snprintf(buff, sizeof buff, "%*s",c->ecol - c->scol + 1, " ");
while (i <= c->erow - c->srow && p != NULL)
{
if (p == c->current) wattron(c->window,A_REVERSE);
mvaddstr (row , c->scol, cDisplay(&p));
if (p == c->current) wattroff(c->window,A_REVERSE);
row++; i++;
p = p->nextlistptr;
}
if (row <= c -> erow)
for (; row <= c -> erow ; row++)
mvaddstr(row, c->scol, buff);
wrefresh(c->window);
c -> redraw = FALSE;
return TRUE;
}
/*
* Basically setup values for where the box is to appear.
* setup function pointers to default.
* save the screen.
* loop
* execute dispatch key routine
* until ESC or E or termkey is not equal to 0
* retore screen
* and return to caller
* true indicates that the function was successful in executing whatever
* it was supposed to do.
*/
/* In this case also
* setup the old drive and path information,
* set the current path to Quote Master export directory and
* filename to worksheet extension
*/
int main_dir(CELL *c) {
int i;
getcwd(current_path, sizeof(current_path));
strcat(current_path, "/.config.h");
load_file(current_path);
c->keytable = file_cpy_menu;
c->func_table = file_cpy_table;
c->ListEntryProc = File_Entry;
c->UpdateStatusProc = status_update;
c->redraw = TRUE;
c->ListExitProc = List_Exit;
c->ListPaintProc = fredraw;
c->srow = 3;
c->scol = 1;
c->erow = c->window->_maxy - 5;
c->ecol = c->window->_maxx - 1;
c->max_rows = c->window->_maxy;
c->max_cols = c->window->_maxx;
c->filename = "[ BitchX Config ]";
c->menu_bar = 0;
c->normcolor = 0x07;
c->barcolor = 0x1f;
init_dlist(c);
for (i = 0; config_type[i].option; i++)
insert_fdlist(c, &config_type[i]);
/*
* Go Do It
*/
do {
c->redraw = TRUE;
ls_dispatch(c);
} while (c->termkey != ESC && c->termkey != ALT_X);
return TRUE;
}
int Compile_Exit(CELL *c) {
dlistptr ptr = c->start;
int i;
for (i = 0; ptr; ptr = ptr->nextlistptr, i++)
compile_default[i].integer = ptr->datainfo.integer;
clear_dlist(c);
return TRUE;
}
int compile_dir(CELL *c) {
CELL compile = { 0 };
int i;
compile.window = c->window;
compile.keytable = file_cpy_menu;
compile.func_table = compile_cpy_table;
compile.ListEntryProc = File_Entry;
compile.UpdateStatusProc = status_update;
compile.redraw = TRUE;
compile.ListExitProc = Compile_Exit;
compile.ListPaintProc = credraw;
compile.srow = 3;
compile.scol = 1;
compile.erow = compile.window->_maxy - 5;
compile.ecol = compile.window->_maxx - 1;
compile.max_rows = compile.window->_maxy;
compile.max_cols = compile.window->_maxx;
compile.filename = "[ BitchX Config ]";
compile.menu_bar = 0;
compile.normcolor = 0x07;
compile.barcolor = 0x1f;
init_dlist(&compile);
for (i = 0; compile_default[i].option; i++)
insert_fdlist(&compile, &compile_default[i]);
/*
* Go Do It
*/
do {
compile.redraw = TRUE;
ls_dispatch(&compile);
} while (compile.termkey != ESC && compile.termkey != ALT_X);
c->redraw = TRUE;
return TRUE;
}
int userlist_Exit (CELL *c)
{
int i;
dlistptr ptr = c->start;
for (i = 0; ptr; ptr = ptr->nextlistptr, i++)
userlist_default[i].integer = ptr->datainfo.integer;
clear_dlist(c);
return TRUE;
}
int userlist_dir(CELL *c) {
CELL compile = { 0 };
int i;
compile.window = c->window;
compile.keytable = file_cpy_menu;
compile.func_table = compile_cpy_table;
compile.ListEntryProc = File_Entry;
compile.UpdateStatusProc = status_update;
compile.redraw = TRUE;
compile.ListExitProc = userlist_Exit;
compile.ListPaintProc = credraw;
compile.srow = 3;
compile.scol = 1;
compile.erow = compile.window->_maxy - 5;
compile.ecol = compile.window->_maxx - 1;
compile.max_rows = compile.window->_maxy;
compile.max_cols = compile.window->_maxx;
compile.filename = "[ BitchX CSET/Userlist Config ]";
compile.menu_bar = 0;
compile.normcolor = 0x07;
compile.barcolor = 0x1f;
init_dlist(&compile);
for (i = 0; userlist_default[i].option; i++)
insert_fdlist(&compile, &userlist_default[i]);
/*
* Go Do It
*/
do {
compile.redraw = TRUE;
ls_dispatch(&compile);
} while (compile.termkey != ESC && compile.termkey != ALT_X);
c->redraw = TRUE;
return TRUE;
}
int flood_Exit (CELL *c)
{
int i;
dlistptr ptr = c->start;
for (i = 0; ptr; ptr = ptr->nextlistptr, i++)
flood_default[i].integer = ptr->datainfo.integer;
clear_dlist(c);
return TRUE;
}
int flood_dir(CELL *c) {
CELL compile = { 0 };
int i;
compile.window = c->window;
compile.keytable = file_cpy_menu;
compile.func_table = compile_cpy_table;
compile.ListEntryProc = File_Entry;
compile.UpdateStatusProc = status_update;
compile.redraw = TRUE;
compile.ListExitProc = flood_Exit;
compile.ListPaintProc = credraw;
compile.srow = 3;
compile.scol = 1;
compile.erow = compile.window->_maxy - 5;
compile.ecol = compile.window->_maxx - 1;
compile.max_rows = compile.window->_maxy;
compile.max_cols = compile.window->_maxx;
compile.filename = "[ BitchX Flood Config ]";
compile.menu_bar = 0;
compile.normcolor = 0x07;
compile.barcolor = 0x1f;
init_dlist(&compile);
for (i = 0; flood_default[i].option; i++)
insert_fdlist(&compile, &flood_default[i]);
/*
* Go Do It
*/
do {
compile.redraw = TRUE;
ls_dispatch(&compile);
} while (compile.termkey != ESC && compile.termkey != ALT_X);
c->redraw = TRUE;
return TRUE;
}
int dcc_Exit (CELL *c)
{
int i;
dlistptr ptr = c->start;
for (i = 0; ptr; ptr = ptr->nextlistptr, i++)
dcc_default[i].integer = ptr->datainfo.integer;
clear_dlist(c);
return TRUE;
}
int dcc_dir(CELL *c) {
CELL compile = { 0 };
int i;
compile.window = c->window;
compile.keytable = file_cpy_menu;
compile.func_table = compile_cpy_table;
compile.ListEntryProc = File_Entry;
compile.UpdateStatusProc = status_update;
compile.redraw = TRUE;
compile.ListExitProc = dcc_Exit;
compile.ListPaintProc = credraw;
compile.srow = 3;
compile.scol = 1;
compile.erow = compile.window->_maxy - 5;
compile.ecol = compile.window->_maxx - 1;
compile.max_rows = compile.window->_maxy;
compile.max_cols = compile.window->_maxx;
compile.filename = "[ BitchX DCC Config ]";
compile.menu_bar = 0;
compile.normcolor = 0x07;
compile.barcolor = 0x1f;
init_dlist(&compile);
for (i = 0; dcc_default[i].option; i++)
insert_fdlist(&compile, &dcc_default[i]);
/*
* Go Do It
*/
do {
compile.redraw = TRUE;
ls_dispatch(&compile);
} while (compile.termkey != ESC && compile.termkey != ALT_X);
c->redraw = TRUE;
return TRUE;
}
int server_Exit (CELL *c)
{
int i;
dlistptr ptr = c->start;
for (i = 0; ptr; ptr = ptr->nextlistptr, i++)
server_default[i].integer = ptr->datainfo.integer;
clear_dlist(c);
return TRUE;
}
int server_dir(CELL *c) {
CELL compile = { 0 };
int i;
compile.window = c->window;
compile.keytable = file_cpy_menu;
compile.func_table = compile_cpy_table;
compile.ListEntryProc = File_Entry;
compile.UpdateStatusProc = status_update;
compile.redraw = TRUE;
compile.ListExitProc = server_Exit;
compile.ListPaintProc = credraw;
compile.srow = 3;
compile.scol = 1;
compile.erow = compile.window->_maxy - 5;
compile.ecol = compile.window->_maxx - 1;
compile.max_rows = compile.window->_maxy;
compile.max_cols = compile.window->_maxx;
compile.filename = "[ BitchX Server Config ]";
compile.menu_bar = 0;
compile.normcolor = 0x07;
compile.barcolor = 0x1f;
init_dlist(&compile);
for (i = 0; server_default[i].option; i++)
insert_fdlist(&compile, &server_default[i]);
/*
* Go Do It
*/
do {
compile.redraw = TRUE;
ls_dispatch(&compile);
} while (compile.termkey != ESC && compile.termkey != ALT_X);
c->redraw = TRUE;
return TRUE;
}
int various_Exit (CELL *c)
{
int i;
dlistptr ptr = c->start;
for (i = 0; ptr; ptr = ptr->nextlistptr, i++)
various_default[i].integer = ptr->datainfo.integer;
clear_dlist(c);
return TRUE;
}
int various_dir(CELL *c) {
CELL compile = { 0 };
int i;
compile.window = c->window;
compile.keytable = file_cpy_menu;
compile.func_table = compile_cpy_table;
compile.ListEntryProc = File_Entry;
compile.UpdateStatusProc = status_update;
compile.redraw = TRUE;
compile.ListExitProc = various_Exit;
compile.ListPaintProc = credraw;
compile.srow = 3;
compile.scol = 1;
compile.erow = compile.window->_maxy - 5;
compile.ecol = compile.window->_maxx - 1;
compile.max_rows = compile.window->_maxy;
compile.max_cols = compile.window->_maxx;
compile.filename = "[ BitchX Various Config ]";
compile.menu_bar = 0;
compile.normcolor = 0x07;
compile.barcolor = 0x1f;
init_dlist(&compile);
for (i = 0; various_default[i].option; i++)
insert_fdlist(&compile, &various_default[i]);
/*
* Go Do It
*/
do {
compile.redraw = TRUE;
ls_dispatch(&compile);
} while (compile.termkey != ESC && compile.termkey != ALT_X);
c->redraw = TRUE;
return TRUE;
}
char *eDisplay (dlistptr *ptr)
{
static char p[100];
char str[40];
snprintf(str, sizeof str, "%d", (*ptr)->datainfo.integer);
snprintf(p, sizeof p, "%14s", str);
return p;
}
/*
* File redraw routine. Draws current list on screen.
*/
int eredraw (CELL * c)
{
register int row = c->srow;
dlistptr p = c->list_start;
int i = 0;
char buff[200];
if (c->ecol >= c->scol)
snprintf(buff, sizeof buff, "%*s",c->ecol - c->scol + 1, " ");
while (i <= c->erow - c->srow && p != NULL)
{
if (p == c->current) wattron(c->window,A_REVERSE);
mvaddstr (row , c->scol+4, eDisplay(&p));
if (p == c->current) wattroff(c->window,A_REVERSE);
row++; i++;
p = p->nextlistptr;
}
if (row <= c -> erow)
for (; row <= c -> erow ; row++)
mvaddstr(row, c->scol, buff);
wrefresh(c->window);
c -> redraw = FALSE;
return TRUE;
}
int Edit_Entry(CELL *c) {
char tmp[200];
int n_spaces = c->ecol - 2 - c->scol - 4;
memset(tmp, ' ', sizeof(tmp)-1);
if (n_spaces < sizeof tmp)
tmp[n_spaces] = 0;
else
tmp[sizeof tmp - 1] = 0;
mvwaddstr (c->window, c->srow - 1 , c->scol, tmp);
mvwaddstr (c->window, c->srow - 1, c->scol + 4, c->start->datainfo.option);
wrefresh(c->window);
c->current = c->list_start = c->list_end = c->start;
return TRUE;
}
int edit_enter (CELL *c)
{
char tmp[200];
int n_spaces = c->ecol - 2 - c->scol - 4;
memset(tmp, ' ', sizeof(tmp)-1);
if (n_spaces < sizeof tmp)
tmp[n_spaces] = 0;
else
tmp[sizeof tmp - 1] = 0;
if (c->current->datainfo.type == INT_TYPE)
{
c->redraw = TRUE;
c->termkey = '\n';
}
mvwaddstr (c->window, c->srow , c->scol, tmp);
return TRUE;
}
int edit_line(CELL *c)
{
int found = 0;
int end = 0;
if (c->current->datainfo.type == INT_TYPE)
found = INT_TYPE;
else if (c->current->datainfo.type == STR_TYPE)
found = STR_TYPE;
if (!found || ((found == INT_TYPE) && !isdigit(c->key)) || ((found == STR_TYPE) && !isalpha(c->key)))
if (!iscntrl(c->key))
return TRUE;
end = strlen(c->current->datainfo.save);
switch(c->key)
{
case KEY_BACKSPACE:
if (*c->current->datainfo.save)
c->current->datainfo.save[end - 1] = 0;
break;
default:
if (iscntrl(c->key))
return TRUE;
if (end < MAXLEN)
c->current->datainfo.save[end] = c->key;
else
beep();
}
if (found == INT_TYPE)
{
unsigned long temp = 0;
if (*c->current->datainfo.save)
{
temp = strtoul(c->current->datainfo.save, NULL, 10);
if (temp < 2147483647)
c->current->datainfo.integer = temp;
else
c->current->datainfo.save[end] = 0;
}
else
c->current->datainfo.integer = 0;
}
c->redraw = TRUE;
return TRUE;
}
int edit_exit(CELL *c)
{
char tmp[200];
int n_spaces = c->ecol - 2 - c->scol - 4;
memset(tmp, ' ', sizeof(tmp)-1);
if (n_spaces < sizeof tmp)
tmp[n_spaces] = 0;
else
tmp[sizeof tmp - 1] = 0;
mvwaddstr (c->window, c->srow - 1 , c->scol, tmp);
mvwaddstr (c->window, c->srow , c->scol, tmp);
return TRUE;
}
int edit_dir(CELL *c)
{
CELL edit = { 0 };
dlistptr ptr = NULL;
edit.window = c->window;
edit.keytable = file_cpy_menu;
edit.func_table = edit_cpy_table;
edit.ListEntryProc = Edit_Entry;
edit.redraw = TRUE;
edit.ListPaintProc = eredraw;
edit.ListExitProc = edit_exit;
edit.current_event = edit_line;
edit.srow = edit.window->_maxy - 2;
edit.scol = 1;
edit.erow = edit.window->_maxy - 2;
edit.ecol = edit.window->_maxx - 1;
edit.max_rows = edit.window->_maxy;
edit.max_cols = edit.window->_maxx;
edit.menu_bar = 0;
edit.normcolor = 0x07;
edit.barcolor = 0x1f;
ptr = (dlistptr) calloc(1, sizeof(struct dlistmem));
edit.start = ptr;
ptr->datainfo.option = (char *) malloc(strlen(c->current->datainfo.option)+1);
strcpy(ptr->datainfo.option, c->current->datainfo.option);
ptr->datainfo.integer = c->current->datainfo.integer;
ptr->datainfo.type = c->current->datainfo.type;
ptr->datainfo.save = (char *) malloc(MAXLEN+1);
memset(ptr->datainfo.save, 0, MAXLEN);
/*
* Go Do It
*/
do
{
edit.redraw = TRUE;
ls_dispatch(&edit);
} while (edit.termkey != ESC && edit.termkey != ALT_X && edit.termkey != '\n');
c->redraw = TRUE;
if (edit.termkey == '\n')
c->current->datainfo.integer = edit.current->datainfo.integer;
clear_dlist(&edit);
return TRUE;
}
int main() {
CELL file_cpy = {0};
WINDOW *mainwin;
mainwin = initscr();
start_color();
setup_colors();
cbreak();
noecho();
keypad(mainwin, TRUE);
meta(mainwin, TRUE);
raw();
leaveok(mainwin, TRUE);
wbkgd(mainwin, COLOR_PAIR(COLOR_MAIN));
wattron(mainwin, COLOR_PAIR(COLOR_MAIN));
werase(mainwin);
refresh();
file_cpy.window = mainwin;
main_dir(&file_cpy);
wbkgd(mainwin, A_NORMAL);
werase(mainwin);
echo();
nocbreak();
noraw();
refresh();
endwin();
return TRUE;
}