HDTenEightyP/NetNews huggingface dataset:
From: volpe@bart.NoSubdomain.NoDomain (Christopher R Volpe)
Newsgroups: comp.lang.c
Subject: Re: Problem with string processing.
Date: 4 Jan 93 01:01:15 GMT
Reply-To: volpe@ausable.crd.ge.com
Organization: GE Corporate Research & Development

In article <1993Jan3.050935.1227@news2.cis.umn.edu>, oleary@staff.tc.umn.edu writes:
|>  
|> A much better version is:
|>  
|> void add_char_to_str(char ch, char *str)
|> {
|>         char tmp[2] = {0};
|>  
|>         *tmp = ch;
|>         strcat(str, tmp);
|> }
|>  
|> You may even want to make tmp a static.  You could also change the name of
|> the function to make it consistent with the standard string functions,
|> perhaps strcharcat(char *str, char ch)

No, don't do that. Function names beginning with "str" are reserved to
the implementation for future use. They are unconditionally reserved
as identifiers with external linkage, and also reserved as file-scope
identifiers if string.h is #included.

-- 
==================
Chris Volpe
G.E. Corporate R&D
volpecr@crd.ge.com
From: learman@cps.msu.edu (Jerome M Learman)
Newsgroups: comp.lang.c
Subject: Re: String function names
Date: 1 Jan 93 03:55:54 GMT
Reply-To: learman@cps.msu.edu (Jerome M Learman)
Organization: Dept. of Computer Science, Michigan State University
NNTP-Posting-Host: atlantic.cps.msu.edu
Originator: learman@atlantic.cps.msu.edu

Does anyone know of a string function that converts all letter in the string to
lower case letter or all capital letter. I could parse the string char by char
and use a case statment but I really don't want to do this

---
Newsgroups: comp.lang.c
From: steve@taumet.com (Steve Clamage)
Subject: Re: assert
Organization: TauMetric Corporation
Date: Mon, 21 Dec 1992 16:30:06 GMT

hbf@gandalf.uio.no (Hallvard B Furuseth) writes:

>assert is sometimes (ie sun or gcc) defined to call another macro (ie
>__assert) which does most or all of the work.  I expect it's a hack to
>make sure the argument is stringified properly, or something like that.
>Can somebody explain?
>--

It is probably invoking a function rather than another macro.

"assert" has to print output on standard error, generally formatted
in some nice way including the file and line number where the
insertion failed as well as the failed assertion.  The easiest way
to do that is with fprintf().

That in turn would mean that the assert header would have to include
<stdio.h> to get the proper declarations, or duplicate the relevent
declarations from <stdio.h>.

