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