#include #include #include #include #include #include #include #include "../src/config.h" conf_t defaults = { "N:TCP://irc.libera.chat:6667", "FNChatTest", "FujiNetChat User", { 0xc0, 0x0c }, { "#testari8", { 0 }, { 0 }, { 0 }, { 0 } }, 3, 1, 0, 1 }; char have_dos = 0; char filename[101] = "D:FNCHAT.CFG"; char buf[128]; char numbuf[4]; char server[101]; char port[6]; void detect_dos(void) { char i, j, h, d; h = d = 0; for(i = 0; i < 11; i++) { j = OS.hatabs[i].id; if(j == 'D') h = 1; if(j == 'H') d = 1; } if(h && !d) filename[0] = 'H'; if(h || d) have_dos = 1; } void print(const char *text) { fputs(text, stdout); } void prompt(const char *text, char *p, char limit) { print(text); print(" ["); print(p); print("]? "); gets(buf); if(buf[0]) strncpy(p, buf, limit); } char yn(const char *text, char dflt) { char c, bad; print(text); if(dflt) print(" [Y/n]? "); else print(" [y/N]? "); do { bad = 1; c = cgetc(); if(c == '\n') c = dflt ? 'Y' : 'N'; if(c == 'Y' || c == 'N' || c == 'y' || c == 'n') bad = 0; } while(bad); putchar(c); putchar('\n'); return (c == 'Y' || c == 'y'); } void prompt_config_file(void) { OS.shflok = 0x40; prompt("Config File", filename, 100); OS.shflok = 0x00; } void prompt_color(const char *text, char which) { itoa(conf->colors[which], numbuf, 10); print(text); prompt(" color", numbuf, 3); conf->colors[which] = atoi(numbuf); } void prompt_colors(void) { char bad; do { bad = 0; prompt_color("Text BG", 0); prompt_color("Text FG", 1); if((conf->colors[0] & 0x0e) == (conf->colors[1] & 0x0e)) { print("!! Unreadable, try again.\n"); bad = 1; } } while(bad); OS.color2 = conf->colors[0]; OS.color1 = conf->colors[1]; } void prompt_alert_type(void) { char c, d, bad; print(" 0:None, 1:Beep, 2:Flash, 3:Both\n"); d = conf->alert_type + '0'; do { bad = 0; print("Alert type ["); putchar(d); print("]? "); c = cgetc(); if(c == '\n') c = d; putchar(c); putchar('\n'); if(c < '0' || c > '3') { bad = 1; print("!! Range is 0-3, try again.\n"); } } while(bad); conf->alert_type = c - '0'; } void save(void) { int fh, bad; do { bad = 0; prompt_config_file(); if((fh = open(filename, O_WRONLY | O_CREAT)) < 0) { print("!! I/O error (open)\n"); bad = 1; } else if((write(fh, conf, sizeof(conf_t))) != sizeof(conf_t)) { print("!! I/O error (write)\n"); bad = 1; } if(fh >= 0) close(fh); if(bad) { if(!yn("Retry", 1)) break; } } while(bad); } void load(void) { int fh, bad = 0; if(have_dos) { if(!yn("Load Config", 1)) { bad = 1; print("OK"); } else { prompt_config_file(); if((fh = open(filename, O_RDONLY)) < 0) { print("Not found"); bad = 1; } else if((read(fh, conf, sizeof(conf_t))) != sizeof(conf_t)) { print("Invalid"); bad = 1; } if(fh >= 0) close(fh); } } else { print("No DOS booted"); bad = 1; } if(bad) { print(", using built-in defaults\n"); memcpy(conf, &defaults, sizeof(conf_t)); } } void make_url(void) { conf->url[8] = '\0'; strcat(conf->url, server); strcat(conf->url, ":"); strcat(conf->url, port); } void main(void) { char *p, *q; OS.color2 = defaults.colors[0]; OS.color1 = defaults.colors[1]; cursor(1); print("\x7d" "FujiNetChat Setup\n\n"); detect_dos(); load(); OS.color2 = conf->colors[0]; OS.color1 = conf->colors[1]; q = server; p = conf->url + 8; /* skip N:TCP:// */ while(*p) { if(*p == ':') break; *q++ = *p++; } *q = 0; p++; q = port; strcpy(port, p); while(1) { prompt("\nServer", server, 100); prompt("Port ", port, 5); prompt("Nick ", conf->nick, 25); prompt("Name ", conf->real_name, 25); prompt_colors(); prompt_alert_type(); conf->show_ping = yn("Show PING/PONG", conf->show_ping); conf->atract_away = yn("Set AWAY on ATRACT", conf->atract_away); conf->hide_motd = yn("Hide MOTD", conf->hide_motd); make_url(); print("\nURL: "); print(conf->url); putchar('\n'); if(yn("Settings OK", 1)) break; } if(have_dos) { if(yn("Save to disk", 1)) save(); } print("\nPress any key to load the client..."); cgetc(); }