HDTenEightyP/NetNews huggingface dataset:
From: dkeisen@leland.Stanford.EDU (Dave Eisen)
Subject: Re: Help.  (Unix C)
Organization: Sequoia Peripherals, Inc.
Date: Thu, 5 Nov 92 15:43:01 GMT

In article <Bx8Cw8.5tB@portal.hq.videocart.com> dfuller@portal.hq.videocart.com (Dave Fuller) writes:

[ Stuff about calling qsort with a comparison function whose arguments
  are of type FOO *, not void * ]

>And if the code were not portable, it compiles and works on a non-ansi
>compiler (and all of the ANSI ones i tried), so please take back the
>part where you say the code is not correct. it is.

The code is not correct. qsort calls the function expecting 
to pass two (void *) (actually two const void *) parameters, 
therefore your comparison function must take parameters of 
that type. 

The only way a (void *) is special is that you can assign a 
(FOO *) to a (void *) and back without any problems; this says 
nothing about whether you can pass (void *) actuals to a function 
which takes parameters of type (FOO *). And in fact you can't do 
this: both Classic C and ANSI C require all function calls to be 
made with actual parameters and formal parameters of the same types. 
Any deviation from this gives undefined behavior. Yet this is exactly
what happens when you use a comparison function in qsort that takes
arguments of type (FOO *).

As you remarked, a lot of code uses strcmp as a comparison function.
All I can say is that there is a lot of bad code out there (or a lot
of code written to work in only an environment where this is in fact
guaranteed to work). Although this might be an exception: the ANSI C 
standard requires that (void *) and (char *) have the same representation 
so one might be able to weasel out with a function that takes parameters
of type (char *). I'll leave that to the language lawyers out here to 
tell us. 

This case (strcmp used as a comparison function) still has nothing to 
do with your example where you tried to use a (struct foo *) instead 
of a (void *). This example is just plain wrong.



-- 
Dave Eisen                               Sequoia Peripherals: (415) 967-5644
dkeisen@leland.Stanford.EDU              Home:                (415) 321-5154
       There's something in my library to offend everybody. 
          --- Washington Coalition Against Censorship
Newsgroups: comp.lang.c
From: garmstro@ringer.cs.utsa.edu (Glenn Stewart Armstrong)
Subject: Re: Fortran to C conversion: Why bother?
Organization: University of Texas at San Antonio
Date: Wed, 11 Nov 1992 18:33:12 GMT

I'm looking for an FTP  C version of spice or floating point intensive
benchmark written in C.  Any help is appreciated.

					glenn 
Newsgroups: comp.lang.c
From: dfuller@portal.hq.videocart.com (Dave Fuller)
Subject: Re: Memory functions  -  memcpy & memmove
Organization: VideOcart Inc.
X-Newsreader: Tin 1.1 PL3
Date: Fri, 6 Nov 1992 19:45:45 GMT

gregb@murphy.com (Greg Banschbach (Unigroup of New York)) writes:
: 
: 	Dear fellow programmers,
: 	
: 		I am in the process of porting a program from MS-DOS to
: 	UNIX.   The program is a database program.   It calls "memmove"
: 	which is not available under  Unix Sys5 rel 2.   I substituted
: 	memcpy,  in order to get it to compile.   Now I discovered that
: 	what appears to be happening is that I am getting DUPLICATE 
: 	records in the INDEX file - probably when the b-tree is moving
: 	nodes around.  
: 	

  Greg,
 memcpy does not account for overlapping regions, it just does a simple
move of x bytes from pointer 1 to pointer 2, if they overlap, too bad.
memmove handles that, but so can you.

write your own memmove (different name of course).

lets say you call it  moveit(char * dest, char *source, int size)

then the code will look like this

{
  char *temp;

  temp = (char *) malloc(size);

  memcpy(temp, source, size);
  memcpy(dest, temp, size);

  free (temp);
}

If you don't like using malloc, there is another way.

Test the value of the pointers to see which is greater.

If SOURCE is greater then you can copy from the beginning of source
to the beginning of dest 1 char at a time with no problem.

for(;size > 0; size --)
  *dest++ = *source++;

If DEST is greater you need to copy from source to dest 1 char at 
a time starting at the ends of the areas.

for(size --; size >= 0; size --)
  dest[size] = source[size];


This should do it !!

