Related articles |
---|
Pascal vs C style string ? guerin@IRO.UMontreal.CA (1994-06-24) |
Pascal vs C style string ? ssimmons@convex.com (1994-06-26) |
Re: Pascal vs C style string ? prener@watson.ibm.com (1994-06-27) |
Re: Pascal vs C style string ? jhallen@world.std.com (1994-06-27) |
Re: Pascal vs C style string ? ddean@robadome.com (1994-06-27) |
Re: Pascal vs C style string ? boehm@parc.xerox.com (1994-06-27) |
Re: Pascal vs C style string ? nandu@cs.clemson.edu (1994-06-27) |
Re: Pascal vs C style string ? eifrig@beanworld.cs.jhu.edu (1994-06-28) |
Re: Pascal vs C style string ? monnier@di.epfl.ch (Stefan Monnier) (1994-06-28) |
Re: Pascal vs C style string ? eru@tele.nokia.fi (Erkki Ruohtula) (1994-06-28) |
[11 later articles] |
Newsgroups: | comp.compilers |
From: | jhallen@world.std.com (Joseph H Allen) |
Keywords: | C, Pascal, design |
Organization: | The World Public Access UNIX, Brookline, MA |
References: | 94-06-175 94-06-195 |
Date: | Mon, 27 Jun 1994 05:41:11 GMT |
guerin@IRO.UMontreal.CA:
> Is there some reasons to use string0 over length attributed string ??
ssimmons@convex.com (Steve Simmons) writes:
>[the length of counted strings is limited by the size of the count field]
If you define the size of the length to be log2 of the size of the address
space (or on the 8086, the segment size), then you never have a problem.
Of course, the language should provide an integer type which is equal to
this size ('int' is this type in C except for on the DEC Alpha).
The only real advantage of 0-terminated strings over length-attributed
strings is that a 0-terminated string plus an offset is still a valid
0-terminated string. (I.E., in C: "Hello" is a valid string and "Hello"+3
is also a valid string).
I occasionally use an elaborate auto-resizing string library for C. It
stores strings as follows: <malloc-block size><string-length><string><0>.
The base address of the string starts at <string>, the string is zero
terminated, and the type is still (char *). This way they are compatible
with existing C code. When you write or concatenate to a string through
the library routines, it will be automatically realloced if it runs out of
space. They are kind of magical though, since a string's length is in
*((int *)string-1) and the malloc block size and start are at ((int
*)string-2). Also, although a string plus an offset is still a valid C
string, it's not a valid auto-resizing string.
Nearly all string operations go through a single function:
char *ncpy(char *string,int offset,char *blk,int size);
/* Copy a block of characters 'blk/size' onto an auto-resizing string
* at a specific offset. If 'string' is NULL, a new string is created. If
* 'offset' is past the end of the string, it gets space filled.
* If 'offset'+'size' is past the end of the string, the string is realloced
* and the string's new address is returned.
*/
These macros are used for filling in the arguments string/offset or blk/size:
#define sc(s) (s),sizeof(s)-1
#define sz(s) (s),strlen(s)
#define sv(s) (s),*((int *)(s)-1)
You can use them as follows:
s=ncpy(sv(s),sc("hi")); Append "hi" to 's'
s=ncpy(NULL,0,sz(r)); Convert 'r' into an auto-string
s=ncpy(sv(s),sv(s)); Concatenate s onto itself
s=ncpy(sv(s),&c,1); Append 'c' onto 's'.
and so on.
I've found that the library can be quite useful, especially for complicated
file-name manipulation routines, but I almost never use it. The problem is
that people can't understand my code when I go through a special library, so
I tend to program in unadorned C whenever possible.
--
/* jhallen@world.std.com (192.74.137.5) */ /* Joseph H. Allen */
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.