Coverage Report

Created: 2025-08-18 06:35

/src/nss/lib/base/base.h
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 */