Index: src/OFStdIOStream.m ================================================================== --- src/OFStdIOStream.m +++ src/OFStdIOStream.m @@ -121,10 +121,50 @@ date.microsecond / 1000, me, getpid(), msg]; objc_autoreleasePoolPop(pool); } +#ifdef OF_MSDOS +int +colorToMSDOS(OFColor *color) +{ + if ([color isEqual: [OFColor black]]) + return BLACK; + if ([color isEqual: [OFColor navy]]) + return BLUE; + if ([color isEqual: [OFColor green]]) + return GREEN; + if ([color isEqual: [OFColor teal]]) + return CYAN; + if ([color isEqual: [OFColor maroon]]) + return RED; + if ([color isEqual: [OFColor purple]]) + return MAGENTA; + if ([color isEqual: [OFColor olive]]) + return BROWN; + if ([color isEqual: [OFColor silver]]) + return LIGHTGRAY; + if ([color isEqual: [OFColor gray]]) + return DARKGRAY; + if ([color isEqual: [OFColor blue]]) + return LIGHTBLUE; + if ([color isEqual: [OFColor lime]]) + return LIGHTGREEN; + if ([color isEqual: [OFColor aqua]]) + return LIGHTCYAN; + if ([color isEqual: [OFColor red]]) + return LIGHTRED; + if ([color isEqual: [OFColor fuchsia]]) + return LIGHTMAGENTA; + if ([color isEqual: [OFColor yellow]]) + return YELLOW; + if ([color isEqual: [OFColor white]]) + return WHITE; + + return -1; +} +#else static int colorToANSI(OFColor *color) { if ([color isEqual: [OFColor black]]) return 30; @@ -159,10 +199,11 @@ if ([color isEqual: [OFColor white]]) return 97; return -1; } +#endif @implementation OFStdIOStream #ifndef OF_WINDOWS + (void)load { @@ -340,10 +381,36 @@ if ((bytesWritten = Write(_handle, (void *)buffer, length)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 errNo: EIO]; + + return (size_t)bytesWritten; +#elif defined(OF_MSDOS) + ssize_t bytesWritten; + + if (self.hasTerminal) { + const char *buffer_ = buffer; + + for (size_t i = 0; i < length; i++) { + if (buffer_[i] == '\n') + putch('\r'); + + putch(buffer_[i]); + } + + return length; + } + + if (length > SSIZE_MAX) + @throw [OFOutOfRangeException exception]; + + if ((bytesWritten = write(_fd, buffer, length)) < 0) + @throw [OFWriteFailedException exceptionWithObject: self + requestedLength: length + bytesWritten: 0 + errNo: errno]; return (size_t)bytesWritten; #elif defined(OF_WII_U) OSConsoleWrite(buffer, length); @@ -491,51 +558,81 @@ int code; if (!self.hasTerminal) return; +#ifdef OF_MSDOS + if ((code = colorToMSDOS(color)) == -1) + return; + + textcolor(code); +#else if ((code = colorToANSI(color)) == -1) return; [self writeFormat: @"\033[%um", code]; +#endif } - (void)setBackgroundColor: (OFColor *)color { int code; if (!self.hasTerminal) return; +#ifdef OF_MSDOS + if ((code = colorToMSDOS(color)) == -1) + return; + + textbackground(code); +#else if ((code = colorToANSI(color)) == -1) return; [self writeFormat: @"\033[%um", code + 10]; +#endif } - (void)reset { if (!self.hasTerminal) return; +#ifdef OF_MSDOS + normvideo(); +#else [self writeString: @"\033[0m"]; +#endif } - (void)clear { if (!self.hasTerminal) return; +#ifdef OF_MSDOS + clrscr(); +#else [self writeString: @"\033[2J"]; +#endif } - (void)eraseLine { if (!self.hasTerminal) return; +#ifdef OF_MSDOS + int column = wherex(); + + gotoxy(1, wherey()); + clreol(); + gotoxy(column, wherey()); +#else [self writeString: @"\033[2K"]; +#endif } - (void)setCursorColumn: (unsigned int)column { if (!self.hasTerminal)