+ if (MODE_COMMAND_LINE(f)) {
+ signal(SIGINT, SIG_DFL);
+ if (old_1b_segment|old_1b_offset) {
+ inregs.h.ah = 0x25;
+ inregs.h.al = 0x1b;
+ inregs.x.dx = old_1b_offset;
+ segregs.ds = old_1b_segment;
+ intdosx(&inregs, &inregs, &segregs);
+ old_1b_segment = old_1b_offset = 0;
+ }
+ if (setmode(fileno(stdout), O_TEXT) == -1) {
+ ExitPerror("setmode (text)", 1);
+ }
+ (void) dosbinary(fileno(stdout), 0);
+ if (setmode(fileno(stdin), O_TEXT) == -1) {
+ ExitPerror("setmode (text)", 1);
+ }
+ (void) dosbinary(fileno(stdin), 0);
+ } else {
+ signal(SIGINT, CtrlCInterrupt);
+ if ((old_1b_segment|old_1b_offset) == 0) {
+ extern void iret_subr();
+ void (far *foo_subr)() = iret_subr;
+
+ inregs.h.ah = 0x35;
+ inregs.h.al = 0x1b;
+ intdosx(&inregs, &inregs, &segregs);
+ old_1b_segment = segregs.es;
+ old_1b_offset = inregs.x.bx;
+ inregs.h.ah = 0x25;
+ inregs.h.al = 0x1b;
+ inregs.x.dx = FP_OFF(foo_subr);
+ segregs.ds = FP_SEG(foo_subr);
+ intdosx(&inregs, &inregs, &segregs);
+ }
+ if (MODE_LOCAL_CHARS(f)) {
+ if (setmode(fileno(stdout), O_TEXT) == -1) {
+ ExitPerror("setmode (text)", 1);
+ }
+ (void) dosbinary(fileno(stdout), 0);
+ if (setmode(fileno(stdin), O_TEXT) == -1) {
+ ExitPerror("setmode (text)", 1);
+ }
+ (void) dosbinary(fileno(stdin), 0);
+ } else {
+ if (setmode(fileno(stdout), O_BINARY) == -1) {
+ ExitPerror("setmode (binary)", 1);
+ }
+ (void) dosbinary(fileno(stdout), 1);
+ if (setmode(fileno(stdin), O_BINARY) == -1) {
+ ExitPerror("setmode (binary)", 1);
+ }
+ (void) dosbinary(fileno(stdin), 1);
+ }
+ }