You are on page 1of 58

What's new in the new version of lcc-win ---------------------------------------Aug 4: Fixed crash when parsing complex number July 18th.

Thanks to Thomas for reporting a very difficult to find bug. Fixed. T his only with optimizations ON. Missing include file wincon.h added to 32 bits version May 20 Fixed problem with repeated labels as reported by Jun Woong. Change in stmt.c Jan 31 Fixed bug in the code generation when optimization is on. The statement table[dp = !dp] When table is a 2 dimensional table, the multiplication by the size of the r ow to get the index was wrong. Thanks to "copx" for pointing me to this bug Dec 3: Fixed bug in the handling of 64 bit numbers in the 32 bit version. Thanks to Thomas.Irlet@vtg.admin.ch for pointing me to this bug. Oct 25: Fixed problem in the fabs function Oct 20: Fixed problem with the statistics library Oct 10 Fixed problem with 128 bit ints April 17: Fixed problem with the optimizer: the cmov instruction always accesses memory, even if the condition is false. Fixed problem with the 64 bit C library. April 6th: Fixed problem in printf with the format printf ("%8.0e\n", 1.8E19); That would print 0... Fixed problem with compilation of complex numbers. Several problems remain. Jan 24: The preprocessor did not handle correctly the path to the include files. When you had some #include <stdio.h> and then a private include file like "containers.h", if in the system directory there was a file with the same name, it would be loaded from the system directory instead of the current directory. Dec 2: The instruction jecxz is assembled incorrectly. For the time being I change d the optimizer place where this instruction was being generated. Nov 28: The expression Table[p++] would fail to increase p if p was an unsigned long and Tab was a table of un signed longs. Fixed. Nov 21: Complex constants were wrongly generated. Fixed. Sep 27: Fixed problem of optimizer in the 64 bit version. When dividing by an unsigned immediate constant, an incorrect assembler instruction would be generated. Sep 24: An ANSI-C-90 version of the compiler is out. Usage: lc -ansic90 foo.c There was a problem in the 64 bit compiler when optimizing. Trying to find an alias for a register variable, the compiler dereferenced a NULL pointer. Shame on me! Fixed. The size_t type was defined as int under 64 bits, what is a BIG error. Fixed. Sep 20: There was a problem with initializations of unions within structures

provoked by the changes introduced for conforming to C99. Fixed, but watch out for similar problems. The 64 bit compiler entered in an infinite loop when optimizations were turned on in some circumstances. Problem was due to a typo in the calculati on of the number of registers available. An uninitialized field in a new structure provoked a crash when compiling a structure initialization in some circumstances. Fixed both 64/32 bit versions Sept 12: Problem in optimizer: it was generating cmpb $32,%edi, what is an illegal instruction. Fixed. Fixed problem with wedit not starting in windows 2000 August 24: Fixed problem reported by Colin Barker: long long subtraction in 32 bits. Fred J. Tydeman reported: > Code like: > double ulp2, res2; > res2 = 1.0 + ulp2 * 4.0; > res2 = ulp2 * 4.0 + 1.0; > gets: Compiler error (trap). This was a typo in the simplifier module. Mr Tydeman also reported: 1.L / 0.L gives a NaN (should be infinity). Fixed . Another bug discovered by Mr Tydeman was: unsigned long int res = 0uL ^ 0LL; This was provoked by an inconsistency in the simplifier module. Another problem that Mr Tydeman discovered was the fact that lcc-win ignore d minus zero. This has been fixed. I would like to thank all people that report bugs, and specially to Mr Tyde man. Thanks for your patience with my blunders. July 20: The expression INT_MAX+1 generated no warnings... Fixed. July 11: Added warning for the statement j=j++; and similar blunders. This optio n is active when the -A flag is given (all warnings) since it slows down a littl e bit compilation (not measurable in my machine). June 28: Fixed labs library function. Thanks to Jason Hood for reporting this bu g. june 10: Fixed problems with long long subtraction: in some cases the result was inversed and a-b would return b-a. june15: Fixed problems with overloaded operators within tables. This appears whe n you try to add complex numbers stored in tables. Since complex numbers use overloaded operators, the compiler will be unable to use them. May 15: The coefficients of the tan() function were wrong, and the results were incorrect. Fixed. May: 7: Fixed problem with subtraction of long longs. Thanks again to Colin Bark er. Apr 21: The compiler will now detect if the machine used supports the SSE3 instructi ons and will set up automatically the "p6" flag accodingly. If you do not want to us e those

instructions so that your program runs also in older hardware you should giv e the -p6=no command line argument to override the SSE3 code generation features. Apr 16: The expression: int main(void) { long x=2, n=1, cnt1; cnt1 = x<=((long long)n*x)/(x-n); } provoked a compile time error. Fixed. Thanks to Colin Barker for reporting t his bug. Mar 18: Performance improvements for 64 bit data. Mar 15: Keith Thompson reported that this C99 syntax did not work: int arr[2] = { [1] = 100, [0] = 50 }; Fixed. Feb 19: The declaration long long unsigned int wasn't parsed correctly. Thanks to Mr Tea Pot for this bug report. Feb 18: Added operator ~for complex numbers. Fixed problem with wide function prototypes in io.h Added new rules to 64 bit operations in 32 bit compiler Fixed bug in operator <= for long long data. Dec 3: Added SphericalBesselY + SphericalBesselK + SphericalBesselJ to the speci al functions package. Updated the documentation. Dec 2: Fixed problems with comparisons between 64 bit constants. Fixed problems with constant expressions (constant < cont1) ? const 2 : const 3;) That expression would not be simplified at compile time. This is an error tha t comes all the way from the original lcc compiler... Oct 31: Overloaded functions with variable argument lists weren't recognized as such. Fixed. Oct 27: Problem linking the string library fixed. Oct 22: Constant folding has been improved to optimize calls to math functions l ike sqrt(5) that will be replaced by their value without generating any function call. Oct 6: Division of a constant by the result of a shift operation would yield inc orrect code generation in some setups. Fixed. Sep 29: Corrected error when reading a constant integer as a pointer, within a struct ure or array initialization. Corrected an error when parsing numbers that are similar to complex numbers. A misplaced pointer access produced a crash. More tests for designated initializers. Sep 6: Corrected all bug reports for designator initializers. Sep 4: Added support for designator initializers of C99. Watch out for bugs since th ere is a lot of rewritten code in structures/arrays initialization. Aug 26: This declaration would not be recognized: void fn(size_t n,char tab[*]) {}

