Subversion Repositories tendra.SVN

Rev

Rev 5 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5 Rev 6
Line -... Line 1...
-
 
1
/*
-
 
2
 * Copyright (c) 2002-2006 The TenDRA Project <http://www.tendra.org/>.
-
 
3
 * All rights reserved.
-
 
4
 *
-
 
5
 * Redistribution and use in source and binary forms, with or without
-
 
6
 * modification, are permitted provided that the following conditions are met:
-
 
7
 *
-
 
8
 * 1. Redistributions of source code must retain the above copyright notice,
-
 
9
 *    this list of conditions and the following disclaimer.
-
 
10
 * 2. Redistributions in binary form must reproduce the above copyright notice,
-
 
11
 *    this list of conditions and the following disclaimer in the documentation
-
 
12
 *    and/or other materials provided with the distribution.
-
 
13
 * 3. Neither the name of The TenDRA Project nor the names of its contributors
-
 
14
 *    may be used to endorse or promote products derived from this software
-
 
15
 *    without specific, prior written permission.
-
 
16
 *
-
 
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
-
 
18
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-
 
19
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-
 
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
-
 
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-
 
22
 * EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-
 
23
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-
 
24
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-
 
25
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-
 
26
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-
 
27
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 
28
 *
-
 
29
 * $Id$
-
 
30
 */
1
/*
31
/*
2
    		 Crown Copyright (c) 1997
32
    		 Crown Copyright (c) 1997
3
    
33
 
4
    This TenDRA(r) Computer Program is subject to Copyright
34
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
35
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
36
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
37
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
38
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
39
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
40
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
41
    shall be deemed to be acceptance of the following conditions:-
12
    
42
 
13
        (1) Its Recipients shall ensure that this Notice is
43
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
44
        reproduced upon any copies or amended versions of it;
15
    
45
 
16
        (2) Any amended version of it shall be clearly marked to
46
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
47
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
48
        for the relevant amendment or amendments;
19
    
49
 
20
        (3) Its onward transfer from a recipient to another
50
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
51
        party shall be deemed to be that party's acceptance of
22
        these conditions;
52
        these conditions;
23
    
53
 
24
        (4) DERA gives no warranty or assurance as to its
54
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
55
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
56
        no liability whatsoever in relation to any use to which
27
        it may be put.
57
        it may be put.
28
*/
58
*/
Line 62... Line 92...
62
 * strings to.  Once it has been completely initialised, it should be
92
 * strings to.  Once it has been completely initialised, it should be
63
 * converted to one of the other string types.
93
 * converted to one of the other string types.
64
 *
94
 *
65
 ***=== FUNCTIONS ============================================================
95
 ***=== FUNCTIONS ============================================================
66
 *
96
 *
67
 ** Function:	void			nstring_init
97
 ** Function:	void nstring_init(NStringP nstring)
68
 *			PROTO_S ((NStringP nstring))
-
 
69
 ** Exceptions:
98
 ** Exceptions:
70
 *
99
 *
71
 * This function initialises the specified nstring to be an empty nstring.
100
 * This function initialises the specified nstring to be an empty nstring.
72
 *
101
 *
73
 ** Function:	void			nstring_init_length
-
 
74
 *			PROTO_S ((NStringP nstring, unsigned length))
102
 ** Function:	void nstring_init_length(NStringP nstring, unsigned length)
75
 ** Exceptions:	XX_dalloc_no_memory
103
 ** Exceptions:	XX_dalloc_no_memory
76
 *
104
 *
77
 * This function initialises the specified nstring to be an nstring of the
105
 * This function initialises the specified nstring to be an nstring of the
78
 * specified length.  The initial contents are unspecified.
106
 * specified length.  The initial contents are unspecified.
79
 *
107
 *
80
 ** Function:	void			nstring_assign
-
 
81
 *			PROTO_S ((NStringP to, NStringP from))
