[Coco] Microware C Compiler port
Gene Heskett
gene.heskett at verizon.net
Wed Jan 21 20:48:42 EST 2009
On Wednesday 21 January 2009, John W. Linville wrote:
>On Wed, Jan 21, 2009 at 07:05:23AM -0500, Steven Hirsch wrote:
>> On Tue, 20 Jan 2009, John W. Linville wrote:
>>> Some of the changes are simple, such as changing "%6D" to "%6d",
>>> implementing a utility function ("sig_err"), and fixing an actual
>>> syntax error. That was enough to get the program basically running,
>>> but it was producing 0 counts for lines, words, and characters.
>>>
>>> The original sources had those count vars defined as long. Changing
>>> them to int yielded correct results, except that it doesn't take much
>>> to overflow the character count... :-(
>>>
>>> Did this compiler have problems with long in the original OS-9/6809
>>> version? It is bad enough to not handle long, but to compile it
>>> without complaint and simply not work seems rather wrong. FWIW,
>>> changing to 'long int' didn't change anything.
>
>So it turns-out that leaving the vars declared as long and simply
>casting them to int in the printf arguments yields the same results
>as simply declaring them as int in the first place. To me this
>suggests that the basic code generation for the long type is working.
>Perhaps there is some different conversion format needed for the
>Microware printf to handle long?
AFAIK, it follows the original K&R exactly for (f)printf() functions.
>>> Still, it _is_ cool to compile for OS-9 on my Linux box... :-)
>>
>> Thanks, John. The feedback is appreciated. I'm going to gather input
>> and hopefully work on a more refined release for the near future.
>
>Sounds great. I'd love to hear about your future plans.
>
>John
>
>P.S. New diff from the original Minix sources inlined below...
>
>--- minix/commands/wc.c 1987-01-02 04:16:15.000000000 -0500
>+++ wc.c 2009-01-21 18:47:27.000000000 -0500
>@@ -1,9 +1,15 @@
> /* wc - count lines, words and characters Author: David Messer */
>
>-#include "stdio.h"
>-#define isdigit(c) (c >= '0' && c <= '9)
>+#include <stdio.h>
>+#define isdigit(c) (c >= '0' && c <= '9')
> #define isspace(c) (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c ==
> '\r')
>
>+std_err(str)
>+char *str;
>+{
>+ fprintf(stderr, "%s", str);
>+}
>+
> /*
> *
> * Usage: wc [-lwc] [names]
>@@ -79,9 +85,9 @@ char *argv[];
> /* Check to see if input comes from std input. */
> if (k >= argc) {
> count();
>- if(lflag) printf(" %6D", lcount);
>- if(wflag) printf(" %6D", wcount);
>- if(cflag) printf(" %6D", ccount);
>+ if(lflag) printf(" %6d", (int)lcount);
>+ if(wflag) printf(" %6d", (int)wcount);
>+ if(cflag) printf(" %6d", (int)ccount);
> printf(" \n");
> fflush(stdout);
> exit(0);
>@@ -99,18 +105,18 @@ char *argv[];
> } else {
> /* Next file has been opened as std input. */
> count();
>- if(lflag) printf(" %6D", lcount);
>- if(wflag) printf(" %6D", wcount);
>- if(cflag) printf(" %6D", ccount);
>+ if(lflag) printf(" %6d", (int)lcount);
>+ if(wflag) printf(" %6d", (int)wcount);
>+ if(cflag) printf(" %6d", (int)ccount);
> printf(" %s\n", argv[k]);
> }
> k++;
> }
>
> if(tflag) {
>- if(lflag) printf(" %6D", ltotal);
>- if(wflag) printf(" %6D", wtotal);
>- if(cflag) printf(" %6D", ctotal);
>+ if(lflag) printf(" %6d", (int)ltotal);
>+ if(wflag) printf(" %6d", (int)wtotal);
>+ if(cflag) printf(" %6d", (int)ctotal);
> printf(" total\n");
> }
--
Cheers, Gene
"There are four boxes to be used in defense of liberty:
soap, ballot, jury, and ammo. Please use in that order."
-Ed Howdershelt (Author)
Department chairmen never die, they just lose their faculties.
More information about the Coco
mailing list