This is C99. Fixed. Aug 25: Fixed crash when parsing complex numbers. Fixed problem within the optimizer. Added functions beginthread/endthread Fixed several problems with declarations, that now can appear in any order as required by the standard. July 15: When a static inline function is not used, the compiler should NOT complain. Eliminated that warning. Some declarations like "int long volatile long" were not correctly recognized. Fixed. When an overloaded function is defined that has a parameter with the same name as the name of the function the compiler would erronously reject the code with a redefinition diagnostic. Fixed. June 15: double _Complex and _Complex double are equivalent. This wasn't recognized by the compiler. Fixed. June 14: First version of the 64 bits version available in the professional edition. June 5: According to the standard, "long int long" is legal and should be understood as long long. May 8: Incrementing a long long had a typo in the machine description, what led to bad code generation. Fixed. Apr 24: Tables of qfloats were not initialized properly. Mar 24: When you give the -ansic option, the file complex.h wasn't compiling correctly. Fixed. The following standard code: int operator = (42); was mistakenly confused with an operator declaration. Fixed. Incrementing a 64 bit int array would not work correctly. Fixed. Functions Fresnel, FresnelS and FresnelC were added to the special functions package. Mar 6: If you write: for (i=0; i<10;i++) { int vlaArray[1024*10*i]; // rest of the block } The memory allocated at each pass wasn't being released and in some extreme cases you would crash because the stack wasn't being reclaimed. Fixed. This bug was reported by Mr Erwin Lindermann. Mar 5: Added several math functions like HarmonicNumber, and others. Fixed problem with alignment in win.h. Added %Z specifier to printf function(s) for complex numbers Feb 4: Added BesselJ and BesselY to the special functions package distribution. Feb 2 Fixed problem in stdlib.h when compiling with -ansic. Fixed problem with complex numbers, when one argument of a binary operation is a constant. (Bad code was being generated). Added pow/sqrt and other functions as generic ones accepting complex numbers. Jan 18 Fixed problem in scanf when reading numbers longer than 105 digits. There were problems with some initialized tables, because of the changes

needed to support C99. Fixed. Jan 16 Added sincos function to the standard library. Fixed typo in the intrinsics code generation Jan 6 Inlined the cosl function. Fixed oversight in stdlib.h where min and max was defined. Dec 30: Added stirling numbers (first and second kind) and the pochhammer symbol function to the special functions package. Dec 23: Added mempcpy, and memccpy to the standard library. Added the documentation for both. The conversion between unsigned long long and long double did not work properly for some test cases. Fixed. Dec 16: Added an important part of the C99 stdandard implementation: int fn(void) { int a[] = { 123,SomeFunction(),56}; } This is standard C99 and now it works. This needed quite a rewrite of the initialization routines, and may have introduced some problems elsewhere. I have tested it here as best as I could but you never know. Dec 15: The optimization of module for a constant integer provoked failure when the constant was bigger than 2GB. Fixed. Added function lambertw (lambert's W function) to the special functions library. Added function lerchphi to the special functions library. Dec 14: The optimization of division by a constant was provoking a compiler failure when the constant was too big. Fixed. When optimizing, the compiler would fail when having a long long constant as a switch variable. Fixed. Wen optimizing and a function was stripped of the stack frame, access to some arguments would be generated still as ebp was valid. Fixed. Dec 12: Assignment of a pointer to a bool did not work properly. Fixed. Dec 5: Fixed problem with the "overflow" checking. THis program would turn out a false positive: #include <limits.h> int main(void) { unsigned u; u = UINT_MAX / 2; u++; u = UINT_MAX; u++; return 0; } Unsigned numbers should not report overflow. Dec 3: The compiler would warn about unused arguments to printf only if there was more than 1 argument unused. Fixed, now it warns if there is only one unused argument. November 26 Added function mempcpy, as the gcc one. See the documentation for details. November 25 The expression

register const unsigned long long n = 0x222LL; was making the compiler fail. Fixed. November 22 The expression L"This is a string" L" " was giving an error instead of returning a correct wide string. Fixed. The expression double *value; long long p; // ... *value = (long long)(*value * p + 0.5L) / (long double)p; was giving an error. Fixed. November 12 Fixed bug when shifting signed/unsigned characters. Added better constant folding when optimizing. The behavior of lcc-win when looking up the include files follows the same path as msvc or gcc: the current directory will be understood to be the directory where the current file is. November 10 Added option -dd to the compiler, that will print all the defines in the preprocessor with file and source line numbers. This allows to see where a define is being... defined. Added inline support for the "div" function. Added several missing header files from the current SDK. Some minor problems with the compiler: You can't declare the 'main' function as 'inline' for obvious reasons... This test was absent. Fixed. October 5 Fixed problem in the "Reformat option". Fixed problems when returning a structure from an inlined function when the size of the structure is less or equal than 8 bytes. Inlined the function div. See stdlib.h September 15 Added extension for using the same convention as C++ when invoking a function with unreferenced parameters. int fn(int a,int b,double) The third parameter contains just the type, not the name. This documents that is an unreferenced parameter. printf checking code provoked in certain circumstances wrong warnings. Fixed. Improved the handling of complex numbers July 25: This code would provoke a crash: int fn(int a) { int tab[a] = {1,2,3}; } Fixed. July 22 2007: Updates to browsegen that was crashing too often. July 09 2007: lcc-win32 accepts the standard syntax for complex numbers constant s of 2.11+34*I; July 5: Added Polylog function+ documentation. June 23: Added atan2q (qfloat atan2) to the math library. Added expintn and expint June 16: Added beta_distribution_inv/beta_distribution_invq function. Added gamma_incom plete* missing functions. May 1: Big update with many bug fixes since February, in the compiler, the IDE, the resource editor, and the debugger.

Feb 24: Added several functions to the special functions math library: Catalan, calcul ates the catalan numbers ibinomial and binomial, calculates binomial coefficients C (n,k) Fibonacci calculates the nth fibonacci number Fixed problem in code generation when converting from long double to long long . Fixed problem when converting from qfloat to long long. If you passed more than 1024 arguments to a function, the compiler would crash instead of writing an error message. Fixed. The error messages within an overloaded operator function would be wrong, disp laying the "mangled" name instead of a clear text message. Fixed. Jan 10: Added the source code for the complex operators to the standard distribution. Dec 28: Bug in scanf fixed. When using operator overloading __func__ gabe the mangled function name. Now i t will give the unmangled one. Updated the error handling of the string library. Nov 21: Added getline, getdelim, ggets fggets to the standard library. Added the specf uncs.h header file to math.h. Oct 15: Missing prototype for _hypot added to math.h Sep 26: The trigraphs feature will not be enabled by default. The compiler will always warn if trigraphs are detected in the source code. If the option -ansic is acyive, trigraphs will be translated but with a warning. Otherwise they are ignored. Sep 18: Updated sqlite3.dll and added -pedantic flag to the compiler Sep 12: Fixed problem with linking PolyRoots, due to an optimizer error. Fixed problems with intrinsic procedures that used long double arguments. Sep 5: Again, fixed the problems with bitfields in anonymous structures. I hope this time is the good one. Fixed problems in the file urlmon.h Aug 22: Fixed bug in conversion from floating point to unsigned long. The conversion was completely reritten, having becme a complex mix of assembly code impossible to maintain. Fixed bug with cast from int to _Bool in the context of a bitfield initialization. This two problems were pointed out by Fred J.Tydeman. Aug 20: Fixed problem with Strchr and Strrchr in the containers.lib. July 28: The atoq function was missing The compiler would still recognize "qfloat" as a defined type even when invoke d with the -ansic flag. Fixed. July 25: browsegen.exe was not writing correct sqlite3 database files. The problem seems to be in the quoting of integer arguments. Adding a single quote to the INSERT INTO sql statements solved this problem.

July 16: Added PolyRoots, a subroutine that uses the Jenkins-Traub method for finding t he zeroes of a polynomial. July 15: When reading a table of qfloats the compiler would trap if any of the members of the array was not a qfloat. Fixed. The debugger displayed wrongly long double data. Fixed. July 12: Added _stati64 and fixed problem in sys\stat.h. _stati64 was written by Friedr ich. July 11: Added strtok_r (POSIX standard), a reentrant version of strtok. July 5: Added Strfromp and several other overloaded functions to the string library. Finished the first part of the Safer C library as proposed by Microsoft. Added the function strfmon for the formatting of monetary values. Jun 20: Added edit_distance to the distribution. See announcement in the lcc newsgroup . Jun 15 The program #include <stdio.h> struct { struct { unsigned a : 1; unsigned b : 1; unsigned:12; }; } t; int main () { t.a = 0; t.b = 1; printf ("%d %d\n", t.a, t.b); return 0; } produced 1 1 instead of 0 1 as it should. This has been fixed. This problem appeared only with nested structures. Several prototypes were missing from wchar.h May 26: Added hypergeom1f1 to the math library. May 25: Added more warnings to the printf checker when using the -A option (all warnin gs). Added the wide character printf functions. May 24: Added an option for Strchr to take a starting index. Added an option for Strdup to take a starting and ending index, to make the sa me thing as the famous mid$ of Basic... Updated the documentation and the proposal to the standardization comitee (see ftp://ftp.cs.virginia.edu/pub/lcc-win32/proposal.pdf ).

May 19: The wmemchr function was missing. Fixed. The Strchr and Strrchr functions in the string library were quite slow. Fixed. May 11: The function isblank was missing from the standard library. Fixed. Strtrim added to the string library. May 06: Updated browsegen.exe, it was crashing. Updated the string library. General cleanup and stricter implementation of the Str prefix for most functions. Apr 18: calloc would not check for overflow, returning a wrong result when the multipl ication of element size times number of elements overflowed. That function was in CRTD LL.DLL, so I rewrote it. Added rintl that was missing Added strtof that was missing Added isnanf, feupdateenv, copysignf that were missing. Bugs reported by Fred J. Tydeman. Mar 19: Fixed problem with the keyword "inline". Arranged the documentation for the list container. It is still not finished ho wever. Fixed problem in the debugger when the size of a structure was bigger than 64K . Feb 26: Added small window to the IDE when you press the scrollbar button. It will show the line number and the current function. When you down-scroll in a long file it may be useful to know where exactly (in which function) you are. Fixed some missing defines in win.h specifically those HEAP_CREATE_* constants . Incorporated a fix to the preprocessor proposed by Nelson Beebe. Jan 29: Added function countbits to the bitstring interface. It returns the number of 1 bits in an integer. Jan 27: Missing lfc.h lfc_impl.h added. Jan 24: People complain the the -ansic option disables __declspec and _stdcall, making windows programming impossible. I have changed this, and now ansic will accept those keywords. The evaluate expression dialog box would not use the carriage return key Fixed. Besides sometimes garbage was printed after the result of an evaluatio n. Fixed too. Jan 16: Added exp10 function. Check of many mathematical functions. Fixed errors in yn scalbn jn. Added scalb function. Jan 14: Fixed isnan() function, was giving wrong results. Added ipow ipowl and ipowf functions. Jan 13: Dynamic arrays are NOT allowed at the global level. For instance this code should NOT compile: int n=7;

int tab[n]; BUT this code WILL compile: const int n=7; int tab[n]; Note the "const". The new version of the resource editor (the full version) is now included in the standard distribution. Some problems with the standard heders using the -ansic option of the compiler have been corrected. Revised the keyboard accelerators in the menus. Dec 20: Revised all standard header files for compatibility with -ansic option. Dec 12: Inline functions with variable number of arguments are not supported. The compiler will issue a warning now, instead of crashing ... Dec 6: Fixed problem with printf A format for double precision. Reduced the size of printf by 600 bytes. Dec 2: Added the function double frand(void) to the standard library. It returns a floating point number between 0 and 1. Nov 27: A problem in code generation fixed. Thanks to Danielle for pointing me to this problem. The problem was with the rule: reg: LOADI(CVDI(CVID(mem))) "\tmovl\t%0,%c\n" This provoked a crash in the function prune, in gen.c Nov 22: Added new cryptography section to netutils.lib. The functions there are: Sha1FromFile (computes digest) Sha1FromBuffer (computes digest) FileEncrypt (encrypts and decrypts a file) This is my second attempt to this, I hope this provides useful. The documentation has been updated, see "Cryptography" in the standard library documentation. Nov 16: Fixed problem under windows 95 Nov 15: Yesterday some changes did not make it: o When optimizations are ON and you call an intrinsic function that requires a double argument with an actual integer argument (sin(1) for example) bad code would be generated. Fixed. o The binary editor was not working due to accidentally erasing the dialog box that it uses. Fixed. Nov 14: Big update for wedit. There are many changes and bug fixes, and (hopefully) we did not add any new bugs... o We have cleaned up wedit from many unneeded stuff and options that nobody used. The versioning system is gone, for instance. We never received any feedback for it, not even a bug report so we assumed that it wasn't being used. o Gone too is the Fortran and Eiffel support. Wedit is just an IDE for the C language o The smooth scrolling option is gone too. Machines are now so fast, that the option wasn't working anyway. o The project directory is now no longer in \lcc\lib but in a per user basis, normally in My Documents\lcc. This allows Wedit to be used by several users in a single machine.

o An uninitialized buffer usage was corrected in goto definition option and probably fixes several mysterious crashes. o The compiler has not been forgotten either. The evaluation of default arguments is completely rewritten, and can handle any type of initilization expression. o Several fixes were added to the header files, and some bugs in tgmath.h eliminated. o The debugger was unable to follow function pointers that were at an offset in a structure bigger than 128 bytes. Fixed. Oct 21: If there is a cast operator defined and a function call needs a cast operation to satisfy the prototype, now the compiler will automatically call the defined cast operator for this argument. Corrected some typos in the prototypes of stats.h Oct 18: Added regexp.lib to the standard libc.lib. Corrected crash in wedit when looking for a symbol definition. Oct 9: Added jv, airy, and struve special functions to the library, and the corresponding documentation. Added in double precision and in qfloat. Oct 7: Fixed trap in 128 bit integer modulo operation. Several updates to the documentation. Oct 4: Added Knuth's floating point comparison algorithm "fcmp" to the standard math library. Added prototype in math.h and added the documentation page Oct 3: Updated the source distribution of the container library. Location: \lcc\src\stringlib. Just type "make" to build it. Oct 3: Corrected problem in optimizer: The constant -1 (or EOF) would not be recognized in a switch statement (if it was one of the cases of the switch). Fixed. Sep 29: Corrected bug in wedit: when opening a new project with the option "keep current project open", wedit would just open a new empty window. Sep 17: A lot of changes in th 128 bit integers library. Started the documentation. An annoying bug in "Usage of" a variable is corrected in wedit. Sep 15: Problem in inline function expansion solved. This would appear when several return statements were present in a function. Aug 27: int and long, or unsigned int and unsigned long are equivalent types under 32 bits lcc. This wasn't being acknowledged in the operator overloading part. Fixed. Aug 16: The more detailed error reporting for function pointer assignment could lead in some cases to the compiler trapping. Fixed. The != operator was not working when qfloats were used in a conditional context. Fixed. Aug 15: 128 bit integers are now possible. To use them #include <i128.h>. The library is i128.lib. In operator overloading, the compiler will now assume that if an operator like == is defined, it is not necessary to define operator!= since it is assumed that operator!= is equal to !operator==. The same with < and >=, and <= and >.

Aug 14: The & (and) operator would not be recognized with operator overloading. Fixed. The atof function receives a const char * and NOT a char *. Changed stdlib.h and math.h. The trap handler was making an infinite loop. Fixed. Jul 26 Given long long ll; the expression while (ll--) would not be compiled correctly. Fixed. When the main() function was declared as void, the compiler would emit an incomprehensible message. Fixed. Jun 08 Improved error reporting for assignments of function pointers. The compiler would never protest when assigning function pointers to completely different function types. Fixed. Fixed several problems with the "overloaded" and the "operator" keywords. Jun 06 Added the array list (flexible arrays) to the distribution. This replaces the vector container library. Updated the documentation Jun 04 Updated the distribution with the string collection library. Documentation updated. Tutorial updated with the new entry. Source code added to the distribution. Updated netapi32.lib and lmcons.h Apr 23: pcre.dll was missing. Fixed. Apr 13: The debugger user interface has been updated. Specifically, it is now possible just to click in a substructure or union and have it expanded showing the sub-items it may have. The watch window in the debugger has changed, and now you have a menu where you can choose to add or delete a new watch. The work of Friedrich Dominicus in the resource editor has been added to the distribution. Specifically, the Add icon dialog should work as expected, and many other problems have been solved. The header files have been updated to reflect several constants and structures that were missing, specially in the common controls. Apr 5: When writing: strchr(name,'.'); Wedit would crash when trying to find a structure member (the point was being interpreted too hastily). Fixed. Apr 4: The macros isgreater, isless, etc in math.h did not work correctly. Replaced them by intrinsic functions. Apr 1: Fixed problem in Wedit: when a recursive grep was started, if a directory chdir was failing, it would crash with stack overflow. Fixed startup code problem in the handling of traps. Added fixes proposed by F. Fritsche for limits.h and stdio.h fscanf would not recognize numbers like -10 if scanning using the %x format. Fixed. Mar 23: Several scanf problems solved. Mar 13:

Fixed problem in shobjidl.h Mar 12: Corrected problem when casting from a double to an unsigned char. File types.h was impossible to include twice. It was missing the #ifndef __types_h #define __types_h ... #endif. Fixed. Fixed problem with reformatting and an unfinished string/comment. Mar 10: Wedit entered in an infinite loop when looking in a source file with an unfinished, multi-line comment. Fixed. Mar 5: Browsegen was entering in an infinite loop when a "const" qualifier was in a typedef definition. Fixed. The initial value of the background color of the search window was set to black, so if you open wedit without opening a project or opening a file, the search window would write black over black, not very good... Fixed. Mar 2: Fixed problems with printf when confronted with -inf Arranged double definitions between richedit.h and win.h Feb 26: Fixed several redefinitions in win.h, uncovered by the bug fix below. When making page down until end of file, Wedit would crash sometimes Fixed. Feb 25: The compiler would accept a redefinition of a structure/union. Fixed. Feb 24: Due to a problem in the editor, the 64 bit shifts weren't working correctly. Fixed. Feb 23: Added more consistent support for traps concerning integer division by zero. Specifically, now a SIGFPE will be generated, not SIGSEGV. Changed the startup code and the default trap handler. Feb 16: Fixed trap in the compiler when parsing complex numbers. Feb 15: OutputDebugString would always stop the debugger. This can be annoying, so it is now changed to adding a line in the outut messages window of the debugger. There was a problem in the optimizer when looking for the flags register. This optimization scanned backwards to see if a compare instruction could be eliminated by using some previous operation that sets the flags already (add, and, etc). This optimization would fail to notice a change in the contents of the register being sought. Corrected. Feb 6: Corrected some problems in the implementation of scanf. Added a sound, if the build has errors in it. This can be turned on in Wedit's config->Workspace tab. Updated documentation for several missing string functions Jan 18: Fixed problem with scanf when reading a group character. Jan 11: Fixed problem when parsing long long constants with the i64 suffix. Jan 4: A serious problem in the optimizer: When a function was stripped

from the stack frame, some generated code still used the frame pointer even if there wasn't any. Fixd. Jan 2: Added two functions to the C library: memshort/memint, that will search in a table a specified number. Updated the documentation. A typo in qfloat.h fixed. Dec 10: Fixed problem with writing of prototypes. Dec 4: Wedit would choke if there was somewhere in the source the #ifdef __cplusplus extern "C" { #endif since the bracket counter got confused. Fixed. Added some missing defines to qfloat.h. Nov 24: Added a tutorial to the sqlite documentation. Nov 21: Improved the structure fields display. Now it will automatically disappear if you write a field completely. Besides, I added an edit field to allow you to see what you type. The prototypes tooltip wasn't working for system functions. Fixed. The functionality to add a keyword to the keyword list wasn't working. (Project->Configuration->Languages). Fixed. Nov 15: Wedit changed completely the format of the browse information. It now uses the sqlite interface to build an sql databse. This may cause problems. Please report any "suspicious" behavior. Fixed problems with conversions from unsigned character to doubles. Fixed problem with inline __declspec(naked) functions. Tried to fix the problems in vfw.h, and vfw32.lib Fixed problem with the ping function (netutils.lib): it would hang if the machine at the other side didn't answer Nov 10: Fixed recentering bug in Wedit: Now recentering is done only when pasting at EOF. Not in other situations. Added configuration option to save the file without tabs. Fixed problem in compiler with instruction CVIL (convert int to long long). In some situations a register would get lost. Nov 6: Fixed glitch in long double to long long conversion. Oct 27: Updated commctrl.h, dbghelp.h. Many definitions added. Added include file windns.h, bluetoothapis.h Oct 26: Added more than 300 missing definitions from winbase.h to win.h. An automatic program checks now for missing definitions. Oct 24: Fixed problem with reformating lines with // comments in wedit. Fixed problem with cut/paste in wedit When inserting text, the cursor was sometimes set in a blank page due to a missing recentering of the inserted text. Fixed. printf would not honor the space qualifier for floating point %g format. Fixed. Oct 22: Fixed problem in printf (%.0d" would print something when given a zero, what is not mandated by the standard. Fixed some problems in Wedit with the menus.

Oct 9: If the last line of a file was //\ wedit would crash. Fixed. Oct 4: The resource compiler accepted the MANIFEST keyword and not the RT_MANIFEST, as it appears sometimes in the documentation. Fixed, it now accepts both. Oct 1: Some updates to the lcclibc.dll library and a bug fix for scanf. Sep 26: Problem with the fabs function, a typo would provoke a crash. Fixed. Sep 25: Update of the dynamic library lcclibc.dll. Many new functions are replacing the CRTDLL counterparts, with the objective of having a stand-alone C99 library for lcc-win32 and replace definitively crtdll.dll. I hope this doesn't introduce new problems. A bug in the linker was fixed. When in the exports definition file (.def) you named a function that did not exist, the linker would search for a function with a similar name but starting with an underscore, so "cos" would become "_cos". The problem was that the windows loader expects the functions in *alphabetical* order, and the underscore prevented other functions from being found at run time. This would provoke an incomprehesible messge: The entry point xxx can't be found Pedump showed the entry point in the dll, so the whole was a complete mistery. Finally I got it and got rid of this bug. Unsigned long long multiplications weren't done at compile time. Fixed. Sep 17: Browsegen.exe would provoke a trap during the installation. Fixed. Sep 16: Bugfixes in printf and scanf: scanf did not recognize 0x prefix in base 16, and printf had a non-zero terminated string in its fixed tables. Sep 9: Added Strencrypt and Strdecrypt to the string library of lcc-win32. Sep 5: Big update: Linear algebra section with a big package for matrices solving linear systems, etc. New intrinsic function "typeof", that returns the type of its argument. Problem with the resource compiler fixed: When a resource file was imported from another directory the file would be opened in text mode and not in binary mode. Fixed. Fixed problems with browsegen information generation. Aug 30: Improved error reporting for missing prototypes. Aug 29: The grep utility in wedit would fail when given a root directory like: c:\. Fixed. Wedit would start displaying structure fields even when the cursor was in a comment. Fixed. Aug 26: Added the -C option to the preprocessor. This will keep comments in the preprocessed output Aug 23: Corected problem when the intrinsic function cos received a float argument as the result of a function call. Added following functions to the statistics library: median, geometric_mean arithmetic_mean harmonic_mean variance variance_mle

standard_deviation_mle central_moment percentile skewness kurtosis rms (root mean square) standard_deviation. Documentation updated Aug 21: Added function crc32 (calculates the crc) to the netutils library. Aug 19: Fixed problem with the preprocessor: #if (2 - 1 - 1 != 0) would not evaluate correctly. Fixed problem with the cbrt function. Aug 15: Still some problems with generic functions: unsigned int was missing when promoting arguments for generic functions. Aug 5 strtoimax strtoumax strtoull: those functions were missing, and they are specified in C99. Fixed. Aug 4: The compiler now accepts standard C99 hexadecimal floats, for instance 0x100.0p-4 --> 16.0. This is one of the missing parts of C99 that is now implemented at last. xprintf did not handle well subnormal numbers. Now it does, using internally the qfloat library. Aug 3: Corrections in the simplification module. Conevrsions of unsigned long long were sometimes not simplified. Fixed. frexpl(infinity) would return a wrong value. Fixed. Aug 2: The signbit function was missing a pop of the floating point stack. Fixed. The distribution was missing random.h (mersenne twister include file). Added. July 30: The conversion of double to unsigned short had a problem. Fixed. Thanks to Mr Tydeman for writing a test program that uncovered this (flt2int.c) July 29: The frexp function produced incorrect results. Bug reported by Fred Tydeman, fixed together with other problems he discovered. The mdimain.tpl template in \lcc\lib\wizard contained an error. Fixed. (bug reported by Winny Mathew Kurian). The C standard changed slightly the signature of the following functions: feclearexcept fegetexceptflag feraiseexcept fesetexceptflag fegetenv fesetenv feupdateenv Those functions were of void return type, and now they have an integer return type. This correction was suggested by Mr Tydeman. The function fehold except was missing from the library. Fixed, and documentation updated. July 24: The generic function fabs would not work when the argument was an integer and the optimization flag was ON. Fixed. July 23: Added the Mersenne Twister random number generator to the statistics section. Updated the documentation. July 22: Finished the statistics package. Documentation and test program OK. July 21: More statistical functions added. Documentation updated for those July 20: New statistical functions library started. See the "Statistics" tag in the documentation July 14:

The inline keyword wasn't recognized for overloaded operators. Fixed. An unused label generated no warnings. Fixed. This will show only if the -A option is in effect. An incorrectly paired #ifndef/#endif was making trouble in stdio.h Fixed. July 10: The macro isnormal wasn't implemented. Defined as a generic function. July 9: New compiler option -overflowcheck that will make the compiler emit code for testing overflow at each addition, subtraction and multiplication. If an overflow is detected a user function called _overflow(char *function_name,int line); is called. A default implementation of that function is now supplied with the run time library. scanf had a problem with octal digits. Fixed. strtod had a problem with the "p" format. Fixed. The function fabs when in optimized setting would provoke an assembler error. Fixed. The founds lround and llround were missing. July 6: strtold would not update correctly the passed pointer to the end of the string for certain inputs like 0e-19. July 4: When you had an include in the form: #include "c:\some path\dir\projects\foo.h" and in "foo.h" you had #include "foo1.h" the compiler would not find "c:\some path\dir\projects\foo1.h" even if it was there. Fixed. Thios bug was reported before but a faulty test led me to believe it didn't exist. Added documentation for regular expressions package that was missing. July 1: When an identifier is a structure, now Wedit will automatically display the fields of the structure. This meant a lot of work, updating the debug information format etc. June 27: Intrinsic functions like sin/cos would not longer be recognized as such after the change in the tymath.h headers. Fixed. Added fabs as intrinsic function too. Modified qfloat.h to use the generic function names. June 26: Updated completely tgmath.h and math.h to make them more confoming to the C99 standard. June 24: Small additions to win.h. Still problems with multimdimensional dynamic arrays. Fixed. June 23: Added functions wtof wcscmp and others to the standard library. The startup establishes now a try/except frame. The debugger is modified to arrange with this. June 19: Fixed problem with subtraction of two global addresses. The code generated was wrong when both addresses were constants. The function strncat was missing from the standard library, even if it was present in the documentation. Fixed. The compiler would generate wrong code for dynamically allocated arrays of more than one dimension. Fixed. June 16: Fixed problem in the code generator. When Optimization is ON,

and a structure with size smaller than 4 bytes is passed by value to a function in an assignment context, bad code was generated. For instance: struct f { char a,b}; struct f Data, a; void somefn(struct f); somefn(a = Data); Fixed. Fixed some problems with the famous __VA_ARGS__ macro expansion. June 15: The strtoll function was giving incorrect results when the base was set to zero. Fixed. June 13: More corrections to the long long module. Wedit configuration linker would not store the double quotes if the executable contains spaces. Fixed. June 12: Fixed buffer overflow when generating the debug information when an enumeration had a lot of names (more than 16K of storage) The fixed buffer was replaced by a dynamic schema. Who would have thought about an enump bigger than 16K? Problem with code generation for unsigned long longs within a conditional context solved. June 7: The expression: double t,d; t *=v--; would miss the decrement. Fixed. The expression: unsigned long long res = ULLONG_MAX/2; would produce a wrong result (zero) because of a typo in the simplification module. Fixed. June 1: Updated wedit to avoid crashes in the F1 help feature. May 29: New chapter added to the tutorial: Network programming. It explains the newly added netutils.lib and a bit network programming in general. Added netutils.h and netutils.lib to the standard distribution. May 28: Added time64, ctime64, difftime64, mktime64 to the standard library. The result is a 64 bit value with the same meaning than the 32 bit counterpart. May 27: There was a problem with the optimizer and long doubles. A "Not enough registers" report would be issued when it wasn't at all the case. Fixed. May 26: Reorganized the browse informatin to better handle the types of the variables. Now the "auto-completion" (using ESC) should work better. Changed the error message "undefined reference to _WinMain@16" in the linker to the clearer "entry point ("main" function) undefined". This will hopefully avoid qustions... The display locals command 'right click menu) was provoking a trap. Fixed. The operator keyword was getting recognized within structure definitions. For instance: struct foo { ingt operator; }

produced a wrong series of syntax errors. Fixed. No extensions (overloaded/operator) are recognized within structure declarations) May 23: Buildguid was failing in some machines due to a memory leak. Fixed. May 20: Problem with lcclnk and the new findfiles function solved. Problem with browsegen crashing solved. May 17: New functions added to the standard library: GetHttpURL (retrieves an URL) and GetFtpURL (retrieves a file with FTP). Another new function is "ping" that will return 1 if the host is alive, zero otehrwise. Documentation updated. May 16: New function added to the standard library: findfiles(). Documentation updated. May 10: Updated iphlpapi.lib. Icmp.lib is no longer distributed since its contents have been included in iphlpapi.lib Updated ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib and comctl32.lib May 7: Updated the network header files iphlpapi.h iprtrmib.h iptypes.h ipexport.h Arrays within structures weren't correctly displayed by the debugger. Fixed. May 4: Fixed small eror in strtrim. Would not delete the last blank. Fixed problems in the memory window in Wedit. Changed Strvalid from bool to int. May 1: Corrected error in the linker when generating the line number information. The linker used the root directory for temporary files. This would not work if you did not have write access into that directory. It uses now the current directory. Changed the exception handling in the string library. April 25: Added the incomplete gamma function to the math library in long double and qfloat precision. Updated the documentation. April 21: Fixed several problems with the undo feature. Backspaces weren't correctly handled. The delete key had problems with the undo too. Fixed. April 19: Still problems with variable args macros. Hopefully fixed now. April 14: The old string library was removed from the distribution. This provoked some errors when building the libraries. Fixed. April 7: The Perl regular expressions package has been added to the standard distribution. The documentation has been updated to document the package. See "Perl regular expressions" in the standard library documentation. April 1: Added function Strenv that gets an environment variable and returns a String. Changed the name of the string library include file from strings.h to str.h to avoid name clashes with POSIX. Mars 30 C99 specifies a default return value for main. This wasn't

