Module Name:    src
Committed By:   thorpej
Date:           Thu Jan 21 15:53:16 UTC 2021

Modified Files:
        src/distrib/sets/lists/comp: mi
        src/share/man/man9: Makefile
Added Files:
        src/share/man/man9: strlist.9

Log Message:
Add a manual page for strlist(9).


To generate a diff of this commit:
cvs rdiff -u -r1.2371 -r1.2372 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.453 -r1.454 src/share/man/man9/Makefile
cvs rdiff -u -r0 -r1.1 src/share/man/man9/strlist.9

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.2371 src/distrib/sets/lists/comp/mi:1.2372
--- src/distrib/sets/lists/comp/mi:1.2371	Sun Jan 17 19:32:52 2021
+++ src/distrib/sets/lists/comp/mi	Thu Jan 21 15:53:15 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: mi,v 1.2371 2021/01/17 19:32:52 rillig Exp $
+#	$NetBSD: mi,v 1.2372 2021/01/21 15:53:15 thorpej Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 ./etc/mtree/set.comp				comp-sys-root
@@ -12227,6 +12227,14 @@
 ./usr/share/man/cat9/sprintf.0			comp-obsolete		obsolete
 ./usr/share/man/cat9/stathz.0			comp-sys-catman		.cat
 ./usr/share/man/cat9/store.0			comp-obsolete		obsolete
+./usr/share/man/cat9/strlist.0			comp-sys-catman		.cat
+./usr/share/man/cat9/strlist_append.0		comp-sys-catman		.cat
+./usr/share/man/cat9/strlist_count.0		comp-sys-catman		.cat
+./usr/share/man/cat9/strlist_index.0		comp-sys-catman		.cat
+./usr/share/man/cat9/strlist_match.0		comp-sys-catman		.cat
+./usr/share/man/cat9/strlist_next.0		comp-sys-catman		.cat
+./usr/share/man/cat9/strlist_pmatch.0		comp-sys-catman		.cat
+./usr/share/man/cat9/strlist_string.0		comp-sys-catman		.cat
 ./usr/share/man/cat9/subyte.0			comp-obsolete		obsolete
 ./usr/share/man/cat9/suibyte.0			comp-obsolete		obsolete
 ./usr/share/man/cat9/suiword.0			comp-obsolete		obsolete
@@ -20361,6 +20369,14 @@
 ./usr/share/man/html9/sprintf.html		comp-obsolete		obsolete
 ./usr/share/man/html9/stathz.html		comp-sys-htmlman	html
 ./usr/share/man/html9/store.html		comp-obsolete		obsolete
+./usr/share/man/html9/strlist.html		comp-sys-htmlman	html
+./usr/share/man/html9/strlist_append.html	comp-sys-htmlman	html
+./usr/share/man/html9/strlist_count.html	comp-sys-htmlman	html
+./usr/share/man/html9/strlist_index.html	comp-sys-htmlman	html
+./usr/share/man/html9/strlist_match.html	comp-sys-htmlman	html
+./usr/share/man/html9/strlist_next.html		comp-sys-htmlman	html
+./usr/share/man/html9/strlist_pmatch.html	comp-sys-htmlman	html
+./usr/share/man/html9/strlist_string.html	comp-sys-htmlman	html
 ./usr/share/man/html9/subyte.html		comp-obsolete		obsolete
 ./usr/share/man/html9/suibyte.html		comp-obsolete		obsolete
 ./usr/share/man/html9/suiword.html		comp-obsolete		obsolete
@@ -28693,6 +28709,14 @@
 ./usr/share/man/man9/sprintf.9			comp-obsolete		obsolete
 ./usr/share/man/man9/stathz.9			comp-sys-man		.man
 ./usr/share/man/man9/store.9			comp-obsolete		obsolete
+./usr/share/man/man9/strlist.9			comp-sys-man		.man
+./usr/share/man/man9/strlist_append.9		comp-sys-man		.man
+./usr/share/man/man9/strlist_count.9		comp-sys-man		.man
+./usr/share/man/man9/strlist_index.9		comp-sys-man		.man
+./usr/share/man/man9/strlist_match.9		comp-sys-man		.man
+./usr/share/man/man9/strlist_next.9		comp-sys-man		.man
+./usr/share/man/man9/strlist_pmatch.9		comp-sys-man		.man
+./usr/share/man/man9/strlist_string.9		comp-sys-man		.man
 ./usr/share/man/man9/subyte.9			comp-obsolete		obsolete
 ./usr/share/man/man9/suibyte.9			comp-obsolete		obsolete
 ./usr/share/man/man9/suiword.9			comp-obsolete		obsolete

