Issues on Porting
Friday, May 11th, 2001DOS not make sense
- Fileformat: Normally these things use CR/LF, and sometimes
 use braindead ibmpc-character encoding. I use “recode ibmpc:utf8mb4”
 to make umlauts meaningful and “pt -u” to convert CR/LF’s. Makefiles
 are mostly broken as well; and sources may contain some weird character
 at the end of file.
- Filenames: Normally crippled to 8.3 characters. I happened to
 come upon some filename which was sometimes written to disk uninitalized
 resulting is a fopen()-failure on DOS but working on Unix. Thus, on
 Unix you’d get a long string of garbled characters as filename..
- Memory Model: DOS-programs come in different flavours of memory
 models like “huge” or “small”, which is, of course, bogus. Delete it,
 including “far”, “near” and “register”.
- Types: On DOS, “int” normally is only 16bit, but is 32bit on
 Unix. Depending on memory-models, pointers may also 16bit on DOS
 (and of course are normally 32bit on Unix).
- Strings: There are some naming differences on string-comparison
 functions:DOS: Unix: stricmp() strcasecmp() strnicmp() strncasecmp()
- Language: C and C++ generally work when used in Character-mode,
 i.e. if no graphics are used. Pascal can be a bit harder to get to work,
 there are at least two pascal to C converters available. One is p2c of
 the FSF and another ptoc.
 I have ported some application from pascal to C using p2c and correcting
 bogus manually (see below). Of course, using gpc (GNU pascal compiler)
 or fpc (free pascal compiler)
 you can compile pascal natively. For Basic, there’s
 qb2c, which
 can handle various basic-dialects through its preprocessor, but the
 free version doesn’t understand dynamic memory allocation (DIM-command)
 which makes it pretty useless.Pascal: C: assign FilePointer=Filename; FilePointer=fopen(Filename, "w"); _randint(15L); (rand()%15); _randomize(); srand((unsigned int)time());For the crippled dialect of Microsoft C for DOS, I wrote a very basic 
 conversion-script to Borland C (see libgrx).
- Character-Screen: Normally, DOS-Programs either use conio.h
 or Turbo Vision. There’s a Linux-Version of conio.h, but I don’t
 like it. You can easily replace conio with ncurses. There’s also
 
 Turbo Vision for Unix, though I don’t know whether it works correctly.
 The biggest nuisance with DOS-Programs is the stupid assumption of
 its programmers that the screensize is 80×25. I wasn’t able to handle
 other screensizes with the linux-conio, so I replaced every occurence
 of conio-commands with their ncurses-equivalents.DOS: UNIX (curses): clrsrc(); clear(); gotoxy(Col, Row) move(Row, Col); refresh(); getch() getchar(); printf("string"); wprintw(window,"string"); #to avoid 80x25 issues cprintf("string"); wprintw(window,"string"); window(a,b,c,d); window = newwin(lines,cols,begin_y,begin_x);Currently I’m working on some perl-scripts to automate this. Alternatively it makes sense just to replace getch(), like this: DOS: UNIX (curses): getch() int ch, charactr; while ((ch=getchar()) != 'n') { charactr=ch; }Perhaps it is most easy to use my getch.c-function 
 to subsitute this. All you’ve got to do is to include it in the source.
- Graphics: There’s a
 BGI-Library for Linux, which doesn’t seem to work (a.out, no source
 available). Another possibility seems to be
 
 libgrx, along with bcc2grx, but libgrx seems to be seriously broken, and has problems with
 mice and Keyboard on modern (glibc) systems.
 Then FPK Free Pascal, a Pascal-compiler which can do Delphi II can handle SVGA-Graphics
 as well, but not X. qb2c
 in contrast appears to be able to do graphics on X.On a related note, there’s a 
 Visual Basic to C/GTK-converter, but I haven’t tried it yet.
- Function-Keys: Handling of Function-keys, including DOWN, UP,
 PGUP and PGDN seems to be mostly messy. I haven’t soled this right
 now. It also seems that the conio.h getch() behaves different from
 the ncurses getchar(). Plus there’s the issue of kbhit() which is
 polling(!) the keyboard, which is an unbelievable stupidity and has
 to be replaced with select() or something.
- Random Numbers: Most DOS-programs can’t do these correctly and
 they break on Unix, either resulting in always the same numbers given
 back, or numbers of completely different length.DOS: UNIX: randomize(); srand((unsigned int)time()); random(number); rand()%number;
- There’s also another essay on this called
 Porting
 DOS applications to Linux by Alan Cox.
 Also, there’s short writeup on porting DOS-programs which play with
 hardware, it’s Porting DOS inb and outb functionality by someone at SCO.In the meantime, some other related articles have appeared: 
 Porting MS-DOS Graphics Applications in Linux Journal 53.
 Easily Porting MS-DOS Diagnostics to Linux in LinuxGazette 58.
 Porting Applications to Linux from Matt Welsh.
 Related: Porting SGI Audio Applications to Linux, again, fom Linux Journal 53.
 
 Porting Windows Applications to Linux from Mark Whitis.
 Solaris-to-Linux Porting Guide from Ulrich Drepper.
 Porting Win32 Applications To Linux from Gerson Kurz.
 
 Porting MFC applications to Linux from Markus Neifer.
 
 Porting MFC to GTK+ by Ryan C. Gordon.
 
 Migrate your apps from OS/2 to Linux IBM.
Peter Keel,
last update (links) 03.09.2004