implemented. The program: int main(void) { /* ... */ } will return zero. Fixed problem with the __VA_ARGS__ macro expansion Added function Strfrompipe() to the Strings library. It will start a command aand gather its output into a String. Mars 24 Fixed problem with browsegen crashing too often... :-( Fixed problem with accelerator keys in the "new project" dialog of wedit. Fixed problem with isgreater and isless, etc, in math.h: An obsolete assembler instruction was used. Fixed a problem with a compiler trap when compiling any of the above functions. The format %ls (print a wide character string) wasn't working. Fixed. The same for %S. Mars 22 The unary operator '*' couldn't be overloaded. Now it can. This is the pointer dereference operator, for instance when you write *p. The result of this operator MUST be a pointer. An example of this in the string package: char *operator *(String s); This operator returns a pointer to the start of the string and allows accessing strings with the *string syntax. The pointer returned by the operator will be immediately dereferenced by the compiler. Mars 21 When a reference argument was passed to a function, the optimizer still performed constant folding, so any result was lost. Fixed. Example: void func(int &r) { r = 1; } int main(void) { int a = 0; func(a); // here the optimizer CAN't substitute a with zero since fn // could have changed it. } Mars 20. Updated pedump to show all the imported dlls of the executable More updates of the string library. win.h updated with missing definitions. Mars 17. More updates to the string library and documentation. Mars 16 There was an error when calculating the offsets of local variables, when using structured exception handling. That would lead to some saved registers being destroyed. Fixed. Further testing of the string library. Documentation updated. Mars 15 New function getopt added to the standard library. The function signbit left the floating point stack unbalanced. This leads to a crash after at most 8 times you used it. Fixed. Mars 14 The reformatter of the IDE would fail with #defines that spanned more than a line, using \ to continuate the line. Fixed. Added functions strtobase64 strfrombase64, that I took from the str library built by John Finlay.

Mars 11 Fixed problem when in a switch statement a declaration apeeared immediately after the case keyword: switch(a) { case 1: int tab[2]; ... } Mars 9 Fixed a problem when casting from double complex to double. Added wcsrepl, that mimics strrepl in the standard library. Rewrote the Strings package to use two versions of each function: one for double byte chars, another for single byte. Both versions are provided and the usual construct #ifdef UNICODE #define Strcpy StrcpyW #else #define Strcpy StrcpyA #endif The documentation of the containers package has been reworked again. Mars 8 Due to a memory allocation error the finding of missing functions in the IDE within the dll list was crashing. Fixed. Control-z works now for the Undo feature. Mars 7 Added library function wcsrepl. Identical to strrepl but with wchar_t strings. Updated documentation. Most of the work now is done updating the container library. Several functions were added to the string package. Mars 4 Vector container added. New documentation available. Mars 3 Fixed problem with expressions like: int a = 10000*(1000*fn()) that made the compiler crash. The container lib is now better (at least I hope :-), and the documentation has been updated. The file dlls.txt used by the buildapi utility was missing several dlls. Fixed. Thanks to Tom Speirs for pointing me to this problem. Feb 28 When a typedef was redefined, the compiler would break if it was followed by a ",". For instance: typedef unsigned short UINT16,*PUINT16; typedef unsigend short UINT16; // This would work typedef unsigned short UINT16,*PUINT16; // but this would not. Fixed. A function returning a pointer to a long long integer that was immediately dereferenced provoked a trap. For example: long long *fn(void); long long a = *fn(); Fixed. Feb 26 When two __try { } blocks appeared in the same function the compiler would emit bad code, i.e. the second try block ended in the first try block exception clause. Fixed. Feb 25: Fixed problem when doing a page up in Wedit that provoked a

crash. When the document was smaller than a full page, the column position wasn't getting updated when doing a page up and the editor crashed. It is the first time that I touch a so basic portion of Wedit since at least 4 years. Congratulations to "bat" that pointed me to this bug. Feb 23: Missing library function atani fixed. Feb 21: First release of the container library. Implemented are lists and stacks. The documentation has been updated with this library. The construct void * operator[](...) would not work. Fixed. Feb 13: The statement int & operator[](...); wasn't recognized correctly. Fixed. The statement: _Bool b; if (b=getchar()) would provoke a compiler error. Fixed. uintptr_t was missing from stdint.h. Feb 5: When using operator overloading with arrays, a cast was missing when the type of the actual array element wasn't the one the operator overloading function expected. Fixed. Feb 4: Yet another problem with the hh modifier solved. The distinction between signed (sign extension should be performed) and unsigned (higher bits should be masked) wasn't getting done. Fixed. Fix for DWORDLONG in win.h. The stack display in the debugger has been improved. Jan 30 The breakpoint icon was missing/ Fixed. Missing definitions in win.h (OSVERSIONINFOEX) were added. Thanks to Simon for pointing me to this problem. Jan 29: Fixed problem with the hh modifier for xprintf Fixed problem when taking the difference of two function addresses in the assembler. Added the instruction cvttsd2si for converting data from floating point to integer instead of a function call to ftol. This is much faster but will work only with the p6 flag since older machines do not have this instruction (needs SSE2). Jan 28: Fixed problem when p6 flag (pentium 6 instructions) is active. The compiler would generate wrong code for some floating point comparisons Jan 27: Minor fixes to library functions (ldexp rewritten in assembler) and to some assembler errors. Jan 26: Fixed code generation problem when optimizing. Added include file wspiapi.h (for IPV6 network programming) Jan 10: Fixed problem of C keywords not appearing. 2003 Dec 23:

The change in warning level for signed/usigned(see below) provokes too much noise. I eliminated all warnings for comparisons of unsigned with a positive constant or zero. Several problems with browsegen were fixed. Wedit received several fixes too, specially the built-in parser (go to definition feature). The ceil() function wa giving wrong results. Fixed. Dec 22: Changed the warning level of signed/unsigned comparison from -A -A to just -A. Dec 20: Added cfg.h cfgmgr32.h and devguid.h to the header files. Updated setupapi.lib. This version contains a NEW assembler. Please report any problems that may appear as soon as possible. Updated compiler correcting problem in code generation: the rule reg: INDIRI(ADDRLP(b))) ADDI(INDIRI(frameoffset),INDIRI(frameoffset)) This rule is valid only if the expression is not assigned to a common sub-expression intermediate value. If you feed it a common subexpression like a+b in the expression if((a + b > 0) && (a + b < c + 1 )) this leads to bad code generation since the register is freed prematurely. The compiler now recognizes I64 and UI64 as suffixes equivalent to LL and ULL to remain compatible with Microsoft notation. No warnings were given when a long long constant overflowed. Fixed. Nov 26: Fixed problem of stack adjustment when overloaded functions received an argument that needs a cast to a different size. Thanks to MrBCX for this. Updated version of wedit will close dexplore.exe when finished. Nov 23 Fixed several problems with code generation: Subtraction of two functions addresses did not work. Fixed. Fixed problem when optimizing division in the peephole optimizer. Added many missing definitions to the header files, specially windows.h. Nov 11: Fixed problem with register allocation. Thanks to the BCX people for reporting this problem. Fixed problem with overloaded functions when optimizing: Instead of a block copy to push a structure by value in the stack, I used just a push instruction for structures with size smaller equal than 4 bytes. This was not working with overloaded functions. Oct 26: Fixed problem with variable length arrays. When the index variable was not of type integer but short or char bad code was emitted. Oct 13: Fixed problem with atan function. When given atan(1), the compiler failed to promote the integer 1 to double and complained about ambiguous call to atan. The restricted keyword wasn't being handled correctly in some cases. Fixed. xscanf was crashing when the '*' format (ignore arg) was given. Fixed. Oct 10: Fixed wrong offset calculation for anonymous structures within anonymous unions. Thanks to John for reporting this bug. Added functions remainder/remainderl/remainderf, trunc/truncl/truncf Updated the documentation of the math library. Added inline __declspec(naked) for defining inlined functions written

entirely in assembly, and used this feature to implement the macros isgreater, isgreaterequal, and the other unordered floating point comparisons as mandated by C99. Fixed problem of spurious warning when using the %S format in printf. Fixed problem with offsetof macro. Oct 6: Fixed problem when taking the address of atan function. Fixed the problem of powl returning a wrong result by mistakingly assuming overflow. Fixed problem with infinities in powq (qfloat) function. Fixed problem in the IDE when a cast to an immediate structure was used. The IDE assumed that no braces can occur when the level of parentheses is greater than zero. Wehn you use foo(&(struct m){"abc",10}); this rule is no longer valid. Since this feature was recently added to the compiler, the IDE issued a wrong message. Oct 1: Fixed problems in xscanf and xprintf. Now xscanf can input qfloats, and long doubles. Changed all representations of complex numbers to a single representation unsing long doubles. This simplifies the code, the libraries and the compiler itself. Sep 30: Fixed problem in strtrim. A wrong file was included in the makefile of libc.lib, what implied that a wrong libc.lib was built. Sep 29: Added following functions to libc.lib: cabs, csqrt, cpow, cproj, csin, ctan, ccos, catan casin cacos, ctanh catanh, csinh, casinh, ccosh, cacosh, clog, y0, y1, j0, j1, yn, jn. All of them in qfloat/long double/double/ precision. Sep 24: Complex numbers have been given a rework. Many automatic casts from float complex to long double complex for instance weren't working properly. The complex functions were moved from math.lib to the standard libc.lib to avoid having to link another extra library when using complex numbers. The cast of immediate structures (C99) now is working. You can write: (struct customer){"John",25} This is useful for passing immediate structures as arguments to functions, for instance. When generating complex long double constant like 2.3L+8.9Li the alignment of doubles in a 16 byte boundary wasn't respected, since the compiler failed to emit a 32 bit zero after emitting the first long double constant. Fixed. A faulty rule would provoke crashes when an addition to a base+offset form was being done. Complex math functions cabs, csin added with qfloat/long double/double versions. Sep 16: Missing declaration for the constant INFINITY in math.h. Fixed. Sep 12-14: The #pragma lib implementation had a serious bug. When linking several files that all contained an automatic reference to a library, the library would be added after that file was added. Since lcclnk is a one pass linker, the librar y would not be seen by the object files later on. For instance if we had: lcclnk a.obj b.obj If a.obj and b.obj included (automatically with #pragma lib) "foo.lib" the command line the linker would see was: lcclnk a.obj foo.lib b.obj Now, if b.obj contained references to "foo.lib", that library contents would not be seen by the linker what provoked incomprehesible errors... Fixed. Fixed overflow problem in powl function.

Improved qfloat standard functions by reducing the copying of qfloat numbers, each 14*sizeof(int) bytes... Added functions ceilq ceill ceilf fdimq scalbnl scalbnf scalbnq log10q The floating constant 0q (zero qfloat) wasn't being recognized. Fixed. Added option -o <output file> to the compiler to keep it more compatible with gcc. Sep 10: Added functions to the standard c library. cbrtl cbrt gamma lgamma erf expm1 atanl tanl isinl log1p and many other qfloat equivalents of the standard libra ry. The pow function was tested for correct behavior with NANs and infinities The initialization -10q was not yielding a negative qfloat but a positive one. Fixed. Tables of qfloats now work as they should. Sep 9: When an overloaded function like int overloaded fn(long double); was called with arguments: fn(5.9); The correct function was selected, but the call was done without generating the cast to the actual expected type! This means that many overloaded math functions failed when called with slightly different argument types. Fixed. The function hypot() was implemented in a trivial way. A better implementation was found in the code of free BSD. I adapted it, and added it to libc.lib. The power function was not taking into account the results specified for infinite, NAN or negative arguments. This has been fixed. Still, lcc-win32 does not support negative zeroes. Sep 6: Added coshl sinhl tanhl to the standard library. Added coshq sinhq and tanhq (qfloat versions) to qfloat.dll Sep 5: Fixed problems with sinhl and asinhl in the math library. Those functions are part of the standard library, so they were moved from math.lib to libc.lib, and now will be included automatically in any link process. Fixed problem with exp(2) being calculated incorrectly. Fixed missing WM_ definitions in win.h. Thanks Mike. Added windows system files rassapi.h adsiid.h and adtgen.h. The operators << and >> weren't being recognized. Fixed. The assembler was confusing fistpl and fistps..., thanks to John for pointing me to that error. Aug 31: Added math library function log1p. Aug 30: In an expresion (1) ? (double expression) : (long double expression) the resulting type would be long double and not double, even if the controlling expression was a positive constant. This made all those macros in math.h: if (sizeof(a) <=8) ? sqrtd(a) : sqrtl(a) FAIL, what a bug... This was visible only when you specified the -ansic flag, that is why I did not see it. Problem with qfloats and cast operators fixed. The expressions unsigned int a = (unsigned int) qfloat; would not work even if there was an operator int operator()(qfloat); defined. Besides, if the operator took a reference like in: int operator()(qfloat &); the reference was not being respected and this provoked a crash. Fixed trap when casting to long in some special conditions.

Fixed several missing definitions in win.h Fixed the problem of redefinitions in win.h Fixed problem in oaidl.h: a macro was defined several times. Added warnings when there is an overflow when converting long double to long long and many other conversions that provoked an overflow without any warning message. This is in the context of constant expressions only. Aug 28: Extra semicolon in math.h line 90 results in surious syntax errors. Fixed. Aug 27: The format in printf "%lf" should ignore the 'l' qualifier. It wasn't, and mistook that for a long long (qualifer 'L'). Fixed. The standard accepts multiple type qualifiers in a declaration like: int const const const a; This wasn't recognized by the compiler. Fixed. The restricted keyword is now fully recognized and error checking is done. Added #pragma lib <bignums.lib> to bignums.h Added the corrections that Mike Caetano proposed for win.h. Thanks Mike. Aug 26: Added intrinsics sin() and cos() to math.h. Now no function call will be generated for those functions but just a single fsin/fcos instruction. At the same time this greatly simplify the type generic math since now sin() and cos() will work for float to long double. Added VARIANT_TRUE/VARIANT_FALSE to win.h, that were missing. Fixed problem in xprintf when a long double value greater than DBL_MAX was passed: xprintf would print "inf" even if the number was a perfectly correct long double number. Improved constant folding in assignments. More constants are now followed. Fixed problem with rule CVUS(CVSU(reg)) in the win32.md file. This provoked that Comeau C++ would not compile its own library. Added improved register assignments. The overall speed is increased, I hope without too much pain in future problems. Please report any inconsistencies you may discover. Added simplification of (CON1*a) / (CON2*b) --> (CON1/CON2)*(a/b). The constan t division will be made at compile time. Multiplies by 1.0 generate no code. When optimizing away a division by 2, a spurious move was still generated. Fixed. Aug 15: Added mount and umount utilities to the tutorial examples. Corrected win.h to include the correct prototypes. Aug 14: Updated inttypes.h to conform to the C99 standard. Several dozen macros were missing. Added __retry to the exception handling syntax. This construct can appear only within an except block and will provoke a jump to the start of the current try/except block Aug 13: Finished the long long work for the time being. Several small problems with long long conversions and cnstant folding were fixed, and the tests passed again. Aug 10: The cast (long long)&foo would not work. Fixed. When parsing 8LL << 6LL the compiler would not do the constant folding. Fixed. Aug 8: Improved the 64 bit support. The improvement is like 25% or more, depending on the program. Please test anew your 64 bit applications.

Rewrote wininet.h since to make it current with the SDK. Aug 4: The function lldiv (and the corresponding lldiv_t) was missing from the standard library. Same with llabs. Both added. Aug 3: __declspec(naked) was not working when the function returned a pointer. Fixed. Added intrinsic _GetStackPointer() that returns the current machine stack. Modified intrinsics.h, added the documentation, etc. Aug 1: Added missing include file pdhmsg.h. Jul 29: Fixed problem in compiler when two consecutive __try blocks were written. Jul 25: Compiler: problem of expanding void inline functions fixed. Problem when expanding intrinsic function round to int fixed. Problem of memory overwrite when generating assembly listing fixed. Jul 20: Due to a typing mistake in libcrt0.asm and libcrt0s.asm the version of July 19 th produce corrupted DLLs. (!!!). Fixed. Implemented psignal(int sig,char *msg); that will print a signal with a descri ptive text. Added a documentation entry for it, and the prototype in signal.h Jul 19 Implemented GetExceptionCode() and GetExceptionInformation() for structured ex ception handling. The result of __except() is now evaluated and must not be an integer constant. It can be, but this is no longer mandatory. Modified lcccrt0.asm to implement the global variables needed by GetExceptionC ode() and GetExceptionInformation(). Fixed problem in wresdll.dll: The second dialog box that was edited, the font would be of the wrong size. New header file <seh.h> containing all definitions needed for structured excep tion handling. Include this file if you want to use this feature. The alt left arrow (back in History) was not working correctly within wedit. F ixed. Jul 17: Added the implementation of FLT_ROUNDS to float.h. Added the intrinsic function _GetStatusWord() that returns the FPU status word . Changed the level of "Assignment in conditional expression" warning to a highe r warning level. When a default argument of type enum was used, the compiler trapped. Fixed. The automatic generation of help files from within Wedit has been discontinued . There are now better tools that are freely available like doxygen, for instanc e. Jul 13: Fixed problem with offsets of unnamed structure/unions within a larger struct. Thanks to MrBCX for that. Fixed problem with sizeof variable length arrays: int fn(int n,int array[n]) { ... sizeof(array) } This produced a trap. Fixed. Fixed the problem with __try __except not working. This should run now but fur

ther work is planned. July 9: Added the syntax ++operator for redefining the pre-increment operator. You red efine the post increment with operator++. This makes the operator overloading consis tent with the normal C syntax. The operator sizeof wasn't giving the correct results when used with flexible arrays. As an example: int fn(int a) { int array[a]; ... int s = sizeof(a); } Added warning "Assignment within conditional expression", that catches errors like: if (a = b) { ... } July 7: Fixed strrepl. Thanks John. The LPCREATESTRUCT was lost in win.h. Fixed. July 6: Added roundl round and roundf functions from the C99 standard that were missin g Added lrint lrintl lrintf llrint llrintl llrintf that were missing also. The documentation (c-library.chm) was updated. Fixed bug of xprintf with negative numbers. Added the qfloat as a native type to the compiler. This allows a better handli ng of numbers like 123456889765645444566.414141414141444442222Q. Numbers ending w ith Q will be assumed qfloats. This is the first step of making the C99 feature of anonymous structures work. July 4: Fixed pow function. When overflow happened, instead of returning infinity, it was returning a NAN. Fixed. strtold() did not recognize the "inf" input. Fixed. The prototype of fegetexceptflag() was missing in fenv.h July 3: Added all the missing definitions in windows.h proposed by Mike Caetano. Improved NAN handling and definitions in math.h fpclassify had problems, returning NAN for INF quantities. Fixed. June 28: Added libraries npptools.lib mtxex.lib gpedit.lib fcachdll.lib rtutils.lib sensapi.lib credui.lib npptools.lib nmsupp.lib ntdsapi.lib sisbkup.lib winscard.lib Updated ntmsapi.lib odbc32.lib riched20.lib Added header files netmon.h gpedit.h filehc.h sensapi.h wincred.h sfc.h netsh.h ntdsapi.h schedule.h ntdsbmsg.h ntdsbcli.h winsmcrd.h scarderr.h winscard.h Updated winioctl.h If an inline function was defined but not used, the compiler would complain. Corrected. June 22: The variable length arrays continue to give some problems. Some of them fixed specifically when using vla arrays in function declarations: int addmat(int x,int y,double matin[x][y]) for example. Added the vertical property to progress controls. Up to now they could be only horizontal June 17: The mergeasm utility is incorporated into the compiler now. The produced assembler files will always have the C source text added to them. This eliminates the need of that utility.

The printf j format was not recognized in the compiler and produced a spurious warning. Fixed. The qfloat.h had a line #pragma lib "qfloat.lib". This produced that the library would be searched in the current directory instead of in the standard include files. Fixed. Now is #pragma lib <qfloat.lib> June 16: Added traffic.h to go with traffic.lib (import lib for traffic.dll) Added oleacc.lib cryptui.lib cryptnet.lib cryptui.lib odbcbcp.lib netsh.exp Added icm.lib ,sfc.lib and sfc.h, wsnmp32.lib Did you notice that this file has less typos? John Finlay has corrected them. I thank John for this and all the work he has done with the lcc-win32 compiler The memory dump in the debugger did not display correctly. Fixed The "Running" button in the debugger stayed on ofter the debugger closed. Fixed. June 15: Added warning with level 3 to the compiler: assignment of unsigned char * to char *. Cleaned win.h eliminating declarations like DWORD bitfield:1 and replaced that with unsigned bitfield:1 This reduces the number of warnings in win.h when using the -A option June 12 Added import library wldap32.lib and corresponding header files winldap.h schannel.h Fixed problem in wedit about the Open project dialog that did not correctly sort the projects by access date. Added support for owner draw listboxes in resource editor. June 1: Fixed several problems in the resource editor: the "name" field was inconsisten tly handled when the properties window was open. Fixed. Other problems with symbols were fixed t oo. Wedit: The "name" field when opening a new file contained garbage at the start. Fixed. May 23: Some problems in Wedit fixed: undo feature (yes, still that), the file comment utility was not working, and some others. The tutorial was ported to PDF format, and many chapters were enhanced and corrected. More material was added explaining finer points of C, and several examples were added to the C samples at the end. May 16: Fixed problem when taking the mod of 2 characters using 64 bit arithmetic. Fixed problem in reference arguments and constant folding Fixed problems of wres with spaces in file names. May 11: Added the statement MANIFEST to the resource compiler. This compiles a resourc e for the manifest of windows NT. Syntax: 1 MANIFEST "file name here" The compiler would not accept: qfloat a = 6.6e834Q; Fixed. May 2: Added a warning when a single line comment was finished by a backslash Added several rules to optimize expressions where character arithmetic is per formed April 27 When you define a structure within a special packing environment, the definiti

on of all structures of that type should take into account the packing when the definiti on of the structure was done and NOT the packing in effect when the structure is initial ized. For instance: #pragma pack(push,1) typedef struct tagStr { char a;char b;} Str; #pragma pack(pop) Str someVar = {1,1}; // Here we have a normal packing but the structure was de fined with // packing to 1. THAT should be used here. April 26 Problem when generating code for a modulo expression when using long longs. Fi xed. April 23 Fixed problem in the spiller. When several character comparisons were done in a single expression (i.e. charray[2] == chararray[34] && chararray[34] == chararray[12] && ... ) the compiler ran out of registers. Fixed. Fixed problem with importing cabs (complex absolute). The crtdll.exp file was wrong. Improved debug information for variable length arrays. Improved code generation when pushing a structure by value in the stack, or co pying it into another. If the size of the structure is a multiple of 4, I will use movsl (4 bytes at a time) instead of movsb (1 byte at a time). April 19: Added header files and export descriptions for Bluetooth support using windows sockets. Files irprops.exp ws2bth.h and others. The compiler would not recognize L "some string" as a wide char string. Fixed. Winhttp interface was added to the system. A sample for this was added to the lcc2 distribution. The implementation of the variable length array had to be rewritten. The infor mation about this type of array was stored in the type information, but this led to assuming unr elated objects that had the same type were variable length arrays. Now the information is sto red in the symbol itself. April 6: Updated directx 8 according to John's contributed files. First version with the strlib (a clone of the standard string library with bou nds checking) Written by Friedrich Dominicus. Mar 31: When an inlined function was compiled using the O2 flag (eliminate unnecessary assignments), a NECESSARY assignment was erased. Fixed. Still problems with the pow function when passing floats. Fixed. The documentation for all the windows controls has been added to the lcc docum entation. Mar 23: Fixed problem in __ftoul: the register ecx was being thrashed Fixed bug in optimizer when compiling (expression)?1:0 Fixed compiler trap when compiling an array of undefined structures. The compi

ler will now emit a diagnostic message... Fixed bug of wedit: when the debugger stops, the current directory was changed to <project>\lcc instead of the current directory when it started the debugger. Mar 10: Fixed problem with token pasting in the preprocessor. Added 0b11100 for binary constants Fixed problem with strrepl when statically linking Mar 2 Resource editor properties window is now non-modal, i.e. you can change the focus without closing it. This could produce some problems. Please report as n eeded. buildapi.exe was not working. Fixed. Debugger: The expression a[b[c]] was not displayed correctly. Fixed. Various problems with the resource editor were fixed. Imaginary numbers can be written 78.98i or 78.98I Feb 14: The profiler display was not working. Fixed. Feb 9: Added strrepl (replace a substring with another string) to the standard librar y. Corrected problem in browsegen.exe that produced inaccurate debug info. Please erase your old xrf files Corrected problems with temporary results in expressions that use overloaded o perators. Feb 8: Added dbglib.exp and dbglib.h to the distribution. Feb 6: Added functions ctanh casin log1pl casinh. Fixed problem in csin, ccos and clo g. All functions come in 3 flavors: suffix l for long doubles, no suffix for doubles, and f suf fix for floats. The compiler would not initialize a long double _Complex because of alignment problems. Fixed. Feb 5: New executable profiler.exe will display the data of the profiler. The usage i s: profiler <data file> where <data file> is normally the __profile.data produced by a program compile d with profiling support. This will be done automatically by the ide. The problem of the resource editor not saving header files is fixed. The compiler supports now compiling for dynamically linking with the lcc runti me (lcclibc.dll) that is now shipped with the distribution. A problem with the addition of 64 bit integers was fixed. wedit now will take into account the left margin when drawing the red underlin e when a symbol is undefined. New compiler flags: -libcdll Compile for linking with lcclibc.dll New linker flags: -dynamic Use lcclibc.dll instead of libc.lib (static version) -nolibc No linking with the c runtime at all Problem with buildapi crashing at installation fixed. Jan 24: Profiler support improved.

Jan 21: Fixed (hopefully) the nasty crashing in wedit. Fixed another bug in the compil er when calling a _stdcall function that returns an unsigned short. Thanks to "lcc-user32" for his/her detailed bug report. Jan 19: Cleanup of wedit's code to avoid nasty crashes when checking the syntax. I hop e it works better now. The system was wasting several handles when starting a new process. Fixed. Thi s would not make a lot of difference, but now that the editor can span several threads in a min ute it could become significant. The expression 1%1 was NOT giving zero as it should. Fixed. The coverage profile was started, the user interface modified, but the data di splay part is not ready yet. Jan 14 Fixed problem in the compiler when converting doubles to unsigned ints. For so me values the conversion was wrong. Jan 8 Added functions acosl acosf hypotf hypotl to libc.lib Fixed font problem in the new resource editor Jan 3 Added two new intrinsic: lrotl and lrotr, to rotate an integer a number of bit s.prototypes in stdlib.h Jan 1 2003 The new version of the resource editor is out. The documentation has been tota lly rewritten since it is a new user interface. The entire documentation of the system is now in chm form. It is no longer dis tributed with the main distribution but in a separate file, where there is the tutorial, the use rs manual, and the documentation for the standard library.

2002

Dec 28: Michael Scott discovered a problem in the routine _alludiv, that was giving a result 1 less than what it should. (That routine divides long longs). Fixed. Several bugs in the undo feature of wedit were fixed. Dec 27: The resource compiler has the -M and -Fo options as the compiler has. This wil l allow wedit to find the dependencies of a resource file, and recompile the resource file when one of the contributing files has been changed, for instance an icon or similar. This was n't working till now. The "Open project" dialog has been updated to show the details of each project

as the user changes its selection. Two problems in the register allocator were fixed today; I thank grischka for very helpful bug reports. Makefile generation, has been improved (see above) and now the resources are r elative to $(SRCDIR) instead of being absolute paths. The position of the child windows is now correctly restored. The first time yo u load the new wedit the windows will be wrongly positioned, since the coordinates now are re lative to the invisible MDI client window. Do a "cascade" to reposition the windows, then th e position will be correctly remembered. The zlib library has been added to the standard distribution. zlib.dll is in \ lcc\bin, zlib.h is in \lcc\include, and zlib.lib will be built at installation in \lcc\lib lik e all the other import libraries. Dec 24: New functionality "Check syntax" added to the IDE. This feature does: 1) Copies the (possibly modified) contents of the current editor file (that mu st be a .c file) into a temporary file in the binaries directory. The name of the temp file i s __check_%s where after the prefix the name of the original file is appended. The editor buffe r is not saved. 2) Calls the compiler with the current compile options of the project and adds the option -check to the compiler flags. 3) Under this new option the compiler will not produce any output, just diagno stics, if any. No object file is created. Since all code generation is disabled, such a test runs approx. twice as fast as a normal build. This option increases the warning level to -A to o, so you may find more diagnostics than you otherwise obtain when compiling with your compile r options. 4) Diagnostic output is saved in the project error file (normally in the binar ies directory). The temporary c file is deleted. 5) The "build" window opens at the bottom of the editor and shows the diagnost ics, if any. You press Alt+F9 when you want to check your code. Dec 20: exp2 function added log2 function added expm1 function added in assembly to libc.lib and taken out of math.lib (was in C) imaxabs function added fixed inttypes.h to declare all C99 types Dec 18: The header file olectl.h was wrong. Updated. The compiler would not recognize correctly a number like: 04000000000LL, i.e. an octal long long. Fixed. xprintf would not print correctly a negative octal number, that should be trea ted as unsigned. Fixed.

