[Coco] c_prep 1.9 oddity
William Carlin
whcarlinjr at gmail.com
Fri May 27 22:12:11 EDT 2016
I have noticed some strange things when using c_prep 1.9 to compile code
that I run across.
Here are the specifics:
C_PREP by Jim McDowell with version 1.9 updates by Gene Heskett
I am using cc version 2.5.2 to compile which uses the module named c_prep
as the preprocessor. Below is the ident information so we know exactly
what version I am working with here.
(Plug for DriveWire here. Copied and pasted here from Windows telnet.)
DriveWire Telnet Server 4.3.3o
NitrOS-9/6309 Level 2 V3.3.0 on the Tandy Color Computer 3 2016/05/27
21:05:58
User name?: su
Process #03 logged on 2016/05/27 21:06:00
Welcome!
Welcome to NitrOS-9 Level 2 V3.3.0 HD6309 Enhanced
On the Tandy Color Computer 3
Shell+ v2.2a 16/05/27 21:06:00
{N2|03}/DD:ident -x c_prep
Header for: c_prep
Module size: $520D #21005
Module CRC: $B07C0E (Good)
Hdr parity: $77
Exec. off: $0021 #33
Data Size: $781E #30750
Edition: $09 #9
Ty/La At/Rv: $11 $81
Prog mod, 6809 obj, re-en, R/O
So I am running through some OS-9 software from a hard disk image named
'RTSI Archives 01 OS9 RSDOS.vhd' and come across the source code for a
utility called CUTS, version 1.6. When cuts.c is run through c_prep 1.9 I
get an error. The error is in shown here:
(Note: I use a different makefile than the one included in the RTSI archive
of CUTS 1.6)
[Error Output from c.pass1]
{N2|03}/DD/USR/SRC/CUTS/SRC:make
cc -dOS9 -T=/r0 -r=../RELS cuts.c
cc version 2.5.2
'cuts.c'
c_prep : -DOS9 cuts.c
c.pass1: /r0/ctmp.12.m -o=/r0/ctmp.12.a
cuts.c : line 108 **** undeclared variable ****
names [ nfiles ] .file _type = 3 ;
^
cuts.c : line 108 **** struct member required ****
names [ nfiles ] .file _type = 3 ;
^
cuts.c : line 108 **** ; expected ****
names [ nfiles ] .file _type = 3 ;
^
cuts.c : line 108 **** undeclared variable ****
names [ nfiles ] .file _type = 3 ;
[END]
c_prep 1.9 seems to be mangling the data type name "file_type" to "file
_type".
Here is the relevant source code:
[cuts.c]
...
typedef struct
{
int file_type;
char *name;
} namestype;
main (argc,argv)
...
int c, i, decoder=0, encoder=0, outputfile=0, nfiles=0;
...
namestype names[MAXNAMES];
...
case 'm':
names[nfiles].file_type = MACHINEFILE; /* Line 108 */
names[nfiles++].name = optarg;
break;
...
[END]
[output from c_prep 1.9]
...
cuts.c
cuts_c
...
typedef struct
{
int file_type ;
char * name ;
} namestype ;
...
main ( argc , argv )
...
int c , i , decoder = 0 , encoder = 0 , outputfile = 0 , nfiles = 0 ;
...
namestype names [ 25 ] ;
...
case 'm' :
names [ nfiles ] .file _type = 3 ;
names [ nfiles ++ ] .name = optarg ;
break ;
...
[END]
[output from Microware C c.prep]
...
typedef struct
{
int file_typ;
char *name;
} namestyp;
main(argc,argv)
...
int c, i, decoder=0, encoder=0, outputfi=0, nfiles=0;
...
namestyp names[25];
...
case 'm':
names[nfiles].file_typ = 3;
names[nfiles++].name = optarg;
break;
...
[END]
The output from c_prep 1.9 adds a space to the variable name of the data
type "file_type" making it "file _type". Microware C c.prep shortens the
variable name of the data type "file_type" to "file_typ" (shortened to 8
characters) but not adding in the space before the underscore.
Do any OS-9 C programmers have some insight into why c_prep 1.9 does this?
I had always assumed that it was a drop in replacement for the Microware
c.prep.
William Carlin
More information about the Coco
mailing list