diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c index 0791686fc27c1685cdb9552da2108ea447b3ba45..eea594ea322cdd8544a5a2bf1dbdfe6dd70fc2a4 100644 --- a/src/conio/bitmap_con.c +++ b/src/conio/bitmap_con.c @@ -440,7 +440,9 @@ static uint32_t color_value(uint32_t col) { if (col & 0x80000000) return col; - return (0xff << 24) | (palette[col].red << 16) | (palette[col].green << 8) | palette[col].blue; + if (col < sizeof(palette) / sizeof(palette[0])) + return (0xff << 24) | (palette[col].red << 16) | (palette[col].green << 8) | palette[col].blue; + fprintf(stderr, "Invalid colour value: %08x\n", col); } static struct rectlist *get_full_rectangle_locked(struct bitmap_screen *screen) diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c index 5608d762a6cd42f8706f7294d5ed4baf35dac13c..f15c9ad354b7ae83d7ec0e3f74cbee2fb60b003b 100644 --- a/src/syncterm/bbslist.c +++ b/src/syncterm/bbslist.c @@ -189,12 +189,15 @@ int sortorder[sizeof(sort_order)/sizeof(struct sort_order_info)]; char *screen_modes[]={ "Current", "80x25", "80x28", "80x30", "80x43", "80x50", "80x60", "132x37 (16:9)", "132x52 (5:4)", "132x25", "132x28", "132x30", "132x34", "132x43", "132x50", "132x60", "C64", "C128 (40col)", "C128 (80col)", "Atari", "Atari XEP80", "Custom", "EGA 80x25", NULL}; static char *screen_modes_enum[]={"Current", "80x25", "80x28", "80x30", "80x43", "80x50", "80x60", "132x37", "132x52", "132x25", "132x28", "132x30", "132x34", "132x43", "132x50", "132x60", "C64", "C128-40col", "C128-80col", "Atari", "Atari-XEP80", "Custom", "EGA80x25", NULL}; + char *log_levels[]={"Emergency", "Alert", "Critical", "Error", "Warning", "Notice", "Info", "Debug", NULL}; static char *log_level_desc[]={"None", "Alerts", "Critical Errors", "Errors", "Warnings", "Notices", "Normal", "All (Debug)", NULL}; char *rate_names[]={"300", "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "76800", "115200", "Current", NULL}; int rates[]={300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 0}; +static char *rip_versions[] = {"Off", "RIPv1", "RIPv3"}; + static char *fc_names[] = {"RTS/CTS", "XON/XOFF", "RTS/CTS and XON/XOFF", "None", NULL}; static char *fc_enum[] = {"RTSCTS", "XONXOFF", "RTSCTS_XONXOFF", "None", NULL}; @@ -687,7 +690,7 @@ void read_item(str_list_t listfile, struct bbslist *entry, char *bbsname, int id entry->screen_mode=iniGetEnum(section,NULL,"ScreenMode",screen_modes_enum,SCREEN_MODE_CURRENT); entry->nostatus=iniGetBool(section,NULL,"NoStatus",FALSE); entry->hidepopups=iniGetBool(section,NULL,"HidePopups",FALSE); - entry->rip=iniGetBool(section,NULL,"RIP",FALSE); + entry->rip=iniGetEnum(section,NULL,"RIP",rip_versions,RIP_VERSION_NONE); iniGetString(section,NULL,"DownloadPath",home,entry->dldir); iniGetString(section,NULL,"UploadPath",home,entry->uldir); @@ -909,6 +912,28 @@ void configure_log(struct bbslist *item, const char *itemname, str_list_t inifil } } +static int +get_rip_version(int oldver, int *changed) +{ + int cur = oldver; + int bar = 0; + + uifc.helpbuf= "`RIP Version`\n\n" + "RIP v1 requires EGA mode while RIP v3\n" + "works in any screen mode."; + switch(uifc.list(WIN_SAV,0,0,0,&cur,&bar,"RIP Mode",rip_versions)) { + case -1: + check_exit(FALSE); + break; + case RIP_VERSION_NONE: + case RIP_VERSION_1: + case RIP_VERSION_3: + if (cur != oldver) + *changed = 1; + } + return cur; +} + int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isdefault) { char opt[19][69]; /* 21=Holds number of menu items, 80=Number of columns */ @@ -994,7 +1019,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd sprintf(opt[i++], "Address Family %s",address_family_names[item->address_family]); sprintf(opt[i++], "Font %s",item->font); sprintf(opt[i++], "Hide Popups %s",item->hidepopups?"Yes":"No"); - sprintf(opt[i++], "RIP %s",item->rip?"Yes":"No"); + sprintf(opt[i++], "RIP %s",rip_versions[item->rip]); opt[i][0]=0; uifc.changes=0; @@ -1282,9 +1307,9 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd break; default: iniSetEnum(&inifile,itemname,"ScreenMode",screen_modes_enum,item->screen_mode,&ini_style); - if (item->rip && item->screen_mode != SCREEN_MODE_EGA_80X25 && item->screen_mode != SCREEN_MODE_80X43) { - item->rip = FALSE; - iniSetBool(&inifile,itemname,"RIP",item->rip,&ini_style); + if (item->rip == RIP_VERSION_1 && item->screen_mode != SCREEN_MODE_EGA_80X25 && item->screen_mode != SCREEN_MODE_80X43) { + item->rip = RIP_VERSION_3; + iniSetEnum(&inifile,itemname,"RIP",rip_versions,item->rip,&ini_style); } if(item->screen_mode == SCREEN_MODE_C64) { SAFECOPY(item->font,font_names[33]); @@ -1411,13 +1436,12 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd iniSetBool(&inifile,itemname,"HidePopups",item->hidepopups,&ini_style); break; case 17: - item->rip = !item->rip; - changed = 1; - if (item->rip) { + item->rip = get_rip_version(item->rip, &changed); + if (item->rip == RIP_VERSION_1) { item->screen_mode = 4; iniSetEnum(&inifile,itemname,"ScreenMode",screen_modes_enum,item->screen_mode,&ini_style); } - iniSetBool(&inifile,itemname,"RIP",item->rip,&ini_style); + iniSetEnum(&inifile,itemname,"RIP",rip_versions,item->rip,&ini_style); } if(uifc.changes) changed=1; @@ -1467,7 +1491,7 @@ void add_bbs(char *listpath, struct bbslist *bbs) iniSetEnum(&inifile, bbs->name, "AddressFamily", address_families, bbs->address_family, &ini_style); iniSetString(&inifile,bbs->name,"Font",bbs->font,&ini_style); iniSetBool(&inifile,bbs->name,"HidePopups",bbs->hidepopups,&ini_style); - iniSetBool(&inifile,bbs->name,"RIP",bbs->rip,&ini_style); + iniSetEnum(&inifile,bbs->name,"RIP",rip_versions,bbs->rip,&ini_style); iniSetString(&inifile,bbs->name,"Comment",bbs->comment,&ini_style); if((listfile=fopen(listpath,"w"))!=NULL) { iniWriteFile(listfile,inifile); diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h index 3adc488afc3789cb8a146ec0b352be16dbe36a60..bc9f413bc6fb76833dd5a633b4225cb198c8eabf 100644 --- a/src/syncterm/bbslist.h +++ b/src/syncterm/bbslist.h @@ -66,6 +66,12 @@ enum { ,ADDRESS_FAMILY_INET6 }; +enum { + RIP_VERSION_NONE + ,RIP_VERSION_1 + ,RIP_VERSION_3 +}; + /* NOTE: changing this may require updating sort_order in bbslist.c */ struct bbslist { char name[LIST_NAME_MAX+1]; diff --git a/src/syncterm/ripper.c b/src/syncterm/ripper.c index bca2a187649c9f93d66333fb5fdff2adcd3d8c4d..0f4e817c34521c5553c993350b6eada3aca88ab7 100644 --- a/src/syncterm/ripper.c +++ b/src/syncterm/ripper.c @@ -226,6 +226,7 @@ static struct { enum rip_state state; enum rip_state newstate; bool enabled; + int version; int x; int y; struct { @@ -270,6 +271,7 @@ static struct { RIP_STATE_BOL, RIP_STATE_FLUSHING, true, + 3, 0, 0, {0, 0, 639, 349}, @@ -7177,7 +7179,7 @@ static void do_rip_string(const char *buf, size_t len); static bool handle_rip_line(BYTE *buf, unsigned *blen, unsigned *pos, size_t *rip_start, unsigned maxlen, enum rip_state ns); static void unrip_line(BYTE *buf, unsigned *blen, unsigned *pos, size_t *rip_start, unsigned maxlen); static void write_text(const char *str); -static char * rv_static(const char * const var, const void * const data); +static char * rv_version(const char * const var, const void * const data); static char * rv_date(const char * const var, const void * const data); static char * rv_time(const char * const var, const void * const data); static char * rv_sound(const char * const var, const void * const data); @@ -7197,11 +7199,10 @@ static void kill_mouse_fields(void); static void shadow_palette(void); static void normal_palette(void); static void draw_line(int x1, int y1, int x2, int y2); -static void reinit_screen(enum text_modes mode, uint8_t *font, int fontx, int fonty); +static void reinit_screen(uint8_t *font, int fontx, int fonty); static bool no_viewport(void); -//static const char ripver[] = "RIPSCRIP015410"; -static const char ripver[] = "RIPSCRIP030001"; +static const char *ripver[] = {"", "RIPSCRIP015410", "RIPSCRIP030001"}; #define RIP_MOUSE_EVENT_NONE 0 #define RIP_MOUSE_EVENT_TEXT 1 @@ -7274,7 +7275,7 @@ static const struct builtin_rip_variable builtins[] = { {"RESTORE9", rv_restore, NULL}, {"RESTOREALL", rv_restore, NULL}, {"REVPHASER", rv_sound, NULL}, - {"RIPVER", rv_static, ripver},// RIPscrip version + {"RIPVER", rv_version, NULL},// RIPscrip version {"RMF", rv_restore, NULL}, {"RTW", rv_restore, NULL}, {"SAVE", rv_save, NULL}, @@ -7358,9 +7359,9 @@ get_text_variable(const char * const var) } static char * -rv_static(const char * const var, const void * const data) +rv_version(const char * const var, const void * const data) { - return strdup(data); + return strdup(ripver[rip.version]); } static char * @@ -7614,7 +7615,7 @@ rv_reset(const char * const var, const void * const data) rip.text_disabled = false; rip.ansi_state = ANSI_STATE_NONE; _setcursortype(rip.curstype); - reinit_screen(C80X43, NULL, 8, 8); + reinit_screen((uint8_t*)conio_fontdata[0].eight_by_eight, 8, 8); memcpy(&curr_ega_palette, &default_ega_palette, sizeof(curr_ega_palette)); set_ega_palette(); cterm->left_margin = 1; @@ -7764,7 +7765,7 @@ map_rip_y(int y) static void scale_setpixel(int x, int y, uint32_t color) { - if (!(color & 0x80000000) && color < 256) + if (!(color & 0x80000000)) color = map_rip_color(color); setpixel(map_rip_x(x), map_rip_y(y), color); } @@ -7846,6 +7847,8 @@ rv_termset(const char * const var, const void * const data) if (cterm->left_margin == 1 && cterm->right_margin == 1 && cterm->top_margin == 1 && cterm->bottom_margin == 1) return strdup("NO"); + if (rip.text_disabled) + return strdup("NO"); if (rip.curstype == _NOCURSOR) return strdup("NO"); return strdup("YES"); @@ -7871,20 +7874,30 @@ rv_termset(const char * const var, const void * const data) return NULL; } break; - case 'S': + case 'S': { + void *font; + int width; + int height; + + pthread_mutex_lock(&vstatlock); + font = vstat.forced_font; + width = vstat.charwidth; + height = vstat.charheight; + pthread_mutex_unlock(&vstatlock); switch(var[5]) { case 'F': gettextinfo(&ti); term.nostatus = TRUE; - reinit_screen(ti.currmode, vstat.forced_font, vstat.charwidth, vstat.charheight); + reinit_screen(font, width, height); return NULL; case 'N': gettextinfo(&ti); term.nostatus = FALSE; - reinit_screen(ti.currmode, vstat.forced_font, vstat.charwidth, vstat.charheight); + reinit_screen(font, width, height); return NULL; } break; + } case 'V': switch(var[6]) { case 'F': @@ -9369,47 +9382,52 @@ kill_mouse_fields(void) // TODO: this currently doesn't seem to work (shocker!) static void -reinit_screen(enum text_modes mode, uint8_t *font, int fx, int fy) +reinit_screen(uint8_t *font, int fx, int fy) { // TODO: Mystery rows in 8x8 mode... struct ciolib_pixels *pix = getpixels(0, 0, rip.x_max - 1, rip.y_max - 1, false); struct cterminal oldcterm = *cterm; int old_hold = hold_update; int cols = 80; + int rows = 43; void *nvmem; hold_update = 0; cterm_end(cterm); normal_palette(); - // First, switch to the new mode... - textmode(mode); // TODO: You know this is insane right? // Patch vstat font, font size, and cols - pthread_mutex_lock(&vstatlock); - vstat.forced_font = font; - vstat.charwidth = fx; - vstat.charheight = fy; if (font == ripfnt7x8) cols = 91; if (font == ripfnt7x14) cols = 91; if (font == ripfnt16x14) cols = 40; - vstat.cols = cols; - // We need to update gettextinfo() results as well... - cio_textinfo.screenwidth = cols; - // And this crappy thing. - term.width = cols; - // Now, make the vmem array large enough for the new bits... - nvmem = realloc(vstat.vmem->vmem, vstat.cols * vstat.rows * sizeof(vstat.vmem->vmem[0])); - // And use it. - vstat.vmem->vmem = nvmem; + pthread_mutex_lock(&vstatlock); + rows = vstat.scrnheight / fy; + if (font != vstat.forced_font || fx != vstat.charwidth || fy != vstat.charheight) { + vstat.forced_font = font; + vstat.charwidth = fx; + vstat.charheight = fy; + vstat.cols = cols; + vstat.rows = rows; + // We need to update gettextinfo() results as well... + cio_textinfo.screenwidth = cols; + cio_textinfo.screenheight = rows; + // And this crappy thing. + term.width = cols; + term.height = rows; + // Now, make the vmem array large enough for the new bits... + nvmem = realloc(vstat.vmem->vmem, vstat.cols * vstat.rows * sizeof(vstat.vmem->vmem[0])); + // And use it. + vstat.vmem->vmem = nvmem; + } pthread_mutex_unlock(&vstatlock); // Initialize it... clrscr(); get_term_win_size(&term.width, &term.height, &term.nostatus); term.width = cols; - cterm = cterm_init((mode == C80X43 ? 43 : 25) + (term.nostatus ? 0 : -1), vstat.cols, oldcterm.x, oldcterm.y, oldcterm.backlines, oldcterm.backwidth, oldcterm.scrollback, oldcterm.emulation); + cterm = cterm_init(rows + (term.nostatus ? 0 : -1), cols, oldcterm.x, oldcterm.y, oldcterm.backlines, oldcterm.backwidth, oldcterm.scrollback, oldcterm.emulation); cterm->apc_handler = oldcterm.apc_handler; cterm->apc_handler_data = oldcterm.apc_handler_data; cterm->mouse_state_change = oldcterm.mouse_state_change; @@ -9928,11 +9946,16 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) GET_XY(); arg1 = parse_mega(&args[4], 2); pthread_mutex_lock(&vstatlock); - // This seems to be - arg3 = (arg1 * 7750 / 10000); + if (vstat.scale_numerator == 729 && vstat.scale_denominator == 1000) { + // Detect EGA mode and use the same value as RIPterm did. + arg3 = (arg1 * 7750 / 10000); + } + else { + arg3 = arg1 * vstat.scale_numerator / vstat.scale_denominator; + } + pthread_mutex_unlock(&vstatlock); if (arg1 == 1) arg3 = 1; - pthread_mutex_unlock(&vstatlock); full_ellipse(x1, y1, arg1, arg3, false); break; case 'E': // RIP_ERASE_VIEW !|E @@ -10427,6 +10450,13 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) GET_XY(); rip.x_dim = x1; rip.y_dim = y1; + pthread_mutex_lock(&vstatlock); + rip.x_max = vstat.scrnwidth; + if (rip.x_max > rip.x_dim) + rip.x_max = rip.x_dim; + rip.y_max = vstat.scrnheight; + if (rip.y_max > rip.y_dim) + rip.y_max = rip.y_dim; // TODO: Hack... we should likely scale both directions... rip.viewport.sx = 0; rip.viewport.sy = 0; @@ -10436,6 +10466,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) FREE_AND_NULL(rip.ymap); FREE_AND_NULL(rip.xunmap); FREE_AND_NULL(rip.yunmap); + pthread_mutex_unlock(&vstatlock); break; case 'g': // RIP_GOTOXY !|g <x> <y> /* This command sets the position of the text cursor in the TTY Text @@ -10807,32 +10838,33 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) break; struct text_info ti; gettextinfo(&ti); - arg3 = vstat.charwidth; + if (arg1) + cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; + else + cterm->extattr &= ~CTERM_EXTATTR_AUTOWRAP; + pthread_mutex_lock(&vstatlock); + if (x1 == cterm->left_margin - 1 && x2 == cterm->right_margin - 1 + && y1 == cterm->top_margin - 1 && y2 == cterm->bottom_margin - 1 + && arg2 == vstat.charwidth) { + pthread_mutex_unlock(&vstatlock); + break; + } + pthread_mutex_unlock(&vstatlock); switch(arg2) { case 0: - if (ti.currmode == C80X43 && arg3 == 8) - break; - reinit_screen(C80X43, NULL, 8, 8); + reinit_screen((uint8_t*)conio_fontdata[0].eight_by_eight, 8, 8); break; case 1: - if (ti.currmode == C80X43 && arg3 == 7) - break; - reinit_screen(C80X43, ripfnt7x8, 7, 8); + reinit_screen(ripfnt7x8, 7, 8); break; case 2: - if (ti.currmode == EGA80X25 && arg3 == 8) - break; - reinit_screen(EGA80X25, NULL, 8, 14); + reinit_screen((uint8_t*)conio_fontdata[0].eight_by_fourteen, 8, 14); break; case 3: - if (ti.currmode == EGA80X25 && arg3 == 7) - break; - reinit_screen(EGA80X25, ripfnt7x14, 7, 14); + reinit_screen(ripfnt7x14, 7, 14); break; case 4: - if (ti.currmode == EGA80X25 && arg3 == 16) - break; - reinit_screen(EGA80X25, ripfnt16x14, 16, 14); + reinit_screen(ripfnt16x14, 16, 14); break; } arg3 = 0; @@ -10855,10 +10887,6 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) cterm->bottom_margin = y2 + 1; cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; - if (arg1) - cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; - else - cterm->extattr &= ~CTERM_EXTATTR_AUTOWRAP; if (arg3) { setwindow(cterm); arg3 = hold_update; @@ -12064,8 +12092,10 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) gettextinfo(&ti); int bline = y1 + rip.viewport.sy + rip.clipboard->height - 1; + pthread_mutex_lock(&vstatlock); if (bline >= vstat.scrnheight) bline = vstat.scrnheight - 1; + pthread_mutex_unlock(&vstatlock); if (x1 + rip.viewport.sx + rip.clipboard->width - 1 > rip.viewport.ex) break; switch(arg1) { @@ -13042,20 +13072,20 @@ handle_rip_line(BYTE *buf, unsigned *blen, unsigned *pos, size_t *rip_start, uns fwrite(pending, 1, pending_len, cterm->logfile); if (strcmp(pending, "\x1b[!") == 0) { gettextinfo(&ti); - if (ti.currmode == C80X43 || ti.currmode == EGA80X25) - conn_send(ripver, 14, 1000); + if (rip.version) + conn_send(ripver[rip.version], 14, 1000); } else if (strcmp(pending, "\x1b[0!") == 0) { gettextinfo(&ti); - if (ti.currmode == C80X43 || ti.currmode == EGA80X25) - conn_send(ripver, 14, 1000); + if (rip.version) + conn_send(ripver[rip.version], 14, 1000); } else if (strcmp(pending, "\x1b[1!") == 0) { rip.enabled = false; } else if (strcmp(pending, "\x1b[2!") == 0) { gettextinfo(&ti); - if (ti.currmode == C80X43 || ti.currmode == EGA80X25) + if (rip.version) rip.enabled = true; } else if (pending[0] == '\x1b' && pending[1] == '[') { @@ -13514,7 +13544,8 @@ init_rip(int enabled) memset(&rip, 0, sizeof(rip)); rip.state = RIP_STATE_BOL; rip.newstate = RIP_STATE_FLUSHING; - rip.enabled = enabled; + rip.enabled = version != RIP_VERSION_NONE; + rip.version = version; rip.x = 0; rip.y = 0; rip.viewport.sx = 0; @@ -13531,9 +13562,15 @@ init_rip(int enabled) rip.line_pattern = 0xffff; rip.line_width = 1; rip.x_dim = 640; - rip.x_max = 640; + pthread_mutex_lock(&vstatlock); + rip.x_max = vstat.scrnwidth; + if (rip.x_max > rip.x_dim) + rip.x_max = rip.x_dim; rip.y_dim = 350; - rip.y_max = 350; + rip.y_max = vstat.scrnheight; + if (rip.y_max > rip.y_dim) + rip.y_max = rip.y_dim; + pthread_mutex_unlock(&vstatlock); pending_len = 0; if (pending) @@ -13541,7 +13578,7 @@ init_rip(int enabled) moredata_len = 0; if (moredata) moredata[0] = 0; - if (enabled) { + if (version) { memcpy(&curr_ega_palette, &default_ega_palette, sizeof(curr_ega_palette)); set_ega_palette(); } diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c index bdcb5719c26eb483d03991e1596804334f89c687..1fbe1df717e29dbc764f8828bacff6e4d180196d 100644 --- a/src/syncterm/rlogin.c +++ b/src/syncterm/rlogin.c @@ -45,7 +45,6 @@ void rlogin_input_thread(void *args) #endif void rlogin_output_thread(void *args) { - fd_set wds; int wr; int ret; int sent; diff --git a/src/syncterm/term.c b/src/syncterm/term.c index fab69fcf750f64e3675c85c99306a2d64f0b01fd..04b544e8375a2a685ad14ee3fc068cff14e8c68e 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -2251,7 +2251,7 @@ static void apc_handler(char *strbuf, size_t slen, void *apcd) MD5_calc(digest, buf, rc); } fclose(f); - MD5_hex((BYTE *)buf, digest); + MD5_hex(buf, digest); conn_send(buf, strlen(buf), 0); } conn_send("\n", 1, 0);