xprintf did not recognize the qualifier 'L' for octal numbers. Fixed. xprintf would not print correctly a nonsense specifications like "%.10000f". F ixed. Output is truncated at 4095 chars, according to the standard. Wedit did not correctly recognize an input file name. Fixed. Dec 17: Added nextafterl nextafter and nextafterf library functions Added mshtmlc.h mshtml.h dimm.h to header files Fixed problems with the fsopen function Dec 13: Serious problem in the debugger evaluator fixed. Dec 12: Problem with conversion of INT32_MIN to long long fixed. Added several complex math functions in all their versions (float double or lo ng double _Complex) Complex.lib has been eliminated and integrated in math.lib. This simplifies th e user interface: only one lib to remember. Problem with the Undo fixed (I hope is the last one) Dec 3: Problem with the #pragma lib instruction fixed. New version of Wedit supports tooltips for all functions in the header files ( windows and standard headers). This supposes a tooltip database that increases the distrib ution size by more than 200K. I think this is a small price to pay for this useful feature. A serious problem with the GC and the Undo information was found. I hope now t he problem is corrected: I was storing the Undo pointer at an odd address. Dec 2: The editor would not recognize errors/warnings that contained two (or more) fi le names when reporting an error in an include file, for instance. Fixed. Fred Tydeman reported several bugs with the overloaded exp function. Fixed. Dec 1: A complete rewrite of the "Undo" feature was done. There are still bugs in it but I hope now it will work better. This needed several days of work. The compiler emitted a warning when a static variable was assigned but not use d. This is incorrect. Fixed. Problems still with 64 bit integer comparisons fixed. Stdint.h defined some quantities incorrectly. Fixed. A cleanup of the editor code was undertaken. This reduced the size of Wedit by 6K. Nov 28: Editor: Corrected problems with indent block-move. The line right after the block move was being moved without reason. Nov 26 Added mmc.h Fixed problem with comparison between long longs and chars Fixed errors in stdint.h A number like -388766LL would lead to generation of a run time NEGate with 388 766 as argument. Fixed. This is jow done at compile time. Nov 23: The linker left an invalid executable in some situations. Fixed. Nov 19:

