1New in 2.8
2==========
3
4- ncc now will automatically strip nccout files (this will work if
5  Python is installed).  Except from less space, in the previous
6  versions under certain circumstances the nccout files could grow
7  exponentially.
8
9- fixed a segfault in link mode without any .c or .o files provided
10  (just an .s file for example)
11
12- The temporary filename that is used to view functions with "vi"
13  (or your favorite highlighting editor), is now different depending
14  on the current function.  So, 'vi' can store the current position
15  of the cursor for every function and that is more functional.
16
17- Robustified parsing of aggregate array initializers that caused
18  many problems with linux 2.6.27. Some assignments to pointers to
19  functions may be missed though.  (help from Luiz Fernando Capitulino)
20
21- work around __builtin_types_compatible_p() that has a syntax with
22  type arguments confusing the parser.  Same for __builtin_offsetof()
23
24- ncc now understands __inline__, __inline and __FUNCTION__ so no need
25  to fix them in nognu.
26
27New in 2.7
28==========
29
30- In the case where in a Makefile we had a target like:
31	gcc foo.c bar.c zoo.c -o program
32  using ncc instead of gcc would fail. Now this case is
33  handled correctly.  If -ncgcc is specified gcc will be
34  executed as above.  ncc instead will analyse each file
35  and then link the generated .nccout files to program.nccout.
36  (qemu)
37
38- Fixed leaving ncurses mode -> xterm -> re-enter ncurses in
39  nccnav.  Patch by Sylvain Beucler.
40
41- New command line option -nccpp=<preprocessor>, useful for
42  using ncc in cross compilation, from Jose Vasconcellos
43
44New in 2.6
45==========
46
47- '-m*' flags are passed to the preprocessor.  For example if
48  '-mmmx' is not used in preprocessing, the macro __MMX__ is not
49  declared and importing <mmintrin.h> will fail.  (X11R71)
50
51- If nccnav is executed from the root of the source tree, it will
52  show relative file paths (good).
53
54- Updated instructions for kernel hacking.  Some object files were
55  missed.
56
57- Fixed segfault with __gu_val.
58
59- Speed up linking nccout object files.
60
61- nccnav crashed if it couldn't open the temporary file.
62
63New in 2.5
64==========
65
66- The nccnav viewer can show functions and files with "vi", thus
67  with syntax coloring.  This will happen if you press 'v' on a
68  function.
69
70- The nccnav viewer can start from the list of global variables
71  (by pressing 'g' in the initial screen).
72
73- nccar will understand the "r" option and replace members in
74  the archive instead of just appending the data.  That's the
75  right thing because with the old version, linking archives
76  into bigger archives would result in geometric explosion of
77  the size of the files.
78
79- Better type propagation in conditional expressions.
80	(x ? (void*)0 : (struct A*)a)->x;
81  now works (gcc/LIM_DATA)
82
83- support for anonymous structures and unions (GNUC):
84	struct X {
85		union {
86			int a, b, c;
87		}
88	};
89	void f (struct X *x)
90	{
91		x->a = 1;
92	}
93  (linux 2.17)
94
95- Fixes to hack linux 2.17:
96  - The "__typeof__ (function)" can be used to declare another function
97  - forward enum declarations
98  - char X[] = ("hello");	// was error
99
100- The expression in a Variable Length Array is not constant (and in fact
101  it can call functions).
102	int X [y = foo()];	// was error
103
104- Debian package and Doc fixes by Anuradha Weeraman.
105
106New in 2.4
107==========
108
109- Bugfix (segfault with gcc 4.x) from Florian Larysch.
110
111- More configury for 'alloca()' in dbstree.
112
113- new command line option '-ncnoerr'. When there are errors in
114  expressions, ncc will not terminate the compilations. Instead
115  it will link all functions that had errors with the special
116  pseudo-function "NCC:syntax_error()".
117
118New in 2.3
119==========
120
121- Bugfix (segfault with gcc 4.0) from Deepak Ravi.
122
123- a typedef name used as a label would cause a syntax error (JamVM)
124
125- Applying '*' on a function has no effect.  (pygame)
126	void (*F)();
127	(**F)();	// used to be error
128
129- Support for '_Complex' as a declaration specifier.
130
131New in 2.2
132==========
133
134- Included a LICENSE text in doc so ncc can be part of Debian.
135
136- Bugfix/crash in nccnav.  Pressing the up-arrow in functions
137  mode caused a segmentation violation because isalpha(KEY_UP)
138  is true.
139
140- if the last statement of a compound statement in expression
141  was an __asm__ and that was the first expression of the program
142  we had a segfault. Thanks to Thomas Petazzoni.
143
144- Header file fixes for MacOS. (Adam Shostack)
145
146- __inline__ is accepted as 'inline'.  gcc-3.4.4 broke things
147  again.
148
149- more pointer-to-function cases caught:
150	fptr = flag ? p->tp_call : 0;
151  now detects that calling fptr() may call p->tp_call()
152  (python)
153
154New in 2.1
155==========
156
157- ncc reports access of arrays. For example, in the code
158	int *X;
159	int foo ()
160	{	X [12] = 1;	}
161  it will be reported that foo modifies 'X[]' and uses 'X'.
162
163- fix for cygwin. In cygwin read() converts \r\n to \n and for that
164  the bytes read are fewer than the size of the file as reported by
165  stat() and ncc thought there was an error. Thanks to Hakon Lovdal.
166
167- comlicated segfault in cygwin due to a small bug. (eu).
168
169- even better support for reporting use of members of structures.
170  For example, in:
171	struct X { int i, j };
172	int foo () {
173		struct X x = { 1, };
174	}
175	int bar () {
176		struct X x = { .y = 1 };
177	}
178	int zoo () {
179		(struct X) { .x = 1, .y = 2 };
180	}
181  it will be reported that foo modifies member 'x' and that bar
182  modifies member 'y' and that zoo modifies both.
183
184
185New in 2.0
186==========
187
188- linker emulation mode with the command line switch "-ncld".
189  In this mode ncc generates "nccout object files" as gcc generates
190  object files and then attempts to link them into bigger nccout
191  files just as gcc links object files.
192
193- binutils wrapper mode.  ncc can be called as 'nccar', 'nccld',
194  'nccg++' and 'nccc++'.  It will normally call the corresponding
195   program and then attempt to collect and link "nccout object files".
196
197- gengraph.py: a script that can produce dot data from ncc output.
198  Sent by Jose Vasconcellos
199
200- Many small fixes for linux-kernel 2.6.9.  ncc is now more relaxed
201  about some cases in which it reported errors.  We can assume that
202  ncc is used to analyse correct programs and worry not about semantic
203  checks.
204  The file hacking.LINUX-KERNEL has been updated with instructions
205  to make ncc working again.
206
207- Assigning non functions to pointers to functions would cause an error:
208	int (*F)();
209	int x;
210	F = x;			// error
211	F = (int(*)())x;	// error too
212  (readline)
213
214- Casts would prevent reporting pointer to function variables passed
215  as arguments to other functions. For example:
216	int (*FN)();
217	foo (FN);		// reported ok
218	foo ((int(*)())FN);	// missed
219  (elinks)
220
221- Local pointer to function variables are named after their function.
222  For example, in:
223	int foo() { int (*fn)()=f1; fn(); }
224	int bar() { int (*fn)()=f2; fn(); }
225  the 'fn' variables are reported as 'foo/fn()' and 'bar/fn()'. In the
226  previous version they were both reported as '*fn()' and one couldn't
227  tell that in reallity foo() calls f1() and bar() calls f2().
228
229New in 1.9
230==========
231
232- the statement following switch() need not be compound (lwc).
233
234- nccnav will also display any comments preceeding functions when asked to
235  display the text of a function (struct too). They are supposed to be
236  essential in understanding what happens...
237
238- /usr/include/nognu macros handle the C99 keyword '_Bool'.
239  /use/include/nognu macros handle '__asm' to be treated syntactically like
240   '__asm__'. Same for __volatile as found in <mathinlines.h>. The crapness never ends.
241  ---Don't forget to Copy the new doc/nognu over the old one---
242
243- Bugfix:
244	typedef int x;
245	int f ()
246	{
247		int x;
248		x = 1;
249	}
250  didn't work as the line starting with 'x' was considered a declaration.
251  In other words, the Bugfix from version 1.7 broke more things than it
252  fixed! (discovered in python source).
253
254- Bugfix:
255	typedef int (*func)();
256	int f () {}
257	int main ()
258	{
259		func x, y;
260		x = f;		// reported ok!
261		y = (func) f;	// not reported. BUG
262	}
263  A cast would prevent ncc from reporting pointer to function assignments
264  as pseudo calls. (python source)
265
266New in 1.8
267==========
268
269- It is very useful to report whether a function *just reads*
270  or *modifies* a variable. ncc now reports such information
271  when it is certain that a variable *is* modified by a function.
272  Read 'README.1.8.rw' for info.
273
274- ncc can now handle the case:
275	(x ? F1 : F2) (args)
276  it used to report that just a "virtual call" is there.
277  Now such constructs are converted to:
278        x ? F1 (args) : F2 (args)
279  reported data is much better for hacking and less confusing
280
281
282New in 1.7
283==========
284
285- From Ben Lau <benlau@linux.org.hk> :
286
287   - A fix for gcc syntax where __asm__() can be specified in
288     a declaration before initialization. Fix for M68K kernel from uClinux
289
290   - Made ncc work with 2.6 kernel! There was a problem with declaration
291     initializers and was triggered in fs/afs/super.c  (thanks!)
292
293   - More stuff with gcc-3.2 and preprocessing. Now we pass -O* options
294     to the preprocessor because it enables the definition of the
295     __OPTIMIZE__ macro, without which kernel can't be compiled.
296
297- nccnav can regenerate its input file without including dupes
298  (functions of header files reported multiple times).
299
300- More features with pointer to functions passed as arguments to
301  other functions.
302
303- Bugfix:
304	typedef int x;
305	struct foo {
306		x x;
307		x y;	// error!
308	};
309  Now fixed (linux kernel, fs/ntfs/inode.h)
310
311- In the case ncc is compiled with gcc, we define 'alloca' to be
312  '__builtin_alloca' and avoid lots of portability issues on non GNU
313  systems.
314
315New in 1.6
316==========
317
318- While "structure->member ()" was detected, "(*structure->member) ()"
319  was not. Now it is. (tkDvi)
320
321- A SIGPIPE would terminate nccnav if requested to view a very big
322  file which didn't fit in the buffer of "less" and the user pressed 'q'.
323
324- New way to view the call graph with pop-ups in nccnav. History mode
325  revised with '<' and '>'.
326
327- Analysis of function addresses passed as arguments to other functions.
328  For example, ncc can now report that qsort() calls whichever comp() function
329  is passed to it. See the file doc/farg.c for more.
330
331New in 1.5
332==========
333
334- The locations of structure declarations are emitted in the
335  output of ncc and nccnav can extract and display them
336  (extremely useful).
337
338- ncc now works on systems that don't have mmap.
339
340- Adapted to work with the kernel sources without having to
341  edit the weirdness found in ide-cd.h (__u8 short) and
342  parport_pc.c (multiple defininitions of function)
343
344- nccnav will indent the source if called with a name
345  other than "nccnav", like "nccnavi".
346
347- Created man page so ncc can be included in distributions.
348
349New in 1.4
350==========
351
352- nccnav now provides "The Recursion Detector".
353
354- ncc does no longer complain if something is declared as
355  just void. It seems this is perfectly valid (valgrind source)
356
357New in 1.3
358==========
359
360- This release includes some changes in the viewer nccnav:
361  It's possible to view the text of functions and entire files
362  with an external viewer.
363  This by default is "indent -kr -st | less".
364
365- Internal changes where the dbstrees were changed to templates
366  instead of polymorphic classes.
367
368New in 1.2
369==========
370
371- Bugfix. Negative floating point values in initializers would
372  cause a segmentation violation.
373
374- The preprocessed source may also include #pragma directives.
375  This should've caused some problems, sometimes.
376
377- In GNUC extensions, goto may be followed by an expression (tcctest).
378
379- `__alignof__' is now simply replaced by `sizeof'.
380
381- `__typeof__(type)' now supported
382
383- nccnav fixes: very long lines would appear on the next line (because
384  ncurses counts tab as one character). Also the request to display the
385  text of the last function of a file which does not end in a newline
386  would cause a segmentation violation.
387
388New in 1.1
389==========
390
391- Major Feature: ncc now does full analysis on the pointers to functions
392  and the values assignmed to them; The result is incredibly amazing when
393  working with projects like the linux kernel where there are lots of
394  callbacks in structure members.
395  See the file doc/fptr.c which demonstrates the new features.
396  Also now aggregate initalizers are parsed to catch function calls
397  and values assigned to pointer-to-function members.
398  Several internal changes/cleanups to implement the above features.
399
400- Patch to work correctly when in -I,-D the argument is in the next argv[]
401  (Awesome Walrus)
402
403- Anonymous structures are named by typedef or by first declared object.
404
405- Wide character and string constants L'x' (bash2 source)
406
407New in 1.0
408==========
409
410- Bugfix.  The conditional with omitted operand caused segfault in the usage
411  report mode.
412
413- ISOC99 additions. Declarations can appear anywhere in a block (as in C++)
414  Hexadecimal floating point constants supported (problems with HUGE_VAL,
415  which is 0x1.0p2048 in glibc)
416
417- Declaration specifiers may be after storage class specifiers.
418  For example, "uint32 static X;" is now acceptable (quicktime source).
419
420- If "-nc00" is used together with "-nckey", string constants are included.
421  The option to leave out line numbers is removed.
422
423- Function prototypes are not checked anymore. There is a rare problem
424  (discovered in quake source) and since ncc is typically a source code
425  analyser, checking function prototypes is useless.
426
427New in 0.9
428==========
429
430- New output format and new viewer. Old formats REMOVED (check your options)
431
432- Reporting absolute pathnames of source files with "-ncfabs"
433
434- Many new things in /usr/include/nognu. __FUNCTION__ now defined as the
435  string literal "__FUNCTION__" because many people use the invalid syntax:
436  printf ("This is " __ FUNCTION__ "\n");
437
438- Fixed critical bug discovered with gcc 3.2. Reallocation in expression
439  parser was broken.
440
441- GNUC variable size arrays pseudo-supported (no error).
442
443- labeled-statement=  identifier:statement
444  and now "if(x)Label:foo();" is working properly (zsh source).
445
446- Misc fixes. Lots of testing (an entire CD of sources).
447
448New in 0.8
449==========
450
451- All fixes in this version were contributed/inspired by Scott McKellar.
452  Include:
453	- Removed comment parsing which was unused.
454	- Made file reporting "right" (off by one)
455	- Made line reporting "right" as well (off by one)
456	- inttree possible signedness bug fixed.
457	- Cleanups at introduce_{anon|named}_struct ()
458	- Redundant. Lookup() was called twice in a row for members.
459	- Misc corrections, optimizations and cleanups everywhere.
460
461New in 0.7
462==========
463
464- Line number information finally included and can be optionally left out
465  with "-ncl0".  Only used when reporting syntax errors for now.
466
467- Except from, -D, -I options, "-ixxx file" options should also be passed
468  to the preprocessor.
469
470- The source file was not unmapped after the lexical analysis, while it
471  should. Also as found by Scott McKellar string literals were allocated
472  twice. Now expect 50% less memory usage.
473
474- Implemented in-file user output with keys (see doc/KEYS)
475
476- Many "do it right" fixes from Scott McKellar.
477
478- Added -ncspp option to keep sourcefile.i preprocessed C files.
479  Extremely useful for debugging failures.
480
481- In the case of :
482	typedef struct { int x, y; } zoo;
483  if reporting use of members, the anonymous structure
484  is automatically named `struct zoo'.
485
486
487New in 0.6
488==========
489
490- In usage report mode, constant expressions (in array sizes and bitfield
491  sizes), were not calculated if they were not as simple as just a number.
492  So in:
493	extern int foo [32/2];
494	int foo [16];
495  It failed because of redefining foo as an array of different size.
496  This now fixed (thanks to Doom source code)
497
498- Type of the result of the last subexpression of a compound statement in
499  expression (GNUC), implemented.
500
501- More information about calling functions through pointers to functions.
502  If the pointer to function is a simple symbol variable, it is converted
503  to a pseudo-function, calling all the functions assigned to it.
504  Otherwise there is a report that a handler is called.
505
506- An __asm__ statement in global used to confuse ncc which reported (ABSENT
507  symbol). Now __asm__ statements in global are ignored (linux kernel source).
508
509- A function definition may also be a single __asm__ statement (not
510  compound). Parsed w/o error and ignored. (linux kernel)
511