/* * games/_shared/ - shared routines for games * * dos2linux.c - MS-Dos to GNU/Linux call convertor * ____________________________________________________________ * * Developed by Ondrej Jombik * Copyright (c) 2003-2004 Platon SDG, http://platon.sk/ * All rights reserved. * * See README file for more information about this software. * See COPYING file for license information. * * Download the latest version from * http://platon.sk/projects/games/ * * Changelog: * 2003-05-03 - created * 2003-08-12 - X11 adaptations */ /* $Platon: games/_shared/dos2linux.c,v 1.9 2004/04/06 09:54:15 nepto Exp $ */ #include #include #include #include #include #include "dos2linux.h" static int getch_next_ret = 0; /* used by both, SVGAlib and X11 */ #if PLATON_SYSTEM_SVGALIB #include int kbhit(void) /* {{{ */ { register int ret; struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; ret = vga_waitevent(/* VGA_MOUSEEVENT | */ VGA_KEYEVENT, NULL, NULL, NULL, &timeout); return ret > 0 ? 1 : 0; } /* }}} */ int getch(void) /* {{{ */ { register int ret; #if 0 /* debug mode */ ret = vga_getch(); fprintf(stderr, "getch(): ret = %d\n", ret); #else if (getch_next_ret != 0) { ret = getch_next_ret; getch_next_ret = 0; } else { ret = vga_getch(); if (ret == 27 && kbhit() && (ret = vga_getch()) == 91 && kbhit()) { ret = vga_getch(); if (ret == 91) { switch (ret = vga_getch()) { case 65: getch_next_ret = F1; break; case 66: getch_next_ret = F2; break; case 67: getch_next_ret = F3; break; case 68: getch_next_ret = F4; break; case 69: getch_next_ret = F5; break; case 70: getch_next_ret = F6; break; case 71: getch_next_ret = F7; break; case 72: getch_next_ret = F8; break; case 73: getch_next_ret = F9; break; case 74: getch_next_ret = F10; break; } } else { switch (ret) { case 65: getch_next_ret = SUP; break; case 66: getch_next_ret = SDOWN; break; case 67: getch_next_ret = SRIGHT; break; case 68: getch_next_ret = SLEFT; break; case 49: getch_next_ret = HOME; break; case 50: getch_next_ret = INSERT; break; case 51: getch_next_ret = DELETE; break; case 52: getch_next_ret = END; break; case 53: getch_next_ret = PGUP; break; case 54: getch_next_ret = PGDOWN; break; } if (ret >= 49 && ret <= 54 && kbhit()) ret = vga_getch(); /* == 126 */ } if (getch_next_ret != 0) ret = NUL; } else if (ret == LF) { ret = EOL; } else if (ret == 127) { ret = BS; } } #endif return ret; } /* }}} */ #endif #if PLATON_SYSTEM_X11 #include int kbhit(void) /* {{{ */ { X11_BGI_update_IO(); return KEYINFO_buffer != 0; } /* }}} */ int getch(void) /* {{{ */ { register int ret; if (getch_next_ret != 0) { ret = getch_next_ret; getch_next_ret = 0; } else { do { X11_BGI_update_IO(); } while (KEYINFO_buffer == 0); ret = KEYINFO_buffer; if (ret > 0xff00) ret -= 0xff00; switch (ret) { case 81: getch_next_ret = SLEFT; break; case 82: getch_next_ret = SUP; break; case 83: getch_next_ret = SRIGHT; break; case 84: getch_next_ret = SDOWN; break; case 190: getch_next_ret = F1; break; case 191: getch_next_ret = F2; break; case 192: getch_next_ret = F3; break; case 193: getch_next_ret = F4; break; case 194: getch_next_ret = F5; break; case 195: getch_next_ret = F6; break; case 196: getch_next_ret = F7; break; case 197: getch_next_ret = F8; break; case 198: getch_next_ret = F9; break; case 199: getch_next_ret = F10; break; } if (getch_next_ret != 0) ret = NUL; #if 0 /* debug mode */ fprintf(stderr, "getch() input key transformation: %x (%d) => %x (%d)", KEYINFO_buffer, KEYINFO_buffer, ret, ret); if (getch_next_ret != 0) fprintf(stderr, " + %x (%d)", getch_next_ret, getch_next_ret); fputc('\n', stderr); #endif KEYINFO_buffer = 0; } return ret; } /* }}} */ #endif void getdate(struct date *datep) /* {{{ */ { time_t secs; struct tm *t; time(&secs); t = gmtime(&secs); datep->da_year = (short) t->tm_year + 1900; datep->da_mon = (char) t->tm_mon + 1; datep->da_day = (char) t->tm_mday; } /* }}} */ /* Modeline for ViM {{{ * vim: set ts=4: * vim600: fdm=marker fdl=0 fdc=0: * }}} */