Optimization problem discovered by the SmallEiffel team fixed. Arranged setupapi.h. A total rewrite was necessary. Nov 16: Problem with a wrong instruction being issued fixed. Thanks to Uwe Sander. Added winsnmp.exp (snmp/windows API) Nov 9: Fixed problems in shlguid.h. Thanks to Pascal Haible for reporting me this. Added olepro32.lib (olepro32.exp) Added the GUIDs for Oledb.lib Updated pdh.lib Added pwrprof.exp powrprof.h (power management), toolbar.exp (toolbar creation ), uxtheme.lib uxtheme.exp uxtheme.h Updated psapi.exp, resutils.exp. Lcclib was stopping after 700 files when you gave it an argument like "*.obj". Fixed. Nov 7: First version of the embedded web control shipped. Use iehelper.h and link wit h iehelper.lib. The library uuid.lib will not be shipped with the distribution but can be buil t with the command buildguid.exe. This saves 3.5MB in the distribution, that already is t oo big. This command uses a IIDs template in \lcc\buildlib\uuids Added addl.h to the standard includes, and adsguid.lib (directory service) imp ort lib. Added bits.h (background downloading header) and exdisp (web browser interface ) to the header files Added authz.lib: for the authz.dll, authorization API. Added authz.h: ditto for the definitions, together with adtgen.h (auditing) Added dsuiext.lib: Directory Services User Interface Extensions Added httpapi.lib. (Httpapi.dll import lib) Nov 1: Fixed bug in strtold. Thanks to Vicent for pointing me to this bug. Oct 29: The double variable HUGE_VAL (defined in math.h) provoked a trap when used. Fi xed and thanks to Ricardo Y Maeda for reporting this bug. Oct 28: The wedit.hlp file has been replaced by c-library.chm, a compiled html file. T hanks to John for doing the conversion. The debugger was being fooled when you have a typedef in some other file that had the same name as a local variable or argument in a function where this typedef wasn't used. Fixed. Oct 25: The debugger should be able now to follow programs with several threads. Bug in code generation fixed: When taking the modulo of a number by two (n%2) the compiler generated an incorrect instruction. Oct 21: Problem with xprintf substitution fixed. Thanks to Geoff from elj-win32. Oct 18: In the declaration: void fn(void (_stdcall pfn)(int)) { } the pfn parameter (a function pointer to a _stdcall function) was NOT recogniz ed as _stdcall. This is fixed. Thanks to grischka for pointing me to this.

Besides, in the declaration void fn(void _stdcall (*pfn)(int)) { } (the _stdcall was before the parentheses instead of after it) the _stdcall was ignored. Fixed. In the IDE, when you defined the output of the executable to be somewhere else than in the directory where lcc keeps the object files and executables, a boring message "executable not up-to-date" was issued each time the debugger was started. Fixed. I added a variable EXE in th e makefile. Please watch for problems here. Oct 16: File poppack.h was missing in the distribution. Added. The debugger did not handle correctly modules with multiple source files, i.e. when in file file1.c you wrote #incldue "file2.c". I hope this works better now. Code generation error with long longs fixed. Oct 11: The printf checking for floating point formats was not working. Fixed Code generation error when pushing a character argument to an overloaded funct ion fixed. A typo in libc.lib made fpclassf (float fpclassify) invisible since it was exp orted under a wrong name. A small inaccuracy in LDBL_EPSILON in float.h was fixed. The header files for the shell (shlobj.h shobjidl.h and others) were updated t o reflect the latest development as used for the Microsoft Windows SDK version Oct 2002. Thi s should be transparent to users unless I have make a mistake obviously. The import libraries shlwapi and shell32 were regenerated to reflect changes i n the corresponding DLLs. Oct 2: The function exp() of the math library was wrong. Fixed. Sep 26: New version of the compiler that has a 30% improvement when compiling very lar ge files. (4MB) Modified the "window" menu item in the IDE. Now, you will find there the most recently accessed files. You can configure the number of files in the configuration->workspace t ab. A value of zero means no limit. The "More windows..." menu item leads now to a bigger dia log box than the default windows MDI one. The "import project" option had several problems. Fixed. Sep 18: Glaux.lib updated by John with a correct version. Sep 13: dynloader.h was wrong. Fixed Arranged the "window" menu of wedit. Now you can see all the windows opened, o r set a maximum number of windows to be kept in the windows menu. Sep 11: When an assignment to a structure smaller than 4 bytes is done, the compiler o ptimizes this as if it were an assignment to a register. This was generating wrong code when you had:

struct foo a,b,c; a = b = c; The first assignment was not transformed, only the second was. This provoked a compiler failure. Fixed Sep 10: Several problems were discovered with optimizations: constant folding was prov oking a trap in some special code patterns, and some constant foldings were not reset after a while or do construct. Sep 7: The debugger did not always show the current line. Fixed. Sep 5: lc.exe (the compiler driver) did not handle .asm files correctly. The same pro blem appeared with .def files. Fixed. Besides, the compilation of a single .res or a .asm file wi ll not invoke the linker. The make utility was modified to set always the variable LCCROOT. This allows that wedit generates makefiles without absolute paths in it. This variable will be set to the lcc d irectory. Wedit has now an incremental search feature, just like emacs. It is bound to C trl+F, and allows you to type a word to search, incrementing the position of the cursor with the longest match. I have started to build the data structure browser in the debugger. Not finish ed yet. Sep 1: Added incremental search to wedit. Aug 25: The compiler would emit wrong code when a bit field that has the same bit size as the natural size of the bit field type appeared in a conditional expression. For instance: unsigned int f:32; // 32 is the bit size of an int if (struct.f) In this context (and only in this setup) the if would be incorrectly generate d. Fixed, with some pain. this was a difficult bug to cope with. Thanks to John for pointing me to this. Aug 24: The construct int a[4.9] was not handled correctly by the compiler. Fixed, now there is a clear error m essage. The optimizer was spoling the generated code when you had: char a[]= {'a','b','c'}; a[1]--; Fixed. Aug 22: The linker contained a bug when exports were added to an executable that wasn' t a dll. Fixed. The prototypes for nan(), nanf() nanl() were missing, as well as the implement ation of those functions. Added. The rules for generic functions have been slightly modified: if there isn't an

