HDTenEightyP/NetNews huggingface dataset:
From: ok@goanna.cs.rmit.oz.au (Richard A. O'Keefe)
Newsgroups: comp.lang.c
Subject: Re: (double)=(double)-(int)*(int) valid???
Date: 15 Oct 92 08:38:25 GMT
Organization: Comp Sci, RMIT, Melbourne, Australia

In article <1992Oct15.062145.1212@trl.oz.au>, hui@apaturia.trl.OZ.AU (Alvaro Hui) writes:
> 	double a, b;
> 	int c, d;
> 
> 	a=b-c*d;
> 
> 	Now, if c*d > 2^(sizeof(int)), the compiler will
> produce invalid result.
> 
> 	Apparently, the compiler compute c*d in a temp variable
> of size 'int' before doing a convertion to 'double'!!!!!! How
> can the compiler assume multiplying two integer will always fit
> into an int!!!!


It cannot and does not.  But you told it to go ahead anyway,
and it trusted you.

> Any comments? Now, be a good boy, I have to put in casting
> everywhere in the program....Just a pain....

You only have to put in casting if you do not understand what your
program is doing.  In that case, a far safer and simpler approach
would just be to declare most of your variables 'double' in the
first place.

The rules are not that complicated.  (I ignore sizeof.)
	An integral expression has one of four types:
		int
		unsigned int
		long
		unsigned long
	If you have an integral expression that doesn't appear to have
	any of these types (char, bitfield, &c) it will be promoted to
	int if all its values can be represented as ints, otherwise to
	unsigned int.  (Value preserving rule.)

	!X always has type int, as do X && Y, X || Y.

	-X and -X have the same type as X (after promotion).

	For other expressions with an infix operator, X <O> Y, the two
	operands will be "balanced" (converted to the same type).
	If you order the types so that
	int < unsigned int < long < unsigned long < float < double < long double
	then the "balanced" type is the greater of the two types,
	unless one is unsigned int and the other is long, in which case the
	result is long if that can preserve all the values of unsigned int,
	unsigned long otherwise.  (The general rule is that balancing
	preserves values.)

[Adapted from Plauger & Brodie.  If you haven't got that book, get it.]

So when you write
	a = b - c * d;
the operator precedence rules force the parse
	a = (b - (* c d));
c and d have the same type, int, so balancing leaves them as they were
and you get int x int -> int.  Then b has type double and c*d has type
int, which balancing converts to double, so you get
	a = DOUBLE_MINUS(b, INT_TO_DOUBLE(INT_TIMES(c, d)));

In effect this is
	a = b - (double)(c*d);
If you want the multiplication to be done in double precision too, just write
	a = b - c*(double)d;

If you stop and think about it, should "int" be 32 bits 2s complement
and "double" be 64-bit IEEE-754, then the product of 2 integers won't
"fit" into double either (some of the bits will be lost).  I can't say
I care for this, but that's computer arithmetic for you.
From: hartman@ulogic.UUCP (Richard M. Hartman)
Newsgroups: comp.lang.c
Subject: Re: How does free() work ?
Date: 15 Oct 92 20:24:24 GMT
Organization: negligable

According to some other recent posts, there exist systems where
memory is not necessarily freed upon program exit.  It is generally
safer to make sure that you eventually free() everything you malloc().

		-Richard Hartman
		hartman@ulogic.COM

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
"Who knows what evil lurks in the hearts of men?"
From: jcoxhead@acorn.co.uk (Jonathan Coxhead)
Newsgroups: comp.lang.c
Subject: Re: Strings and integer sizes
Date: 9 Oct 92 15:58:22 GMT
Organization: Acorn Computers Ltd, Cambridge, England


   In article 'Re: Strings and integer sizes' scs@adam.mit.edu (Steve
Summit) writes:

         strncpy, on the other hand, is (annoyingly) not guaranteed to
      0-terminate the destination, so a stratagem like the above might be
      necessary.

   Indeed. Sometimes it's what you want, though: if you have a structure
(defined elsewhere) that contains a fixed-length field, null-terminated if
there's room but not otherwise, you need two different operations: one to
insert the terminated strings you are using in your programme into the
structure, and one to get them out again.

   Given a structure with a string in it, somewhere in memory

      struct {... char s [LIMIT]; ...} *str;

and a string on the stack

      char s [LIMIT + 1];

to go one way, I go

      strncpy (str->s, s, LIMIT);

This doesn't copy the terminator if |strlen (s) == LIMIT|. To go the other,
I use

      sprintf (s, "%.*s", LIMIT, str->s);

This always writes a terminator to |s|, but doesn't read more than |LIMIT|
characters from |str->s|.

   /|
  (_|/
   /|
  (_/
From: jkwan@hpcuhe.cup.hp.com (John Kwan)
Date: Tue, 6 Oct 1992 20:48:54 GMT
Subject: Re: Plum-Hall test suite
Organization: Hewlett Packard, Cupertino
Newsgroups: comp.lang.c

> / hpcuhe:comp.lang.c / courtney@data.rain.com (Courtney Meissen) / 11:15 am  Sep 30, 1992 /
> I am trying to track down the whereabouts of Plum-Hall, who used
> to make a C language validation suite.  Does anyone have a phone
> number for them (southern NJ someplace).

 Plum-Hall has moved to Hawaii ! Their address is :

    Plum Hall
    2L Ouli Street #261
    PO Box 11333
    Kamuela Hi 96743

    FAX (808) 885-3569
    Ph  (808) 885-6663

    E-mail : plum@plumhall.com
Newsgroups: comp.lang.c
From: hermann@uran.informatik.uni-bonn.de (Hermann Stamm)
Subject: Preprocessor facilities
Reply-To: hermann@uran.informatik.uni-bonn.de (Hermann Stamm)
Organization: Praktische Informatik III
Date: Fri, 16 Oct 1992 07:48:13 GMT

/*
Hello!

Is the below program ANSI-C conform?
It works with SUN-ANSI-C and gcc, 
and produces correctly the output:

132
213
321

It compiles without any warning and produces the
following messages concerning the usage of printf only with:

alint     --> function returns value which is always ignored
                  printf 

gcc -Wall --> warning: implicit declaration of function `printf'


Is the use of kl1 instead ) ok in the macro kac?
How to use kl0 if its ok ?

Bye,

   Hermann.
*/

#include <stdio.h>
#include <stdlib.h>

#define CAT(a,b)  a##b
#define XCAT(a,b) CAT(a,b)

#define kl0 (
#define kl1 )
#define k(n,a,b,c) XCAT(k,n)(a,b,c)
#define kbc(a,b,c) XCAT(a,XCAT(c,b))
#define kab(a,b,c) XCAT(b,XCAT(a,c))
#define kac(a,b,c) XCAT(c,XCAT(b,a)kl1


int main(void)
  {
  printf("%d\n",k(bc,1,2,3));
  printf("%d\n",k(ab,1,2,3));
  printf("%d\n",k(ac,1,2,3));

  return(0);
  }


Newsgroups: comp.lang.c
From: Dave-Nuttall@cup.portal.com (David Dave Nuttall)
Newsgroups: comp.lang.c
Subject: Who is using a file?
Date: Sun, 11 Oct 92 08:12:43 PDT
Organization: The Portal System (TM)

Is it possible for a C program running on a System V 3.2 UNIX box
to determine if any current user is accessing a particular file,
(or device)?

Thanks.
Organization: Penn State University
Date: Fri, 9 Oct 1992 11:35:52 EDT
From: <DLA5@psuvm.psu.edu>
Newsgroups: comp.lang.c
Subject: WANTED: how to program TSR's

I currently have a screen saver program that I created and I would like to know
 how to make a TSR.  Any help would be greatly appreciated.  I am posting this
through a friend who normally does not monitor this bulliten board.  Please pos
t responses to his E-Mail address.  Thanks again.
From: heilig@plains.NoDak.edu (Zachary Heilig)
Newsgroups: comp.lang.c
Subject: Re: TC++ 1.0 spawn() question.
Date: 13 Oct 92 18:03:28 GMT
Article-I.D.: ns1.Bw2nHs.G4w
Organization: University of North Dakota, Grand Forks

In article <1992Oct12.213809.6351@jwminhh.hanse.de> wieck@jwminhh.hanse.de (Jan Wieck) writes:
>From article <nhu1H8ug2a@atlantis.psu.edu>, by newton@wilbur.psu.edu (Cynthia Newton):
>> 
>> [...]
>> 
>> spawnvp(P_WAIT,"test.exe",NULL); <-works if the location is in PATH
>> spawnvp(P_WAIT,"C:\TEST\TEST.EXE",NULL) <-does not work, perror says
>		    ^^
>		    ||
>
>This is a single 'T'. You just quoted it. Better write
>... "C:\\TEST\\TEST.EXE" ... to get what you want.
>
>

or a simpler more portable way would be to use:
spawnvp( P_WAIT, "C:/TEST/TEST.EXE", NULL );
                    ^----^--not typos :-)
since the \ is COMMAND.COM's idea, DOS itself doesn't care which you use.

-- 
    - Zach Heilig (heilig@plains.nodak.edu)

Ninety-Ninety Rule of Project Schedules:
	The first ninety percent of the task takes ninety percent of
	the time, and the last ten percent takes the other ninety
	percent.
From: reid@ss6.cps.msu.edu (Dr Richard J. Reid)
Newsgroups: comp.lang.c
Subject: C Usage in CS1?
Date: 8 Oct 92 13:47:11 GMT
Organization: Department of Computer Science, Michigan State University
Originator: reid@ss6.cps.msu.edu

Andrews University, Berrien Springs, MI
Boston University
Carnegie Mellon University (All-Majors Pascal-Course Prereq.)
Cayuga Community College (Auburn NY)
Duke University
Emory University
Holden College, Norway
Korea Advanced Institute of Science and Technology
Lebanon College, Lebanon NH 
Marquette University
Moscow University, USSR (30/400 in C experiment, else Pascal)
Northern Arizona University (High-School Pascal Required)
Princeton
San Diego State
Seattle Pacific University (1/2 Pascal, then 1/2 C)
University of Bath, England
University of Michigan (1/4 Pascal, then C)
University of North Florida
U.S. Naval Academy
Virginia Tech
Widener University, Chester, PA
From: lkt3_wha@pkinbg.UUCP (Werner Hack)
Newsgroups: comp.lang.c
Subject: More than one flex scanner in a program
Date: 9 Oct 92 09:58:13 GMT

bison offers a -p option to prefix all external symbols in a parser.
flex doesn't seem to have this possibilty.

How can more than one flex scanner coexist in a program ?

Werner

 ------------------------------------------------------------------------------
|  Werner Hack                        |   voice: +49 911 526 3157              |
|  Philips Kommunikations Industrie   |   fax:   +49 911 526 3983              |
|  IC Design Center, Dept. WTI3       |   email: lkt3_wha@pki-nbg.philips.de   |
|  Nuernberg, Germany                 |   seri:  lkt3_wha:pkinus1              |
 ------------------------------------------------------------------------------
From: mollers.pad@sni.de (Josef Moellers)
Newsgroups: comp.lang.c
Subject: Re: multidimensional arrays as parameters
Date: 16 Oct 92 12:25:16 GMT
Organization: Siemens Nixdorf Info.Sys. AG, Paderborn, Germany

In <hjv.719079093@groucho.phil.ruu.nl> hjv@phil.ruu.nl (Hendrik Jan Veenstra) writes:

>bill@chaos.phys.ualberta.ca (Bill Burris) writes:

>>I was wondering how to pass a multidimensional array as a parameter.

>>Now for a 2D array if I do the following:

>>void fun2d( int * );

>>int array2d[10][20];

>>main()
>>{
>>    fun2d( array2d );
>>}

>>void fun2d( int *data2d )
>>{
>>    ...
>>}

>>I get a warring from the compiler for the parameter in the call
>>fun2d( array2d );

>'array2d' is not a pointer to int but a pointer to pointer to int, since
>a 2d-array is an array of *arrays* and not of *ints*.
>So the prototype for fun2d() should be
>void fun2d( int **data2d );
>Now e.g. data2d[2] will be pointing to the third array of 20 ints, and of
>course data2d[2][3] will be the fourth int in the third array of ints.

And how is poor little compiler goin' to know that the array is (10 deep
and) 20 wide?

The address of data2d[i][j] is
	data2d + ((i * 20) + j) * sizeof(int)

So, in order to evaluate "data2d[2][3]" the compiler needs at least the
last size. The proper declaration should be at least (see below for "at
least"):

void fun2d(int data2d[][10])

The compiler doesn't need to know how many rows there are, only how many
columns.
Therefore, if You had a five-dimensional array
int	a[10][20][30][40][50];

An appropriate declaration of a function processing this could be

void fun5d(int data5d[][20][30][40][50])

Of course, You _can_ specify the very first dimension, but You don't
_have_ to! Specifying it would allow for range checking, if implemented.

-- 
| Josef Moellers		| c/o Siemens Nixdorf Informationssysteme AG  |
|  USA: mollers.pad@sni-usa.com	| Abt. STO-XS 113	   | Riemekestrasse   |
| !USA: mollers.pad@sni.de	| Phone: (+49) 5251 835124 | D-4790 Paderborn |
From: masoodj@rigel.cs.pdx.edu (Javed Masood)
Newsgroups: comp.lang.c
Subject: function fgets
Date: 15 Oct 92 06:35:42 GMT
Distribution: usa


Newsgroups: comp.lang.c
From: frank@Cookie.secapl.com (Frank Adams)
Subject: Re: Strings and integer sizes
Date: Tue, 13 Oct 1992 20:33:57 GMT
Organization: Security APL, Inc.

In article <416@ulogic.UUCP> hartman@ulogic.UUCP (Richard M. Hartman) writes:
>If you truly intend an array of char instead of a string
>you should (as a matter of good programming practice) provide
>the appropriate initializer "= { 'a', 'b', 'c'};" to make the
>intended usage clear.

There is more meaning for "string" which nobody seems to have mentioned, but
it is really the most important one: a string is the data structure used to
store readable text.  By default, C uses nul-terminated character arrays as
the implementation for strings, but not all C programs use this convention.

And when you are writing readable text which does not use nul-termination,
putting each character in as a separate initializer is really ugly.

>However, the ANSI committee in their wisdom has allowed this
>misleading syntax of initializing a char array w/ a string
>constant.

I think they got it right.
Newsgroups: comp.lang.c,comp.os.msdos.programmer,comp.programming
From: pdh@netcom.com (Phil Howard )
Subject: Re: FAQ: Book for learning C.
Organization: Netcom - Online Communication Services  (408 241-9760 guest) 
Date: Fri, 9 Oct 1992 06:25:31 GMT

prangba@halcyon.com (Bruce Prang) writes:

>I have a friend that is in the proceses of learning C. He is using an
>MS-DOS box to learn but he will be doing some of the programming on a
>Unix (AT&T SysV) box. He asked me for a recomandation but I didn't use a
>book in learning so I couldn't help him. How bout any of you fine folks?
>
>The book would ideally teach ANSI C with notes of perhaps how some of
>the MS-DOS compilers (MS, Borland, Zortech) differ. He's not looking for
>reference book, he has one of those. More of a real life kinda thing.

IMHO, a good reference book for a particular language, and a good
programming book in any language, do not leave any gaps.  It would
of course be most convenient if the programming text also used as the
example language, the one you are learning.  But if you have not done
so yet, it is important to learn the programming fundamentals, too.

The book that would be the best depends on the person.
-- 
/***********************************************************************\
| Phil Howard  ---  KA9WGN  ---  pdh@netcom.com   |   "The problem with |
| depending on government is that you cannot depend on it" - Tony Brown |
\***********************************************************************/
Newsgroups: comp.lang.c
From: jes@grendel.demon.co.uk (Jim Segrave)
ReplyTo: jes@grendel.demon.co.uk
Subject: Re: No typedef
Distribution: world
X-Mailer: cppnews $Revision: 1.18 $
Organization: None
Date: Tue, 13 Oct 1992 20:33:36 +0000


In article <1992Oct11.192657.7275@waggen.twuug.com> alpha@waggen.twuug.com (Joe Wright) writes:

> 
> #define nutyp struct nutyp
> 	nutyp {
> 		int ID;
> 		char Name[32];
> 	};
> 
> 	nutyp Person, *PersPtr;
> 
> Is this 'as good as' a real typedef?  It seems to work here.
> -- 
> Joe Wright  alpha@waggen.twuug.com  

For this it works. But beware of using #defines to replace typedefs of
pointers:
#define c_ptr char *
c_ptr   thing, blob;       /* thing is a char *, blob is a char! */
This doesn't happen with typedefs.
See A Koenig's excellent 'C traps and Pitfalls' - chapter 6 is full of
lovely little gotcha's with #defines

--
Jim Segrave (Segrave Software Services)     jes@grendel.demon.co.uk

Newsgroups: comp.lang.c,comp.lang.fortran,comp.lang.pascal,sci.math.num-analysi
From: dnl@convex.is.macsch.com (David Lombard)
Subject: Re: Numerical Analysis on a PC-languages?
Organization: MacNeal-Schwendler Corp.
Date: Wed, 14 Oct 92 23:41:23 GMT


Most numerical work is done with Fortran.  (I can here the howls now).
Most high performance numerical work is still done with Fortran.

Some of the reasons over C are:
	Passing arrays,
		Many dimensions, striding, etc.
	Implicit promotion to double when passed 
		No longer a problem with ANSI C.
	Optimizations with pointers.  VERY FEW COMPILERS DO
		A TRULY GOOD JOB WITH THESE.  My own personal fave
		compiler writers are Cray.  IMHO - they are without
		peer in optimizing both Fortran and C.
	Huge amounts of published Fortran codes, e.g. CACM.
		Admittedly for historical reasons.

I'd be willing to do certain (read context dependent) numerical work in C.

YOU WOULD HAVE TO BE INCREDIBLY MASOCHISTIC TO DO ANY MANNER OF NUMERICAL
WORK IN PASCAL.

I repeat:

YOU WOULD HAVE TO BE INCREDIBLY MASOCHISTIC TO DO ANY MANNER OF NUMERICAL
WORK IN PASCAL.

On a PC, I'd probably want to know how good the compiler was in optimization
and let that guide me.  For PC Fortran, I've hear that RM Fortran is good.

Regards,
DNL
******************************************************************************
*               MY COMMENTS == MY OPINIONS != ANYBODY ELSES                  *
******************************************************************************
* David N. Lombard                               The MacNeal-Schwendler Corp *
* dnl@macsch.com                                 815 Colorado Blvd           *
* (213) 259-4911 FAX: (213) 259-3838             Los Angeles, CA  90041      *
******************************************************************************
From: hartman@ulogic.UUCP (Richard M. Hartman)
Newsgroups: comp.lang.c
Subject: Re: static/external <=> storage/linkage
Date: 15 Oct 92 00:13:07 GMT
Organization: negligable

In article <Bw1orz.Hyp@news.orst.edu> choup@bionette.cgrb.orst.edu (Ping Chou) writes:
>extern int gloabl_1;  /* external storage, external linkage */
>       int global_2;  /* static storage, external linkage */
>static int global_3;  /* static storage, static linkage */
>
>        Please let me know if I'm wrong again.
>

Assumming these declarations are taking place OUTSIDE of all
functions in a single .C file:

	extern int global_1;

let's "global_1" be used by any routine in the module, but
the memory is allocated by some other module (external linkage)

	int global_2;

we allocate storage for global_2, we also allow other modules
to get at the value of this variable (if they declare it "extern").

	static int global_3;

we allocate storage for global_3, all routines in this module
may access it.  other modules can NOT get at the value of this
variable.


If they are declared within a routine, the meanings for 1 & 3
are similar, w/ scope (visibility) of the name limited to the
routine.  #2 would no longer be global, with the memory being
allocated on the stack each time the routine is entered
and released each time the routine is exited.


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Work away today, think about tomorrow.		|
Never comes the day, for my love and me.	|	-Richard Hartman	
I feel her gently sighing			|	hartman@uLogic.COM
as the evening slips away....			|
From: jos@and.nl (Jos Horsmeier)
Newsgroups: comp.lang.c
Subject: Re: Volatile variables and optimization
Date: 16 Oct 92 12:11:35 GMT
Organization: AND Software BV Rotterdam

In article <chupchup.719226966@piggy> chupchup@ferkel.ucsb.edu (Robert Earl) writes:
|votava@fndaud.fnal.gov (Margaret Votava) writes:
|
|| 	I've got a simple question about the correct behavior of the ANSI
|| C compiler regarding volatile variables. I have a memory location that I 
|| simply want to read. I don't want to do anything with the result; it is
|| just a hardware location that needs to be touched.
|
|| 	The following piece of code will access the location when compiled
|| without optimization, but is optimized out when optimization is turned on in 
|| the compilation command.
|
|| 	I thought the point of volatile was to *always* fetch the value
|| from memory.
|
|| int junk()
|| {
|| 	volatile unsigned short *mem_addr;
|
|Your problem is that the pointer object itself is volatile, rather
|than what you wanted, which is the object to which "mem_addr" points.
|Try this instead:
|
|unsigned short *volatile mem_addr;

No, it's exactly the other way around:

volatile unsigned short *mem_addr; is a pointer to a volatile
unsigned short object, while:

unsigned short *volatile mem_addr; is a volatile pointer to
an unsigned short object.

I agree that it is confusing ...

kind regards,

Jos aka jos@and.nl
Newsgroups: comp.lang.c
From: darcy@druid.uucp (D'Arcy J.M. Cain)
Subject: Re: lint
Date: Wed, 7 Oct 1992 11:40:55 GMT
Organization: D'Arcy Cain Consulting

xu@prim.rose.utoronto.ca (Jiefeng Xu) writes:
>I am new to lint. I don't understand why lint always print out great amount of 
>error or warning messages to some programs which have succeeded in compiler
>(gcc) and executed correctly. The message like "syntax error at or near type 
>word "void" " is really confusing. Can anybody show me how to use lint   
>correctly?
>Thanks.

You don't say what OS version you are using but it sounds like you are using
ANSI constructs in your code that gcc understands but your K&R1 lint doesn't.
If this is the case you can do your checking in the compile step by turning
on various warning flags.  Even though I have an ANSI lint I never bother
with it.  Instead I have the following line in my Makefiles:

CFILES = -O2 -pipe -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \
        -Wwrite-strings -Dscanf=DONT_USE_SCANF -Dgets=DONT_USE_GETS

This seems to catch everything that lint does that I care about without
giving me those stupid "return value of printf not used" errors.

-- 
D'Arcy J.M. Cain (darcy@druid.com)  |
D'Arcy Cain Consulting              |   There's no government
Toronto, Ontario, Canada            |   like no government!
+1 416 424 2871          DoD#0082   |
Newsgroups: comp.lang.c
From: ebergman@nyx.cs.du.edu (Eric Bergman-Terrell)
Subject: Re: call graph generator
X-Disclaimer: Nyx is a public access Unix system run by the University
	of Denver for the Denver community.  The University has neither
	control over nor responsibility for the opinions of users.
Keywords: graph tool
Organization: Nyx, Public Access Unix at U. of Denver Math/CS dept.
Date: Tue, 13 Oct 92 06:52:09 GMT

In article <12OCT199222565635@rosie.uh.edu> st1n2@rosie.uh.edu (McCoy, Mark) writes:
>I am faced with the following assignment as part of a team project
>for a software engineering class:
>
>-----------------------------------------------------------------------
>The source code of a large software system is usually organized as a set
>of files stored in a single directory.  Each file contains one or more
>seperately compilable program units.  The way these units call one
>another during execution provides an important clue about the working of
>the software system.  Conceptually, this information can be represented
>by a directed graph in which each node represents a subprogram, and 
>each edge represents a possible function or procedure call.  Such a graph
>is called a call graph.
>
>In this project, the task is to produce a call-graph-generator that
>accepts a directory name as input and constructs the call graph of the
>software system contained in that directory.  It is assumed that all
>programs (including the generator and its inputs) are written in C
>under UNIX. 
>-----------------------------------------------------------------------
>
>I know that the above mentioned call grapher is a fairly common development
>tool (I have seen plenty in advertisements but never in person).
>Since this project is fairly open ended as far as required features, a good
>starting point would be to see whats already been done and work from there.
>So..Is there anything anywhere that fits the above description.  preferably
>PD.
>I am also in the process of hunting down an algorithm to solve the problem of
>node placement on the graph.  Any help on either front would be much
>appreciated.
>Thanks in advance
>
>Mark McCoy (st1n2@jetson.uh.edu)

See The C User's Journal, October 1991, pp. 33 - 39 for an article that I
wrote which includes a complete call tree generator for Borland and Microsoft
C.  The program could be easily adapted to other environments.

Terrell