Dave Fuller
dfuller@portal.hq.videocart.com

    
Newsgroups: comp.lang.c
From: pal@regent.e-technik.tu-muenchen.dbp.de (Peter Loibl)
Subject: Re: Please help me with my #include mess-up.
Organization: Technical University of Munich, Germany
Date: Thu, 12 Nov 1992 13:21:52 GMT

ae007@yfn.ysu.edu (Daniel Newcombe) writes:

>Well here is my problem:  I have these modules:
>  MOSTYPES.H - defines several types I am using in this
>    project, such as boolean, and a few structs and typedefs
>QUEUE.H - the header file for my queue class which has a few
>   inline things in it.
>   This has to include mostypes.h because it needs boolean.
>QUEUE.CPP - the rest of the code for the queues.  It includes
>  queue.h
>MAINMOD.CPP - my main module.  It includes QUEUE.H and MOSTYPES.H.
>When I compile I get a whole mess of errors saying that all sorts
>of things in MOSTYPES.H are redefined.  There are a lot more        
>modules that are going to have to use mostypes.h before it's   
>all over with.

>My question - how do I get this to compile, while still keeping
>the code portable and re-usable???

Hi!

1. include ONLY these headers, that are obviously needed in a source.
   Do NOT rely that a specific header is included somewhere else.
   Write your headers that way, that you are independed from the
   arragement of your includes in the source.

2. You can get this by using a construciton like this (for queue.h):

#ifndef __QUEUE_H
#define __QUEUE_H

#include "mostype.h"

/* definitions, macros, etc */

#endif  /* EOF */

Do the same thing for each header you use. This will include this
header file ONLY, if it has not been included before. This way you also
prevent possible include-loops.

Peter Loibl
pal@regent.e-technik.tu-muenchen.de
Newsgroups: comp.lang.c
From: allan@microware.com (R. Allan Kirkhart)
Subject: Re: How to use 'return' in c?
Organization: Microware Systems Corp., Des Moines, Iowa
Distribution: usa
Date: Thu, 12 Nov 1992 15:22:36 GMT

In article <7162TB3w165w@quest.UUCP> srhqla!quest!kdq writes:
>    On the other hand, since C does not truly support the boolean type,
>I consider it misleading to assign a numeric value to a boolean.  I
>
> _
>Kevin D. Quitt      96.37% of all statistics are made up.     srhqla!quest!kdq

	Since C does not truly support the boolean type, I consider it misleading
to discuss the values that C chooses to assign to a boolean.

	If on the other hand, you wish to discuss how C treats the defined type
int, when used in a conditional test, then we are back to 1 being treated as
TRUE.

----------------------------------------------------------------------------
I write my own code and opinions.
Newsgroups: comp.lang.c
From: djulian@controls.ccd.harris.com (Danny E. Julian)
Subject: Reasons for using C vs. Fortran or vice/versa
Organization: Harris Controls Division
Distribution: usa
Date: Thu, 12 Nov 1992 13:59:01 GMT

Hello,                  

This may or may not be the place to ask this, but here I go anyway.

I was wondering what advantages Fortran has over C(if any) and vice-versa.

I know C is much better than Fortran in the I/O dept., but is there anything
else that makes it a better language.

The reason I ask is when was in college, we used C for our primary language.
But the company I work for, uses a lot of Fortran(mainly because it was
written years ago and still works).  We do a lot of number crunching around
here and I've always been told that Fortran was very good at that.

Is Fortran actually better than C for number crunching routines?


Sorry if this is wasting BW.


Thanks a bunch.

Danny
Newsgroups: comp.lang.c
Subject: Re: How to print an integer as binary?
From: a_rubin@dsg4.dse.beckman.com (Arthur Rubin)
Date: 5 Nov 92 19:55:08 GMT
Organization: Beckman Instruments, Inc.

In <1dbpe8INNcop@frigate.doc.ic.ac.uk> anb@doc.ic.ac.uk (A N Burton) writes:


>#include	<stdio.h>


>void
>PrintBinary1( long x ){
>	if ( x < 0 ){
>		putchar( '-' );
>		PrintBinary1( -x );

usually infinite recursion on a 2s complement machine if x = LONG_MIN;
can be easily fixed only by having a PrintBinary1U (unsigned long)

>	}
>	else if( x < 2 )
>		putchar( '0'+x );
>	else{
>		PrintBinary1( x >> 1 );
>		putchar( '0'+( x & 1 ) );
>	}
>}
>#define MAX_SIZE 32

