1 # SOME DESCRIPTIVE TITLE
2 # Copyright (C) YEAR Free Software Foundation, Inc.
3 # This file is distributed under the same license as the PACKAGE package.
4 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
9 "Project-Id-Version: PACKAGE VERSION\n"
10 "POT-Creation-Date: 2012-03-19 23:50+0900\n"
11 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Language-Team: LANGUAGE <LL@li.org>\n"
16 "Content-Type: text/plain; charset=CHARSET\n"
17 "Content-Transfer-Encoding: 8bit\n"
20 #: build/C/man3/bsearch.3:29
26 #: build/C/man3/bsearch.3:29
32 #: build/C/man3/bsearch.3:29 build/C/man3/hsearch.3:35 build/C/man3/insque.3:34 build/C/man3/lsearch.3:25 build/C/man3/qsort.3:34 build/C/man3/tsearch.3:24
34 msgid "Linux Programmer's Manual"
38 #: build/C/man3/bsearch.3:30 build/C/man3/hsearch.3:36 build/C/man3/insque.3:35 build/C/man3/lsearch.3:26 build/C/man3/qsort.3:35 build/C/man3/tsearch.3:25
44 #: build/C/man3/bsearch.3:32
45 msgid "bsearch - binary search of a sorted array"
49 #: build/C/man3/bsearch.3:32 build/C/man3/hsearch.3:39 build/C/man3/insque.3:37 build/C/man3/lsearch.3:28 build/C/man3/qsort.3:37 build/C/man3/tsearch.3:27
55 #: build/C/man3/bsearch.3:35 build/C/man3/qsort.3:40
57 msgid "B<#include E<lt>stdlib.hE<gt>>\n"
61 #: build/C/man3/bsearch.3:39
64 "B<void *bsearch(const void *>I<key>B<, const void *>I<base>B<,>\n"
65 "B< size_t >I<nmemb>B<, size_t >I<size>B<,>\n"
66 "B< int (*>I<compar>B<)(const void *, const void *));>\n"
70 #: build/C/man3/bsearch.3:40 build/C/man3/hsearch.3:60 build/C/man3/insque.3:59 build/C/man3/lsearch.3:38 build/C/man3/qsort.3:44 build/C/man3/tsearch.3:50
76 #: build/C/man3/bsearch.3:48
78 "The B<bsearch>() function searches an array of I<nmemb> objects, the "
79 "initial member of which is pointed to by I<base>, for a member that matches "
80 "the object pointed to by I<key>. The size of each member of the array is "
81 "specified by I<size>."
85 #: build/C/man3/bsearch.3:57
87 "The contents of the array should be in ascending sorted order according to "
88 "the comparison function referenced by I<compar>. The I<compar> routine is "
89 "expected to have two arguments which point to the I<key> object and to an "
90 "array member, in that order, and should return an integer less than, equal "
91 "to, or greater than zero if the I<key> object is found, respectively, to be "
92 "less than, to match, or be greater than the array member."
96 #: build/C/man3/bsearch.3:57 build/C/man3/hsearch.3:174 build/C/man3/lsearch.3:58 build/C/man3/qsort.3:61 build/C/man3/tsearch.3:132
102 #: build/C/man3/bsearch.3:64
104 "The B<bsearch>() function returns a pointer to a matching member of the "
105 "array, or NULL if no match is found. If there are multiple elements that "
106 "match the key, the element returned is unspecified."
110 #: build/C/man3/bsearch.3:64 build/C/man3/hsearch.3:226 build/C/man3/insque.3:97 build/C/man3/lsearch.3:66 build/C/man3/qsort.3:65 build/C/man3/tsearch.3:153
112 msgid "CONFORMING TO"
116 #: build/C/man3/bsearch.3:66
117 msgid "SVr4, 4.3BSD, POSIX.1-2001, C89, C99."
121 #: build/C/man3/bsearch.3:66 build/C/man3/hsearch.3:273 build/C/man3/insque.3:132 build/C/man3/qsort.3:77 build/C/man3/tsearch.3:181
127 #: build/C/man3/bsearch.3:71
129 "The example below first sorts an array of structures using B<qsort>(3), then "
130 "retrieves desired elements using B<bsearch>()."
134 #: build/C/man3/bsearch.3:76 build/C/man3/qsort.3:88
137 "#include E<lt>stdio.hE<gt>\n"
138 "#include E<lt>stdlib.hE<gt>\n"
139 "#include E<lt>string.hE<gt>\n"
143 #: build/C/man3/bsearch.3:85
150 " { 1, \"jan\" }, { 2, \"feb\" }, { 3, \"mar\" }, { 4, \"apr\" },\n"
151 " { 5, \"may\" }, { 6, \"jun\" }, { 7, \"jul\" }, { 8, \"aug\" },\n"
152 " { 9, \"sep\" }, {10, \"oct\" }, {11, \"nov\" }, {12, \"dec\" }\n"
157 #: build/C/man3/bsearch.3:87
159 msgid "#define nr_of_months (sizeof(months)/sizeof(months[0]))\n"
163 #: build/C/man3/bsearch.3:95
167 "compmi(const void *m1, const void *m2)\n"
169 " struct mi *mi1 = (struct mi *) m1;\n"
170 " struct mi *mi2 = (struct mi *) m2;\n"
171 " return strcmp(mi1-E<gt>name, mi2-E<gt>name);\n"
176 #: build/C/man3/bsearch.3:100
180 "main(int argc, char **argv)\n"
186 #: build/C/man3/bsearch.3:114
189 " qsort(months, nr_of_months, sizeof(struct mi), compmi);\n"
190 " for (i = 1; i E<lt> argc; i++) {\n"
191 " struct mi key, *res;\n"
192 " key.name = argv[i];\n"
193 " res = bsearch(&key, months, nr_of_months,\n"
194 " sizeof(struct mi), compmi);\n"
195 " if (res == NULL)\n"
196 " printf(\"\\(aq%s\\(aq: unknown month\\en\", argv[i]);\n"
198 " printf(\"%s: month #%d\\en\", res-E<gt>name, res-E<gt>nr);\n"
200 " exit(EXIT_SUCCESS);\n"
205 #: build/C/man3/bsearch.3:116 build/C/man3/hsearch.3:323 build/C/man3/lsearch.3:71 build/C/man3/qsort.3:116 build/C/man3/tsearch.3:258
211 #: build/C/man3/bsearch.3:121
212 msgid "B<hsearch>(3), B<lsearch>(3), B<qsort>(3), B<tsearch>(3)"
216 #: build/C/man3/bsearch.3:121 build/C/man3/hsearch.3:328 build/C/man3/insque.3:242 build/C/man3/lsearch.3:75 build/C/man3/qsort.3:121 build/C/man3/tsearch.3:263
222 #: build/C/man3/bsearch.3:128 build/C/man3/hsearch.3:335 build/C/man3/insque.3:249 build/C/man3/lsearch.3:82 build/C/man3/qsort.3:128 build/C/man3/tsearch.3:270
224 "This page is part of release 3.35 of the Linux I<man-pages> project. A "
225 "description of the project, and information about reporting bugs, can be "
226 "found at http://man7.org/linux/man-pages/."
230 #: build/C/man3/hsearch.3:35
236 #: build/C/man3/hsearch.3:35
242 #: build/C/man3/hsearch.3:35 build/C/man3/lsearch.3:25 build/C/man3/tsearch.3:24
248 #: build/C/man3/hsearch.3:39
250 "hcreate, hdestroy, hsearch, hcreate_r, hdestroy_r, hsearch_r - hash table "
255 #: build/C/man3/hsearch.3:42 build/C/man3/hsearch.3:52 build/C/man3/insque.3:40 build/C/man3/lsearch.3:31 build/C/man3/tsearch.3:30 build/C/man3/tsearch.3:47
257 msgid "B<#include E<lt>search.hE<gt>>\n"
261 #: build/C/man3/hsearch.3:44
263 msgid "B<int hcreate(size_t >I<nel>B<);>\n"
267 #: build/C/man3/hsearch.3:46
269 msgid "B<ENTRY *hsearch(ENTRY >I<item>B<, ACTION >I<action>B<);>\n"
273 #: build/C/man3/hsearch.3:48
275 msgid "B<void hdestroy(void);>\n"
279 #: build/C/man3/hsearch.3:50 build/C/man3/tsearch.3:45
281 msgid "B<#define _GNU_SOURCE> /* See feature_test_macros(7) */\n"
285 #: build/C/man3/hsearch.3:54
287 msgid "B<int hcreate_r(size_t >I<nel>B<, struct hsearch_data *>I<htab>B<);>\n"
291 #: build/C/man3/hsearch.3:57
294 "B<int hsearch_r(ENTRY >I<item>B<, ACTION >I<action>B<, ENTRY "
296 "B< struct hsearch_data *>I<htab>B<);>\n"
300 #: build/C/man3/hsearch.3:59
302 msgid "B<void hdestroy_r(struct hsearch_data *>I<htab>B<);>\n"
306 #: build/C/man3/hsearch.3:69
308 "The three functions B<hcreate>(), B<hsearch>(), and B<hdestroy>() allow the "
309 "caller to create and manage a hash search table containing entries "
310 "consisting of a key (a string) and associated data. Using these functions, "
311 "only one hash table can be used at a time."
315 #: build/C/man3/hsearch.3:83
317 "The three functions B<hcreate_r>(), B<hsearch_r>(), B<hdestroy_r>() are "
318 "reentrant versions that allow a program to use more than one hash search "
319 "table at the same time. The last argument, I<htab>, points to a structure "
320 "that describes the table on which the function is to operate. The "
321 "programmer should treat this structure as opaque (i.e., do not attempt to "
322 "directly access or modify the fields in this structure)."
325 #. e.g., in glibc it is raised to the next higher prime number
327 #: build/C/man3/hsearch.3:92
329 "First a hash table must be created using B<hcreate>(). The argument I<nel> "
330 "specifies the maximum number of entries in the table. (This maximum cannot "
331 "be changed later, so choose it wisely.) The implementation may adjust this "
332 "value upward to improve the performance of the resulting hash table."
336 #: build/C/man3/hsearch.3:103
338 "The B<hcreate_r>() function performs the same task as B<hcreate>(), but for "
339 "the table described by the structure I<*htab>. The structure pointed to by "
340 "I<htab> must be zeroed before the first call to B<hcreate_r>()."
344 #: build/C/man3/hsearch.3:118
346 "The function B<hdestroy>() frees the memory occupied by the hash table that "
347 "was created by B<hcreate>(). After calling B<hdestroy>() a new hash table "
348 "can be created using B<hcreate>(). The B<hdestroy_r>() function performs "
349 "the analogous task for a hash table described by I<*htab>, which was "
350 "previously created using B<hcreate_r>()."
354 #: build/C/man3/hsearch.3:125
356 "The B<hsearch>() function searches the hash table for an item with the same "
357 "key as I<item> (where \"the same\" is determined using B<strcmp>(3)), and if "
358 "successful returns a pointer to it."
362 #: build/C/man3/hsearch.3:128
364 "The argument I<item> is of type I<ENTRY>, which is defined in "
365 "I<E<lt>search.hE<gt>> as follows:"
369 #: build/C/man3/hsearch.3:135
372 "typedef struct entry {\n"
379 #: build/C/man3/hsearch.3:141
381 "The field I<key> points to a null-terminated string which is the search "
382 "key. The field I<data> points to data that is associated with that key."
386 #: build/C/man3/hsearch.3:160
388 "The argument I<action> determines what B<hsearch>() does after an "
389 "unsuccessful search. This argument must either have the value B<ENTER>, "
390 "meaning insert a copy of I<item> (and return a pointer to the new hash table "
391 "entry as the function result), or the value B<FIND>, meaning that NULL "
392 "should be returned. (If I<action> is B<FIND>, then I<data> is ignored.)"
396 #: build/C/man3/hsearch.3:174
398 "The B<hsearch_r>() function is like B<hsearch>() but operates on the hash "
399 "table described by I<*htab>. The B<hsearch_r>() function differs from "
400 "B<hsearch>() in that a pointer to the found item is returned in I<*retval>, "
401 "rather than as the function result."
405 #: build/C/man3/hsearch.3:180
407 "B<hcreate>() and B<hcreate_r>() return nonzero on success. They return 0 "
412 #: build/C/man3/hsearch.3:191
414 "On success, B<hsearch>() returns a pointer to an entry in the hash table. "
415 "B<hsearch>() returns NULL on error, that is, if I<action> is B<ENTER> and "
416 "the hash table is full, or I<action> is B<FIND> and I<item> cannot be found "
417 "in the hash table. B<hsearch_r>() returns nonzero on success, and 0 on "
422 #: build/C/man3/hsearch.3:191
428 #: build/C/man3/hsearch.3:197
429 msgid "B<hcreate_r>() and B<hdestroy_r>() can fail for the following reasons:"
433 #: build/C/man3/hsearch.3:197
439 #: build/C/man3/hsearch.3:201
440 msgid "I<htab> is NULL."
444 #: build/C/man3/hsearch.3:206
445 msgid "B<hsearch>() and B<hsearch_r>() can fail for the following reasons:"
449 #: build/C/man3/hsearch.3:206
455 #: build/C/man3/hsearch.3:214
457 "I<action> was B<ENTER>, I<key> was not found in the table, and there was no "
458 "room in the table to add a new entry."
462 #: build/C/man3/hsearch.3:214
468 #: build/C/man3/hsearch.3:222
469 msgid "I<action> was B<FIND>, and I<key> was not found in the table."
473 #: build/C/man3/hsearch.3:226
474 msgid "POSIX.1-2001 only specifies the B<ENOMEM> error."
478 #: build/C/man3/hsearch.3:239
480 "The functions B<hcreate>(), B<hsearch>(), and B<hdestroy>() are from SVr4, "
481 "and are described in POSIX.1-2001. The functions B<hcreate_r>(), "
482 "B<hsearch_r>(), and B<hdestroy_r>() are GNU extensions."
486 #: build/C/man3/hsearch.3:239 build/C/man3/insque.3:99 build/C/man3/qsort.3:67 build/C/man3/tsearch.3:158
492 #: build/C/man3/hsearch.3:246
494 "Hash table implementations are usually more efficient when the table "
495 "contains enough free space to minimize collisions. Typically, this means "
496 "that I<nel> should be at least 25% larger than the maximum number of "
497 "elements that the caller expects to store in the table."
501 #: build/C/man3/hsearch.3:264
503 "The B<hdestroy>() and B<hdestroy_r>() functions do not free the buffers "
504 "pointed to by the I<key> and I<data> elements of the hash table entries. "
505 "(It can't do this because it doesn't know whether these buffers were "
506 "allocated dynamically.) If these buffers need to be freed (perhaps because "
507 "the program is repeatedly creating and destroying hash tables, rather than "
508 "creating a single table whose lifetime matches that of the program), then "
509 "the program must maintain bookkeeping data structures that allow it to free "
514 #: build/C/man3/hsearch.3:264 build/C/man3/insque.3:125 build/C/man3/lsearch.3:69
520 #: build/C/man3/hsearch.3:271
522 "SVr4 and POSIX.1-2001 specify that I<action> is significant only for "
523 "unsuccessful searches, so that an B<ENTER> should not do anything for a "
524 "successful search. In libc and glibc (before version 2.3), the "
525 "implementation violates the specification, updating the I<data> for the "
526 "given I<key> in this case."
530 #: build/C/man3/hsearch.3:273
531 msgid "Individual hash table entries can be added, but not deleted."
535 #: build/C/man3/hsearch.3:277
537 "The following program inserts 24 items into a hash table, then prints some "
542 #: build/C/man3/hsearch.3:282
545 "#include E<lt>stdio.hE<gt>\n"
546 "#include E<lt>stdlib.hE<gt>\n"
547 "#include E<lt>search.hE<gt>\n"
551 #: build/C/man3/hsearch.3:289
554 "char *data[] = { \"alpha\", \"bravo\", \"charlie\", \"delta\",\n"
555 " \"echo\", \"foxtrot\", \"golf\", \"hotel\", \"india\", \"juliet\",\n"
556 " \"kilo\", \"lima\", \"mike\", \"november\", \"oscar\", \"papa\",\n"
557 " \"quebec\", \"romeo\", \"sierra\", \"tango\", \"uniform\",\n"
558 " \"victor\", \"whisky\", \"x-ray\", \"yankee\", \"zulu\"\n"
563 #: build/C/man3/hsearch.3:295
574 #: build/C/man3/hsearch.3:297
576 msgid " hcreate(30);\n"
580 #: build/C/man3/hsearch.3:310
583 " for (i = 0; i E<lt> 24; i++) {\n"
584 " e.key = data[i];\n"
585 " /* data is just an integer, instead of a\n"
586 " pointer to something */\n"
587 " e.data = (void *) i;\n"
588 " ep = hsearch(e, ENTER);\n"
589 " /* there should be no failures */\n"
590 " if (ep == NULL) {\n"
591 " fprintf(stderr, \"entry failed\\en\");\n"
592 " exit(EXIT_FAILURE);\n"
598 #: build/C/man3/hsearch.3:322
601 " for (i = 22; i E<lt> 26; i++) {\n"
602 " /* print two entries from the table, and\n"
603 " show that two are not in the table */\n"
604 " e.key = data[i];\n"
605 " ep = hsearch(e, FIND);\n"
606 " printf(\"%9.9s -E<gt> %9.9s:%d\\en\", e.key,\n"
607 " ep ? ep-E<gt>key : \"NULL\", ep ? (int)(ep-E<gt>data) : 0);\n"
610 " exit(EXIT_SUCCESS);\n"
615 #: build/C/man3/hsearch.3:328
616 msgid "B<bsearch>(3), B<lsearch>(3), B<malloc>(3), B<tsearch>(3)"
620 #: build/C/man3/insque.3:34
626 #: build/C/man3/insque.3:34
632 #: build/C/man3/insque.3:37
633 msgid "insque, remque - insert/remove an item from a queue"
637 #: build/C/man3/insque.3:42
639 msgid "B<void insque(void *>I<elem>B<, void *>I<prev>B<);>\n"
643 #: build/C/man3/insque.3:44
645 msgid "B<void remque(void *>I<elem>B<);>\n"
649 #: build/C/man3/insque.3:49
650 msgid "Feature Test Macro Requirements for glibc (see B<feature_test_macros>(7)):"
654 #: build/C/man3/insque.3:54
655 msgid "B<insque>(), B<remque>():"
659 #: build/C/man3/insque.3:57
661 "_SVID_SOURCE || _XOPEN_SOURCE\\ E<gt>=\\ 500 || _XOPEN_SOURCE\\ &&\\ "
662 "_XOPEN_SOURCE_EXTENDED"
666 #: build/C/man3/insque.3:71
668 "The B<insque>() and B<remque>() functions manipulate doubly-linked lists. "
669 "Each element in the list is a structure of which the first two elements are "
670 "a forward and a backward pointer. The linked list may be linear (i.e., NULL "
671 "forward pointer at the end of the list and NULL backward pointer at the "
672 "start of the list) or circular."
676 #: build/C/man3/insque.3:76
678 "The B<insque>() function inserts the element pointed to by I<elem> "
679 "immediately after the element pointed to by I<prev>."
683 #: build/C/man3/insque.3:83
685 "If the list is linear, then the call I<insque(elem, NULL)> can be used to "
686 "insert the initial list element, and the call sets the forward and backward "
687 "pointers of I<elem> to NULL."
691 #: build/C/man3/insque.3:92
693 "If the list is circular, the caller should ensure that the forward and "
694 "backward pointers of the first element are initialized to point to that "
695 "element, and the I<prev> argument of the B<insque>() call should also point "
700 #: build/C/man3/insque.3:97
702 "The B<remque>() function removes the element pointed to by I<elem> from the "
703 "doubly-linked list."
707 #: build/C/man3/insque.3:99
708 msgid "POSIX.1-2001."
712 #: build/C/man3/insque.3:103
714 "Traditionally (e.g., SunOS, Linux libc 4 and libc 5), the arguments of these "
715 "functions were of type I<struct qelem *>, defined as:"
719 #: build/C/man3/insque.3:111
723 " struct qelem *q_forw;\n"
724 " struct qelem *q_back;\n"
730 #: build/C/man3/insque.3:118
732 "This is still what you will get if B<_GNU_SOURCE> is defined before "
733 "including I<E<lt>search.hE<gt>>."
737 #: build/C/man3/insque.3:125
739 "The location of the prototypes for these functions differs among several "
740 "versions of UNIX. The above is the POSIX version. Some systems place them "
741 "in I<E<lt>string.hE<gt>>. Linux libc4 and libc 5 placed them in "
742 "I<E<lt>stdlib.hE<gt>>."
746 #: build/C/man3/insque.3:132
748 "In glibc 2.4 and earlier, it was not possible to specify I<prev> as NULL. "
749 "Consequently, to build a linear list, the caller had to build a list using "
750 "an initial call that contained the first two elements of the list, with the "
751 "forward and backward pointers in each element suitably initialized."
755 #: build/C/man3/insque.3:136
757 "The program below demonstrates the use of B<insque>(). Here is an example "
758 "run of the program:"
762 #: build/C/man3/insque.3:145
765 "$ B<./a.out -c a b c>\n"
766 "Traversing completed list:\n"
770 "That was a circular list\n"
774 #: build/C/man3/insque.3:147
776 msgid "Program source"
780 #: build/C/man3/insque.3:154
783 "#include E<lt>stdio.hE<gt>\n"
784 "#include E<lt>stdlib.hE<gt>\n"
785 "#include E<lt>unistd.hE<gt>\n"
786 "#include E<lt>search.hE<gt>\n"
790 #: build/C/man3/insque.3:160
794 " struct element *forward;\n"
795 " struct element *backward;\n"
801 #: build/C/man3/insque.3:165
804 "static struct element *\n"
805 "new_element(void)\n"
807 " struct element *e;\n"
811 #: build/C/man3/insque.3:171
814 " e = malloc(sizeof(struct element));\n"
815 " if (e == NULL) {\n"
816 " fprintf(stderr, \"malloc() failed\\en\");\n"
817 " exit(EXIT_FAILURE);\n"
822 #: build/C/man3/insque.3:174
830 #: build/C/man3/insque.3:180
834 "main(int argc, char *argv[])\n"
836 " struct element *first, *elem, *prev;\n"
837 " int circular, opt, errfnd;\n"
841 #: build/C/man3/insque.3:183
844 " /* The \"-c\" command-line option can be used to specify that the\n"
845 " list is circular */\n"
849 #: build/C/man3/insque.3:196
854 " while ((opt = getopt(argc, argv, \"c\")) != -1) {\n"
867 #: build/C/man3/insque.3:201
870 " if (errfnd || optind E<gt>= argc) {\n"
871 " fprintf(stderr, \"Usage: %s [-c] string...\\en\", argv[0]);\n"
872 " exit(EXIT_FAILURE);\n"
877 #: build/C/man3/insque.3:203
879 msgid " /* Create first element and place it in the linked list */\n"
883 #: build/C/man3/insque.3:206
886 " elem = new_element();\n"
891 #: build/C/man3/insque.3:208
893 msgid " elem-E<gt>name = argv[optind];\n"
897 #: build/C/man3/insque.3:216
901 " elem-E<gt>forward = elem;\n"
902 " elem-E<gt>backward = elem;\n"
903 " insque(elem, elem);\n"
905 " insque(elem, NULL);\n"
910 #: build/C/man3/insque.3:218
912 msgid " /* Add remaining command-line arguments as list elements */\n"
916 #: build/C/man3/insque.3:221
919 " while (++optind E<lt> argc) {\n"
924 #: build/C/man3/insque.3:226
927 " elem = new_element();\n"
928 " elem-E<gt>name = argv[optind];\n"
929 " insque(elem, prev);\n"
934 #: build/C/man3/insque.3:228
936 msgid " /* Traverse the list from the start, printing element names */\n"
940 #: build/C/man3/insque.3:235
943 " printf(\"Traversing completed list:\\en\");\n"
946 " printf(\" %s\\en\", elem-E<gt>name);\n"
947 " elem = elem-E<gt>forward;\n"
948 " } while (elem != NULL && elem != first);\n"
952 #: build/C/man3/insque.3:238
955 " if (elem == first)\n"
956 " printf(\"That was a circular list\\en\");\n"
960 #: build/C/man3/insque.3:241
963 " exit(EXIT_SUCCESS);\n"
968 #: build/C/man3/lsearch.3:25
974 #: build/C/man3/lsearch.3:25
980 #: build/C/man3/lsearch.3:28
981 msgid "lfind, lsearch - linear search of an array"
985 #: build/C/man3/lsearch.3:34
988 "B<void *lfind(const void *>I<key>B<, const void *>I<base>B<, size_t "
990 "B< size_t >I<size>B<, int(*>I<compar>B<)(const void *, const void "
995 #: build/C/man3/lsearch.3:37
998 "B<void *lsearch(const void *>I<key>B<, void *>I<base>B<, size_t "
1000 "B< size_t >I<size>B<, int(*>I<compar>B<)(const void *, const void "
1005 #: build/C/man3/lsearch.3:50
1007 "B<lfind>() and B<lsearch>() perform a linear search for I<key> in the "
1008 "array I<base> which has I<*nmemb> elements of I<size> bytes each. The "
1009 "comparison function referenced by I<compar> is expected to have two "
1010 "arguments which point to the I<key> object and to an array member, in that "
1011 "order, and which returns zero if the I<key> object matches the array member, "
1012 "and nonzero otherwise."
1016 #: build/C/man3/lsearch.3:58
1018 "If B<lsearch>() does not find a matching element, then the I<key> object is "
1019 "inserted at the end of the table, and I<*nmemb> is incremented. In "
1020 "particular, one should know that a matching element exists, or that more "
1021 "room is available."
1025 #: build/C/man3/lsearch.3:66
1027 "B<lfind>() returns a pointer to a matching member of the array, or NULL if "
1028 "no match is found. B<lsearch>() returns a pointer to a matching member of "
1029 "the array, or to the newly added member if no match is found."
1033 #: build/C/man3/lsearch.3:69
1034 msgid "SVr4, 4.3BSD, POSIX.1-2001. Present in libc since libc-4.6.27."
1038 #: build/C/man3/lsearch.3:71
1039 msgid "The naming is unfortunate."
1043 #: build/C/man3/lsearch.3:75
1044 msgid "B<bsearch>(3), B<hsearch>(3), B<tsearch>(3)"
1048 #: build/C/man3/qsort.3:34
1054 #: build/C/man3/qsort.3:34
1060 #: build/C/man3/qsort.3:37
1061 msgid "qsort - sorts an array"
1065 #: build/C/man3/qsort.3:43
1068 "B<void qsort(void *>I<base>B<, size_t >I<nmemb>B<, size_t >I<size>B<,>\n"
1069 "B< int(*>I<compar>B<)(const void *, const void *));>\n"
1073 #: build/C/man3/qsort.3:51
1075 "The B<qsort>() function sorts an array with I<nmemb> elements of size "
1076 "I<size>. The I<base> argument points to the start of the array."
1080 #: build/C/man3/qsort.3:55
1082 "The contents of the array are sorted in ascending order according to a "
1083 "comparison function pointed to by I<compar>, which is called with two "
1084 "arguments that point to the objects being compared."
1088 #: build/C/man3/qsort.3:61
1090 "The comparison function must return an integer less than, equal to, or "
1091 "greater than zero if the first argument is considered to be respectively "
1092 "less than, equal to, or greater than the second. If two members compare as "
1093 "equal, their order in the sorted array is undefined."
1097 #: build/C/man3/qsort.3:65
1098 msgid "The B<qsort>() function returns no value."
1102 #: build/C/man3/qsort.3:67
1103 msgid "SVr4, 4.3BSD, C89, C99."
1107 #: build/C/man3/qsort.3:77
1109 "Library routines suitable for use as the I<compar> argument include "
1110 "B<alphasort>(3) and B<versionsort>(3). To compare C strings, the "
1111 "comparison function can call B<strcmp>(3), as shown in the example below."
1115 #: build/C/man3/qsort.3:80
1116 msgid "For one example of use, see the example under B<bsearch>(3)."
1120 #: build/C/man3/qsort.3:83
1122 "Another example is the following program, which sorts the strings given in "
1123 "its command-line arguments:"
1127 #: build/C/man3/qsort.3:95
1131 "cmpstringp(const void *p1, const void *p2)\n"
1133 " /* The actual arguments to this function are \"pointers to\n"
1134 " pointers to char\", but strcmp(3) arguments are \"pointers\n"
1135 " to char\", hence the following cast plus dereference */\n"
1139 #: build/C/man3/qsort.3:98
1142 " return strcmp(* (char * const *) p1, * (char * const *) p2);\n"
1147 #: build/C/man3/qsort.3:103
1151 "main(int argc, char *argv[])\n"
1157 #: build/C/man3/qsort.3:108
1160 " if (argc E<lt> 2) {\n"
1161 "\tfprintf(stderr, \"Usage: %s E<lt>stringE<gt>...\\en\", argv[0]);\n"
1162 "\texit(EXIT_FAILURE);\n"
1167 #: build/C/man3/qsort.3:110
1169 msgid " qsort(&argv[1], argc - 1, sizeof(char *), cmpstringp);\n"
1173 #: build/C/man3/qsort.3:115
1176 " for (j = 1; j E<lt> argc; j++)\n"
1178 " exit(EXIT_SUCCESS);\n"
1183 #: build/C/man3/qsort.3:121
1184 msgid "B<sort>(1), B<alphasort>(3), B<strcmp>(3), B<versionsort>(3)"
1188 #: build/C/man3/tsearch.3:24
1194 #: build/C/man3/tsearch.3:24
1200 #: build/C/man3/tsearch.3:27
1201 msgid "tsearch, tfind, tdelete, twalk, tdestroy - manage a binary tree"
1205 #: build/C/man3/tsearch.3:33
1208 "B<void *tsearch(const void *>I<key>B<, void **>I<rootp>B<,>\n"
1209 "B< int (*>I<compar>B<)(const void *, const void *));>\n"
1213 #: build/C/man3/tsearch.3:36
1216 "B<void *tfind(const void *>I<key>B<, const void **>I<rootp>B<,>\n"
1217 "B< int (*>I<compar>B<)(const void *, const void *));>\n"
1221 #: build/C/man3/tsearch.3:39
1224 "B<void *tdelete(const void *>I<key>B<, void **>I<rootp>B<,>\n"
1225 "B< int (*>I<compar>B<)(const void *, const void *));>\n"
1229 #: build/C/man3/tsearch.3:43
1232 "B<void twalk(const void *>I<root>B<, void (*>I<action>B<)(const void "
1234 "B< const VISIT >I<which>B<,>\n"
1235 "B< const int >I<depth>B<));>\n"
1239 #: build/C/man3/tsearch.3:49
1242 "B<void tdestroy(void *>I<root>B<, void (*>I<free_node>B<)(void "
1243 "*>I<nodep>B<));>\n"
1247 #: build/C/man3/tsearch.3:67
1249 "B<tsearch>(), B<tfind>(), B<twalk>(), and B<tdelete>() manage a binary "
1250 "tree. They are generalized from Knuth (6.2.2) Algorithm T. The first field "
1251 "in each node of the tree is a pointer to the corresponding data item. (The "
1252 "calling program must store the actual data.) I<compar> points to a "
1253 "comparison routine, which takes pointers to two items. It should return an "
1254 "integer which is negative, zero, or positive, depending on whether the first "
1255 "item is less than, equal to, or greater than the second."
1259 #: build/C/man3/tsearch.3:82
1261 "B<tsearch>() searches the tree for an item. I<key> points to the item to "
1262 "be searched for. I<rootp> points to a variable which points to the root of "
1263 "the tree. If the tree is empty, then the variable that I<rootp> points to "
1264 "should be set to NULL. If the item is found in the tree, then B<tsearch>() "
1265 "returns a pointer to it. If it is not found, then B<tsearch>() adds it, "
1266 "and returns a pointer to the newly added item."
1270 #: build/C/man3/tsearch.3:90
1272 "B<tfind>() is like B<tsearch>(), except that if the item is not found, then "
1273 "B<tfind>() returns NULL."
1277 #: build/C/man3/tsearch.3:95
1279 "B<tdelete>() deletes an item from the tree. Its arguments are the same as "
1284 #: build/C/man3/tsearch.3:115
1286 "B<twalk>() performs depth-first, left-to-right traversal of a binary tree. "
1287 "I<root> points to the starting node for the traversal. If that node is not "
1288 "the root, then only part of the tree will be visited. B<twalk>() calls the "
1289 "user function I<action> each time a node is visited (that is, three times "
1290 "for an internal node, and once for a leaf). I<action>, in turn, takes three "
1291 "arguments. The first is a pointer to the node being visited. The second is "
1292 "an integer which takes on the values B<preorder>, B<postorder>, and "
1293 "B<endorder> depending on whether this is the first, second, or third visit "
1294 "to the internal node, or B<leaf> if it is the single visit to a leaf node. "
1295 "(These symbols are defined in I<E<lt>search.hE<gt>>.) The third argument is "
1296 "the depth of the node, with zero being the root."
1300 #: build/C/man3/tsearch.3:122
1302 "(More commonly, B<preorder>, B<postorder>, and B<endorder> are known as "
1303 "B<preorder>, B<inorder>, and B<postorder>: before visiting the children, "
1304 "after the first and before the second, and after visiting the children. "
1305 "Thus, the choice of name B<post\\%order> is rather confusing.)"
1309 #: build/C/man3/tsearch.3:132
1311 "B<tdestroy>() removes the whole tree pointed to by I<root>, freeing all "
1312 "resources allocated by the B<tsearch>() function. For the data in each "
1313 "tree node the function I<free_node> is called. The pointer to the data is "
1314 "passed as the argument to the function. If no such work is necessary "
1315 "I<free_node> must point to a function doing nothing."
1319 #: build/C/man3/tsearch.3:142
1321 "B<tsearch>() returns a pointer to a matching item in the tree, or to the "
1322 "newly added item, or NULL if there was insufficient memory to add the item. "
1323 "B<tfind>() returns a pointer to the item, or NULL if no match is found. If "
1324 "there are multiple elements that match the key, the element returned is "
1329 #: build/C/man3/tsearch.3:146
1331 "B<tdelete>() returns a pointer to the parent of the item deleted, or NULL "
1332 "if the item was not found."
1336 #: build/C/man3/tsearch.3:153
1338 "B<tsearch>(), B<tfind>(), and B<tdelete>() also return NULL if I<rootp> was "
1343 #: build/C/man3/tsearch.3:158
1344 msgid "SVr4, POSIX.1-2001. The function B<tdestroy>() is a GNU extension."
1348 #: build/C/man3/tsearch.3:162
1350 "B<twalk>() takes a pointer to the root, while the other functions take a "
1351 "pointer to a variable which points to the root."
1355 #: build/C/man3/tsearch.3:168
1357 "B<twalk>() uses B<postorder> to mean \"after the left subtree, but before "
1358 "the right subtree\". Some authorities would call this \"inorder\", and "
1359 "reserve \"postorder\" to mean \"after both subtrees\"."
1363 #: build/C/man3/tsearch.3:173
1365 "B<tdelete>() frees the memory required for the node in the tree. The user "
1366 "is responsible for freeing the memory for the corresponding data."
1370 #: build/C/man3/tsearch.3:181
1372 "The example program depends on the fact that B<twalk>() makes no further "
1373 "reference to a node after calling the user function with argument "
1374 "\"endorder\" or \"leaf\". This works with the GNU library implementation, "
1375 "but is not in the System V documentation."
1379 #: build/C/man3/tsearch.3:185
1381 "The following program inserts twelve random numbers into a binary tree, "
1382 "where duplicate numbers are collapsed, then prints the numbers in order."
1386 #: build/C/man3/tsearch.3:192
1389 "#define _GNU_SOURCE /* Expose declaration of tdestroy() */\n"
1390 "#include E<lt>search.hE<gt>\n"
1391 "#include E<lt>stdlib.hE<gt>\n"
1392 "#include E<lt>stdio.hE<gt>\n"
1393 "#include E<lt>time.hE<gt>\n"
1397 #: build/C/man3/tsearch.3:194
1399 msgid "void *root = NULL;\n"
1403 #: build/C/man3/tsearch.3:205
1407 "xmalloc(unsigned n)\n"
1413 " fprintf(stderr, \"insufficient memory\\en\");\n"
1414 " exit(EXIT_FAILURE);\n"
1419 #: build/C/man3/tsearch.3:215
1423 "compare(const void *pa, const void *pb)\n"
1425 " if (*(int *) pa E<lt> *(int *) pb)\n"
1427 " if (*(int *) pa E<gt> *(int *) pb)\n"
1434 #: build/C/man3/tsearch.3:220
1438 "action(const void *nodep, const VISIT which, const int depth)\n"
1444 #: build/C/man3/tsearch.3:236
1447 " switch (which) {\n"
1450 " case postorder:\n"
1451 " datap = *(int **) nodep;\n"
1452 " printf(\"%6d\\en\", *datap);\n"
1457 " datap = *(int **) nodep;\n"
1458 " printf(\"%6d\\en\", *datap);\n"
1465 #: build/C/man3/tsearch.3:242
1476 #: build/C/man3/tsearch.3:257
1479 " srand(time(NULL));\n"
1480 " for (i = 0; i E<lt> 12; i++) {\n"
1481 " ptr = (int *) xmalloc(sizeof(int));\n"
1482 " *ptr = rand() & 0xff;\n"
1483 " val = tsearch((void *) ptr, &root, compare);\n"
1484 " if (val == NULL)\n"
1485 " exit(EXIT_FAILURE);\n"
1486 " else if ((*(int **) val) != ptr)\n"
1489 " twalk(root, action);\n"
1490 " tdestroy(root, free);\n"
1491 " exit(EXIT_SUCCESS);\n"
1496 #: build/C/man3/tsearch.3:263
1497 msgid "B<bsearch>(3), B<hsearch>(3), B<lsearch>(3), B<qsort>(3)"