108
 ** Function:	void nstring_assign(NStringP to, NStringP from)
82
 ** Exceptions:
109
 ** Exceptions:
83
 *
110
 *
84
 * This function assigns the from nstring to the to nstring.  The from nstring
111
 * This function assigns the from nstring to the to nstring.  The from nstring
85
 * should not be used afterwards, without reinitialising it.
112
 * should not be used afterwards, without reinitialising it.
86
 *
113
 *
87
 ** Function:	void			nstring_copy_cstring
-
 
88
 *			PROTO_S ((NStringP nstring, CStringP cstring))
114
 ** Function:	void nstring_copy_cstring(NStringP nstring, CStringP cstring)
89
 ** Exceptions:	XX_dalloc_no_memory
115
 ** Exceptions:	XX_dalloc_no_memory
90
 *
116
 *
91
 * This function initialises the specified nstring from the content of the
117
 * This function initialises the specified nstring from the content of the
92
 * specified cstring.
118
 * specified cstring.
93
 *
119
 *
94
 ** Function:	void			nstring_insert_cstring
-
 
95
 *			PROTO_S ((NStringP nstring, CStringP cstring))
120
 ** Function:	void nstring_insert_cstring(NStringP nstring, CStringP cstring)
96
 ** Exceptions:
121
 ** Exceptions:
97
 *
122
 *
98
 * This function inserts the specified cstring into the specified nstring.
123
 * This function inserts the specified cstring into the specified nstring.
99
 * Sufficient characters are copied to fill up the nstring.
124
 * Sufficient characters are copied to fill up the nstring.
100
 *
125
 *
101
 ** Function:	void			nstring_copy
-
 
102
 *			PROTO_S ((NStringP to, NStringP from))
126
 ** Function:	void nstring_copy(NStringP to, NStringP from)
103
 ** Exceptions:	XX_dalloc_no_memory
127
 ** Exceptions:	XX_dalloc_no_memory
104
 *
128
 *
105
 * This function copies the specified from nstring into the specified to
129
 * This function copies the specified from nstring into the specified to
106
 * nstring.
130
 * nstring.
107
 *
131
 *
108
 ** Function:	CStringP		nstring_to_cstring
132
 ** Function:	CStringP nstring_to_cstring(NStringP nstring)
109
 *			PROTO_S ((NStringP nstring))
-
 
110
 ** Exceptions:	XX_dalloc_no_memory
133
 ** Exceptions:	XX_dalloc_no_memory
111
 *
134
 *
112
 * This function returns a dynamically allocated cstring copy of the specified
135
 * This function returns a dynamically allocated cstring copy of the specified
113
 * nstring.  If the nstring contains null characters, then the characters
136
 * nstring.  If the nstring contains null characters, then the characters
114
 * after the first null will be ignored in the cstring (although they will
137
 * after the first null will be ignored in the cstring (although they will
115
 * still be part of it).
138
 * still be part of it).
116
 *
139
 *
117
 ** Function:	unsigned		nstring_hash_value
140
 ** Function:	unsigned nstring_hash_value(NStringP nstring)
118
 *			PROTO_S ((NStringP nstring))
-
 
119
 ** Exceptions:
141
 ** Exceptions:
120
 *
142
 *
121
 * This function returns the hash value associated with the specified nstring.
143
 * This function returns the hash value associated with the specified nstring.
122
 * This value is guaranteed to be identical for all nstrings with the same
144
 * This value is guaranteed to be identical for all nstrings with the same
123
 * content.
145
 * content.
124
 *
146
 *
125
 ** Function:	unsigned		nstring_length
147
 ** Function:	unsigned nstring_length(NStringP nstring)
126
 *			PROTO_S ((NStringP nstring))
-
 
127
 ** Exceptions:
148
 ** Exceptions:
128
 *
149
 *
129
 * This function returns the length of the specified nstring.
150
 * This function returns the length of the specified nstring.