y exact match, before applying all the promotions, only the promotions as to widen the argume nt types are applied: char/short are converted to int, unsigned char and unsigned short are converted to unsigned, and floats are converted to doubles. Aug 2: The problem of executables containing random bits after the import table has been fixed. The linker version has been upgraded to 2.55 since some APIs require this. Jul 23: When comparing long long integers right after a not operation, the compiler co uld generate wrong code. Fixed. Jul 20: Added several include files and libraries to support WMI network API: wbemads. h wbemdisp.h wbemidl.h wbemcli.h wbemprov.h wbemtran.h. The new library wbemuuid.lib was ad ded to the distribution. The compiler distinguished between unsigned long and unsigned int when compari ng types. Since this types are always equivalent in lcc-win32, any error generated by "redefin ition of" was wrong. Fixed. This means that void function(unsigned long) is equivalent proto type for void function(unsigned); Jul 15: Unsigned/signed comparisons in the preprocessor were wrong. Fixed. Jul 9: The compiler would generate wrong code in some situations for the expression: int Table[idx & CONSTANT] += short; This error was introduced around May 1998, and was present since... It only ap pears in special situations of register configuration, and that's why it was so dificult to detect. Math.h was modified to comply with ANSIC 99 generic macros. The standard libra ry was enhanced too. Jul 1: Several problems in the debugger fixed. Pointers to simple data types were som etimes incorrectly followed. The memory window did not know how to display qfloats correctly. Qfloat support improved. The new qfloat library features more speed, less size . Jun 28: First release of the #pragma lib construct. Syntax: #pragma lib "path" #pragma lib <path> (look in \lcc\lib) Jun 25: Serious bug in math.h discovered by Fred Tydeman: The prototype for rint is wrong! In math.h I changed int rint(double) to the correct double rint(double)!!! Jun 23: Following functions were added to the math library (now named math.lib): acoshl asinhl expl ldexpl frexpl ceill atanl expm1l Jun 22: Browsegen generated an extra file name in the file table of the browse informa tion.

This made wedit open the wrong file when going to the definition of a symbol. Fixed. Jun 21: Fixed problem with inlined functions that generated several labels of the same name. Fixed another problem with inlined functions when a label wasn't generated at all. Fixed strtold, and added it to the compiler when parsing long doubles. Added correct run time library functions for converting from double or long do uble to short or character. Fixed declaration problem for rint in math.h Jun 20: Added explanations for the compiler and linker configuration to the documentat ion right after the "Installing lcc" item. This will help new users to quickly fin d out how to use the system. Sometimes the usage count of a function used in a call wasn't incremented and its symbol usage remained zero. This leads to the assembler not emitting an .external record to inform the linker that this function was extern and used. The linker would then complain with an incomprehensible message "undefined symbol (*UND*)". I ensure now that this reference counter is incremented whene ver I emit a function call. The system dll MSIMG32.DLL was missing from the system. Added. Thanks to manuel.francisco@free.fr Jun 19: Fixed spurious complaints in the compiler when a long double was given to %Ld. xprintf was writing the wrong quantity for %ld when the input was negative. Fixed. Jun 17: This version has the qfloat library integrated within the compiler to increase reading precision. Xprintf has been updated to use long double arguments and in general precision of reading and writing of long doubles is now higher. Problem when accessing long long array fixed. Bug reported by Hubert S. Jun 11: Fixed problem with sizeof in structures with flexible array members. Started working in a better memory display window for the debugger. Added long double logl(long double); long double log10l(long double); float log10f(float); float logf(float); int fpclassl(long double) int fpclassf(float) int fpclassd(double) to libc.lib. All written in assembler for speed. The corresponding definitions were added to math.h. This functions are defined as overloaded functions. Jun 9: The assembler instruction andps was missing. Added. When generating code for a constant double or float, the compiler would not generate code for zero or 1, generating inline instruction fldz and fld1. When a NAN or an INF number was generated as a result of a double/float constant expression like 1.0e99999f, this tests would fail and the compiler wr ongly assumed that a NAN or an INF was zero, producing a wrong code, and the dreaded "compiler error in kids". This is fixed now. I test for NANs when testing for zero double constants in dag.c Jun 9:

The assembler instruction andps was missing. Added. Jun 5: Working together with Fred Tydeman, I have corrected several problems with conversions from floating point types and integers/unsigned. The conversions were done in a correct form, but the flags weren't at all like the ANSI C standard specifies. In several cases the INVALID exception wasn't raised even it it should, and in other cases the exception was raised even when it shouldn't. Missing still in this area are the conversions from/to long doubles/doubles to signed/unsigned chars. Jun 4 Added a correct library function for converting a long double into an unsigned long long. Since this operation is not implemented in the FPU it has to be simulated in software. A variant of the long long division had the divisor/dividend inversed. Fixed. Jun 3 Problem with overloaded keyword fixed. Jun 1 Bug in the optimization of expressions like !v fixed. This bug appeared only when at the left hand side of the assignment there was an indexed table of structures and at the right hand side a boolean expression. Added mstcpip.h to the distribution. Fixed a bit the Undo feature of the IDE. May 26: Bug fixed when optimizing a memset call by generating it inline. Thanks to Mario Feldberg. May 25: The debugger wasn't testing for NANs and printed 0.0 instead. Fixed. The __declspec(naked) was added. This construct is now 100% msvc compatible: no "ret" instruction generated, no prolog, no function epilogue, exactly like msvc does. This means that in 99% of the cases it will cause your program to crash. BUT you can write device drivers with it. xprintf has now the modifier ' (single quote) that will allow you to put the thousands separator in the formats d and f or g. Example: xprintf("%'d\n",123456789); will print: 123,456,789 Fixed problem with "%*.*s" in the printf checker. May 20: Added qfloat support in the debugger. Corrected a small problem in richedit.h header file. Added vdmdbg.h windows header file. May 16: When a structure that had a size less than 4 was declared as a local variable and optimizations were ON, the generated code would write more bytes than necessary to the stack. Fixed. When a field assignment was done, the optimizer did not consider if it was a structure field. For instance x.field = 23 would be seen as x = 23. This confused completely the constant folding module. Fixed. New module added to check for the arguments of printf, fprintf, and other functions of the same family. When an overloaded function that expected a reference arg was called with a structure argument, the compiler failed to take the address of the structure and pushed the whole structure instead. Fixed. When an overloaded function was called with a structure argument, the compiler failed to recognize this and issued a "No matching call" diagnostic. Fixed. The documentation for the qfloat data type was added to the html

manuals. Now there are two versions of that library: a dll version with the minimal functionality and a static version with extended functions. May 14: The statement: static char *foo = ("abc"); wasn't correctly handled by the compiler. Fixed. Bug reported by Mario Feldberg. May 11: MANY bug fixes contributed by Fred J Tydeman. They are mainly in: boundary conditions and constants initializations when compile time operations are involved. For instance: 23.778L/123.9L, or 1332LL * 23322LL, and similar operations. I have corrected many of them, specially in conversions from/to long doubles and long longs. Code generation bugs were discovered by Mr. Tydeman. Comparisons of greater than or less than involving unsigned longs and doubles were generated incorrectly. Mr Tydeman looked in the xprintf implementation too, and found many inconsistencies: xprintf with DBL_MAX was printing a wrong value. Fixed, I increased the digits buffer to accommodate at least 350 numbers. The strtold function would return a wrong value for 0.0e9999. Fixed. There was a problem with the constant folding module that would lead at the end of a switch statement (and if there wasn't any break at the end) to propagating a constant wrongly outside the switch. For * instance: switch (b) { case 1: c=12; break; case 2: c=34; } // here the compiler assumes wrongly that c is 34. Fixed. In the module that creates a multiplication by the inverse of a 32 bit constant there was an error that would surface only in very complicated contexts. Thanks to the SmallEiffel compiler I found that one. A new module for extra precision floating point is now part of the standard distribution. This floats have 104 digit precision. The dll involved is qfloat.dll, that now is part of the distribution as well as the qfloat.h file. April 30: When an overloaded function had a float argument, the compiler was pushing a double instead of a float! Fixed. Some redefinition errors appeared after the corrections to win.h. Fixed. New command line option to wedit: /projectsroot:<file path> allows you to designate an alternative path for the projects directory. April 28: A lot of work being done for the bignums. A general cleanup of the code yielded missing/buggy operators, and some serious defects in the assembler code for the bignums that was rewritten. The first implementation of a "constructor" feature. If you define a typedef, now you can define a function with the same name that will be called to build the object. For instance: typedef struct example { int i; } EXAMPLE; EXAMPLE EXAMPLE(int a) {

EXAMPLE result; result.i = a; return result; } Then you can write: EXAMPLE g = EXAMPLE(56); This would be trivial, but I plan to call this functions whenever a cast is necessary and this functions exist. April 27: Improvements to win.h: raw input API incorporated. Other missing definitions added. The #error directive didn't increase the error count! Fixed. April 19: Optimizations improvements reduce code size: Instead of movl $0,destination, I emit now andl $0,destination what is 4 bytes shorter as instruction. This makes for big code size savings. When you pass an immediate constant to a function that is expecting an argument as reference, the compiler issued an error. This is corrected now. The compiler will build a temporary that contains the constant, and pass the address of this temporary to the function as C++ does. Several new trees were added to the rules of win32.md. The bignums accept now the assignment operator, i.e. you can write: pBignum a = 23; This will call automatically the operator assignment for this type (bignums). This wasn't working before. Note that you have to define the assignment operator function as a function that accepts a reference for it to work at all. April 8: Several problems in the bignums.dll fixed. Some minor problems in wedit fixed. March 31: Fixed spurious warning "variable used before being defined", when a sizeof() of an uninitialized variable was done March 29: Bug fixing update. Several problems with long longs, and ternary expressions. March 22: Two bugs in optimized code generation fixed: a) When the following code was compiled, the result was incorrect: char *string = "Oops"; printf ("%d\n", (*string == '\0')? 0 : -1); This was a problem of the boolean assignment generator, that did not complement the carry when the arguments were exactly zero and minus 1. Bug reported by Konrad Budych from Poland. b) The following code was incorrectly implemented: int test() { char c[] = {0,0}; return 0; } This provoked a stack corruption. Bug reported by Tom from Japan March 15: The constant folding module has been completely rewritten and tested. This supersedes the old implementation, too far back in the back end, that was incomplete and bug-ridden. The module for emitting the debug line number information corrected

an error with more lines being emitted for the same code. Several fixes to the header files, updates, etc. Jan 25: The compiler will now check for operators with a void return type and will issue an error if this is found. Jan 23: Major update. o Speed of 64 bit operations improves from 70.000 bits/sec in the "tiger" benchmark to 200.000 bits/sec. lcc-win32 achieves now 79% of the performance of fully optimized gcc. o Improvements in analysis yield a better CSE (Common Subexpression Elimination) that reduces the number of redundant loads from RAM into a register. This improves the speed of the generated code. o Several bugs were fixed in the 64 bit (long long) module, and in several other places: the pushing of a structure of 4 bytes is now done in a single instruction instead of in a block copy operation. This fixes a bug where register esi was lost.

2001

Dec 25: Problem in the optimizer solved (reported by Ross Axe). Wedit "Evaluate expression" should be able to handle simple casts now. Dec 13: Error in operator overloading corrected. The arguments were not promoted to their expected types. Complex.lib was modified to expect now _Complex types instead of references to _Complex. Dec 10: Error when a stdcall function pointer was being accessed through a function pointer. This bug appears only when the stdcall function returned a boolean result. Update to the documentation (wedit.hlp) Now xprintf will have enough precision to display accurately 1e18+1. Completely rewritten. Several functions (floating point) added to the standard library. modfl, for instance. The driver program lc.exe was updated. Some minor glitches when using paths were fixed. The new startup code sets the precision settings to 64 bit precision (full precision) Dec 8: Error in generated code when the try ... except construct was used corrected. Functions added to the standard library: (for C99) fegetround, fesetround, DoublePrecision, FloatPrecision, FullPrecision, isnan, floorl, fmodl, fmaxl Dec 2: When a shift right was immediately followed by a shift left, in some cases the register allocator would emit wrong register assignments. Fixed. Dec 1: Problem in the optimizer fixed: the register ECX is not actually free if there is a shift operation further down the same block.

When an inlined procedure with no result is expanded, problems occur. Fixed, but still some problems remain in there. The new functions xprintf, etc, did not test for NANs and INFs, and they would loop infinitely if given such "numbers". Fixed. Wedit had a fixed size "Add project files" window. When the paths were too long, you could not see all the file name. Fixed, now that window is resizeable. Nov 29: The lc driver program for lcc would not add the libraries given in his command line to the linker. Fixed. The lc driver program would not handle correctly paths. Fixed. The compiler now supports the correct syntax for double _Complex a; The structure double _Complex, long double _Complex and float _Complex are built-in data-types as specified by C99. libc.lib was missing ldtoa. Fixed. Nov 28: Fixed bug when doing integer division. Wrote ldtoa to handle displaying a long double. Needed for the debugger. Nov 25: Added fdim nearbyint fmax and other functions to the standard c library. Added libml.lib to the standard distribution. This library contains all long double functions, and many other goodies. It has been adapted for lcc-win32 from the cephes math library available in www.netlib.org. Lcc-win32 compiles now all this long double code without any error. When you declared a flexible array, and immediately afterwards another (normal) array, the second array would be treated as flexible and the compiler would crash. (What a shame!). FIXED. When the bignum library got an overflow, it showed: Error 2116 Now it shows: Overflow An improvement I hope (:-) Nov 23: When a function is being overloaded, the compiler should correctly promote the void pointer to match any pointer. This wasn't being done. When several overloaded functions were declared, the compiler did not emit all the names as external symbols to the assembler, and link would fail. Thanks to John Findlay for reporting the two bugs above. When an unused variable in an inner scope was declared "register", the compiler would allocate a register for it, spending a register for nothing. When long long operations are being done, it is impossible (at least for now) to use any register variables. The long long operations use too many registers. Several long long operations were wrongly described in the machine description. The optimizer is improved, generating tighter code. Instead of: movl %esi,%edx addl $8,%edx orl $4,(%edx) it will generate now orl $4,8(%esi) Instead of generating an division to compute the modulous of an integer by a power of two, the compiler will generate several and or OR operations.