perhaps:

#include <limits.h>
#define MAX_SIZE  (CHAR_BIT * sizeof(long))

>void
>PrintBinary2( long x ){
>	char	buff[ MAX_SIZE+1 ];
>	int	i;

>	if( x < 0 ){
>		x = -x ;
>		putchar( '-' );
>	}

>	buff[ i = MAX_SIZE ] = '\0';
>	for( ; x ; x >>= 1 )

loops forever if x is LONG_MIN, as -LONG_MIN is usually LONG_MIN;
can be fixed by copying x to an unsigned long and using it.

>		buff[ --i ] = '0'+ (x&1);

>	printf( "%s", buff+i );
>}

>void
>PrintBinary3( long x ){
>	unsigned long	mask = 1 << (8*sizeof(unsigned long) - 1);
                                 ^
                                 \CHAR_BIT

or, the clean ANSI version:

    unsigned long mask = (((unsigned long)(-1)) >> 1) + 1;

>	if( x < 0 ){
>		putchar( '-' );
>		x = -x;
>	}

>	for( ;  ! (x & mask) ; mask >>= 1 )
>		;

>	for( ; mask ; mask >>= 1 )
>		putchar( x & mask ? '1' : '0' );
>}

>main( int argc, char *argv[] ){
>	PrintBinary1( atol(argv[1] ) );
>	putchar( '\n' );
>	PrintBinary2( atol(argv[1] ) );
>	putchar( '\n' );
>	PrintBinary3( atol(argv[1] ) );
>	putchar( '\n' );
>}
--
Arthur L. Rubin: a_rubin@dsg4.dse.beckman.com (work) Beckman Instruments/Brea
216-5888@mcimail.com 70707.453@compuserve.com arthur@pnet01.cts.com (personal)
My opinions are my own, and do not represent those of my employer.
My interaction with our news system is unstable; please mail anything important.
Newsgroups: comp.lang.c
From: mjn@pseudo.uucp (Murray Nesbitt)
Subject: Re: Help - What Is Wrong?
Organization: Private system in Toronto, ON
Date: Sat, 7 Nov 1992 11:03:12 GMT
	<536@ulogic.UUCP>


hartman@ulogic.UUCP (Richard M. Hartman) writes:

>>JC>  for(idx=0;idx!=5;idx++){                                              3
>>JC>    r=&address[idx];                /*AND HERE*/                        3
>>
>>What on earth is going on here? Why is "r" repeatdly being assigned a
>>(ignored) value? 
>
>No we aren't.  If it were "idx < 5" we might be, but w/ "idx != 5"
>we don't go through at all.  It's FALSE right off the bat.

Eh?  Unless the semantics of ``for'' have changed recently, this loop
will iterate five times (barring any asynchronous access of ``idx'').

-- 
Murray
Newsgroups: comp.lang.c
From: bandy@netnews.jhuapl.edu (Mike Bandy)
Subject: Re: Help - What Is Wrong?
Organization: JHU/Applied Physics Laboratory
Date: Sat, 7 Nov 1992 05:00:37 GMT

Fernando.Jose.Olmos@f262.n633.z3.fidonet.org (Fernando Jose Olmos) writes:

>Firstly your code is messy to the max dude. Try this instead...

>[1] remove your typedefs

Why?  What's the problem with typedefs?  I use the following construct:
  typedef struct
	{ ... }  NAME, *P_NAME;
Then my types are all very clear - if in uppercase they're typedefed somewhere
and if they start with P_ then they're clearly a pointer to something.
There's nothing worse then wandering into some garbage code that has 2
character variable names, some of which are pointers, some are scalar
variables and yet others are structure names.
 
I also typedef LONG, BITS32, etc in a general .h file that works
for any architechure I use (VAX/VMS, MS-DOS, AmigaDOS, or UNIX).

-- 

	Mike Bandy
	bandy@aplcomm.jhuapl.edu
	Johns Hopkins University / Applied Physics Lab
From: Neal.Sanche@ttlg.UUCP (Neal Sanche)
Sender: postmaster@ttlg.UUCP
Newsgroups: comp.lang.c
Subject: Re: To Recurse or NOT to
Date: 10 Nov 92  22:24:06 mst

-U> > What is better to do when traversing a linked list..... SHould I use
-U> > recursion to search down through the list for the last node, or should I
-U> use a while loop?  What or the pro's and con's of each?

A while loop is probably the best and is really the easiest to program.
It can be done quickly as follows:

  list *mylist;
  list *tail;

  tail = mylist;
  while (tail->next) {
    tail = tail->next;
  }

  This will leave tail pointing to the last element in the list.
  The only space require on the stack for this implementation in
  the space for one pointer (4 bytes in large model) whereas
  with recursion you are looking at n times as much, where n is
  the number of elements in the list. And as Rick pointed out,
  a lot more time wasted via function calls and so on.

  -Neal
___
 X OLX 2.1 TD X I give up, what is the meaning of life?

 * Origin: Paradigm BBS: A programmer's paradise. (42:100/11)
Xref: sparky comp.lang.c:16290 comp.lang.c++:16048 comp.lang.pascal:6464 comp.lang.misc:3572
From: vec@alnitak.Kodak.COM (Vance Cochrane)
Newsgroups: comp.lang.c,comp.lang.c++,comp.lang.pascal,comp.lang.misc
Subject: Re: Godel's Proof (was Re: Software design =/= Programming)
Date: 10 Nov 92 16:24:45 GMT
Followup-To: comp.lang.c
Organization: Eastman Kodak Co., Rochester, NY

In article <BxHz2v.EK4@sci.kun.nl>, hansm@cs.kun.nl (Hans Mulder) writes:
>In <LOEGEL.92Nov9134531@fegatello.ssc.gov> loegel@fegatello.ssc.gov (George J. Loegel) writes:
>>From the McGraw-Hill Dictionary of Science and Technology:
>>Godel's Proof: Any formal arithmetical system is incomplete in the
>>sense that, given any consistent set of arithmetical axioms, there are
>>true statements in the resulting arithmetical system that cannot be
>>derived from these axioms.

WHAT DOES THIS HAVE TO DO WITH THE C PROGRAMMING LANGUAGE !!!!!
ANSWER:
NOTHING.
-- 
+------------------------------------------------------+
+ Vance Cochrane                Email: vec@Kodak.COM   +
+ Research Laboratories	        Voice: (716) 722-3709  +
+ Eastman Kodak Company	        Fax:   (716) 477-8681  +
+ Rochester, NY 14650-1826                             +
+ USA                                                  +
+------------------------------------------------------+
From: mwm@contessa.palo-alto.ca.us (Mike Meyer)
Subject: Re: CUG Library CDROM free for contributors
Newsgroups: comp.lang.c,alt.cd-rom
Distribution: world
X-NewsSoftware: Amiga Yarn 3.4, 1992/08/12 15:49:52
Keywords: 
Summary: 
Date: 6 Nov 92 13:47:07 PST
Organization: Missionaria Phonibalonica

In <1dej8fINNq9i@agate.berkeley.edu>, rab@sprite.berkeley.edu (Robert A. Bruce) wrote:
> I forgot to mention this in my previous post, but just like all
> other CD-ROMs, the CUG Library CD-ROM  is available for free to
> anyone who has contributed any software to the C Users' Group.

I would like to take this chance to publicly commend Walnut Creek for
this practice. This is not because I've been giving software to public
collections for over a decade and will probably be eligible for free
disks. This is because it rewards those who donate software to the
public, and encourages others to do the same.

I feel that a large base of freely distributable software is a good
thing, and have worked to build that base. Walnut Creek is helping to
make that base more available, which is a good thing. But they've also
found a unique way to encourage others to contribute to that base. I
applaud them for all these actions.

Note that Walnut Creek can't keep this up unless they sell lots of
disks. So if you get a freebie, please show it off to encourage others
to buy it. Personally, I'd recommend not asking for a freebie unless
you can use it, as opposed to just collecting them.

To Robert, and Walnut Creek:

	Thank you,
	<mike


Xref: sparky comp.lang.c:16337 comp.sys.mac.programmer:18272
From: rick@howtek.UUCP (Rick Roy)
Newsgroups: comp.lang.c,comp.sys.mac.programmer
Subject: Re: Productivity of a C programmer ?
Date: 10 Nov 92 18:17:16 GMT
Reply-To: rick@howtek.UUCP (Rick Roy)
Organization: Howtek, Inc.
X-Mailer: uAccess - Macintosh Release: 1.6v1


In article <MARTINC.92Oct28215627@hatteras.cs.unc.edu> (comp.lang.c), martinc@hatteras.cs.unc.edu (Charles R. Martin) writes:
] Look, it's an old argument, but no matter what you want to count as
] "lines of code" you need to specify it.  If you count both blank lines
] and comment lines, that'll give a rather different number than if you
] don't.
] --
]                 Charles R. Martin/(Charlie)/martinc@cs.unc.edu
]      Dept. of Computer Science/CB #3175 UNC-CH/Chapel Hill, NC 27599-3175
]             3611 University Dr #13M/Durham, NC 27707/(919) 419 1754
]      "Oh God, please help me be civil in tongue, pure in thought, and able
]       to resist the temptation to laugh uncontrollably.  Amen." -- Rob T

	Not necessarily! 8-O