130
 *
151
 *
131
 ** Function:	CStringP		nstring_contents
152
 ** Function:	CStringP nstring_contents(NStringP nstring)
132
 *			PROTO_S ((NStringP nstring))
-
 
133
 ** Exceptions:
153
 ** Exceptions:
134
 *
154
 *
135
 * This function returns the contents of the specified nstring.
155
 * This function returns the contents of the specified nstring.
136
 *
156
 *
137
 ** Function:	CmpT			nstring_compare
-
 
138
 *			PROTO_S ((NStringP nstring1, NStringP nstring2))
157
 ** Function:	CmpT nstring_compare(NStringP nstring1, NStringP nstring2)
139
 ** Exceptions:
158
 ** Exceptions:
140
 *
159
 *
141
 * This function returns ``CMP_LT'', ``CMP_EQ'', or ``CMP_GT'', depending on
160
 * This function returns ``CMP_LT'', ``CMP_EQ'', or ``CMP_GT'', depending on
142
 * whether the content of nstring1 is lexicographically less than, equal to,
161
 * whether the content of nstring1 is lexicographically less than, equal to,
143
 * or greater than the content of nstring2.
162
 * or greater than the content of nstring2.
144
 *
163
 *
145
 ** Function:	BoolT			nstring_equal
-
 
146
 *			PROTO_S ((NStringP nstring1, NStringP nstring2))
164
 ** Function:	BoolT nstring_equal(NStringP nstring1, NStringP nstring2)
147
 ** Exceptions:
165
 ** Exceptions:
148
 *
166
 *
149
 * This function returns true if the specified nstrings have the same content,
167
 * This function returns true if the specified nstrings have the same content,
150
 * and false otherwise.
168
 * and false otherwise.
151
 *
169
 *
152
 ** Function:	BoolT			nstring_ci_equal
-
 
153
 *			PROTO_S ((NStringP nstring1, NStringP nstring2))
170
 ** Function:	BoolT nstring_ci_equal(NStringP nstring1, NStringP nstring2)
154
 ** Exceptions:
171
 ** Exceptions:
155
 *
172
 *
156
 * This function returns true if the specified nstrings have the same content
173
 * This function returns true if the specified nstrings have the same content
157
 * (ignoring differences in case), and false otherwise.
174
 * (ignoring differences in case), and false otherwise.
158
 *
175
 *
159
 ** Function:	BoolT			nstring_contains
176
 ** Function:	BoolT nstring_contains(NStringP nstring, char c)
160
 *			PROTO_S ((NStringP nstring, char c))
-
 
161
 ** Exceptions:
177
 ** Exceptions:
162
 *
178
 *
163
 * This function returns true if the specified nstring contains the specified
179
 * This function returns true if the specified nstring contains the specified
164
 * character, and false otherwise.
180
 * character, and false otherwise.
165
 *
181
 *
166
 ** Function:	BoolT			nstring_is_prefix
-
 
167
 *			PROTO_S ((NStringP nstring1, NStringP nstring2))
182
 ** Function:	BoolT nstring_is_prefix(NStringP nstring1, NStringP nstring2)
168
 ** Exceptions:
183
 ** Exceptions:
169
 *
184
 *
170
 * This function returns true if the second nstring is a prefix of the first
185
 * This function returns true if the second nstring is a prefix of the first
171
 * nstring, and false otherwise.
186
 * nstring, and false otherwise.
172
 *
187
 *
173
 ** Function:	void			nstring_destroy
188
 ** Function:	void nstring_destroy(NStringP nstring)
174
 *			PROTO_S ((NStringP nstring))
-
 
175
 ** Exceptions:
189
 ** Exceptions:
176
 *
190
 *
177
 * This function deallocates the contents of the specified nstring.
191
 * This function deallocates the contents of the specified nstring.
178
 *
192
 *
179
 ** Function:	void			write_nstring
-
 