Index: src/share/man/man9/Makefile
diff -u src/share/man/man9/Makefile:1.453 src/share/man/man9/Makefile:1.454
--- src/share/man/man9/Makefile:1.453	Sat Oct 31 22:43:01 2020
+++ src/share/man/man9/Makefile	Thu Jan 21 15:53:16 2021
@@ -1,4 +1,4 @@
-#       $NetBSD: Makefile,v 1.453 2020/10/31 22:43:01 uwe Exp $
+#       $NetBSD: Makefile,v 1.454 2021/01/21 15:53:16 thorpej Exp $
 
 #	Makefile for section 9 (kernel function and variable) manual pages.
 
@@ -54,6 +54,7 @@ MAN=	accept_filter.9 accf_data.9 accf_ht
 	SET.9 setbit.9 setjmp.9 shutdownhook_establish.9 \
 	signal.9 skpc.9 sockopt.9 softintr.9 spl.9 specificdata.9 \
 	spi.9 splraiseipl.9 \
+	strlist.9 \
 	suspendsched.9 \
 	sysctl.9 sysmon_envsys.9 sysmon_pswitch.9 sysmon_taskq.9 tc.9 \
 	tcp_congctl.9 thmap.9 threadpool.9 timecounter.9 time_second.9 todr.9 \
@@ -885,6 +886,13 @@ MLINKS+=spl.9 spl0.9 spl.9 splbio.9 spl.
 	spl.9 splsoftclock.9 spl.9 splsoftnet.9 spl.9 splsoftserial.9 \
 	spl.9 splstatclock.9 spl.9 spltty.9 spl.9 splvm.9 spl.9 splx.9 \
 	spl.9 splsoftbio.9
+MLINKS+=strlist.9 strlist_append.9 \
+	strlist.9 strlist_count.9 \
+	strlist.9 strlist_index.9 \
+	strlist.9 strlist_match.9 \
+	strlist.9 strlist_next.9 \
+	strlist.9 strlist_pmatch.9 \
+	strlist.9 strlist_string.9
 MLINKS+=sysctl.9 old_sysctl.9 \
 	sysctl.9 sysctl_create.9 \
 	sysctl.9 sysctl_createv.9 \

Added files:

Index: src/share/man/man9/strlist.9
diff -u /dev/null src/share/man/man9/strlist.9:1.1
--- /dev/null	Thu Jan 21 15:53:16 2021
+++ src/share/man/man9/strlist.9	Thu Jan 21 15:53:16 2021
@@ -0,0 +1,218 @@
+.\"	$NetBSD: strlist.9,v 1.1 2021/01/21 15:53:16 thorpej Exp $
+.\"
+.\" Copyright (c) 2021 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Jason R. Thorpe.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd January 20, 2021
+.Dt OFSL 9
+.Os
+.Sh NAME
+.Nm strlist ,
+.Nm strlist_next ,
+.Nm strlist_count ,
+.Nm strlist_string ,
+.Nm strlist_match ,
+.Nm strlist_index ,
+.Nm strlist_append
+.Nd functions to interact with OpenFirmware-style string lists
+.Sh SYNOPSIS
+.In sys/systm.h
+.Ft const char *
+.Fn strlist_next "const char *sl" "size_t slsize" "size_t *cursorp"
+.Ft void
+.Fn strlist_count "const char *sl" "size_t slsize"
+.Ft const char *
+.Fn strlist_string "const char *sl" "size_t slsize" "unsigned int index"
+.Ft int
+.Fn strlist_match "const char *sl" "size_t slsize" "const char *str"
+.Ft int
+.Fn strlist_pmatch "const char *sl" "size_t slsize" "const char *pattern"
+.Ft int
+.Fn strlist_index "const char *sl" "size_t slsize" "const char *str"
+.Ft bool
+.Fn strlist_append "char **slp" "size_t *slsizep" "const char *str"
+.Sh DESCRIPTION
+The
+.Nm
+functions provide a simple way to interact with OpenFirmware
+.Pq IEEE 1275
+string lists.
+.Pp
+An OpenFirmware string list is simply a buffer containing one or more
+NUL-terminated strings concatenated together.
+For example, a string list containing the strings
+.Dq foo ,
+.Dq bar ,
+and
+.Dq baz
+would be represented in memory as:
+.Bd -literal -offset indent
+foo\\0bar\\0baz\\0
+.Ed
+.Pp
+The following functions are available:
+.Bl -tag -width "xxxxx"
+.It Fn strlist_next "const char *sl" "size_t slsize" "size_t *cursorp"
+This function provides a way to enumerate the strings in a string list.
+To enumerate a string list, initialize
+.Fa cursor
+to 0 and pass it by reference to
+.Fn strlist_next .
+Each call to
+.Fn strlist_next
+returns the current string and advances the cursor to the next string in
+the list.
+If all strings in the list have been enumerated,
+.Fn strlist_next
+will return
+.Dv NULL .
+.It Fn strlist_count "const char *sl" "size_t slsize"
+Returns the number of strings in the string list.
+.It Fn strlist_string "const char *sl" "size_t slsize" "unsigned int index"
+Returns a pointer to the string in the string list at the specified
+index or
+.Dv NULL
+if the index is out of range.
+.It Fn strlist_match "const char *sl" "size_t slsize" "const char *str"
+Returns a weighted match value if the specified string appears in
+the string list.
+The value returned is the number of strings in the string list
+minus the index of the matched string.
+For example, if a string list contains the strings
+.Dq foo ,
+.Dq bar ,
+and
+.Dq baz ,
+a match against
+.Dq foo
+returns 3 and a match against
+.Dq baz
+returns 1.
+If the string does not appear in the string list, 0 is returned.
+.It Fn strlist_pmatch "const char *sl" "size_t slsize" "const char *pattern"
+Like
+.Fn strlist_match ,
+but uses
+.Fn pmatch
+to compare strings, allowing for wildcard characters to be specified in
+.Fa pattern .
+.It Fn strlist_index "const char *sl" "size_t slsize" "const char *str"
+Returns the index of the specified string if it appears in the
+string list, or -1 if the string does not appear in the string list.
+.It Fn strlist_append "char **slp" "size_t *slsizep" "const char *str"
+Appends a copy of the specified string to the stringlist.
+Begin by initializing
+.Fa sl
+to
+.Dv NULL
+and
+.Fa slsize
+to 0.
+Pass these by reference to
+.Fn strlist_append .
+New memory for the string list will be allocated as needed.
+The resulting string list can be freed with
+.Fn kmem_free .
+Returns
+.Dv true
+if the string was successfully appended to the string list or
+.Dv false
+if memory allocation fails.
+.El
+.Sh EXAMPLES
+The following shows an example of string list enumeration using
+.Fn strlist_next :
+.Bd -literal
+void
+print_stringlist(const char *sl, size_t slsize)
+{
+	const char *cp;
+	size_t cursor;
+
+	printf("There are %u strings in the string list:\\n",
+	    strlist_count(sl, slsize));
+	for (cursor = 0;
+	     (cp = strlist_next(sl, slsize, &cursor) != NULL; ) {
+		printf("\\t%s\\n", cp);
+	}
+}
+.Ed
+.Pp
+The following example shows a simple way to use
+.Fn strlist_match :
+.Bd -literal
+bool
+is_compatible(int phandle, const char *compat_str)
+{
+	char buf[128];
+	int proplen;
+
+	proplen = OF_getprop(phandle, "compatible", buf, sizeof(buf));
+	return strlist_match(buf, proplen, compat_str) != 0;
+}
+.Ed
+.Pp
+The following example shows a use of
+.Fn strlist_pmatch :
+.Bd -literal
+bool
+is_pc_printer_port(const char *pnp_id_list, size_t list_size)
+{
+	return strlist_pmatch(pnp_id_list, list_size, "PNP04??") != 0;
+}
+.Ed
+.Pp
+The folowing example converts an array of strings to a string list using
+.Fn strlist_append :
+.Bd -literal
+char *
+string_array_to_string_list(const char **array, int count,
+    size_t *slsizep)
+{
+	char *sl;
+	size_t slsize;
+	int i;
+
+	for (i = 0, sl = NULL, slsize = 0; i < count; i++) {
+		if (!strlist_append(&sl, &slsize, array[i])) {
+			kmem_free(sl, slsize);
+			return NULL;
+		}
+	}
+
+	*slsizep = slsize;
+	return sl;
+}
+.Ed
+.Sh SEE ALSO
+.Xr kmem 9 ,
+.Xr pmatch 9
+.Sh HISTORY
+The
+.Xr strlist 9
+functions first appeared in
+.Nx 10.0 .

Reply via email to