-----------------------------------------------------------------------
Rick Roy          Usenet: rick@phunt.MV.com         America Online: QED
   "He knows that changes aren't permanent- but change is!"   --Rush

Disclaimer: My employer's views are orthogonal to these.
From: gegu@zurich.spectrospin.ch (Gerry Gucher)
Newsgroups: comp.lang.c
Subject: Re: Macros
Summary: use a function
Date: 11 Nov 92 15:37:31 GMT
Organization: Spectrospin AG, Fallanden Switzerland

In article <pal.721305765@regent.e-technik.tu-muenchen.de>, pal@regent.e-technik.tu-muenchen.dbp.de (Peter Loibl) writes:
> wct@po.CWRU.Edu (William C. Thompson) writes:
> 
> >I'm trying to write a macro that allocates memory for Rows double *,
> >...
> >trouble with this macro business.
> > I don't want to write a function to do it.
> >
> >ALL.H
> >-----
> >#define malloc2d(A,rows,cols); (
> >{
> >  int i;
> >
> >  if (((A)=(double **)malloc(sizeof(double *)*(rows)))==NULL)
> >    printf("Allocation error!\n");
> >  for (i=0; i<(cols); i++)
> >    if (((A)[i]=(double *)malloc(sizeof(double)*(cols)))==NULL)
> >     printf("Allocation error!\n");
> >}
> >)
> >

I have the strong feeling you want the wrong thing. There are VERY
few reasons to use a macro at all.

  1) efficiency
  2) desire to win the obfuscated C contest

Both reasons are not fulfilled by your code.

  1) A macro that calls several mallocs won't be any faster than 
     calling a function that does it.

  2) Since you don't know how to write such a macro you are not up to
     the second reason either.

The disadvantages on the other side are severalfold:

1) You cannot debug it
2) It increases the code size
3) The macro evaluates the A argument several times, possibly
   leading to hard to find bugs (see 1).
4) The macro argument A is modified without need to be a pointer,
   which is inconsitent with similar looking function calls,
   leading to hard to find bugs (1).
5) ... 


A macro like this is just plain nonsense (besides the errors it
contains like the ; and the missing \ ).

Whenever you want to write a macro repeat to yourself at least
10 times:

  macros are a bad thing...

If you are then still conviced that it is NECESSARY, do it
make sure that it behaves like a function and that it does
not lead to bad syntax in the calling code.


Gerry


Newsgroups: comp.lang.c
From: bena@yoyo.cc.monash.edu.au (Ben Aveling)
Subject: Hows this for odd
Organization: Monash University General Access Unix
X-Newsreader: TIN [version 1.1 PL6]
Date: Mon, 9 Nov 1992 10:22:17 GMT


Hi all,

Just recently I saw the following fragment of code, and I thought I'd share
it with you all.  (This is real code, part of a real program people will
pay money for.)

	... ,(i==0)?TRUE:FALSE,...

Am I going mad, or is this slightly redundant ?

	:-/  Ben
From: kwakkel@cwi.nl (Fred Kwakkel)
Newsgroups: comp.lang.c
Subject: Oject Oriented C libraries
Date: 11 Nov 92 18:32:01 GMT
Organization: CWI, Amsterdam

Hai,

I'm looking for some object oriented C likr libraries (not C++!).
I want to do set manipulation with arbitrary data structures,
symbol table manipulation and more of these these 'low-level' 
abstract data types. If you know an ftp site where I can find these libraries
(pure C, not compiled), please mail them to me.