180
 *			PROTO_S ((OStreamP stream, NStringP nstring))
193
 ** Function:	void write_nstring(OStreamP stream, NStringP nstring)
181
 ** Exceptions:	XX_dalloc_no_memory, XX_ostream_write_error
194
 ** Exceptions:	XX_dalloc_no_memory, XX_ostream_write_error
182
 *
195
 *
183
 * This function writes the content of the specified nstring to the specified
196
 * This function writes the content of the specified nstring to the specified
184
 * ostream.
197
 * ostream.
185
 *
198
 *
186
 ** Function:	void			dstring_init
199
 ** Function:	void dstring_init(DStringP dstring)
187
 *			PROTO_S ((DStringP dstring))
-
 
188
 ** Exceptions:	XX_dalloc_no_memory
200
 ** Exceptions:	XX_dalloc_no_memory
189
 *
201
 *
190
 * This function initialises the specified dstring to be an empty dstring.
202
 * This function initialises the specified dstring to be an empty dstring.
191
 *
203
 *
192
 ** Function:	unsigned		dstring_length
204
 ** Function:	unsigned dstring_length(DStringP dstring)
193
 *			PROTO_S ((DStringP dstring))
-
 
194
 ** Exceptions:
205
 ** Exceptions:
195
 *
206
 *
196
 * This function returns the length of the specified dstring.
207
 * This function returns the length of the specified dstring.
197
 *
208
 *
198
 ** Function:	void			dstring_append_char
209
 ** Function:	void dstring_append_char(DStringP dstring, char c)
199
 *			PROTO_S ((DStringP dstring, char c))
-
 
200
 ** Exceptions:	XX_dalloc_no_memory
210
 ** Exceptions:	XX_dalloc_no_memory
201
 *
211
 *
202
 * This function appends the specified character to the specified dstring.
212
 * This function appends the specified character to the specified dstring.
203
 *
213
 *
204
 ** Function:	void			dstring_append_cstring
-
 
