Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!ames!uhccux!munnari.oz.au!murtoa.cs.mu.oz.au!otc!softway!peterc From: peterc@softway.oz (Peter Chubb) Newsgroups: comp.sys.amiga.tech Subject: Lattice C 5.02 BUGS Keywords: cmp==eor getenv fork Message-ID: <2023@softway.oz> Date: 28 Aug 89 23:05:48 GMT Organization: Softway Pty Ltd, Sydney, Australia Lines: 77 Some more bugs in Lattice C 5.02 for the Amiga for your pleasure and delectation: Compiler bug: void t() { long a, *t; *t = (*t < a); } Instead of a compare instruction, the compiler generates an exclusive or instruction. These have the same bit pattern, but are interpreted differently depending on the addressing mode. Library bugs: getenv() seems to use the same buffer for the name of the file in env: and its returned contents. Unfortunately, if the file name was longer than the value of the variable, the end of the file name will still be visible. Maybe it's not being null terminated properly? I've appended a version of getenv that works. This version uncovered a bug in the builtin_strcpy, too! fork() often seems to crash the amiga. Try the example in the manual with c:echo as argument, just be ready for the three-fingered reset. ----------------Cut Here------------------------------------ /************************************************************************ * getenv.c -- get environment variable value. * * * * Copyright 1989 Peter Chubb * * All rights reserved * * * * This software may be used and distributed freely * * providing this notice is not removed or altered * * and any changes to the file are clearly marked as * * such. * * * ************************************************************************/ #include #include #include #undef strcpy /* avoid bug in built_in strcpy */ /* getenv -- return value of 1.3 environment variable */ char * getenv(char *name) { static char buf[BUFSIZ]; BPTR envfile; long len; if(!name) return NULL; (void)strcpy(buf, "ENV:"); (void)strcat(buf, name); if((envfile = Open(buf, MODE_OLDFILE)) == (BPTR)0) return NULL; /* non-existent variable */ if((len = Read(envfile, buf, BUFSIZ)) < 0){ (void)Close(envfile); return NULL; } if(len != BUFSIZ) buf[len] = '\0'; else /* too long */ buf[BUFSIZ-1] = '\0'; (void)Close(envfile); return buf; }