Line | Count | Source (jump to first uncovered line) |
1 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
2 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | | |
5 | | #ifndef BASE_H |
6 | | #define BASE_H |
7 | | |
8 | | /* |
9 | | * base.h |
10 | | * |
11 | | * This header file contains basic prototypes and preprocessor |
12 | | * definitions used throughout nss but not available publicly. |
13 | | */ |
14 | | |
15 | | #ifndef BASET_H |
16 | | #include "baset.h" |
17 | | #endif /* BASET_H */ |
18 | | |
19 | | #ifndef NSSBASE_H |
20 | | #include "nssbase.h" |
21 | | #endif /* NSSBASE_H */ |
22 | | |
23 | | #include "plhash.h" |
24 | | |
25 | | PR_BEGIN_EXTERN_C |
26 | | |
27 | | /* |
28 | | * NSSArena |
29 | | * |
30 | | * The nonpublic methods relating to this type are: |
31 | | * |
32 | | * nssArena_Create -- constructor |
33 | | * nssArena_Destroy |
34 | | * nssArena_Mark |
35 | | * nssArena_Release |
36 | | * nssArena_Unmark |
37 | | * |
38 | | * nss_ZAlloc |
39 | | * nss_ZFreeIf |
40 | | * nss_ZRealloc |
41 | | * |
42 | | * Additionally, there are some preprocessor macros: |
43 | | * |
44 | | * nss_ZNEW |
45 | | * nss_ZNEWARRAY |
46 | | * |
47 | | * In debug builds, the following calls are available: |
48 | | * |
49 | | * nssArena_verifyPointer |
50 | | * nssArena_registerDestructor |
51 | | * nssArena_deregisterDestructor |
52 | | * |
53 | | * The following preprocessor macro is also always available: |
54 | | * |
55 | | * nssArena_VERIFYPOINTER |
56 | | * |
57 | | * A constant PLHashAllocOps structure is available for users |
58 | | * of the NSPL PLHashTable routines. |
59 | | * |
60 | | * nssArenaHashAllocOps |
61 | | */ |
62 | | |
63 | | /* |
64 | | * nssArena_Create |
65 | | * |
66 | | * This routine creates a new memory arena. This routine may return |
67 | | * NULL upon error, in which case it will have set an error on the |
68 | | * error stack. |
69 | | * |
70 | | * The error may be one of the following values: |
71 | | * NSS_ERROR_NO_MEMORY |
72 | | * |
73 | | * Return value: |
74 | | * NULL upon error |
75 | | * A pointer to an NSSArena upon success |
76 | | */ |
77 | | |
78 | | /* |
79 | | * XXX fgmr |
80 | | * Arenas can be named upon creation; this is mostly of use when |
81 | | * debugging. Should we expose that here, allowing an optional |
82 | | * "const char *name" argument? Should the public version of this |
83 | | * call (NSSArena_Create) have it too? |
84 | | */ |
85 | | |
86 | | NSS_EXTERN NSSArena *nssArena_Create(void); |
87 | | |
88 | | extern const NSSError NSS_ERROR_NO_MEMORY; |
89 | | |
90 | | /* |
91 | | * nssArena_Destroy |
92 | | * |
93 | | * This routine will destroy the specified arena, freeing all memory |
94 | | * allocated from it. This routine returns a PRStatus value; if |
95 | | * successful, it will return PR_SUCCESS. If unsuccessful, it will |
96 | | * set an error on the error stack and return PR_FAILURE. |
97 | | * |
98 | | * The error may be one of the following values: |
99 | | * NSS_ERROR_INVALID_ARENA |
100 | | * |
101 | | * Return value: |
102 | | * PR_SUCCESS |
103 | | * PR_FAILURE |
104 | | */ |
105 | | |
106 | | NSS_EXTERN PRStatus nssArena_Destroy(NSSArena *arena); |
107 | | |
108 | | extern const NSSError NSS_ERROR_INVALID_ARENA; |
109 | | |
110 | | /* |
111 | | * nssArena_Mark |
112 | | * |
113 | | * This routine "marks" the current state of an arena. Space |
114 | | * allocated after the arena has been marked can be freed by |
115 | | * releasing the arena back to the mark with nssArena_Release, |
116 | | * or committed by calling nssArena_Unmark. When successful, |
117 | | * this routine returns a valid nssArenaMark pointer. This |
118 | | * routine may return NULL upon error, in which case it will |
119 | | * have set an error on the error stack. |
120 | | * |
121 | | * The error may be one of the following values: |
122 | | * NSS_ERROR_INVALID_ARENA |
123 | | * NSS_ERROR_NO_MEMORY |
124 | | * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD |
125 | | * |
126 | | * Return value: |
127 | | * NULL upon failure |
128 | | * An nssArenaMark pointer upon success |
129 | | */ |
130 | | |
131 | | NSS_EXTERN nssArenaMark *nssArena_Mark(NSSArena *arena); |
132 | | |
133 | | extern const NSSError NSS_ERROR_INVALID_ARENA; |
134 | | extern const NSSError NSS_ERROR_NO_MEMORY; |
135 | | extern const NSSError NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD; |
136 | | |
137 | | /* |
138 | | * nssArena_Release |
139 | | * |
140 | | * This routine invalidates and releases all memory allocated from |
141 | | * the specified arena after the point at which the specified mark |
142 | | * was obtained. This routine returns a PRStatus value; if successful, |
143 | | * it will return PR_SUCCESS. If unsuccessful, it will set an error |
144 | | * on the error stack and return PR_FAILURE. |
145 | | * |
146 | | * The error may be one of the following values: |
147 | | * NSS_ERROR_INVALID_ARENA |
148 | | * NSS_ERROR_INVALID_ARENA_MARK |
149 | | * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD |
150 | | * |
151 | | * Return value: |
152 | | * PR_SUCCESS |
153 | | * PR_FAILURE |
154 | | */ |
155 | | |
156 | | NSS_EXTERN PRStatus nssArena_Release(NSSArena *arena, nssArenaMark *arenaMark); |
157 | | |
158 | | extern const NSSError NSS_ERROR_INVALID_ARENA; |
159 | | extern const NSSError NSS_ERROR_INVALID_ARENA_MARK; |
160 | | |
161 | | /* |
162 | | * nssArena_Unmark |
163 | | * |
164 | | * This routine "commits" the indicated mark and any marks after |
165 | | * it, making them unreleasable. Note that any earlier marks can |
166 | | * still be released, and such a release will invalidate these |
167 | | * later unmarked regions. If an arena is to be safely shared by |
168 | | * more than one thread, all marks must be either released or |
169 | | * unmarked. This routine returns a PRStatus value; if successful, |
170 | | * it will return PR_SUCCESS. If unsuccessful, it will set an error |
171 | | * on the error stack and return PR_FAILURE. |
172 | | * |
173 | | * The error may be one of the following values: |
174 | | * NSS_ERROR_INVALID_ARENA |
175 | | * NSS_ERROR_INVALID_ARENA_MARK |
176 | | * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD |
177 | | * |
178 | | * Return value: |
179 | | * PR_SUCCESS |
180 | | * PR_FAILURE |
181 | | */ |
182 | | |
183 | | NSS_EXTERN PRStatus nssArena_Unmark(NSSArena *arena, nssArenaMark *arenaMark); |
184 | | |
185 | | extern const NSSError NSS_ERROR_INVALID_ARENA; |
186 | | extern const NSSError NSS_ERROR_INVALID_ARENA_MARK; |
187 | | extern const NSSError NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD; |
188 | | |
189 | | #ifdef ARENA_DESTRUCTOR_LIST |
190 | | |
191 | | /* |
192 | | * nssArena_registerDestructor |
193 | | * |
194 | | * This routine stores a pointer to a callback and an arbitrary |
195 | | * pointer-sized argument in the arena, at the current point in |
196 | | * the mark stack. If the arena is destroyed, or an "earlier" |
197 | | * mark is released, then this destructor will be called at that |
198 | | * time. Note that the destructor will be called with the arena |
199 | | * locked, which means the destructor may free memory in that |
200 | | * arena, but it may not allocate or cause to be allocated any |
201 | | * memory. This callback facility was included to support our |
202 | | * debug-version pointer-tracker feature; overuse runs counter to |
203 | | * the the original intent of arenas. This routine returns a |
204 | | * PRStatus value; if successful, it will return PR_SUCCESS. If |
205 | | * unsuccessful, it will set an error on the error stack and |
206 | | * return PR_FAILURE. |
207 | | * |
208 | | * The error may be one of the following values: |
209 | | * NSS_ERROR_INVALID_ARENA |
210 | | * NSS_ERROR_NO_MEMORY |
211 | | * |
212 | | * Return value: |
213 | | * PR_SUCCESS |
214 | | * PR_FAILURE |
215 | | */ |
216 | | |
217 | | NSS_EXTERN PRStatus nssArena_registerDestructor( |
218 | | NSSArena *arena, void (*destructor)(void *argument), void *arg); |
219 | | |
220 | | extern const NSSError NSS_ERROR_INVALID_ARENA; |
221 | | extern const NSSError NSS_ERROR_NO_MEMORY; |
222 | | |
223 | | /* |
224 | | * nssArena_deregisterDestructor |
225 | | * |
226 | | * This routine will remove the first destructor in the specified |
227 | | * arena which has the specified destructor and argument values. |
228 | | * The destructor will not be called. This routine returns a |
229 | | * PRStatus value; if successful, it will return PR_SUCCESS. If |
230 | | * unsuccessful, it will set an error on the error stack and |
231 | | * return PR_FAILURE. |
232 | | * |
233 | | * The error may be one of the following values: |
234 | | * NSS_ERROR_INVALID_ARENA |
235 | | * NSS_ERROR_NOT_FOUND |
236 | | * |
237 | | * Return value: |
238 | | * PR_SUCCESS |
239 | | * PR_FAILURE |
240 | | */ |
241 | | |
242 | | NSS_EXTERN PRStatus nssArena_deregisterDestructor( |
243 | | NSSArena *arena, void (*destructor)(void *argument), void *arg); |
244 | | |
245 | | extern const NSSError NSS_ERROR_INVALID_ITEM; |
246 | | extern const NSSError NSS_ERROR_INVALID_ARENA; |
247 | | extern const NSSError NSS_ERROR_NOT_FOUND; |
248 | | |
249 | | #endif /* ARENA_DESTRUCTOR_LIST */ |
250 | | |
251 | | /* |
252 | | * nss_ZAlloc |
253 | | * |
254 | | * This routine allocates and zeroes a section of memory of the |
255 | | * size, and returns to the caller a pointer to that memory. If |
256 | | * the optional arena argument is non-null, the memory will be |
257 | | * obtained from that arena; otherwise, the memory will be obtained |
258 | | * from the heap. This routine may return NULL upon error, in |
259 | | * which case it will have set an error upon the error stack. The |
260 | | * value specified for size may be zero; in which case a valid |
261 | | * zero-length block of memory will be allocated. This block may |
262 | | * be expanded by calling nss_ZRealloc. |
263 | | * |
264 | | * The error may be one of the following values: |
265 | | * NSS_ERROR_INVALID_ARENA |
266 | | * NSS_ERROR_NO_MEMORY |
267 | | * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD |
268 | | * |
269 | | * Return value: |
270 | | * NULL upon error |
271 | | * A pointer to the new segment of zeroed memory |
272 | | */ |
273 | | |
274 | | NSS_EXTERN void *nss_ZAlloc(NSSArena *arenaOpt, PRUint32 size); |
275 | | |
276 | | extern const NSSError NSS_ERROR_INVALID_ARENA; |
277 | | extern const NSSError NSS_ERROR_NO_MEMORY; |
278 | | extern const NSSError NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD; |
279 | | |
280 | | /* |
281 | | * nss_ZFreeIf |
282 | | * |
283 | | * If the specified pointer is non-null, then the region of memory |
284 | | * to which it points -- which must have been allocated with |
285 | | * nss_ZAlloc -- will be zeroed and released. This routine |
286 | | * returns a PRStatus value; if successful, it will return PR_SUCCESS. |
287 | | * If unsuccessful, it will set an error on the error stack and return |
288 | | * PR_FAILURE. |
289 | | * |
290 | | * The error may be one of the following values: |
291 | | * NSS_ERROR_INVALID_POINTER |
292 | | * |
293 | | * Return value: |
294 | | * PR_SUCCESS |
295 | | * PR_FAILURE |
296 | | */ |
297 | | |
298 | | NSS_EXTERN PRStatus nss_ZFreeIf(void *pointer); |
299 | | |
300 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
301 | | |
302 | | /* |
303 | | * nss_ZRealloc |
304 | | * |
305 | | * This routine reallocates a block of memory obtained by calling |
306 | | * nss_ZAlloc or nss_ZRealloc. The portion of memory |
307 | | * between the new and old sizes -- which is either being newly |
308 | | * obtained or released -- is in either case zeroed. This routine |
309 | | * may return NULL upon failure, in which case it will have placed |
310 | | * an error on the error stack. |
311 | | * |
312 | | * The error may be one of the following values: |
313 | | * NSS_ERROR_INVALID_POINTER |
314 | | * NSS_ERROR_NO_MEMORY |
315 | | * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD |
316 | | * |
317 | | * Return value: |
318 | | * NULL upon error |
319 | | * A pointer to the replacement segment of memory |
320 | | */ |
321 | | |
322 | | NSS_EXTERN void *nss_ZRealloc(void *pointer, PRUint32 newSize); |
323 | | |
324 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
325 | | extern const NSSError NSS_ERROR_NO_MEMORY; |
326 | | extern const NSSError NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD; |
327 | | |
328 | | /* |
329 | | * nss_ZNEW |
330 | | * |
331 | | * This preprocessor macro will allocate memory for a new object |
332 | | * of the specified type with nss_ZAlloc, and will cast the |
333 | | * return value appropriately. If the optional arena argument is |
334 | | * non-null, the memory will be obtained from that arena; otherwise, |
335 | | * the memory will be obtained from the heap. This routine may |
336 | | * return NULL upon error, in which case it will have set an error |
337 | | * upon the error stack. |
338 | | * |
339 | | * The error may be one of the following values: |
340 | | * NSS_ERROR_INVALID_ARENA |
341 | | * NSS_ERROR_NO_MEMORY |
342 | | * |
343 | | * Return value: |
344 | | * NULL upon error |
345 | | * A pointer to the new segment of zeroed memory |
346 | | */ |
347 | | |
348 | 0 | #define nss_ZNEW(arenaOpt, type) ((type *)nss_ZAlloc((arenaOpt), sizeof(type))) |
349 | | |
350 | | /* |
351 | | * nss_ZNEWARRAY |
352 | | * |
353 | | * This preprocessor macro will allocate memory for an array of |
354 | | * new objects, and will cast the return value appropriately. |
355 | | * If the optional arena argument is non-null, the memory will |
356 | | * be obtained from that arena; otherwise, the memory will be |
357 | | * obtained from the heap. This routine may return NULL upon |
358 | | * error, in which case it will have set an error upon the error |
359 | | * stack. The array size may be specified as zero. |
360 | | * |
361 | | * The error may be one of the following values: |
362 | | * NSS_ERROR_INVALID_ARENA |
363 | | * NSS_ERROR_NO_MEMORY |
364 | | * |
365 | | * Return value: |
366 | | * NULL upon error |
367 | | * A pointer to the new segment of zeroed memory |
368 | | */ |
369 | | |
370 | | #define nss_ZNEWARRAY(arenaOpt, type, quantity) \ |
371 | | ((type *)nss_ZAlloc((arenaOpt), sizeof(type) * (quantity))) |
372 | | |
373 | | /* |
374 | | * nss_ZREALLOCARRAY |
375 | | * |
376 | | * This preprocessor macro will reallocate memory for an array of |
377 | | * new objects, and will cast the return value appropriately. |
378 | | * This routine may return NULL upon error, in which case it will |
379 | | * have set an error upon the error stack. |
380 | | * |
381 | | * The error may be one of the following values: |
382 | | * NSS_ERROR_INVALID_POINTER |
383 | | * NSS_ERROR_NO_MEMORY |
384 | | * NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD |
385 | | * |
386 | | * Return value: |
387 | | * NULL upon error |
388 | | * A pointer to the replacement segment of memory |
389 | | */ |
390 | | #define nss_ZREALLOCARRAY(p, type, quantity) \ |
391 | | ((type *)nss_ZRealloc((p), sizeof(type) * (quantity))) |
392 | | |
393 | | /* |
394 | | * nssArena_verifyPointer |
395 | | * |
396 | | * This method is only present in debug builds. |
397 | | * |
398 | | * If the specified pointer is a valid pointer to an NSSArena object, |
399 | | * this routine will return PR_SUCCESS. Otherwise, it will put an |
400 | | * error on the error stack and return PR_FAILURE. |
401 | | * |
402 | | * The error may be one of the following values: |
403 | | * NSS_ERROR_INVALID_ARENA |
404 | | * |
405 | | * Return value: |
406 | | * PR_SUCCESS if the pointer is valid |
407 | | * PR_FAILURE if it isn't |
408 | | */ |
409 | | |
410 | | #ifdef DEBUG |
411 | | NSS_EXTERN PRStatus nssArena_verifyPointer(const NSSArena *arena); |
412 | | |
413 | | extern const NSSError NSS_ERROR_INVALID_ARENA; |
414 | | #endif /* DEBUG */ |
415 | | |
416 | | /* |
417 | | * nssArena_VERIFYPOINTER |
418 | | * |
419 | | * This macro is always available. In debug builds it will call |
420 | | * nssArena_verifyPointer; in non-debug builds, it will merely |
421 | | * check that the pointer is not null. Note that in non-debug |
422 | | * builds it cannot place an error on the error stack. |
423 | | * |
424 | | * Return value: |
425 | | * PR_SUCCESS if the pointer is valid |
426 | | * PR_FAILURE if it isn't |
427 | | */ |
428 | | |
429 | | #ifdef DEBUG |
430 | | #define nssArena_VERIFYPOINTER(p) nssArena_verifyPointer(p) |
431 | | #else /* DEBUG */ |
432 | | |
433 | | #define nssArena_VERIFYPOINTER(p) \ |
434 | | (((NSSArena *)NULL == (p)) ? PR_FAILURE : PR_SUCCESS) |
435 | | #endif /* DEBUG */ |
436 | | |
437 | | /* |
438 | | * Private function to be called by NSS_Shutdown to cleanup nssArena |
439 | | * bookkeeping. |
440 | | */ |
441 | | extern PRStatus nssArena_Shutdown(void); |
442 | | |
443 | | /* |
444 | | * nssArenaHashAllocOps |
445 | | * |
446 | | * This constant structure contains allocation callbacks designed for |
447 | | * use with the NSPL routine PL_NewHashTable. For example: |
448 | | * |
449 | | * NSSArena *hashTableArena = nssArena_Create(); |
450 | | * PLHashTable *t = PL_NewHashTable(n, hasher, key_compare, |
451 | | * value_compare, nssArenaHashAllocOps, hashTableArena); |
452 | | */ |
453 | | |
454 | | NSS_EXTERN_DATA PLHashAllocOps nssArenaHashAllocOps; |
455 | | |
456 | | /* |
457 | | * The error stack |
458 | | * |
459 | | * The nonpublic methods relating to the error stack are: |
460 | | * |
461 | | * nss_SetError |
462 | | * nss_ClearErrorStack |
463 | | */ |
464 | | |
465 | | /* |
466 | | * nss_SetError |
467 | | * |
468 | | * This routine places a new error code on the top of the calling |
469 | | * thread's error stack. Calling this routine wiht an error code |
470 | | * of zero will clear the error stack. |
471 | | */ |
472 | | |
473 | | NSS_EXTERN void nss_SetError(PRUint32 error); |
474 | | |
475 | | /* |
476 | | * nss_ClearErrorStack |
477 | | * |
478 | | * This routine clears the calling thread's error stack. |
479 | | */ |
480 | | |
481 | | NSS_EXTERN void nss_ClearErrorStack(void); |
482 | | |
483 | | /* |
484 | | * nss_DestroyErrorStack |
485 | | * |
486 | | * This routine frees the calling thread's error stack. |
487 | | */ |
488 | | |
489 | | NSS_EXTERN void nss_DestroyErrorStack(void); |
490 | | |
491 | | /* |
492 | | * NSSItem |
493 | | * |
494 | | * nssItem_Create |
495 | | * nssItem_Duplicate |
496 | | * nssItem_Equal |
497 | | */ |
498 | | |
499 | | NSS_EXTERN NSSItem *nssItem_Create(NSSArena *arenaOpt, NSSItem *rvOpt, |
500 | | PRUint32 length, const void *data); |
501 | | |
502 | | NSS_EXTERN void nssItem_Destroy(NSSItem *item); |
503 | | |
504 | | NSS_EXTERN NSSItem *nssItem_Duplicate(NSSItem *obj, NSSArena *arenaOpt, |
505 | | NSSItem *rvOpt); |
506 | | |
507 | | NSS_EXTERN PRBool nssItem_Equal(const NSSItem *one, const NSSItem *two, |
508 | | PRStatus *statusOpt); |
509 | | |
510 | | /* |
511 | | * NSSUTF8 |
512 | | * |
513 | | * nssUTF8_CaseIgnoreMatch |
514 | | * nssUTF8_Duplicate |
515 | | * nssUTF8_Size |
516 | | * nssUTF8_Length |
517 | | * nssUTF8_CopyIntoFixedBuffer |
518 | | */ |
519 | | |
520 | | /* |
521 | | * nssUTF8_CaseIgnoreMatch |
522 | | * |
523 | | * Returns true if the two UTF8-encoded strings pointed to by the |
524 | | * two specified NSSUTF8 pointers differ only in typcase. |
525 | | * |
526 | | * The error may be one of the following values: |
527 | | * NSS_ERROR_INVALID_POINTER |
528 | | * |
529 | | * Return value: |
530 | | * PR_TRUE if the strings match, ignoring case |
531 | | * PR_FALSE if they don't |
532 | | * PR_FALSE upon error |
533 | | */ |
534 | | |
535 | | NSS_EXTERN PRBool nssUTF8_CaseIgnoreMatch(const NSSUTF8 *a, const NSSUTF8 *b, |
536 | | PRStatus *statusOpt); |
537 | | |
538 | | /* |
539 | | * nssUTF8_Duplicate |
540 | | * |
541 | | * This routine duplicates the UTF8-encoded string pointed to by the |
542 | | * specified NSSUTF8 pointer. If the optional arenaOpt argument is |
543 | | * not null, the memory required will be obtained from that arena; |
544 | | * otherwise, the memory required will be obtained from the heap. |
545 | | * A pointer to the new string will be returned. In case of error, |
546 | | * an error will be placed on the error stack and NULL will be |
547 | | * returned. |
548 | | * |
549 | | * The error may be one of the following values: |
550 | | * NSS_ERROR_INVALID_POINTER |
551 | | * NSS_ERROR_INVALID_ARENA |
552 | | * NSS_ERROR_NO_MEMORY |
553 | | */ |
554 | | |
555 | | NSS_EXTERN NSSUTF8 *nssUTF8_Duplicate(const NSSUTF8 *s, NSSArena *arenaOpt); |
556 | | |
557 | | /* |
558 | | * nssUTF8_PrintableMatch |
559 | | * |
560 | | * Returns true if the two Printable strings pointed to by the |
561 | | * two specified NSSUTF8 pointers match when compared with the |
562 | | * rules for Printable String (leading and trailing spaces are |
563 | | * disregarded, extents of whitespace match irregardless of length, |
564 | | * and case is not significant), then PR_TRUE will be returned. |
565 | | * Otherwise, PR_FALSE will be returned. Upon failure, PR_FALSE |
566 | | * will be returned. If the optional statusOpt argument is not |
567 | | * NULL, then PR_SUCCESS or PR_FAILURE will be stored in that |
568 | | * location. |
569 | | * |
570 | | * The error may be one of the following values: |
571 | | * NSS_ERROR_INVALID_POINTER |
572 | | * |
573 | | * Return value: |
574 | | * PR_TRUE if the strings match, ignoring case |
575 | | * PR_FALSE if they don't |
576 | | * PR_FALSE upon error |
577 | | */ |
578 | | |
579 | | NSS_EXTERN PRBool nssUTF8_PrintableMatch(const NSSUTF8 *a, const NSSUTF8 *b, |
580 | | PRStatus *statusOpt); |
581 | | |
582 | | /* |
583 | | * nssUTF8_Size |
584 | | * |
585 | | * This routine returns the length in bytes (including the terminating |
586 | | * null) of the UTF8-encoded string pointed to by the specified |
587 | | * NSSUTF8 pointer. Zero is returned on error. |
588 | | * |
589 | | * The error may be one of the following values: |
590 | | * NSS_ERROR_INVALID_POINTER |
591 | | * NSS_ERROR_VALUE_TOO_LARGE |
592 | | * |
593 | | * Return value: |
594 | | * nonzero size of the string |
595 | | * 0 on error |
596 | | */ |
597 | | |
598 | | NSS_EXTERN PRUint32 nssUTF8_Size(const NSSUTF8 *s, PRStatus *statusOpt); |
599 | | |
600 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
601 | | extern const NSSError NSS_ERROR_VALUE_TOO_LARGE; |
602 | | |
603 | | /* |
604 | | * nssUTF8_Length |
605 | | * |
606 | | * This routine returns the length in characters (not including the |
607 | | * terminating null) of the UTF8-encoded string pointed to by the |
608 | | * specified NSSUTF8 pointer. |
609 | | * |
610 | | * The error may be one of the following values: |
611 | | * NSS_ERROR_INVALID_POINTER |
612 | | * NSS_ERROR_VALUE_TOO_LARGE |
613 | | * NSS_ERROR_INVALID_STRING |
614 | | * |
615 | | * Return value: |
616 | | * length of the string (which may be zero) |
617 | | * 0 on error |
618 | | */ |
619 | | |
620 | | NSS_EXTERN PRUint32 nssUTF8_Length(const NSSUTF8 *s, PRStatus *statusOpt); |
621 | | |
622 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
623 | | extern const NSSError NSS_ERROR_VALUE_TOO_LARGE; |
624 | | extern const NSSError NSS_ERROR_INVALID_STRING; |
625 | | |
626 | | /* |
627 | | * nssUTF8_Create |
628 | | * |
629 | | * This routine creates a UTF8 string from a string in some other |
630 | | * format. Some types of string may include embedded null characters, |
631 | | * so for them the length parameter must be used. For string types |
632 | | * that are null-terminated, the length parameter is optional; if it |
633 | | * is zero, it will be ignored. If the optional arena argument is |
634 | | * non-null, the memory used for the new string will be obtained from |
635 | | * that arena, otherwise it will be obtained from the heap. This |
636 | | * routine may return NULL upon error, in which case it will have |
637 | | * placed an error on the error stack. |
638 | | * |
639 | | * The error may be one of the following: |
640 | | * NSS_ERROR_INVALID_POINTER |
641 | | * NSS_ERROR_NO_MEMORY |
642 | | * NSS_ERROR_UNSUPPORTED_TYPE |
643 | | * |
644 | | * Return value: |
645 | | * NULL upon error |
646 | | * A non-null pointer to a new UTF8 string otherwise |
647 | | */ |
648 | | |
649 | | NSS_EXTERN NSSUTF8 *nssUTF8_Create(NSSArena *arenaOpt, nssStringType type, |
650 | | const void *inputString, |
651 | | PRUint32 size /* in bytes, not characters */ |
652 | | ); |
653 | | |
654 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
655 | | extern const NSSError NSS_ERROR_NO_MEMORY; |
656 | | extern const NSSError NSS_ERROR_UNSUPPORTED_TYPE; |
657 | | |
658 | | NSS_EXTERN NSSItem *nssUTF8_GetEncoding(NSSArena *arenaOpt, NSSItem *rvOpt, |
659 | | nssStringType type, NSSUTF8 *string); |
660 | | |
661 | | /* |
662 | | * nssUTF8_CopyIntoFixedBuffer |
663 | | * |
664 | | * This will copy a UTF8 string into a fixed-length buffer, making |
665 | | * sure that the all characters are valid. Any remaining space will |
666 | | * be padded with the specified ASCII character, typically either |
667 | | * null or space. |
668 | | * |
669 | | * Blah, blah, blah. |
670 | | */ |
671 | | |
672 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
673 | | extern const NSSError NSS_ERROR_INVALID_ARGUMENT; |
674 | | |
675 | | NSS_EXTERN PRStatus nssUTF8_CopyIntoFixedBuffer(NSSUTF8 *string, char *buffer, |
676 | | PRUint32 bufferSize, char pad); |
677 | | |
678 | | /* |
679 | | * nssUTF8_Equal |
680 | | * |
681 | | */ |
682 | | |
683 | | NSS_EXTERN PRBool nssUTF8_Equal(const NSSUTF8 *a, const NSSUTF8 *b, |
684 | | PRStatus *statusOpt); |
685 | | |
686 | | /* |
687 | | * nssList |
688 | | * |
689 | | * The goal is to provide a simple, optionally threadsafe, linked list |
690 | | * class. Since NSS did not seem to use the circularity of PRCList |
691 | | * much before, this provides a list that appears to be a linear, |
692 | | * NULL-terminated list. |
693 | | */ |
694 | | |
695 | | /* |
696 | | * nssList_Create |
697 | | * |
698 | | * If threadsafe is true, the list will be locked during modifications |
699 | | * and traversals. |
700 | | */ |
701 | | NSS_EXTERN nssList *nssList_Create(NSSArena *arenaOpt, PRBool threadSafe); |
702 | | |
703 | | /* |
704 | | * nssList_Destroy |
705 | | */ |
706 | | NSS_EXTERN PRStatus nssList_Destroy(nssList *list); |
707 | | |
708 | | NSS_EXTERN void nssList_Clear(nssList *list, |
709 | | nssListElementDestructorFunc destructor); |
710 | | |
711 | | /* |
712 | | * nssList_SetCompareFunction |
713 | | * |
714 | | * By default, two list elements will be compared by comparing their |
715 | | * data pointers. By setting this function, the user can control |
716 | | * how elements are compared. |
717 | | */ |
718 | | NSS_EXTERN void nssList_SetCompareFunction(nssList *list, |
719 | | nssListCompareFunc compareFunc); |
720 | | |
721 | | /* |
722 | | * nssList_SetSortFunction |
723 | | * |
724 | | * Sort function to use for an ordered list. |
725 | | */ |
726 | | NSS_EXTERN void nssList_SetSortFunction(nssList *list, |
727 | | nssListSortFunc sortFunc); |
728 | | |
729 | | /* |
730 | | * nssList_Add |
731 | | */ |
732 | | NSS_EXTERN PRStatus nssList_Add(nssList *list, void *data); |
733 | | |
734 | | /* |
735 | | * nssList_AddUnique |
736 | | * |
737 | | * This will use the compare function to see if the element is already |
738 | | * in the list. |
739 | | */ |
740 | | NSS_EXTERN PRStatus nssList_AddUnique(nssList *list, void *data); |
741 | | |
742 | | /* |
743 | | * nssList_Remove |
744 | | * |
745 | | * Uses the compare function to locate the element and remove it. |
746 | | */ |
747 | | NSS_EXTERN PRStatus nssList_Remove(nssList *list, void *data); |
748 | | |
749 | | /* |
750 | | * nssList_Get |
751 | | * |
752 | | * Uses the compare function to locate an element. Also serves as |
753 | | * nssList_Exists. |
754 | | */ |
755 | | NSS_EXTERN void *nssList_Get(nssList *list, void *data); |
756 | | |
757 | | /* |
758 | | * nssList_Count |
759 | | */ |
760 | | NSS_EXTERN PRUint32 nssList_Count(nssList *list); |
761 | | |
762 | | /* |
763 | | * nssList_GetArray |
764 | | * |
765 | | * Fill rvArray, up to maxElements, with elements in the list. The |
766 | | * array is NULL-terminated, so its allocated size must be maxElements + 1. |
767 | | */ |
768 | | NSS_EXTERN PRStatus nssList_GetArray(nssList *list, void **rvArray, |
769 | | PRUint32 maxElements); |
770 | | |
771 | | /* |
772 | | * nssList_CreateIterator |
773 | | * |
774 | | * Create an iterator for list traversal. |
775 | | */ |
776 | | NSS_EXTERN nssListIterator *nssList_CreateIterator(nssList *list); |
777 | | |
778 | | NSS_EXTERN nssList *nssList_Clone(nssList *list); |
779 | | |
780 | | /* |
781 | | * nssListIterator_Destroy |
782 | | */ |
783 | | NSS_EXTERN void nssListIterator_Destroy(nssListIterator *iter); |
784 | | |
785 | | /* |
786 | | * nssListIterator_Start |
787 | | * |
788 | | * Begin a list iteration. After this call, if the list is threadSafe, |
789 | | * the list is *locked*. |
790 | | */ |
791 | | NSS_EXTERN void *nssListIterator_Start(nssListIterator *iter); |
792 | | |
793 | | /* |
794 | | * nssListIterator_Next |
795 | | * |
796 | | * Continue a list iteration. |
797 | | */ |
798 | | NSS_EXTERN void *nssListIterator_Next(nssListIterator *iter); |
799 | | |
800 | | /* |
801 | | * nssListIterator_Finish |
802 | | * |
803 | | * Complete a list iteration. This *must* be called in order for the |
804 | | * lock to be released. |
805 | | */ |
806 | | NSS_EXTERN PRStatus nssListIterator_Finish(nssListIterator *iter); |
807 | | |
808 | | /* |
809 | | * nssHash |
810 | | * |
811 | | * nssHash_Create |
812 | | * nssHash_Destroy |
813 | | * nssHash_Add |
814 | | * nssHash_Remove |
815 | | * nssHash_Count |
816 | | * nssHash_Exists |
817 | | * nssHash_Lookup |
818 | | * nssHash_Iterate |
819 | | */ |
820 | | |
821 | | /* |
822 | | * nssHash_Create |
823 | | * |
824 | | */ |
825 | | |
826 | | NSS_EXTERN nssHash *nssHash_Create(NSSArena *arenaOpt, PRUint32 numBuckets, |
827 | | PLHashFunction keyHash, |
828 | | PLHashComparator keyCompare, |
829 | | PLHashComparator valueCompare); |
830 | | |
831 | | NSS_EXTERN nssHash *nssHash_CreatePointer(NSSArena *arenaOpt, |
832 | | PRUint32 numBuckets); |
833 | | |
834 | | NSS_EXTERN nssHash *nssHash_CreateString(NSSArena *arenaOpt, |
835 | | PRUint32 numBuckets); |
836 | | |
837 | | NSS_EXTERN nssHash *nssHash_CreateItem(NSSArena *arenaOpt, PRUint32 numBuckets); |
838 | | |
839 | | /* |
840 | | * nssHash_Destroy |
841 | | * |
842 | | */ |
843 | | NSS_EXTERN void nssHash_Destroy(nssHash *hash); |
844 | | |
845 | | /* |
846 | | * nssHash_Add |
847 | | * |
848 | | */ |
849 | | |
850 | | extern const NSSError NSS_ERROR_HASH_COLLISION; |
851 | | |
852 | | NSS_EXTERN PRStatus nssHash_Add(nssHash *hash, const void *key, |
853 | | const void *value); |
854 | | |
855 | | /* |
856 | | * nssHash_Remove |
857 | | * |
858 | | */ |
859 | | NSS_EXTERN void nssHash_Remove(nssHash *hash, const void *it); |
860 | | |
861 | | /* |
862 | | * nssHash_Count |
863 | | * |
864 | | */ |
865 | | NSS_EXTERN PRUint32 nssHash_Count(nssHash *hash); |
866 | | |
867 | | /* |
868 | | * nssHash_Exists |
869 | | * |
870 | | */ |
871 | | NSS_EXTERN PRBool nssHash_Exists(nssHash *hash, const void *it); |
872 | | |
873 | | /* |
874 | | * nssHash_Lookup |
875 | | * |
876 | | */ |
877 | | NSS_EXTERN void *nssHash_Lookup(nssHash *hash, const void *it); |
878 | | |
879 | | /* |
880 | | * nssHash_Iterate |
881 | | * |
882 | | */ |
883 | | NSS_EXTERN void nssHash_Iterate(nssHash *hash, nssHashIterator fcn, |
884 | | void *closure); |
885 | | |
886 | | /* |
887 | | * nssPointerTracker |
888 | | * |
889 | | * This type and these methods are only present in debug builds. |
890 | | * |
891 | | * The nonpublic methods relating to this type are: |
892 | | * |
893 | | * nssPointerTracker_initialize |
894 | | * nssPointerTracker_finalize |
895 | | * nssPointerTracker_add |
896 | | * nssPointerTracker_remove |
897 | | * nssPointerTracker_verify |
898 | | */ |
899 | | |
900 | | /* |
901 | | * nssPointerTracker_initialize |
902 | | * |
903 | | * This method is only present in debug builds. |
904 | | * |
905 | | * This routine initializes an nssPointerTracker object. Note that |
906 | | * the object must have been declared *static* to guarantee that it |
907 | | * is in a zeroed state initially. This routine is idempotent, and |
908 | | * may even be safely called by multiple threads simultaneously with |
909 | | * the same argument. This routine returns a PRStatus value; if |
910 | | * successful, it will return PR_SUCCESS. On failure it will set an |
911 | | * error on the error stack and return PR_FAILURE. |
912 | | * |
913 | | * The error may be one of the following values: |
914 | | * NSS_ERROR_NO_MEMORY |
915 | | * |
916 | | * Return value: |
917 | | * PR_SUCCESS |
918 | | * PR_FAILURE |
919 | | */ |
920 | | |
921 | | #ifdef DEBUG |
922 | | NSS_EXTERN PRStatus nssPointerTracker_initialize(nssPointerTracker *tracker); |
923 | | |
924 | | extern const NSSError NSS_ERROR_NO_MEMORY; |
925 | | #endif /* DEBUG */ |
926 | | |
927 | | /* |
928 | | * nssPointerTracker_finalize |
929 | | * |
930 | | * This method is only present in debug builds. |
931 | | * |
932 | | * This routine returns the nssPointerTracker object to the pre- |
933 | | * initialized state, releasing all resources used by the object. |
934 | | * It will *NOT* destroy the objects being tracked by the pointer |
935 | | * (should any remain), and therefore cannot be used to "sweep up" |
936 | | * remaining objects. This routine returns a PRStatus value; if |
937 | | * successful, it will return PR_SUCCES. On failure it will set an |
938 | | * error on the error stack and return PR_FAILURE. If any objects |
939 | | * remain in the tracker when it is finalized, that will be treated |
940 | | * as an error. |
941 | | * |
942 | | * The error may be one of the following values: |
943 | | * NSS_ERROR_TRACKER_NOT_EMPTY |
944 | | * |
945 | | * Return value: |
946 | | * PR_SUCCESS |
947 | | * PR_FAILURE |
948 | | */ |
949 | | |
950 | | #ifdef DEBUG |
951 | | NSS_EXTERN PRStatus nssPointerTracker_finalize(nssPointerTracker *tracker); |
952 | | |
953 | | extern const NSSError NSS_ERROR_TRACKER_NOT_EMPTY; |
954 | | #endif /* DEBUG */ |
955 | | |
956 | | /* |
957 | | * nssPointerTracker_add |
958 | | * |
959 | | * This method is only present in debug builds. |
960 | | * |
961 | | * This routine adds the specified pointer to the nssPointerTracker |
962 | | * object. It should be called in constructor objects to register |
963 | | * new valid objects. The nssPointerTracker is threadsafe, but this |
964 | | * call is not idempotent. This routine returns a PRStatus value; |
965 | | * if successful it will return PR_SUCCESS. On failure it will set |
966 | | * an error on the error stack and return PR_FAILURE. |
967 | | * |
968 | | * The error may be one of the following values: |
969 | | * NSS_ERROR_NO_MEMORY |
970 | | * NSS_ERROR_TRACKER_NOT_INITIALIZED |
971 | | * NSS_ERROR_DUPLICATE_POINTER |
972 | | * |
973 | | * Return value: |
974 | | * PR_SUCCESS |
975 | | * PR_FAILURE |
976 | | */ |
977 | | |
978 | | #ifdef DEBUG |
979 | | NSS_EXTERN PRStatus nssPointerTracker_add(nssPointerTracker *tracker, |
980 | | const void *pointer); |
981 | | |
982 | | extern const NSSError NSS_ERROR_NO_MEMORY; |
983 | | extern const NSSError NSS_ERROR_TRACKER_NOT_INITIALIZED; |
984 | | extern const NSSError NSS_ERROR_DUPLICATE_POINTER; |
985 | | #endif /* DEBUG */ |
986 | | |
987 | | /* |
988 | | * nssPointerTracker_remove |
989 | | * |
990 | | * This method is only present in debug builds. |
991 | | * |
992 | | * This routine removes the specified pointer from the |
993 | | * nssPointerTracker object. It does not call any destructor for the |
994 | | * object; rather, this should be called from the object's destructor. |
995 | | * The nssPointerTracker is threadsafe, but this call is not |
996 | | * idempotent. This routine returns a PRStatus value; if successful |
997 | | * it will return PR_SUCCESS. On failure it will set an error on the |
998 | | * error stack and return PR_FAILURE. |
999 | | * |
1000 | | * The error may be one of the following values: |
1001 | | * NSS_ERROR_TRACKER_NOT_INITIALIZED |
1002 | | * NSS_ERROR_POINTER_NOT_REGISTERED |
1003 | | * |
1004 | | * Return value: |
1005 | | * PR_SUCCESS |
1006 | | * PR_FAILURE |
1007 | | */ |
1008 | | |
1009 | | #ifdef DEBUG |
1010 | | NSS_EXTERN PRStatus nssPointerTracker_remove(nssPointerTracker *tracker, |
1011 | | const void *pointer); |
1012 | | |
1013 | | extern const NSSError NSS_ERROR_TRACKER_NOT_INITIALIZED; |
1014 | | extern const NSSError NSS_ERROR_POINTER_NOT_REGISTERED; |
1015 | | #endif /* DEBUG */ |
1016 | | |
1017 | | /* |
1018 | | * nssPointerTracker_verify |
1019 | | * |
1020 | | * This method is only present in debug builds. |
1021 | | * |
1022 | | * This routine verifies that the specified pointer has been registered |
1023 | | * with the nssPointerTracker object. The nssPointerTracker object is |
1024 | | * threadsafe, and this call may be safely called from multiple threads |
1025 | | * simultaneously with the same arguments. This routine returns a |
1026 | | * PRStatus value; if the pointer is registered this will return |
1027 | | * PR_SUCCESS. Otherwise it will set an error on the error stack and |
1028 | | * return PR_FAILURE. Although the error is suitable for leaving on |
1029 | | * the stack, callers may wish to augment the information available by |
1030 | | * placing a more type-specific error on the stack. |
1031 | | * |
1032 | | * The error may be one of the following values: |
1033 | | * NSS_ERROR_POINTER_NOT_REGISTERED |
1034 | | * |
1035 | | * Return value: |
1036 | | * PR_SUCCESS |
1037 | | * PR_FAILRUE |
1038 | | */ |
1039 | | |
1040 | | #ifdef DEBUG |
1041 | | NSS_EXTERN PRStatus nssPointerTracker_verify(nssPointerTracker *tracker, |
1042 | | const void *pointer); |
1043 | | |
1044 | | extern const NSSError NSS_ERROR_POINTER_NOT_REGISTERED; |
1045 | | #endif /* DEBUG */ |
1046 | | |
1047 | | /* |
1048 | | * libc |
1049 | | * |
1050 | | * nsslibc_memcpy |
1051 | | * nsslibc_memset |
1052 | | * nsslibc_offsetof |
1053 | | */ |
1054 | | |
1055 | | /* |
1056 | | * nsslibc_memcpy |
1057 | | * |
1058 | | * Errors: |
1059 | | * NSS_ERROR_INVALID_POINTER |
1060 | | * |
1061 | | * Return value: |
1062 | | * NULL on error |
1063 | | * The destination pointer on success |
1064 | | */ |
1065 | | |
1066 | | NSS_EXTERN void *nsslibc_memcpy(void *dest, const void *source, PRUint32 n); |
1067 | | |
1068 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
1069 | | |
1070 | | /* |
1071 | | * nsslibc_memset |
1072 | | * |
1073 | | * Errors: |
1074 | | * NSS_ERROR_INVALID_POINTER |
1075 | | * |
1076 | | * Return value: |
1077 | | * NULL on error |
1078 | | * The destination pointer on success |
1079 | | */ |
1080 | | |
1081 | | NSS_EXTERN void *nsslibc_memset(void *dest, PRUint8 byte, PRUint32 n); |
1082 | | |
1083 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
1084 | | |
1085 | | /* |
1086 | | * nsslibc_memequal |
1087 | | * |
1088 | | * Errors: |
1089 | | * NSS_ERROR_INVALID_POINTER |
1090 | | * |
1091 | | * Return value: |
1092 | | * PR_TRUE if they match |
1093 | | * PR_FALSE if they don't |
1094 | | * PR_FALSE upon error |
1095 | | */ |
1096 | | |
1097 | | NSS_EXTERN PRBool nsslibc_memequal(const void *a, const void *b, PRUint32 len, |
1098 | | PRStatus *statusOpt); |
1099 | | |
1100 | | extern const NSSError NSS_ERROR_INVALID_POINTER; |
1101 | | |
1102 | | #define nsslibc_offsetof(str, memb) ((PRPtrdiff)(&(((str *)0)->memb))) |
1103 | | |
1104 | | PR_END_EXTERN_C |
1105 | | |
1106 | | #endif /* BASE_H */ |