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