Thanks a lot!

-- Fred

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
kwakkel@cwi.nl - centre for mathematics and computer science, amsterdam
From: holliday@cse.unl.edu (david holliday)
Newsgroups: comp.lang.c
Subject: Re: The Correct Way To Write C if-Statements
Date: 6 Nov 1992 00:54:54 GMT
Organization: University of Nebraska--Lincoln	
Distribution: usa
NNTP-Posting-Host: cse.unl.edu

>Mark Boolootian writes:

>The following piece was written by Jim Minton, an aspiring C programmer.
>I convinced him to let me post it to the net.  Happy reading and flames
>to /nev/dull...

>		The Correct Way To Write C if-Statements
>				by
>			    Jim Minton

I did a global search for the three-character sequence ":-)". Since the
editor didn't report any, I can only presume that the author forgot to
place after this character sequence after each paragraph of this post.

Dave
----
Newsgroups: comp.lang.c,comp.lang.c++
From: ctaylor@cs.uiuc.edu (Conrad W Taylor)
Subject: Looking for B-Tree, AVL Tree, & Printing routine...???
Organization: University of Illinois at Urbana-Champaign
Date: Tue, 10 Nov 1992 06:36:09 GMT


Subject: Data structure code/B-Tree/AVL TREE...???

         Could someone/anyone direct me to an ftp site
which has standard/common data structure code for a
balanced B-Tree and an AVL Tree?  Also, I'm looking for
data structure code for doubly linked circular lists
that are to be used for integers.  Thanks in advance to
all reply to this post.

-Conrad

ps:  If you can also locate a routine that prints out
     an binary/AVL Tree like this

                8
             /    \
            6      9
          /  \    /  \
         4    7  nil  10

      would be off great service because having the root of
      the tree at the left margin so that the tree blooms
      to the right doesn't work for me.  Also, I would like
      to store at most 10 elemnents in each node of the B-Tree
      and do the balancing as if it were an AVL Tree.



Newsgroups: comp.lang.c
From: sca@gese.ge14.mdadv.gv.at (Petzi Schweda)
Subject: Re: To Recurse or NOT to
Originator: sca@gese0n.ge14.mdadv.gv.at
Organization: MD-ADV
Date: Wed, 11 Nov 1992 15:24:57 GMT


Is the whole discussion about saving CPU-time still necessary ?
On the up-and-coming DEC-ALPHA the first six arguments are passed in
registers, so the call itself shouldn't matter any more (as long as you
don't initalize lots and lots of stack data :).

I'm astonished that "todays" RISC has so much calling overhead that you can
gain 30-40% CPU-time, as mentioned in another reply ...

For all those non-recs out there: try to walk trough a tree-structure ...
For all those non-recs who've done that: try to explain your program
to someone sane :-) ...

regards, Petzi 
-- 
----------------------------------------------------
Petzi Schweda (sca@gese.ge14.mdadv.gv.at)
MD-ADV, Municipality of the City of Vienna, Austria
-- 
----------------------------------------------------
Petzi Schweda (sca@gese.ge14.mdadv.gv.at)
MD-ADV, Municipality of the City of Vienna, Austria
Newsgroups: comp.lang.c
From: mouse@thunder.mcrcim.mcgill.edu (der Mouse)
Subject: Re: Hows this for odd
Organization: McGill Research Centre for Intelligent Machines
Date: Thu, 12 Nov 92 21:12:42 GMT

In article <1266@pascal.einstein.eds.com>, wenner@einstein.eds.com (Rich Wenner) writes:
> In article <1992Nov10.161008.27590@mksol.dseg.ti.com> mccall@mksol.dseg.ti.com (fred j mccall 575-3539) writes:
>> ...(i==0)?TRUE:FALSE...
> Why is it that nobody in this thread has yet mentioned that the above
> expression reverses the logic?

In what sense?  Assuming that TRUE is 1 and FALSE is 0, the expression
is equivalent to just (i==0).  Nobody has tried to claim it's
equivalent to unadorned i.

> Is this equivalent to !i or have I been reading too much of my
> students' code?

Yes, it's equivalent to i==0, which by definition is equivalent to !i.

					der Mouse

			    mouse@larry.mcrcim.mcgill.edu