xref: /netbsd-src/common/lib/libppath/ppath.3 (revision aa4b308c77cf1961c3a33de274eb53bc123ac329)
1*aa4b308cSwiz.\"	$NetBSD: ppath.3,v 1.5 2017/10/23 00:59:44 wiz Exp $
233ce21e2Sdyoung.\"
333ce21e2Sdyoung.\" Copyright (c) 2011 The NetBSD Foundation, Inc.
433ce21e2Sdyoung.\" All rights reserved.
533ce21e2Sdyoung.\"
633ce21e2Sdyoung.\" This code is derived from software contributed to The NetBSD Foundation
733ce21e2Sdyoung.\" by David Young <dyoung@NetBSD.org>.
833ce21e2Sdyoung.\"
933ce21e2Sdyoung.\" Redistribution and use in source and binary forms, with or without
1033ce21e2Sdyoung.\" modification, are permitted provided that the following conditions
1133ce21e2Sdyoung.\" are met:
1233ce21e2Sdyoung.\" 1. Redistributions of source code must retain the above copyright
1333ce21e2Sdyoung.\"    notice, this list of conditions and the following disclaimer.
1433ce21e2Sdyoung.\" 2. Redistributions in binary form must reproduce the above copyright
1533ce21e2Sdyoung.\"    notice, this list of conditions and the following disclaimer in the
1633ce21e2Sdyoung.\"    documentation and/or other materials provided with the distribution.
1733ce21e2Sdyoung.\"
1833ce21e2Sdyoung.\" THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY EXPRESS
1933ce21e2Sdyoung.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2033ce21e2Sdyoung.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2133ce21e2Sdyoung.\" ARE DISCLAIMED.  IN NO EVENT SHALL David Young BE LIABLE FOR ANY
2233ce21e2Sdyoung.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2333ce21e2Sdyoung.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
2433ce21e2Sdyoung.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2533ce21e2Sdyoung.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
2633ce21e2Sdyoung.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2733ce21e2Sdyoung.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2833ce21e2Sdyoung.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2933ce21e2Sdyoung.\"
3033ce21e2Sdyoung.Dd August 24, 2011
31b6947e90Swiz.Dt PPATH 3
3233ce21e2Sdyoung.Os
3333ce21e2Sdyoung.Sh NAME
3433ce21e2Sdyoung.Nm ppath ,
3533ce21e2Sdyoung.Nm ppath_idx ,
3633ce21e2Sdyoung.Nm ppath_key ,
3733ce21e2Sdyoung.\" ,
3833ce21e2Sdyoung.Nm ppath_component_retain ,
3933ce21e2Sdyoung.Nm ppath_component_release ,
4033ce21e2Sdyoung.\" ,
4133ce21e2Sdyoung.Nm ppath_create ,
4233ce21e2Sdyoung.Nm ppath_length ,
4333ce21e2Sdyoung.Nm ppath_component_idx ,
4433ce21e2Sdyoung.Nm ppath_component_key ,
4533ce21e2Sdyoung.Nm ppath_pop ,
4633ce21e2Sdyoung.Nm ppath_push ,
4733ce21e2Sdyoung.Nm ppath_component_at ,
4833ce21e2Sdyoung.Nm ppath_subpath ,
4933ce21e2Sdyoung.Nm ppath_push_idx ,
5033ce21e2Sdyoung.Nm ppath_push_key ,
5133ce21e2Sdyoung.Nm ppath_replace_idx ,
5233ce21e2Sdyoung.Nm ppath_replace_key ,
5333ce21e2Sdyoung.\" ,
5433ce21e2Sdyoung.Nm ppath_copy ,
5533ce21e2Sdyoung.Nm ppath_retain ,
5633ce21e2Sdyoung.Nm ppath_release ,
5733ce21e2Sdyoung.\" ,
58bc341be2Sabhinav.Nm ppath_lookup
5933ce21e2Sdyoung.\" ,
6033ce21e2Sdyoung.Nd property container path library
6133ce21e2Sdyoung.Sh LIBRARY
6233ce21e2Sdyoung.Lb libppath
6333ce21e2Sdyoung.Sh SYNOPSIS
6433ce21e2Sdyoung.In ppath/ppath.h
6533ce21e2Sdyoung.\"
6633ce21e2Sdyoung.Ft "ppath_component_t *"
6733ce21e2Sdyoung.Fn ppath_idx "unsigned int index"
6833ce21e2Sdyoung.Ft "ppath_component_t *"
6933ce21e2Sdyoung.Fn ppath_key "const char *key"
7033ce21e2Sdyoung.\"
7133ce21e2Sdyoung.Ft "ppath_component_t *"
7233ce21e2Sdyoung.Fn ppath_component_retain "ppath_component_t *pc"
7333ce21e2Sdyoung.Ft void
7433ce21e2Sdyoung.Fn ppath_component_release "ppath_component_t *pc"
7533ce21e2Sdyoung.\"
7633ce21e2Sdyoung.Ft "ppath_t *"
7733ce21e2Sdyoung.Fn ppath_create "void"
7833ce21e2Sdyoung.Ft "unsigned int"
7933ce21e2Sdyoung.Fn ppath_length "const ppath_t *p"
8033ce21e2Sdyoung.Ft int
8133ce21e2Sdyoung.Fn ppath_component_idx "const ppath_component_t *"
8233ce21e2Sdyoung.Ft const char *
8333ce21e2Sdyoung.Fn ppath_component_key "const ppath_component_t *"
8433ce21e2Sdyoung.Ft "ppath_t *"
8533ce21e2Sdyoung.Fn ppath_pop "ppath_t *" "ppath_component_t **"
8633ce21e2Sdyoung.Ft ppath_t *
8733ce21e2Sdyoung.Fn ppath_push "ppath_t *" "ppath_component_t *"
8833ce21e2Sdyoung.Ft ppath_component_t *
8933ce21e2Sdyoung.Fn ppath_component_at "const ppath_t *" "unsigned int"
9033ce21e2Sdyoung.Ft ppath_t *
9133ce21e2Sdyoung.Fn ppath_subpath "const ppath_t *" "unsigned int" "unsigned int"
9233ce21e2Sdyoung.Ft ppath_t *
9333ce21e2Sdyoung.Fn ppath_push_idx "ppath_t *" "unsigned int"
9433ce21e2Sdyoung.Ft ppath_t *
9533ce21e2Sdyoung.Fn ppath_push_key "ppath_t *" "const char *"
9633ce21e2Sdyoung.Ft ppath_t *
9733ce21e2Sdyoung.Fn ppath_replace_idx "ppath_t *" "unsigned int"
9833ce21e2Sdyoung.Ft ppath_t *
9933ce21e2Sdyoung.Fn ppath_replace_key "ppath_t *" "const char *"
10033ce21e2Sdyoung.\"
10133ce21e2Sdyoung.Ft ppath_t *
10233ce21e2Sdyoung.Fn ppath_copy "const ppath_t *"
10333ce21e2Sdyoung.Ft ppath_t *
10433ce21e2Sdyoung.Fn ppath_retain "ppath_t *"
10533ce21e2Sdyoung.Ft void
10633ce21e2Sdyoung.Fn ppath_release "ppath_t *"
10733ce21e2Sdyoung.\"
10833ce21e2Sdyoung.Ft prop_object_t
10933ce21e2Sdyoung.Fn ppath_lookup "prop_object_t" "const ppath_t *"
11033ce21e2Sdyoung.\"
11133ce21e2Sdyoung.Sh DESCRIPTION
11233ce21e2SdyoungThe
11333ce21e2Sdyoung.Nm
11433ce21e2Sdyounglibrary provides functions to read, write, or delete objects in a
11533ce21e2Sdyoungproperty list.
11633ce21e2SdyoungA property-list
11733ce21e2Sdyoung.Dq path
11833ce21e2Sdyoungnames the object in a property list to read, write, or delete.
11933ce21e2Sdyoung.Pp
12033ce21e2SdyoungA property-list path is an ordered array of zero or more array
12133ce21e2Sdyoungindices and dictionary keys that names at most one
12233ce21e2Sdyoung.Vt prop_object_t
12333ce21e2Sdyoungin a property list.
12433ce21e2SdyoungThe abstract function
12533ce21e2Sdyoung.Fn E
12633ce21e2Sdyoungevaluates
12733ce21e2Sdyounga property-list path against a
12833ce21e2Sdyoung.Vt prop_object_t ,
12933ce21e2Sdyoung.Va o ,
13033ce21e2Sdyoungto yield a
13133ce21e2Sdyoung.Vt prop_object_t
13233ce21e2Sdyoungresult according to the following recursive definition, where
13333ce21e2Sdyoung.Fa empty
13433ce21e2Sdyoungindicates the empty
13533ce21e2Sdyoung.Pq zero-length
13633ce21e2Sdyoungpath and the operator
13733ce21e2Sdyoung.Dq |
13833ce21e2Sdyoungindicates the concatenation of the path on the left-hand side with
13933ce21e2Sdyoungthe key or index on the right-hand side:
14033ce21e2Sdyoung.Bl -tag -width "E(o, p | index)"
14133ce21e2Sdyoung.It Fn E "o" "empty"
14233ce21e2SdyoungEvaluates to
14333ce21e2Sdyoung.Fa o .
14433ce21e2Sdyoung.It Fn E "o" "p | index"
14533ce21e2SdyoungIf
14633ce21e2Sdyoung.Fn E "o" "p"
14733ce21e2Sdyoungevaluates to a
14833ce21e2Sdyoung.Vt prop_array_t ,
14933ce21e2Sdyoungthen
15033ce21e2Sdyoung.Fn E "o" "p | index"
15133ce21e2Sdyoungevaluates to the
15233ce21e2Sdyoung.Fa index 'th
15333ce21e2Sdyoungelement of that array.
15433ce21e2SdyoungOtherwise, an error occurs.
15533ce21e2Sdyoung.It Fn E "o" "p | key"
15633ce21e2SdyoungIf
15733ce21e2Sdyoung.Fn E "o" "p"
15833ce21e2Sdyoungevaluates to a
15933ce21e2Sdyoung.Vt prop_dictionary_t ,
16033ce21e2Sdyoungthen
16133ce21e2Sdyoung.Fn E "o" "p | key"
16233ce21e2Sdyoungevaluates to the dictionary value stored under
16333ce21e2Sdyoung.Fa key .
16433ce21e2SdyoungOtherwise, an error occurs.
16533ce21e2Sdyoung.El
16633ce21e2Sdyoung.Pp
16733ce21e2SdyoungThe programmer may think of property-list paths as working similarly
16833ce21e2Sdyoungto paths in a file system, where property arrays and dictionaries
16933ce21e2Sdyoungcorrespond to directories, and all other property types correspond
17033ce21e2Sdyoungto files.
17133ce21e2Sdyoung.Sh DATA TYPES
17233ce21e2Sdyoung.Nm
17333ce21e2Sdyoungprovides two opaque types:
17433ce21e2Sdyoung.Bl -tag -width ppath_component
17533ce21e2Sdyoung.It Vt ppath_component_t
17633ce21e2SdyoungA property-list path component: a single key or index.
17733ce21e2Sdyoung.Nm
17833ce21e2Sdyoungcounts references to a
17933ce21e2Sdyoung.Vt ppath_component_t
18033ce21e2Sdyoungand reclaims its storage when there are no more references.
18133ce21e2Sdyoung.It Vt ppath_t
18233ce21e2SdyoungAn array of zero or more property-list path components.
18333ce21e2Sdyoung.Nm
18433ce21e2Sdyoungcounts references to a
18533ce21e2Sdyoung.Vt ppath_t
18633ce21e2Sdyoungand reclaims its storage when there are no more references.
18733ce21e2Sdyoung.El
18833ce21e2Sdyoung.Sh FUNCTIONS
18933ce21e2Sdyoung.Nm
19033ce21e2Sdyoungprovides these functions for manipulating property-list paths
19133ce21e2Sdyoungand their components:
19233ce21e2Sdyoung.Bl -tag -width ppath
19333ce21e2Sdyoung.It Fn ppath_idx "unsigned int index"
19433ce21e2SdyoungAllocate a new
19533ce21e2Sdyoung.Vt ppath_component_t
19633ce21e2Sdyoungfor the given array index and return it.
19733ce21e2SdyoungIts reference count is initially one.
19833ce21e2Sdyoung.Pp
19933ce21e2SdyoungIf there is not sufficient memory to complete the request, return
20033ce21e2Sdyoung.Dv NULL .
20133ce21e2Sdyoung.It Fn ppath_key "const char *key"
20233ce21e2SdyoungAllocate a new
20333ce21e2Sdyoung.Vt ppath_component_t
20433ce21e2Sdyoungfor the given dictionary key and return it.
20533ce21e2SdyoungIts reference count is initially one.
20633ce21e2Sdyoung.Pp
20733ce21e2SdyoungIf there is not sufficient memory to complete the request, return
20833ce21e2Sdyoung.Dv NULL .
20933ce21e2Sdyoung.\"
21033ce21e2Sdyoung.It Fn ppath_component_retain "ppath_component_t *pc"
21133ce21e2SdyoungIncrease the reference count on
21233ce21e2Sdyoung.Fa pc
21333ce21e2Sdyoungby one.
21433ce21e2Sdyoung.It Fn ppath_component_release "ppath_component_t *pc"
21533ce21e2SdyoungDecrease the reference count on
21633ce21e2Sdyoung.Fa pc
21733ce21e2Sdyoungby one.
21833ce21e2SdyoungIf the reference count reaches zero, reclaim the storage
21933ce21e2Sdyoungfor
22033ce21e2Sdyoung.Fa pc .
22133ce21e2Sdyoung.\"
22233ce21e2Sdyoung.It Fn ppath_create "void"
22333ce21e2SdyoungCreate a new property-list path and return it.
22433ce21e2SdyoungIts reference count is initially one.
22533ce21e2SdyoungThe path's length is initially zero.
22633ce21e2Sdyoung.Pp
22733ce21e2SdyoungIf there is not sufficient memory to complete the request, return
22833ce21e2Sdyoung.Dv NULL .
22933ce21e2Sdyoung.It Fn ppath_length "const ppath_t *p"
23033ce21e2SdyoungReturn the number of components in path
23133ce21e2Sdyoung.Fa p .
23233ce21e2Sdyoung.It Fn ppath_component_idx "const ppath_component_t *pc"
23333ce21e2SdyoungReturn the array index represented by the component
23433ce21e2Sdyoung.Fa pc ,
23533ce21e2Sdyoungor \-1 if
23633ce21e2Sdyoung.Fa pc
23733ce21e2Sdyoungdoes not represent an array index.
23833ce21e2Sdyoung.It Fn ppath_component_key "const ppath_component_t *pc"
23933ce21e2SdyoungReturn the dictionary key represented by the component
24033ce21e2Sdyoung.Fa pc ,
24133ce21e2Sdyoungor
24233ce21e2Sdyoung.Dv NULL
24333ce21e2Sdyoungif
24433ce21e2Sdyoung.Fa pc
24533ce21e2Sdyoungdoes not represent a dictionary key.
24633ce21e2Sdyoung.It Fn ppath_pop "ppath_t *p" "ppath_component_t **pcp"
24733ce21e2SdyoungIf
24833ce21e2Sdyoung.Fa p
24933ce21e2Sdyoungis the empty path or
25033ce21e2Sdyoung.Dv NULL ,
25133ce21e2Sdyoungreturn
25233ce21e2Sdyoung.Dv NULL .
25333ce21e2SdyoungOtherwise, remove the last component from
25433ce21e2Sdyoung.Fa p
25533ce21e2Sdyoungand return
25633ce21e2Sdyoung.Fa p ,
25733ce21e2Sdyoungand if
25833ce21e2Sdyoung.Fa pcp
25933ce21e2Sdyoungis not
26033ce21e2Sdyoung.Dv NULL ,
26133ce21e2Sdyoungwrite the removed component to
26233ce21e2Sdyoung.Fa "*pcp" .
26333ce21e2Sdyoung.It Fn ppath_push "ppath_t *p" "ppath_component_t *pc"
26433ce21e2SdyoungIf
26533ce21e2Sdyoungeither
26633ce21e2Sdyoung.Fa p
26733ce21e2Sdyoungis
26833ce21e2Sdyoung.Dv NULL
26933ce21e2Sdyoungor no more components can be added to
27033ce21e2Sdyoung.Fa p ,
27133ce21e2Sdyoungreturn
27233ce21e2Sdyoung.Dv NULL .
27333ce21e2SdyoungOtherwise, append
27433ce21e2Sdyoung.Fa pc
27533ce21e2Sdyoungto the end of the component array
27633ce21e2Sdyoung.Fa p
27733ce21e2Sdyoungand return
27833ce21e2Sdyoung.Fa p .
27933ce21e2Sdyoung.It Fn ppath_component_at "const ppath_t *p" "unsigned int i"
28033ce21e2SdyoungIf
28133ce21e2Sdyoungeither
28233ce21e2Sdyoung.Fa p
28333ce21e2Sdyoungis
28433ce21e2Sdyoung.Dv NULL
28533ce21e2Sdyoungor there is no
28633ce21e2Sdyoung.Fa ith
28733ce21e2Sdyoungcomponent to
28833ce21e2Sdyoung.Fa p ,
28933ce21e2Sdyoungreturn
29033ce21e2Sdyoung.Dv NULL .
29133ce21e2SdyoungOtherwise, return the
29233ce21e2Sdyoung.Fa ith
29333ce21e2Sdyoungcomponent of
29433ce21e2Sdyoung.Fa p .
29533ce21e2SdyoungBefore returning a component,
29633ce21e2Sdyoung.Fn ppath_component_at
29733ce21e2Sdyoungincreases its reference count.
298*aa4b308cSwiz(The first component is 0.)
29933ce21e2Sdyoung.It Fn ppath_subpath "const ppath_t *p" "unsigned int first" "unsigned int exclast"
30033ce21e2SdyoungCreate a new
30133ce21e2Sdyoung.Vt ppath_t
30233ce21e2Sdyoungand fill it with components
30333ce21e2Sdyoung.Fa first
30433ce21e2Sdyoungto
30533ce21e2Sdyoung.Fa exclast
30633ce21e2Sdyoung.Pq exclusive
30733ce21e2Sdyoungof
30833ce21e2Sdyoung.Fa p .
30933ce21e2SdyoungIf there are no such components as those in
31033ce21e2Sdyoung.Fa p ,
31133ce21e2Sdyoung.Fn ppath_subpath
31233ce21e2Sdyoungreturns an empty
31333ce21e2Sdyoung.Vt ppath_t .
31433ce21e2SdyoungIf there is insufficient memory to create the new path, or if
31533ce21e2Sdyoung.Fa p
31633ce21e2Sdyoungis
31733ce21e2Sdyoung.Dv NULL ,
31833ce21e2Sdyoungreturn
31933ce21e2Sdyoung.Dv NULL .
32033ce21e2SdyoungOtherwise, return the new path.
32133ce21e2Sdyoung.It Fn ppath_push_idx "ppath_t *p" "unsigned int idx"
32233ce21e2SdyoungAppend an array index,
32333ce21e2Sdyoung.Fa idx ,
32433ce21e2Sdyoungto the end of path
32533ce21e2Sdyoung.Fa p .
32633ce21e2SdyoungIf
32733ce21e2Sdyoung.Fa p
32833ce21e2Sdyoungis
32933ce21e2Sdyoung.Dv NULL ,
33033ce21e2Sdyoungor if there is insufficient memory to complete the operation,
33133ce21e2Sdyoungreturn
33233ce21e2Sdyoung.Dv NULL .
33333ce21e2SdyoungOtherwise, return
33433ce21e2Sdyoung.Fa p .
33533ce21e2Sdyoung.It Fn ppath_push_key "ppath_t *" "const char *key"
33633ce21e2SdyoungAppend a dictionary key,
33733ce21e2Sdyoung.Fa key ,
33833ce21e2Sdyoungto the end of path
33933ce21e2Sdyoung.Fa p .
34033ce21e2SdyoungIf
34133ce21e2Sdyoung.Fa p
34233ce21e2Sdyoungis
34333ce21e2Sdyoung.Dv NULL ,
34433ce21e2Sdyoungor if there is insufficient memory to complete the operation,
34533ce21e2Sdyoungreturn
34633ce21e2Sdyoung.Dv NULL .
34733ce21e2SdyoungOtherwise, return
34833ce21e2Sdyoung.Fa p .
34933ce21e2Sdyoung.It Fn ppath_replace_idx "ppath_t *p" "unsigned int idx"
35033ce21e2SdyoungReplace the array index at the end of path
35133ce21e2Sdyoung.Fa p
35233ce21e2Sdyoungwith the array index
35333ce21e2Sdyoung.Fa idx .
35433ce21e2SdyoungIf
35533ce21e2Sdyoung.Fa p
35633ce21e2Sdyoungis
35733ce21e2Sdyoung.Dv NULL ,
35833ce21e2Sdyoungif the last component of
35933ce21e2Sdyoung.Fa p
36033ce21e2Sdyoungis not an array index,
36133ce21e2Sdyoungor if there is insufficient memory to complete the operation,
36233ce21e2Sdyoungreturn
36333ce21e2Sdyoung.Dv NULL .
36433ce21e2SdyoungOtherwise, return
36533ce21e2Sdyoung.Fa p .
36633ce21e2Sdyoung.It Fn ppath_replace_key "ppath_t *p" "const char *key"
36733ce21e2SdyoungReplace the dictionary key at the end of path
36833ce21e2Sdyoung.Fa p
36933ce21e2Sdyoungwith the dictionary key
37033ce21e2Sdyoung.Fa idx .
37133ce21e2SdyoungIf
37233ce21e2Sdyoung.Fa p
37333ce21e2Sdyoungis
37433ce21e2Sdyoung.Dv NULL ,
37533ce21e2Sdyoungif the last component of
37633ce21e2Sdyoung.Fa p
37733ce21e2Sdyoungis not a dictionary key,
37833ce21e2Sdyoungor if there is insufficient memory to complete the operation,
37933ce21e2Sdyoungreturn
38033ce21e2Sdyoung.Dv NULL .
38133ce21e2SdyoungOtherwise, return
38233ce21e2Sdyoung.Fa p .
38333ce21e2Sdyoung.\"
38433ce21e2Sdyoung.It Fn ppath_copy "const ppath_t *p"
38533ce21e2SdyoungCreate a copy of path
38633ce21e2Sdyoung.Fa p .
38733ce21e2SdyoungIf
38833ce21e2Sdyoung.Fa p
38933ce21e2Sdyoungis
39033ce21e2Sdyoung.Dv NULL ,
39133ce21e2Sdyoungor if there is insufficient memory to complete the operation,
39233ce21e2Sdyoungreturn
39333ce21e2Sdyoung.Dv NULL .
39433ce21e2SdyoungOtherwise, return the copy, whose reference count will be one.
39533ce21e2Sdyoung.It Fn ppath_retain "ppath_t *p"
39633ce21e2SdyoungIncrease the reference count on
39733ce21e2Sdyoung.Fa p
39833ce21e2Sdyoungand return
39933ce21e2Sdyoung.Fa p .
40033ce21e2Sdyoung.It Fn ppath_release "ppath_t *p"
40133ce21e2SdyoungDecrease the reference count on
40233ce21e2Sdyoung.Fa p .
40333ce21e2SdyoungReclaim the storage for
40433ce21e2Sdyoung.Fa p
40533ce21e2Sdyoungif the reference count reaches zero.
40633ce21e2Sdyoung.\"
40733ce21e2Sdyoung.It Fn ppath_lookup "prop_object_t o" "const ppath_t *p"
40833ce21e2SdyoungReturn the
40933ce21e2Sdyoung.Vt prop_object_t
41033ce21e2Sdyoungunder
41133ce21e2Sdyoung.Fa o
41233ce21e2Sdyoungnamed by
41333ce21e2Sdyoung.Fa p ,
41433ce21e2Sdyoungor return
41533ce21e2Sdyoung.Dv NULL
41633ce21e2Sdyoungif no such
41733ce21e2Sdyoung.Vt prop_object_t
41833ce21e2Sdyoungis under
41933ce21e2Sdyoung.Fa o .
42033ce21e2Sdyoung.El
42133ce21e2Sdyoung.Sh SEE ALSO
42233ce21e2Sdyoung.\" Cross-references should be ordered by section (low to high), then in
42333ce21e2Sdyoung.\"     alphabetical order.
42433ce21e2Sdyoung.Xr ppath_bool 3 ,
425*aa4b308cSwiz.\" .Xr ppath_data 3 ,
42633ce21e2Sdyoung.Xr ppath_number 3 ,
42733ce21e2Sdyoung.Xr ppath_object 3 ,
428*aa4b308cSwiz.\" .Xr ppath_string 3 ,
42933ce21e2Sdyoung.Xr proplib 3
43033ce21e2Sdyoung.Sh HISTORY
43133ce21e2SdyoungThe
43233ce21e2Sdyoung.Nm
43333ce21e2Sdyoungproperty container path library first appeared in
43433ce21e2Sdyoung.Nx 6.0 .
43533ce21e2Sdyoung.Sh AUTHORS
43633ce21e2Sdyoung.An David Young
43733ce21e2Sdyoung.Aq dyoung@pobox.com
43833ce21e2Sdyoung.\" .Sh CAVEATS
43933ce21e2Sdyoung.\" .Sh BUGS
44033ce21e2Sdyoung.\" .Sh SECURITY CONSIDERATIONS
441