Skip to main content

Going crazy in C

I have an application, written (by someone else) in C, running on SCO OpenServer 5 Unix, which I need to convince that Linux is a better thing to do — amongst other things, it is much easier to find people to maintain such a system, plus significantly easier to find matching hardware with drivers. Plus when SCO finally bites the dust, major support questions arise.

It is written, mostly, in very old-style C. No function protoypes at all.

It was compiled, it seems, with an ancient version of gcc, which should make things easier. The compile shell-scripts are a bit cumbersome, don’t refer to any particular breed of shell, have about zero error checking, use obsolete/defective options. Never mind.

Some definition files were copied in wholesale from the SCO Unix system files. Never mind about copyrights. Erase. We’ll use modern, intrinsic-to-system ones.

Terminal (text screen) handling is absolutely hard-wired into the code [printf("\33[%d;%dH", row, col);] for a VT-100 type terminal (but that at least is a bit modularised so can be readily converted to a more modern, portable style).

Some of the system definitions have been over-ridden by hand. Poorly. For example, NULL is #defined to be (0), in contrast to a void pointer to nothing.

C source files are canonically “whatever.c”; C include files (definitions) are supposed to be “whatever.h”; the binaries (compiled programs) are supposed to be just “whatever”... but both binaries & includes are quite cryptically named (what would you make of “dr3” or “clx?”) as just “whatever”. Some of the include files are prefixed “i_” — WTF?

Calling conventions are terribly arbitrary. They modify the supplied variables instead of returning a new one. They return the address of a static (one copy local to each procedure) variable instead of writing into a supplied one or creating a new one. A row number is supplied directly as an int, so is a column number but in one procedure it is supplied as a reference (indirect) to the number. No explanation. No comments within the code at all beyond a general/vague mention at the start of some files.

There are some unquestionable bugs; for example, one procedure prompts for & reads an integer from the keyboard, accepting a double * as an argument. In several places, it is passed an int *. Some things may mysteriously commence working after this compiles. (-:

The fact that it is working at all is a freakin’ miracle.

In amending it so that it will compile successfully on a modern C compiler, I am doing surgery which makes up many of those lacks, & emplaces default specifications & checks which will point out any obvious errors.

Comments

Anonymous said…
Pass by reference, especially for constants ala

int one = 1;
function (&one);

sounds a lot like you're calling, or have called in the past, Fortran functions (the Fortran ABI only handles pass by reference).

To be honest, I'd avoid changing your code too much, it's a great way to introduce subtle bugs (especially if Fortran is involved, Fortran enumerates arrays from 1, not 0)

Modern gcc still supports K&R style declarations, etc. So your source should still be compilable. Linux still supports VT100 terminal controls (set TERM=vt100).

Ideally, your only problem will be the use of library calls that aren't available on Linux, but for a terminal program it's usually just a matter of working out what #define turns that call on (assuming you're not touching threading, ioctls, IPv6, or a bunch of other areas).
Leon RJ Brooks said…
ForTran originally didn’s allow for recursion, either, due to having initially been written on a PDP-8. (-:

This is C (I have in the past used ForTran & even RatFor), but under gcc (later than the version used on SCO Unix) a straight compilation is warning city.

Gazing through many hundreds of warnings is a bit overwhelming, & I am planning for the future a bit, so if I get run down by the proverbial bus, the next programmer starts with at least an even chance...

AFAICT, library usage is very middle-of-the-road (the #includes physically copied into a local directory featured nothing bizarre).

Thanks for your comments...

Popular posts from this blog

An Open and Shut response to Darl McBride

Hi, Darl. I see you’re being dishonest again . It’d be really nice if you could shoot straight for a change, but I think Kerry’s Dad will be selling snowplows in Hell first. Three years ago, when I first joined The SCO Group, we focused the company on the area that was most profitable and provided the most benefit to customers, investors, resellers, developers and employees: UNIX No, you focused the company on suing people, which was most profitable to lawyers and provided some golden parachutes for your buddies. People thought we were crazy. They were right. But since SCO owns the UNIX operating system The SCO Group does not own UNIX® in any sense of the word. The Open Group owns the UNIX trademark, definition and other rights , The SCO Group does not. The SCO Group doesn’t even own the UnixWare® or OpenServer® code, the rights to those are held by Novell and TSG use them only by permission and under certain conditions — which they have violate...

5x7 text dot-matrix in five minutes...

This is a fairly primitive toy I threw together today for a specific purpose, published in case it’s any use to others... feed it a list of words as command arguments, which it will then display as a 5x7 ASCII dotmatrix with ‘#’ as a dot & ‘_’ as a blank. /* * display text using a 5x7 bitmap font in ASCII letters */ static unsigned char font [] [5] = { { 0x00,0x00,0x00,0x00,0x00 }, // 0x20 32 { 0x00,0x00,0x6f,0x00,0x00 }, // ! 0x21 33 { 0x00,0x07,0x00,0x07,0x00 }, // " 0x22 34 { 0x14,0x7f,0x14,0x7f,0x14 }, // # 0x23 35 { 0x00,0x07,0x04,0x1e,0x00 }, // $ 0x24 36 { 0x23,0x13,0x08,0x64,0x62 }, // % 0x25 37 { 0x36,0x49,0x56,0x20,0x50 }, // & 0x26 38 { 0x00,0x00,0x07,0x00,0x00 }, // ' 0x27 39 { 0x00,0x1c,0x22,0x41,0x00 }, // ( 0x28 40 { 0x00,0x41,0x22,0x1c,0x00 }, // ) 0x29 41 { 0x14,0x08,0x3e,0x08,0x14 }, // * 0x2a 42 { 0x08,0x08,0x3e,0x08,0x08 }, ...

Citizens Augmenting Government Waste

So here we have Microsoft-funded “ Citizens Against Government Waste ” (CAGW) heavily criticising Massachusetts’s switch to an internationally accepted and open document standard (not open source, open standard — but I seem to remember a large monopolist who frequently confuses the two when it suits them). I remember CAGW, they were the organisation who had dead people writing in to support Microsoft in court a few years ago — thanks to sbergman27 for the link — is this “the dead hand of CAGW” at work again? Let’s follow the money and find out. Who stands to lose the most money and control if Massachusetts switches to an unencumbered document format? Big surprise, it’s CAGW sponsor Microsoft, through their dominant MS-Office suite. Why did CAGW list Microsoft’s suite last, after two other much-less-dominant examples which are waning anyway? If you’re inclined to wallow in additional irony, consider that at leas...