long doubles are now implemented as a real type, i.e. they will not only be recognized but also actually used. This has provoked obviously quite a lot of modifications. The function "peektoken" would not work when the compiler was almost at the end of the buffer received from the preprocessor. Fixed. Wedit has been updated to display long doubles in the debugger. The compiler emits now that information of course. Nov 12: Fixed bug that produced a division by zero. Thanks to Anh Vu Tran for his report. Nov 11: Nasty repaint bug in wedit fixed. Diff dirs improved, and other small changes to wedit. Added fix for _GetCmdLine proposed by kdiggins@qwest.net. lcccrt0.asm and lcccrt0s.asm modified. Fixed problems in the examples distribution. The first file in the files open toolbar did not work. Fixed. Nov 7: Fixes problem in code generation. Under optimization, a switch that used a signed byte variable would fail when comparing negative bytes. The disassembler now understands all pentium 4 operations. Inverted Mousewheel support in Wedit due to popular demand Nov 4: Several problems in the long long code generation fixed, and the overall long long code generation strategy reviewed. When using alloca, the generated code would crash/fail if optimizations were ON. Fixed. Pentium4 SSE2 back end started. It is not in this release yet. Bug in generation of long long constants fixed. The resource compiler had a limitation of strings of 255 characters. Fixed. The debugger has a display for the new XMM registers. The assembler has been modified to accept the new Pentium4 instructions. Mousewheel support has been added to Wedit. The documentation of the system has been extensively reviewed, to add all pentium SSE2 instructions. See the assembler docs. Sep 25: There were several inefficiencies in the code generation when a function a small structure was used. This has been corrected. Improvements are noticeable in the bignums.dll, that is much smaller now. Besides that dll was being shipped with debug info, what has been corrected. Sep 21: Variable length arrays implemented. This allows you to write code like this: int fn(int a) { int array[n]; ... } Improvements to the inline keyword implementation. Static character strings can now be of any length. The 16K limit has been eliminated. Added "stdheaders.h" to the include directory, including the most frequently used standard include files. Aug 28: rpcproxy.h would not compile in stand alone. Fixed. First implementation of the "inline" keyword Added htmlhelp.h to the distribution Aug 9: A typo in w32incl.c (a missing "%") provoked that the assembler crashed when

generating the code. Fixed. An error in the MULL machine description provoked the generation of mul (unsigned multiplication) instead of imul (signed multiplication). this happens only when the two input values were 32 bit integers and the output should be 64 bits; Fixed Include file rasdlg.h was missing. Added to the distribution. July 28: A .def file added to a dll project wouldn't be used when constructing the makefile. Fixed. Juli 26: Fixed problem in the spiller (compiler) Fixed diagnostics without line number info in resource compiler Fixed problem with multiplication and division of manifest constants in resource compiler Fixed problem of *cbk.c in the IDE. Several bug fixes in the headers. June 29: Fixed bug in the optimizer when you write: string[j++] = '/'; string[j++] = '/'; The optimizer was generating bad code when both those statements appeared one after the other. This bug in the optimizer made wedit reformat the comments incorrectly. June 27: Fixed bug in the garbage collector that would make wedit crash. "Fixed" is actually too big for this. I just added a check for valid pointers, that's all. Fixed problem with coordinates that would make wedit crash under windows 95. If you give bogus coordinates to MoveWindow, Windows would freeze solid. When looking for the header file of a resource, the current directory is now reset to the sources directory. This allows you to skip a long series of button clicks to get to the correct directory or worst, to choose a wrong file. Fixed problem with the linker. When defining an alias in a definition file, the export directory of the executable was sorted wrong, and this made windows miss some valid exports. June 25: Added left selection bar to the editor. Ctrl+End didn't work correctly. Fixed. Compiler wasn't optimizing all the possible occurrences of stack adjustments. Fixed. June 23: The code generation for overloading == and != was wrong in the case of integer constants. Fixed. The bignums library contained several errors. Fixed. June 20: The compiler would reject: unsigned short a = (unsigned short)3.14; Fixed. The compiler would generate wrong code for a stdcall function that returned a structure whose size is less than 9 bytes. The stack didn't get cleaned up, i.e. the _stdcall attribute was ignored. Fixed. The code management system (CMS) was taken away from the distribution. It is no longer part of wedit and will be distributed as a separate module. June 10: Fixed problem with foreign characters in the resource editor. May 27th: The compiler now will accept flexible array members at the end of a structure declaration.

