rubber band in platform-specific code
[retroray] / src / logger.c
index 00d88b4..5b43a3a 100644 (file)
@@ -22,6 +22,10 @@ along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 #if defined(__MSDOS__) || defined(MSDOS)
 static int setup_serial(int sdev);
+
+void ser_putchar(int c);
+void ser_puts(const char *s);
+void ser_printf(const char *fmt, ...);
 #else
 #define USE_STD
 #endif
@@ -149,36 +153,19 @@ int add_log_callback(void (*cbfunc)(const char*, void*), void *cls)
 #endif
 #endif
 
-static void logmsg(int type, const char *fmt, va_list ap)
+static int logmsg(int type, const char *fmt, va_list ap)
 {
-       static char *buf;
-       static int bufsz;
-       int i, ret, newsz;
-       char *tmp;
-
-       while((ret = vsnprintf(buf, bufsz, fmt, ap)) > bufsz || ret < 0) {
-               if(ret > bufsz) {
-                       newsz = ret + 1;
-               } else {
-                       newsz = bufsz ? bufsz * 2 : 256;
-               }
-               if(!(tmp = realloc(buf, newsz))) {
-                       if(buf) {
-                               buf[bufsz - 1] = 0;
-                       }
-                       break;
-               }
-               buf = tmp;
-               bufsz = newsz;
-       }
+       static char buf[2048];
+       int i, len;
 
-       if(!buf) return;
+       len = vsnprintf(buf, sizeof buf, fmt, ap);
 
        for(i=0; i<num_outputs; i++) {
                switch(outputs[i].type) {
                case LOG_FILE:
                case LOG_STREAM:
                        fputs(buf, outputs[i].out.fp);
+                       fflush(outputs[i].out.fp);
                        break;
 
 #if defined(MSDOS) || defined(__MSDOS__)
@@ -194,62 +181,74 @@ static void logmsg(int type, const char *fmt, va_list ap)
                        break;
                }
        }
+
+       return len;
 }
 
-void errormsg(const char *fmt, ...)
+int errormsg(const char *fmt, ...)
 {
+       int len;
        va_list ap;
        va_start(ap, fmt);
-       logmsg(LOG_ERR, fmt, ap);
+       len = logmsg(LOG_ERR, fmt, ap);
        va_end(ap);
+       return len;
 }
 
-void warnmsg(const char *fmt, ...)
+int warnmsg(const char *fmt, ...)
 {
+       int len;
        va_list ap;
        va_start(ap, fmt);
-       logmsg(LOG_WARN, fmt, ap);
+       len = logmsg(LOG_WARN, fmt, ap);
        va_end(ap);
+       return len;
 }
 
-void infomsg(const char *fmt, ...)
+int infomsg(const char *fmt, ...)
 {
+       int len;
        va_list ap;
        va_start(ap, fmt);
-       logmsg(LOG_INFO, fmt, ap);
+       len = logmsg(LOG_INFO, fmt, ap);
        va_end(ap);
+       return len;
 }
 
-void dbgmsg(const char *fmt, ...)
+int dbgmsg(const char *fmt, ...)
 {
+       int len;
        va_list ap;
        va_start(ap, fmt);
-       logmsg(LOG_DBG, fmt, ap);
+       len = logmsg(LOG_DBG, fmt, ap);
        va_end(ap);
+       return len;
 }
 
-void verrormsg(const char *fmt, va_list ap)
+int verrormsg(const char *fmt, va_list ap)
 {
-       logmsg(LOG_ERR, fmt, ap);
+       return logmsg(LOG_ERR, fmt, ap);
 }
 
-void vwarnmsg(const char *fmt, va_list ap)
+int vwarnmsg(const char *fmt, va_list ap)
 {
-       logmsg(LOG_ERR, fmt, ap);
+       return logmsg(LOG_ERR, fmt, ap);
 }
 
-void vinfomsg(const char *fmt, va_list ap)
+int vinfomsg(const char *fmt, va_list ap)
 {
-       logmsg(LOG_ERR, fmt, ap);
+       return logmsg(LOG_ERR, fmt, ap);
 }
 
-void vdbgmsg(const char *fmt, va_list ap)
+int vdbgmsg(const char *fmt, va_list ap)
 {
-       logmsg(LOG_ERR, fmt, ap);
+       return logmsg(LOG_ERR, fmt, ap);
 }
 
 
 #if defined(MSDOS) || defined(__MSDOS__)
+#include <conio.h>
+
 #define UART1_BASE     0x3f8
 #define UART2_BASE     0x2f8