205
 *			PROTO_S ((DStringP dstring, CStringP cstring)
214
 ** Function:	void dstring_append_cstring(DStringP dstring, CStringP cstring
206
 ** Exceptions:	XX_dalloc_no_memory
215
 ** Exceptions:	XX_dalloc_no_memory
207
 *
216
 *
208
 * This function appends the content of the specified cstring to the specified
217
 * This function appends the content of the specified cstring to the specified
209
 * dstring.
218
 * dstring.
210
 *
219
 *
211
 ** Function:	void			dstring_append_nstring
-
 
212
 *			PROTO_S ((DStringP dstring, NStringP nstring)
220
 ** Function:	void dstring_append_nstring(DStringP dstring, NStringP nstring
213
 ** Exceptions:	XX_dalloc_no_memory
221
 ** Exceptions:	XX_dalloc_no_memory
214
 *
222
 *
215
 * This function appends the content of the specified nstring to the specified
223
 * This function appends the content of the specified nstring to the specified
216
 * dstring.
224
 * dstring.
217
 *
225
 *
218
 ** Function:	BoolT			dstring_last_char_equal
226
 ** Function:	BoolT dstring_last_char_equal(DStringP dstring, char c)
219
 *			PROTO_S ((DStringP dstring, char c))
-
 
220
 ** Exceptions:
227
 ** Exceptions:
221
 *
228
 *
222
 * This function returns true if the last character of the specified dstring
229
 * This function returns true if the last character of the specified dstring
223
 * is the same as the specified character, and false otherwise.  If the
230
 * is the same as the specified character, and false otherwise.  If the
224
 * dstring is empty, then false is always returned.
231
 * dstring is empty, then false is always returned.
225
 *
232
 *
226
 ** Function:	void			dstring_to_nstring
-
 
227
 *			PROTO_S ((DStringP dstring, NStringP nstring_ref))
233
 ** Function:	void dstring_to_nstring(DStringP dstring, NStringP nstring_ref)
228
 ** Exceptions:	XX_dalloc_no_memory
234
 ** Exceptions:	XX_dalloc_no_memory
229
 *
235
 *
230
 * This function copies the content of the specified dstring into the
236
 * This function copies the content of the specified dstring into the
231
 * specified nstring.
237
 * specified nstring.
232
 *
238
 *
233
 ** Functions:	CStringP		dstring_to_cstring
239
 ** Functions:	CStringP dstring_to_cstring(DStringP dstring)
234
 *			PROTO_S ((DStringP dstring))
-
 
235
 ** Exceptions:	XX_dalloc_no_memory
240
 ** Exceptions:	XX_dalloc_no_memory
236
 *
241
 *
237
 * This function copies the content of the specified dstring into a
242
 * This function copies the content of the specified dstring into a
238
 * dynamically allocated cstring, and returns it.
243
 * dynamically allocated cstring, and returns it.
239
 *
244
 *
240
 ** Function:	CStringP		dstring_destroy_to_cstring
245
 ** Function:	CStringP dstring_destroy_to_cstring(DStringP dstring)
241
 *			PROTO_S ((DStringP dstring))
-
 
242
 ** Exceptions:	XX_dalloc_no_memory
246
 ** Exceptions:	XX_dalloc_no_memory
243
 *
247
 *
244
 * This function does the equivalent of a call to ``dstring_to_cstring''
248
 * This function does the equivalent of a call to ``dstring_to_cstring''
245
 * followed by a call to ``dstring_destroy''.  It returns a cstring that is
249
 * followed by a call to ``dstring_destroy''.  It returns a cstring that is
246
 * normally the internal cstring of the dstring (if there isn't enough room
250
 * normally the internal cstring of the dstring (if there isn't enough room
247
 * for a null character at the end, then the cstring will need to be
251
 * for a null character at the end, then the cstring will need to be
248
 * reallocated).
252
 * reallocated).
249
 *
253
 *
250
 ** Function:	void			dstring_destroy
254
 ** Function:	void dstring_destroy(DStringP dstring)
251
 *			PROTO_S ((DStringP dstring))
-
 
252
 ** Exceptions:
255
 ** Exceptions:
253
 *
256
 *
254
 * This function deallocates the contents of the specified dstring.
257
 * This function deallocates the contents of the specified dstring.
255
 *
258
 *
256
 **** Change log:
259
 **** Change log:
Line 291... Line 294...
291
} DStringT, *DStringP;
294
} DStringT, *DStringP;
292
 
295
 
293
/*--------------------------------------------------------------------------*/
296
/*--------------------------------------------------------------------------*/
294
 
297
 
295
extern void			nstring_init
298
extern void			nstring_init
296
	PROTO_S ((NStringP));
299
(NStringP);
297
extern void			nstring_init_length
300
extern void			nstring_init_length
298
	PROTO_S ((NStringP, unsigned));
301
(NStringP, unsigned);
299
extern void			nstring_assign
302
extern void			nstring_assign
300
	PROTO_S ((NStringP, NStringP));
303
(NStringP, NStringP);
301
extern void			nstring_copy_cstring
304
extern void			nstring_copy_cstring
302
	PROTO_S ((NStringP, CStringP));
305
(NStringP, CStringP);
303
extern void			nstring_insert_cstring
306
extern void			nstring_insert_cstring
304
	PROTO_S ((NStringP, CStringP));
307
(NStringP, CStringP);
305
extern void			nstring_copy
308
extern void			nstring_copy
306
	PROTO_S ((NStringP, NStringP));
309
(NStringP, NStringP);
307
extern CStringP			nstring_to_cstring
310
extern CStringP			nstring_to_cstring
308
	PROTO_S ((NStringP));
311
(NStringP);
309
extern unsigned			nstring_hash_value
312
extern unsigned			nstring_hash_value
310
	PROTO_S ((NStringP));
313
(NStringP);
311
extern unsigned			nstring_length
314
extern unsigned			nstring_length
312
	PROTO_S ((NStringP));
315
(NStringP);
313
extern CStringP			nstring_contents
316
extern CStringP			nstring_contents
314
	PROTO_S ((NStringP));
317
(NStringP);
315
extern CmpT			nstring_compare
318
extern CmpT			nstring_compare
316
	PROTO_S ((NStringP, NStringP));
319
(NStringP, NStringP);
317
extern BoolT			nstring_equal
320
extern BoolT			nstring_equal
318
	PROTO_S ((NStringP, NStringP));
321
(NStringP, NStringP);
319
extern BoolT			nstring_ci_equal
322
extern BoolT			nstring_ci_equal
320
	PROTO_S ((NStringP, NStringP));
323
(NStringP, NStringP);
321
extern BoolT			nstring_contains
324
extern BoolT			nstring_contains
322
	PROTO_S ((NStringP, char));
325
(NStringP, char);
323
extern BoolT			nstring_is_prefix
326
extern BoolT			nstring_is_prefix
324
	PROTO_S ((NStringP, NStringP));
327
(NStringP, NStringP);
325
extern void			nstring_destroy
328
extern void			nstring_destroy
326
	PROTO_S ((NStringP));
329
(NStringP);
327
 
330
 
328
extern void			write_nstring
331
extern void			write_nstring
329
	PROTO_S ((OStreamP, NStringP));
332
(OStreamP, NStringP);
330
 
333
 
331
extern void			dstring_init
334
extern void			dstring_init
332
	PROTO_S ((DStringP));
335
(DStringP);
333
extern unsigned			dstring_length
336
extern unsigned			dstring_length
334
	PROTO_S ((DStringP));
337
(DStringP);
335
extern void			dstring_append_char
338
extern void			dstring_append_char
336
	PROTO_S ((DStringP, char));
339
(DStringP, char);
337
extern void			dstring_append_cstring
340
extern void			dstring_append_cstring
338
	PROTO_S ((DStringP, CStringP));
341
(DStringP, CStringP);
339
extern void			dstring_append_nstring
342
extern void			dstring_append_nstring
340
	PROTO_S ((DStringP, NStringP));
343
(DStringP, NStringP);
341
extern BoolT			dstring_last_char_equal
344
extern BoolT			dstring_last_char_equal
342
	PROTO_S ((DStringP, char));
345
(DStringP, char);
343
extern void			dstring_to_nstring
346
extern void			dstring_to_nstring
344
	PROTO_S ((DStringP, NStringP));
347
(DStringP, NStringP);
345
extern CStringP			dstring_to_cstring
348
extern CStringP			dstring_to_cstring
346
	PROTO_S ((DStringP));
349
(DStringP);
347
extern CStringP			dstring_destroy_to_cstring
350
extern CStringP			dstring_destroy_to_cstring
348
	PROTO_S ((DStringP));
351
(DStringP);
349
extern void			dstring_destroy
352
extern void			dstring_destroy
350
	PROTO_S ((DStringP));
353
(DStringP);
351
 
354
 
352
/*--------------------------------------------------------------------------*/
355
/*--------------------------------------------------------------------------*/
353
 
356
 
354
#ifdef FS_FAST
357
#ifdef FS_FAST
355
#define nstring_length(s) ((s)->length)
358
#define nstring_length(s)	((s)->length)
356
#define nstring_contents(s) ((s)->contents)
359
#define nstring_contents(s)	((s)->contents)
357
#define dstring_length(s) ((s)->length)
360
#define dstring_length(s)	((s)->length)
358
#endif /* defined (FS_FAST) */
361
#endif /* defined (FS_FAST) */
359
 
362
 
360
#endif /* !defined (H_DSTRING) */
363
#endif /* !defined (H_DSTRING) */
361

364

362
/*
365
/*