For instance: struct f { int a; char b[]; }; Problem with the following code: unsigned short *p = L"abc" L"def" corrected. The strings will be concatenated, as they should. Wedit now understands the pre-processor errors when in a macro expansion. A problem with the files toolbar fixed... the number of files was -1... Several crashes in wedit were fixed. For instance, if the files toolbar was active when no files were open, wedit would crash. Other crashes provoked by clicking in other windows than the focus window were fixed. When using the "open all files" option, wedit would not test that the file to open wasn't a .lib or .obj file... Corrected. May 23th: Wedit didn't handle correctly the Show definition option in the right button menus. Sample added to the e-mail distribution: Code to find the DirectX version installed in the machine. Added following header files to the distribution to support directx 8. d3d8.h dmdls.h d3dx8.h d3d8types.h d3d8caps.h d3dxmath.h d3dx8math.inl d3dx8core.h d3dx8tex.h d3dx8shape.h d3dx8mesh.h dplay8.h d3dx8effect.h dvoice.h Updated dsound.exp, dsetup.exp dinput8.exp. Added getdxversion to the e-mail samples distribution. This sample returns an integer between 0 and 8, telling you which version of directx you are running. Added sample to draw a sprite to the e-mail distribution. First complex sampl e that compiles successfully with the new headers. Added dxerr.dll to the distribution. This exports the DXErrorMsg function. Added a documentation chapter for directx (23 pages). Updated other documentation (header files listings, for instance). There was a problem with functions with optional arguments. Under some circumstances, the compiler would enter an infinite loop. Corrected. Documentation for AMD 3DNOW instructions now in the manual, together with the MMX instructions doc. May 21th: When an overloaded function takes a long long argument, its "mangled" name would be: int foo_long_long When an overloaded function takes two longs as arguments, its name would be: int foo_long_long Exactly identical. I corrected this bug... The browsegen utility wasn't writing correctly the prototypes when long long arguments were in the declaration. Fixed. The resource editor will not write absolute paths to the include header files any more, and will assume the header is in the current directory or in the include path. Besides, the #include <windows.h> will be enclosed in a #ifdef __LCC__ to make it more portable. Directx8 support. This version fixes libraries and other problems with directdraw support. May 19th: Header file ws2tcpip.h was missing. Problems with overloaded functions: unsigned int wasn't accepted as a substitute for int. Bug when calling through function pointers returning structures corrected. May 15th: Maintenance release that correct the bugs of the previous one. Sorry... :-( For instance, when you press compile with a file open that is not in the

current project, a dialog box would ask if you want to add it to the current project. If you pressed ADD, nothing happened. Corrected! May 10th: MAJOR revamping of the resource editor. 1: User defined resources should work now. 2: International characters shouldn't get lost. 3: Adding an icon/bitmap should work now. The values _HEX and _BLANK were wrong in ctype.h. Corrected, and rebuild libc .lib May 5th: All references must be eliminated in an expression. The compiler wasn't doing this in the case of several references in an expression. Fixed. The documentation for printf was completely unusable do to bad formatting. Fixed. Problems in the menu editor. Solved problem of crash when the symbolic name of the menu was being edited. Crash when the "Properties" of string table were chosen solved. In the compiler, some intermediate expression that returned a reference weren't handled correctly. In the configuration tab you could move the embedded dialog boxes with the mouse. Corrected. The include path should be enclosed in quotes when there is a space in it. Corrected. May 1st: First release of the improved RAD environment for lcc-win32. Many bugs in it were fixed, and a tighter integration with wedit is done. New index in the help file with all the standard library functions for quick reference. Apr 20 Bug in exception handling corrected. The compiler would save if there were two __try blocks one right after the other. Corrected typo's in win.h and stdlib.h Infinite loop when importing a project. Corrected. Apr 19 Wedit uses the html format now for the online documentation, if available Apr 14 Operator overloding with = should work now Problems with the != operator corrected. Thanks to Sjouke Hamstra. imaxdiv function implemented Apr 4: Problems with optional arguments fixed. LPNMTREEVIEW was missing in win.h Mar 29: Problem with overloaded functions solved. Mar 28: Missing definitions in wininet.h added. Bug that made the compiler choke when expecting a char pointer and finding a char array when calling an operator function corrected. Mar 25: Error with overloaded functions corrected. Mar 24: Corrected bug in lcclib.exe: when the output file name was incorrect, it would crash instead of showing an error message. Fixed. Mar 22: Added optional arguments to the grammar. This feature is identical to the C++ one: you write: int foo(int a,int b=2,int c = 3); "c" and "b" will be optional arguments, so you can make calls like:

foo(1); // Compiler supplies foo(1,2,3); foo(1,78); //Compiler supplies foo(1,78,3); Mar 19: Release of Berkeley DB for lcc-win32 Mar 14: Fixed problem in keyboard reconfiguration. Mar 13: Output and input redirection work with the debuggers arguments. You can now write: >outfile in the debugger args, and the stdout of the program under debug will be redirected to that file. matherr correction. long long problem solved (code generation) Feb 19: Multi-threaded debugger. First release. Feb 7: Problem in the asin atan, etc functions in the bignums library corrected. Problems with several types in the bignum lib header files fixed. Documentation for the bignums lib added to the user's manual. In the debugger fixed repeating of question: sources are newer than the executable. In the debugger the option for displaying memory using decimal notation did not work. Fixed. Feb 3: Problem with the compiler and Unicode strings. Strings containing embedded zero bytes weren't emitted correctly. For instance the string "A\0BCD" would consist of only the unicode char A, stopping at the first zero. Fixed. Feb 2: Fixed the tab key in the dialog editor when the test dialog is active. This wasn't working. Changed the font of all dialogs in wedit from "Helv" to MS Sans Serif, to cope with machines that do not have that font installed. Fixed (again) the accelerator table in the dialog editor. When creating a table the editor refused to accept the new table. Jan 28: Put the macros with variable arguments modification in the compiler. Fixed other small issues in the user interface of Wedit: button's text, etc. Jan 20: Fixed tchar.h _strnicmp instead of _strnicmp. Added an option to generate a Excel CSV in the "Audit" option of the analysis menu-group. This will generate an Excel table of all loaded functions, so including the line count, the size, etc etc. Improved the dialog box for the 'File relations" option. The print option of the metrics plot did not work. Fixed. Optimization bug with long longs fixed. Problem with int --> double comparison fixed in the code generator. The linker was generating a wrong size for the .reloc section. Fixed. Added the drawing of tick marks in the plotter for the software metrics module. Jan 16: The versioning system did not take into account any extra files the user stored using the put command. Files would be stored but there wasn't any way of making a "get" afterwards. This is corrected now. The versioning system didn't handle extraneous files in the project file list and crashed with names like "tcconio.lib" for instance. The type of files that the versioning system understands has been limited to C,H,RC,DLG. Unless the user explicitly puts a file of another type, it will not be considered as a valid CMS file. A bad allocation error in the configuration dialog produced a "Overwritten block size 33" message. Fixed.

The macros "max" and "min" were missing from stdlib.h Jan 13: Packing of structures with bit-fields using #pragma pack(1) did not work correctly. Fixed. Jan 12: Problem with multiple selection in when selecting revisions in the versioning system fixed. Background of diff dialog box changed to white. This makes text more visible. Introduced the software metrics option for a whole project. All files will be measured. Introduced timing statistics for project and session, to be displayed in the General tab of the configuration wizard. A double quote too much caused the makefile generation to fail when compiling for a library project. Fixed. Documentation for inp was missing. Jan 09: Problems with printing: did not print for the second time. Fixed. Problems when generating code for the bool type. Fixed. Jan 04: Still problems with makefile generation fixed. Bug with long long division fixed. Problem with // comments in the reformater solved Problem with bignums dll solved. Jan 03: In some circumstances, when an unknown library function was used, pressing F8 (for trace) in the debugger would make the debugged program continue no longer under debugger control. Fixed. When comparing two long longs, the stack was being left in a wrong state. The code generated by the compiler was missing two pop instructions. Jan 02 Bug in the optimizer with subtraction from long longs. Corrected. Bug in the optimizer with intermediate registers using two long long expressions. Now the optimizer is almost disabled if any long long expressions appear in a function. The problem is that with only 6 registers available, any operation with two long longs uses almost all the CPU. Upgraded the setup utility to the new installer format. Corrected several bugs in the handling of pathnames with spaces. This will probably go on for a while sigh...

end of 2000. Starting 2001

Dec 31: Fixed errors un bignum.h Fixed erros in stdlib.h concerning the _environ variable. Fixed erros in errno.h concerning the errlist variable. Compiler problem: When using intrinsics for sin or cos functions, it was impossible to take the address of those functions, since they are always inlined. Fixed. Fixed problem with the makefile in the buildlib that made installation fail. Fixed problem of embedded blanks in pathnames in the wizard, and the corresponding place in wedit when it calls it. Added code to test each include path for validity. Added prototypes in stdlib.h for _rotr, and _lrotr. Thanks to Peter Raddatz. When no project is defined, the menu items in the Project menu weren't grayed correctly. Fixed.

The keyboard macro Ctrl+F could not be set. Corrected. Corrected bug of '\ ' (backslash followed by a space) in ddraw.h and several other header files. Fixed several small problems with the print dialog. Fixed problem of spaces in lcc path when calling buildlib in lcclnk. Fixed several problems with spaces in the lcc path (i.e. when you install into "Program Files"). Make generation, and many utilities would fail. Fixed pedump, buildlib, browsegen, etc. Added documentation for the -Pn option to browsegen. Added feature "Import foreign library" to transform a .lib in the format used by Microsoft, to the format used in lcc. This was added to wedit. Dec 26: Added browse button to the grep dialog box. Added several pages technical description to lccwin32.doc specifying the workings of the project management, keyboard handling, screen redrawing, and others. This prompted some cleaning in the data structures within wedit. Some unused variables are gone, for instance. Suppressed the "Project" tab in the configuration wizard. The few valid fields were moved to the "general" tab. Added the System info tab to the configuration wizard, mainly for getting the details of the gc. Corrected problem in buildlib.exe when confronted with extremely long symbols. Now the maximum symbol name length is 512 characters! Added lseeki64 and telli64 functions to the standard library to support files bigger than 2GB. Modified the corresponding on-line documentation. Revised the index of standard library functions to fill missing functions and type errors, adding those functions too. Added an index to lccwin32.doc. Eliminated the "Browse function" menu item in the right button menu. It didn' t bring any really important functionality. Fixed many bugs and problems in the revision control system. The "revisions" command would make wedit crash. The interface to several dialog boxes was simplified, eliminating unnecessary extra dialogs that appeared everywhere. The bookmark menu wasn't being grayed as it should when no bookmarks were defined. The accelerators for next bookmark did not work. Fixed. The prototypes writing has been moved from the small special purpose parser in wedit to the browsegen utility, that has improved the -P flag handling in the compiler. The -P flags looks like this: -P (or -P1) Write only global function prototypes. -P2 Write global protos and global data definitions (int foo, for instance) -P3 Write global protos, global data defs, and static protos. -P4 Write everything: global and local protos and data definitions. Wedit will remember this options for you. Just use the new Write protos option. By default, always the generated files will be loaded into the editor. Updated netapi32.exp to changes in windows 2000 API. Eliminated support for asm files, int the editor, since this didn't work at all, and it would be too much effort to support it correctly. Asm files can still be loaded but there will be no syntax coloring or finding the procedures in the file. Dec 16: Linker wasn't recognizing comments within the .def files. Fixed. Comments start with a ';'. Fixed. Wedit wasn't recognizing relative paths when building a project.This has been improved... Wedit will generate now a dependencies file in the compilation directory that is used by the workspace window to display the header files, and in the makefile generation process.

The makefile generation process will not rescan all source files at each time if at all possible. This speeds-up the makefile generation for big projects. The workspace window would fail to open a file with relative paths specifications. Corrected. Updated online documentation for lcc options. (Thanks to lado brisar) Dec 8: Linker bug fixed: the definitions file (.def) weren't working correctly. Eliminated the #define of RtlZeroMemory as memset. The standard header wctype.h was added to the distribution as required by the standard. Tooltips were added to the resource editor's toolbars. Dec 5: When a bit field is declared as unsigned long, the resulting type should be unsigned, and not signed integer, as it was till now. Corrected. Thanks to Pascal Haible. Under certain circumstances, the optimizer would alias several local variables to the same register producing bad code. Corrected. GNU GDBM library added, with documentation, to the distribution. Nov 27: TVINSERTSTRUCT and TVITEM were missing from win.h. Added Corrected problem with unsigned long longs and shifts. Corrected bug in the optimizer that produces an incorrect move instruction in the assembler output Corrected problem with temporary variables of long longs. Nov 23: Erasing a project in wedit didn't work correctly. Corrected. The complex functions library complex.lib has been updated to use ANSI-C-99 function names. The complex library has been updated with acosh and other functions. A revision of the complex library is under way. i64toa didn't work correctly for some long long values. The same for atoll. Nov 20: When the compiler sees if (0) { ...} the code will not be compiled. This optimization produces an error when there is a goto statement that points to a label in the excluded block. Corrected. Added header files to the workspace option of wedit. The resource compiler lrc.exe had a stupid limitation of 70K for rcdata resources. This has been eliminated. Bug in the optimizer corrected: under some circumstances, a cached register variable would be used when the value in the cache was wrong. Corrected with the help of planeta@iach.cz _Pragma() construct implemented. This is required by the C99 specifications page 159. The History command in wedit has now an accelerator of alt + left arrow. Nov 15: A bug in the previous version (Nov 1) provoked a loop that made wedit use 100% CPU time. Corrected. The compiler didn't correctly convert doubles to long longs and vice versa. The warning about signed/unsigned comparison was moved to a higher warning level. nspapi.h was incorrect? Added missing definitions. Corrected bug in selecting first column with the mouse Corrected bug in memory window in the debugger: the address field wasn't incremented and there were several redrawing problems. Added _makepath to stdlib.h Added missing definition of STDMETHODIMP to objbase.h. Bug report contributed by lesbread@tomatoweb.com Fixed crash in the configuration wizard. (bug report from wpress@unis.ru) Introduced the History command in wedit.

Nov 1: The utility browsegen was broken. It didn't generate the browse file! The block indent code in wedit was interfering with replacement of the current selection: the tab key didn't work for replacing the selection. Generic functions extension: first implementation Corrected bug in wedit when you deleted (with the DEL key) a letter, UNDO did not work. Oct 30: Problems with the installation program. Dolibs announces a non-existent error. Corrected (I hope) Several bugs in code generation with long long corrected again. Another problem with the optimizer solved. Oct 28: Project workspace modifications. The project window appears at the left side of the editor. Projects aren't longer stored in the registry but in ascii files. This makes the export and import options obsolete. A "migrate.exe" utility is provided to move from the old registry format to the new one. The lcc.dll library is provided for people that want to use the compiler as a dll. Problems with the ide crashing were solved. Oct 1: Bug with boolean declarations corrected. XOR worked incorrectly for unsigned long longs. Sep 29: Correction of problems when compiling "bool foo = true;" Two identical structure definitions will not provoke an error now. This means that typedef struct tagFoo { int a; int b; } FOO; typedef struct tagFoo { int a; int b; } FOO; will be accepted. The names of the structures and fields must be equal, and their types must be exactly equal. Correction of the profile problems. The profiler works again. Sep 10: I have added a compilation driver, lc.exe, that will call the compiler, and if there are no errors, will automatically call the linker. Even if lcc-win32 with Wedit has no real need for this, many users have complained that use lcc from the command line. Wedit: You can now indent a marked block with the TAB key, and move a block to the left with Shift tab. Error messages in the compiler improved for clarity. The tutorial has a dozen of pages more. The wizard can now generate a File open procedure to get an open file name. Documentation updated. Tested installing into folders with spaces in file names (i.e. Program files) Seems to work. Sep 6: New header files added: wmistr.h guiddef.h evntrace.h Modified: tlhelp32.h (contained errors) stdlib.h: missing _wtoi definition and other functions win.h modified to put all tool help definitions in tlhelp32.h Bug fixes: Corrected error in version module when setting/unsetting the locks. Corrected error with proportional font in wedit.

Sep 4 1: A new check was done for spaces in filenames. This should work better now, since I was able to compile a project in F:\program files\Microsoft Platform Sdk\samples\dataaccess\odbc ^ ^ I had to modify the compiler, the resource compiler, and the IDE. I hope I haven't introduced any bugs... 2: I started compiling odbc with lcc-win32. New and updated files: sql.h sltypes.h sqlucode.h sqlext.h Sep 2 1: The make utility accepts redirection of its output. You can then write commands like: flex file.l >file.c 2: A bug in the project flags settings left always the debug information in the executables. Corrected. 3: The compiler choked with int i1,i2,i3; i1 = (long long)i1*i2/i3; This is corrected now. 4: AMD support for the 3DNOW instructions. The assembler accepts the 3DNOW instructions, the compiler has now intrinsics for using them, and the debugger shows the AMD floating MMX registers. 5: Added include file shlwapi.h to be able to execute the shell extensions API.Corrected several bugs in this part. 6: The debugger has a error window showing at each step the result of GetLastError(). 7: Corrected the sample code in the shell extensions API documentation. 8: Compiler did not correctly compile right shifts for 64 bit longs. Aug 17: THE NASTY BUG OF WINDOWS 95 IS GONE!!!!! Please windows 95 users download this version. Other corrections within the resource editor. Jul 31 -----1: Resource editor: Corrected the string table editor to use symbolic identifiers instead of bare numbers. This wasn't working before. 2: Resource editor: Corrected the string table editor to better check the values of the numeric IDs: tests for zero or negative IDs and rejects them. 3: Wedit:Problem with the search/find box crashing corrected. July 10: 1: Yes, a new small problem in long longs. Damm is this difficult. But bugs are now difficult to find what is a measure of progress... 2: strtrim was missing from the stdlib functions. Corrected so that F1 will work with under wedit. 3: Wedit entered an infinite loop when the debugger found a long long type. Corrected. July 9: 1: Problem with _stdcall function pointers hidden in typedefed function pointers is corrected. phew... 2: A new C-Tutorial is in the documentation file lccdoc.exe. It has already more than 100 pages and tries to explain the C language to the beginner starting with the traditional hello world program up to building a DLL. This is just the first version, more will follow. July 2: 1: Problem with floating point intrinsic functions in the optimizer corrected. 2: Code with constructs like: if (0) { ... statements...

} will now not generate any code. Warnings are disabled (by default) when parsing the code that is not active. 3: Error reporting has been improved. Some "error cascades" are now avoided. 4: Problem in the IDE with some paths that contained nonsense is solved. June 29: ------1: Users complained that the linker was mixing random data from RAM into the executables it built. This has been corrected, the linker now cleans up the space in the executable, as windows-nt or windows-2000 makes automatically. This isn't done by windows 98 or windows 95, so the linker will do that instead. This has been a cause of concern by certain users, what prompted an immediate upgrade. 2: A saga without end: unsigned long long support was still missing some ops. (several nested levels of AND or ORs of long longs provoked trouble). What is reassuring is these bugs get increasingly sophisticated, i.e. simple expressions are well covered already. 3: Documentation for the functions in tcconio.lib are now online. 4: The optimizer will now recognize if (0) { // ... some code ... } and absolutely no code will be generated for it. By default, no warnings will be issued in this code, unless you compile with the -A option. June 19: 1: Problems appeared when a function had a reference argument. The reference bit was getting lost in comparing the function proto with the actual defined function arguments. This has been corrected. 2: The bignum (arbitrary precision) library has been added. See the documentation (user's manual) or \lcc\include\bignums.h 3: Some problems with the "strlen" intrinsic were corrected. This provoked a crash in the resource editor. June 17 ------1: Forgot the intrinsic for unsigned long division in libc.lib. This would provoke that the linker complained about an undefined. 2: The bignum (arbitrary precision) library has been added. See the documentation (user's manual) or \lcc\include\bignums.h 3: Some problems with the "strlen" intrinsic were corrected. This provoked a crash in the resource editor. June 17 ------1: Forgot the intrinsic for unsigned long division in libc.lib. This would provoke that the linker complained about an undefined. ------1: Forgot the intrinsic for unsigned long division in libc.lib. This would provoke that the linker complained about an undefined. 2: Unsigned long long further problems with some conversions solved. 3: The promotion of some built-in types wasn't working with operator overloading Now those are correctly promoted. The operator '%' wasn't being recognized for subclassing. Corrected. 3: Updated a bit the doc. 4: The bignum (infinite precision) library is almost working, but I decided not to include it in this one.

June 13 ------1: This is a major release: it features for the first time the memory manager developed by Hans Boehm. (gc). See the documentation (user's manual is updated) or the online docs (go to index and choose memory manager). 2: Problems with the unsigned long longs (yes, I know, I promised that there would be no more bugs :-) have been solved, extensive test suite for them written. Well this time I do not promise anything but I am surely more confident in them. Thanks to Pascal Haible. 3: Fixed a buffer overflow in the macro expansion. Macros can get quite long when expanded, as I found out... 4: Fixed the alignment problems in the linker and in the assembler, that would prevent Hans Boehm's gc to run. This cost me weeks of development. Now is (finally) working. Please use only *THIS* version of the system with the gc. It will NOT RUN in earlier versions because of this alignment problems. June 4 ---1: Added macros for the debug info of the debugger. Macro support doesn't included expansion, the definition however, is now included in the shipped debug information. The debugger will display the definition of the macro as a character string. 2: The C-FAQ has been added to the e-mail distribution, and is available in ftp://ftp.cs.virginia.edu/lcc-win32 and ftp://ps.qss.cz/lcc May 28 ----1: The compiler has been updated to recognize the boolean types. The unsigned long long problems of previous versions have been corrected. 2: The IDE is now able to export projects with less problems... 3: Several small upgrades to the header files. 4: regexp.lib: a regular expression package has been added to the standard distribution. 5: fdlibm.lib, with more floating point functions has been added to the distribution. 6: Documentation updates for the operator syntax, and the new libraries. 7: The bug in the divisor being stored in register EDX, and provoking a division by zero error has been corrected. 8: Sometimes when proposing the missing libraries to a link, Wedit would crash. I hope this doesn't happen any more. A wandering NULL pointer was shot down. May 15 2000 1: Operator overloading and references are introduced. This is a major revision of the compiler. The documentation has been updated with a new file "operators.doc" that describes the new syntax, the rationale etc. 2: When the optimizer was on, sometimes a register was being lost in a misguided optimization effort. this happened when an assignment was being done to a register variable. May 5 2000 --------1: Several odd bugs in code generation, specially in the optimizer were correcte d. They appeared when compiling Eiffel code and concerned floating point compari sons with integer values, and trashing a value in a register variable. 2: The IDE didn't recognize de utilities command anymore. Corrected.

1: Corrected a bug in the error message display: if the name of your source file happened to be the same as the name the directory you were in, the file name would be truncated to "c". 2: Corrected problems in the c preprocessor with foreign language code pages. 3: Corrected a code generation error in the optimizer concerning some cases of incorrect oring with immediate constants. 4: Corrected a code generation error that involved a bad register allocation for intrinsic calls. Documentation: -------------1 Added documentation for the way you add assembler macros to the compiler as "intrinsic" pseudo-functions. Header files and Libraries: --------------------------Added libraries: hlink.exp and hlink.lib import libraries resutils.exp resutils.lib iprop.exp iprop.lib icmui.exp icmui.lib Added header files: resapi.h clusapi.h Corrected/updated files: windows.h (this is a long runner...:-) stddef.h Wedit ----1. Corrected problem with tcconio.lib always being added to the libraries. 2. Bit fields are now supported in the debugger 3. Increased capacity for error messages in the error message buffer that was overflowing when too many warnings appeared in compilation. 4. The link command called make, rebuilding the objects. This has been corrected , and now only the link will be performed. 5. The problem with the add/delete files dialog box that required pressing two times the "validate" option has been corrected. 6. Wedit will now detect a missing library automatically, if the needed API is in the list of known APIs. That list has now something like 10500 entries. This list will be now generated automatically by the installation program and will be placed in \lcc\lib\apilist.txt. 17 Mai 1999: Bug when closing a project that has no name. Fixed. Bug when printing a function tree. The AbortProc goes into an infini te loop. Corrected (edit2.c) new files added to the include directory: adshlp.h snmp.h mqmail.h psapi.h ws2spi.h mq.h lmdfs.h cchannel.h midles.h nspap u.h svrapi.h wfext.h mapiform.h digitalv.h lmat.h tnef.h imessage.h winnls.h winnls32.h winab le.h tom.h time.h rasshost.h confpriv.h tapi3if.h iads.h mqoai.h security.h sspi.h secext.h

intshcut.h lccpath.h 9 Mai 99: Fixed problems with the tree drawing functionality that would get lost if it found a function definition containing a brace in the same line that the function definition started, i.e.: int foo() { The link tab provoked a spurious 'project has changed' warning. This is because it didn't ignore case when comparing the old contents of the libraries and the new ones. Since I did an strlwr at the start, this would always provoke a spurious message the first time the tab was called. Corrected. Added support for stack integrity checking when the debug level is 4 . 8 Mai 99: Wedit debugger tab didn't read the starting dir correctly. This code made the compiler trap. Corrected. typedef int my_int; typedef unsigned my_int my_unsigned_int; // <-- the error occurs in

this line 7 Mai 1999: Added the lm*.h (lan manager) header files lrc was crashing when called with a special rc file. Corrected. inb and outb were wrong. C library corrected Resource editor doesn't screw up files when the 'new' project is chosen Some strings in the C code generated by the resource editor were wrong. Updated documentation for the changes in wedit's menu. 6 Mai 1999: Wedit understands now paths with embedded spaces crtdll.exp was wrong: is syslist and not syslist_dll. Corrected. 5 Mai 1999: Changed the menus, eliminating the 'Options' menu.

You might also like