The first alternative (#include <stdio.h>) is forbidden by the C
Standard (standard headers may not #include other standard headers).

The second is messy, and may cause interactions with user code.
(It would impinge on your right to use identifiers from <stdio.h>
when you don't include <stdio.h> in your code.)

Probably the best solution is for the assert macro to call a function
which is compiled separately and can therefore include whatever headers
it needs.  This function is often called something like __assert() or
__gripe(), names which are reserved for the implementation.
-- 

Steve Clamage, TauMetric Corp, steve@taumet.com
From: hartman@ulogic.UUCP (Richard M. Hartman)
Newsgroups: comp.lang.c
Subject: Re: Arrays with variable dimensions?
Date: 30 Dec 92 01:28:06 GMT
Organization: negligable

You got more details than "vary according to user input"?

Off the top of my head (w/ no safety checks & uncompiled)
a program that creates and fills an array where each value
in the array is 2 times the index value (no output of course,
but who's counting?):

main()
{
	int sz, i;
	int *a;
	printf("Enter array size:\n");
	sscanf("%d", &sz);
	a = (int *) malloc(sz * sizeof(int));
	for (i=0; i<sz; i++)
		a[i] = i*2;
}


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Blasting, bursting, billowing forth with	|
the power of ten billion butterfly sneezes,	|	-Richard Hartman	
Man, with his flaming fire,			|	hartman@uLogic.COM
has conquered the wayword breezes.		|
From: dave@cs.arizona.edu (Dave Schaumann)
Newsgroups: comp.lang.c
Subject: Re: Parameter passing & data abstraction
Date: 1 Jan 93 06:35:55 GMT
Reply-To: dave@cs.arizona.edu (Dave Schaumann)
Organization: University of Arizona

In article <D90-AWE.93Jan1044231@klara.nada.kth.se>, d90-awe@klara (Assar Westerlund) writes:
[comparisons deleted]
>Better use size as Bjarne does. libg++ is usually compiled with
>debugging-information included, which usually takes place on disk but
>not in memory (unless you use a debugger, of course).

Actually, physical size of the file is important too.  Disk space may
be cheap, but it's not free.

Moreover, given an environment like a Sparc station with few users, 8
or 16 megs of main memory and ~50 megs of swap space, the difference
between 30K and 300K is not /that/ crucial.

Fortunately, we're upgrading to 2.3 in a few days, so hopefully the
point will become more academic (to me, anyway...)

-- 
Essentia non sunt multiplicanda praeter necessitatum -- William of Ockham
(Fact need not be multiplied beyond necessity)
Newsgroups: comp.lang.c
From: jbii@HDFS1.acd.com ( John O. Bell II )
Subject: Re: C code Layout
Summary: It doesn't matter really...
Keywords: programming style
Organization: Applied Computing Devices, Inc., Terre Haute IN
Date: Thu, 31 Dec 1992 14:07:15 GMT

In article <771@ulogic.UUCP> hartman@ulogic.UUCP (Richard M. Hartman) writes:
>In article <1992Dec18.151710.23851@scott.skidmore.edu> pvonk@scott.skidmore.edu (Pierre VonKaenel) writes:
>>In article <AJ3U.92Dec17172600@onyx.cs.virginia.edu> aj3u@onyx.cs.virginia.edu (Asim Jalis) writes:

It doesn't matter which style you use for bracing in your programs, as long
as you are _consistent_!

(Yes, I have had to debug code where the programmer would switch between
 two or three bracing styles on a whim... it _sucks_.)

John Bell
Applied Computing Devices, Inc.
jbii@hdfs1.acd.com
From: ahd@apollo.sunquest.com (Art Dyer)
Newsgroups: comp.lang.c
Subject: Re: stderr: Question
Keywords: fprintf stderr
Date: 28 Dec 92 16:24:45 GMT
Organization: Sunquest Information Systems, Tucson

In article <1992Dec21.134608.16856@ifi.unizh.ch>,
caliaro@avalon.physik.unizh.ch (Aurelio Caliaro) writes:

> I would like to redirect all output made by "fprintf(stderr, ...)" to
> a procedure.  Is that possible without changing the source everytime
> that stderr comes?

I've used the following technique:
	Create a pipe, let's call it p.
	Close file descriptor 2.
	Use fcntl(p[1], F_DUPFD, 2) to re-open file descriptor 2 as
	as duplicate of the writable side of your pipe.
	Now, when somebody writes to stderr (or directly to file
	descriptor 2), the data goes into your pipe and thus is
	available for reading from p[0].  If you have asynch i/o
	capability you can set up a signal handler to be called
	whenever data is available to be read, otherwise you will
	need to poll the pipe.
Apologies for posting a UNIX-oriented reply in a C-oriented group.

--
Art Dyer    ahd@apollo.sunquest.com    Voice:  (602) 570-2602
Newsgroups: comp.lang.c,comp.lang.c++
From: paranjpe@leland.Stanford.EDU (Milind D Paranjpe)
Subject: Linking in Borland C++ .OBJ's with Turbo Pascal 5.5
Organization: DSG, Stanford University, CA 94305, USA
Date: Wed, 23 Dec 92 01:03:15 GMT

Hi:

I'm trying to link in functions compiled using Borland's C++ package into
their Turbo Pascal 5.5.  I keep getting errors saying that public symbols
in the C++ .OBJ file are not in the CODE segment.  How do I fix this so it
works?

Thanks much.

Milind Paranjpe
paranjpe@leland.stanford.edu
or
mparanj@eis.calstate.edu
From: murphy@npri6.npri.com (David P. Murphy)
Newsgroups: comp.lang.c
Subject: Re: readable code
Date: 31 Dec 92 22:35:29 GMT
Distribution: world
Organization: NPRI, Alexandria VA

>So the question of whether "x = x + 1" or "x += 1" is more "readable" is
>really a moot point.
>
>timk@world.std.com (Tim King)

	"++x" is more readable.  [down!  down!  bad lurker! (whack) (whack)]

ok
dpm
-- 
murphy@npri6.npri.com 602 Cameron St. Alexandria, VA 22314 (703) 683-9090

              When every one is dead the Great Game is finished.  Not before.
                              --- Hurree Babu, "Kim"
From: ssarmast@copper.denver.colorado.edu (Sam Sarmast)
Newsgroups: comp.lang.c
Subject: Re: Arrays with variable dimensions?
Date: 28 Dec 92 07:09:15 GMT
Organization: University of Colorado at Denver

In article <1992Dec26.220736.22177@news.ysu.edu> ah017@yfn.ysu.edu (John B. Lee) writes:
>
>Is it possible to create an array that would change size according
>to user input?
>
>John Lee

Linked list would solve your problem...


Newsgroups: comp.lang.c
From: pdh@netcom.com (Phil Howard )
Subject: readable code
Organization: Netcom - Online Communication Services  (408 241-9760 guest) 
Date: Thu, 31 Dec 1992 02:09:53 GMT

I just saw a posting on comp.lang.c on the usage of ?: and one of the
replies noted that you could use ?: to select the choice of function
to be called with one set of argument list.

C has a lot of features other languages just don't have.  In those endless
debates over what language is best, a lot of people frequently tell me that
certain features (and they happen to point out the ones C has that others
do not) are "not (easily) readable".

In one debate I had, someone tried to convince me that:

    x += 3;

was not readable while:

    x = x + 3;

was readable.

To me, an expression like:

    ( ( n < midway ) ? array_a : array_b ) [ n ] += k;

is perfectly readable.

What I am interested in finding out is what is a good way to specifically
characterize CODE READABILITY (specific to the C language).

I think we should assume readability by a fully experienced C programmer.
Just because something does not exist in other languages or fields of
study does not, IMHO, justify attacking it as unreadable WITHIN the C
language, so I am not interested in that aspect of the question.

BTW, I've had a couple people who I know are fully experienced C programmers
tell me that they find array subscripting like:

    array [ n ]

harder to read, and insist on something like:

    array[n]

Personally I find the former easier to read, PROVIDED IT FITS.  There is
not that much difference that I would not squish it to get certain things
on one line where those things would read better that way.  But I do feel
I should space things out when it makes it easier to read... it it usually
does so for *ME*.
-- 
/************************************************************************\
| Phil Howard,  pdh@netcom.com,  KA9WGN    Spell protection?  "1(911)A1" |
| "It's not broken... it's just functionally challenged" --Phil and Pete |
\************************************************************************/
From: bob@comlab.gatech.edu (Bob Baggerman)
Newsgroups: comp.lang.c
Subject: Re: Survey:  Commercial Libraries
Date: 31 Dec 92 16:55:12 GMT
Organization: GTRI Communications Lab

Mike Erwin of Apple writes:
> How many of you use commercial libraries?  What type of functionality do you
> need from them mostly?  Would you rather program low level junk yourself? 
> Which ones do you consider the best/worst?  Are they even at all useful, or
> are they a waste of time and money?

Two commercial libraries that I like are TCXL for building user interfaces
and BTree/ISAM for database stuff.

TCXL has all the stuff for building relatively "smart" user interfaces.
My experience is with the DOS product, but if I need to turn my DOS program
into a Windows, OS/2, or Unix program then I can purchase libraries for
these platforms and use my existing code.  No Mac library, though.

BTree/ISAM has been a good database library for me because it compiles on
lots of different systems; PCs, workstations, and mainframes.  I dabble on
a lot of different platforms and I like being able to use the same database
library on each.

I bought each of these for less than US$100 from Programmer's Connection.
Support for both has been real good.  Usually when you call up for support
one of the authors answers the phone.  I hate talking to a technical
support person who knows less about the product than I do.  8-)  Oh, yea,
both come with complete source code.

All appropriate disclaimers apply.

Bob

-- 
Bob Baggerman                         !  bob.baggerman@gtri.gatech.edu
Communications Laboratory             !  bob@comlab.gatech.edu
Georgia Tech Research Institute       !  qseclrb@prism.gatech.edu
Atlanta, GA  30332  USA               !  404-894-3525
Newsgroups: comp.lang.c
From: draper@ais.org (Patrick Draper)
Subject: Is this ANSI?
Organization: UMCC
Date: Thu, 24 Dec 1992 00:47:58 GMT

I was playing with the Turbo C++ 1.01 compiler, and I found that it choked
on this code:

void foo (struct bar *x);

struct bar {
   int aaa;
   int bbb;
};

void foo (struct bar *x)
{

   ....

}

It complained about the redeclaration of function foo. If I put the
structure definition before the prototype, Turbo C++ 1.01 is happy.

This code works just fine with the borland C++ 2.0 and Borland C++ 3.1
compilers, and that leads me to suspect that the Turbo C++ 1.01 is not
strictly ANSI in this regard.

My question is: what does ANSI say about this. Stylistically, I can see that
it is preferable to define the structure before I use it, however, it is
defined in the global realm, thus should be visible.

Is this an artifact of a one pass vs. two pass compiler? (I don't know if
Turbo C++ 1.01 is one pass or not)

Thanks,

------------------////////////////////\\\\\\\\\\\\\\\\\\\\------------------
| Patrick Draper-ZBT       Disclaimer:  I can't control my fingers,        |
| draper@umcc.ais.org                   I can't control my toes! - Ramones |
| University of Michigan Computer Club                                     |
NO CARRIER                     We are a nation of laws, not people         |
------------------\\\\\\\\\\\\\\\\\\\\////////////////////------------------
From: brad@optilink.COM (Brad Yearwood)
Newsgroups: comp.lang.c
Subject: Re: C code Layout
Date: 23 Dec 92 06:43:32 GMT
Organization: Optilink Corporation, Petaluma, CA

In article <771@ulogic.UUCP>, hartman@ulogic.UUCP (Richard M. Hartman) writes:
# 
# ... am I in the minority here by preferring style C:
# 
# 	keyword (condition) 
# 		{
# 		statement1;
# 		statement2;
# 		statement3;
# 		}

You may be in the minority, but you're in good company ;-) .  We have
standardized upon style C here.  I was probably on the other side of
the (acrimonious) arguments which led up to this style, but I have come to
appreciate it.

Brad Yearwood   brad@optilink.com   {uunet, pyramid}!optilink!brad
Petaluma, CA
From: kdq@quest.UUCP (Kevin D. Quitt)
Newsgroups: comp.lang.c
Subject: Re: A different C puzzle
Date: Thu, 24 Dec 92 19:27:14 PST
Reply-To: srhqla!quest!kdq
Organization: Job quest  (805) 251-8210,  So Cal: (800) 400-8210

keith@torme.sharebase.com (Keith Chambless) writes:
> In article <1992Dec23.092712.2408@sq.sq.com> msb@sq.sq.com (Mark Brader) writ
> >> > Write a [C] program that uses every valid character exactly once.
> >> I should think it would be rather difficult to use only one " ...
> 
> Best I could come up with is:
> 
> #
> 
> main()
> {
> 	double *ABCDEFGHIJKLMNOPQRSTUVWXYZ[], \
                                             ^^-------- sheesh!
> 		   c_fghjkpqrstvwxyz = -!9 + 8.0 / 7 > 6 < 5 % 4 ? 3 : 2 & 1;
> }
> 
> 
> missing are ' " \


 _
Kevin D. Quitt      96.37% of all statistics are made up.     srhqla!quest!kdq
From: slahiri@jade.tufts.edu (Sandip Lahiri)
Newsgroups: comp.lang.c
Subject: Re: Why won't this work?? (scanf(), etc.)
Date: 21 Dec 92 18:24:07 GMT
Distribution: comp
Organization: Tufts University - Medford, MA

In article <JVIGNEAU.92Dec10205719@cs.ulowell.edu> jvigneau@cs.ulowell.edu (|Joe Vigneau|) writes:
>This time I just can't figure it out... I am trying to build a binary tree,
>with structures as nodes. This isn't the problem (yet...). The problem is that
>I can't get scanf to work! This is the first time in the program that any sort
>of input is called for, if there's a buffer problem or somethinf like that.
>BTW: I'm using Ultrix and gcc.
>
>----trouble lies just ahead---------
>struct Tree *starttree(void)
>{   struct Tree *topnode;
>    char *last, *first, *mid;
>
>    topnode = (struct Tree *)malloc(sizeof(struct Tree));
>
>    if (topnode == NULL){
>	puts("starttree: malloc returned NULL");
>	exit(1);
>	}
>
>    printf("First Name          : "); scanf("%s",first);
>/*                           ---------^
> * The problem's right here.-| When the program gets this far, it dies and
> * says "Bus error (core dumped)" I've tried using gets(), but that didn't
> * work either. This is the problem.

Allocate memory for first first. So the following would do,
   char first[100];
Now, scanf("%s", first); 
will work. But my personal opinion is *not* to use scanf. Use fgets.
Hope this helps.

-Sandip
From: bs@alice.att.com (Bjarne Stroustrup)
Newsgroups: comp.lang.c
Subject: Re: Parameter passing & data abstraction
Date: 1 Jan 93 16:02:58 GMT
Article-I.D.: alice.24532
Organization: AT&T Bell Laboratories, Murray Hill NJ



dave@cs.arizona.edu (Dave Schaumann @ University of Arizona) writes

 > The only other option is some cfront-
 > like program called CC, but (at least the version we have) is so hoplessly
 > brain-damaged as to be unusable.

My figures were cfront figures (the driver for cfront is usually called CC).
It isn't braindamaged here. Maybe you should consider getting yours fixed
or updated to a 3.0 if that's the problem.
Newsgroups: comp.lang.c
From: mccall@mksol.dseg.ti.com (fred j mccall 575-3539)
Subject: Re: C code Layout
Organization: Texas Instruments Inc
Distribution: usa
Date: Tue, 29 Dec 1992 14:38:59 GMT

In <BzzLzv.ApL@rahul.net> kpapai@rahul.net (Ken Papai) writes:

>mccall@mksol.dseg.ti.com (fred j mccall 575-3539) writes:

>>And you obviously grew up on Pascal and PC's.  Now, what do you do
>>when you have to work (simultaneously) on: VAX/VMS, SGI/MIPS UNIX,
>>MCS-68k OS-9, SunOS, and MS-DOS?  Gee, sorry, but you're too
>>unproductive trying to run Brief on VMS . . . 
>>One editor to find them all, and in the darkness bind them . . . 

>Well, Pascal was my first formal language I learned in college. (lucky
>me) Then LISP, Algol 68, and TI 980-A assembly.  Then it was PC Basic
>and Z80 and 8086.  And, I find it much easier, and a lot more productive
>to do major edits on PC Brief and swap back quickly to Vax or IBM 370
>with the file. Every "mainframe" editor I have encountered sucks donkey fumes.
>(Incidentally, I've never seen or heard of Brief running under VMS)

That's exactly the point.  You're not going to be real productive
trying to run Brief on a VMS box -- since it won't.  You're also
assuming that you have some kind of reliable file transfer and that
your LAN (or other connection) has loads of excess bandwidth.  Either
of those assumptions may turn out not to be true.  However, if I have
a compiler and some way to load a tape, I can have an Emacs editor
(and I can make it look like anything I want it to look like,
including, no doubt, Brief).

>(Before Brief, I though WordStar was best editor for me, but then, I simply
>was totally uninformed and narrow minded)

You can probably make Emacs look like WordStar, too, but I'm not sure
why you would want to.  ;-)

-- 
"Insisting on perfect safety is for people who don't have the balls to live
 in the real world."   -- Mary Shafer, NASA Ames Dryden
------------------------------------------------------------------------------
Fred.McCall@dseg.ti.com - I don't speak for others and they don't speak for me.
Newsgroups: comp.lang.c,comp.std.c
From: fjh@munta.cs.mu.OZ.AU (Fergus James HENDERSON)
Subject: Re: uninitialized++;
Followup-To: comp.std.c
Organization: Computer Science, University of Melbourne, Australia
Date: Tue, 29 Dec 1992 21:44:33 GMT

hbf@gandalf.uio.no (Hallvard B Furuseth) writes:

>Can this fail  - on some machine?  - in ANSI?
>
>main ()
>{
>	int uninitialized;
>	uninitialized++;
>	return 0;
>}

I believe so, but I can't give you an authoratitive answer.
I've redirected things to comp.std.c where hopefully someone will
be able to quote chapter and verse of the standard to answer
your query.

-- 
Fergus Henderson             fjh@munta.cs.mu.OZ.AU      
This .signature virus is a self-referential statement that is true - but 
you will only be able to consistently believe it if you copy it to your own
.signature file!
Xref: sparky comp.lang.c:18891 comp.lang.c++:18419
From: yak@sms.ccas.msk.su (Alex Yakovlev)
Newsgroups: comp.lang.c,comp.lang.c++
Subject: Problem in TopSpeed DOS Extender
Date: Mon, 21 Dec 92 14:16:13 +0300
Distribution: world
Organization: Computing Center of Russian Academy of Sciences
Reply-To: yak@sms.ccas.msk.su


 Dear colleagues, we have the TopSpeed C/C++ System Ver 3.02
 with TopSpeed DOS Extender - legal copy, don't worry. I use
 dynamic link libraries (DLL), created by TopSpeed in extended
 memory model (by the way, i've had to correct the system file
 TSPRJ.TXT before i could create DLL's in this model - it's
 obvious JPI's mistake!). When i attempted to use *MANUAL*
 loading/unloading DLL's, i met serious problem. I've reduced
 my program to the following pair of texts:

 My main text looks like as:

   #include <stdio.h>
   #include <conio.h>
   #include <tsxlib.h>
   typedef unsigned (* Function) (void);
   static Function func;
   static unsigned handle, res;
   void main (void)
   {
     while (getch() != 033)
     {
       handle = LOADMODULE("Drv");
       func = (Function) GETPROCADDR("_Proc", handle);
       res += func();
       UNLOADMODULE(handle);
       printf("%d\n", res);
     }
   }

 And DLL-text, named "Drv.c", is very simple:

   unsigned Proc(void) {return 1;}

 The main program results in General Protection Fault on the
 15'th pass through the loop. I think, it is connected with an
 incorrect behaviour of UNLOADMODULE. May be, it is necessary
 to pass some other parameter, not a handle, into this
 function?

 I'm sure, there are experienced people, who use TopSpeed DOS
 Extender's DLL's in such a way. Help me, please!
 --
 Alex Yakovlev
 Computing Center of Russian Academy of Sciences
 Moscow, Russia
 Internet: yak@sms.ccas.msk.su

Newsgroups: comp.lang.c
From: alane@wozzle.linet.org (J. Alan Eldridge)
Newsgroups: comp.lang.c
Subject: Re: Qusetions about UC Berkerley header file. Help!
Date: 31 Dec 92 20:38:29 GMT
Organization: Disorganization

ren@function.mps.ohio-state.edu (Liming Ren) writes:

> This question bugs me all the day. I hope it makes sense.
> 
> I am reading two header files distributed by UC Berkley. One is search.h
> and the other one is db.h (they are about hashing, Btree etc).
> 
> (1) In search.h, there are several lines such as:
> 
> int      hcreate __P((unsigned int));
> void     hdestroy __P((void));
> ENTRY   *hsearch __P((ENTRY, ACTION));
> 
> I don't understand this. It seems __P is a function returns ....(confused 
> here).  What are hcreate , hdestroy etc anyway?
> 
> (2) In db.h, there is a definition for  DB:
> 
> typedef struct __db {
>         DBTYPE type;                    /* underlying db type */
>         int (*close)    __P((struct __db *));
>         int (*del)      __P((const struct __db *, const DBT *, unsigned int))
>         int (*get)      __P((const struct __db *, const DBT *, DBT *,
>                             unsigned int));
>         int (*put)      __P((const struct __db *, const DBT *, const DBT *,
>                             unsigned int));
>         int (*seq)      __P((const struct __db *, DBT *, DBT *, unsigned int)
>         int (*sync)     __P((const struct __db *));
>         void *internal;                 /* access method private */
> } DB;
> 
> What is __P again? To my best knowledge, C does not support function
> overloading. BUT what is this? 

Well, I guess it's something like:

#if     __STDC__
#define __P(x)  x
#else
#define __P(x)  ()
#endif

This lets you prototype if your compiler supports it (ANSI), or use
the old style if your compiler is old and senile (K&R).




alane@wozzle.linet.org (J. Alan Eldridge)
Fido: The University of Walamaloo 1:272/38.473
Newsgroups: comp.lang.c