1*eac741fcSschwarze /* $OpenBSD: mansearch.h,v 1.24 2019/04/30 18:48:26 schwarze Exp $ */ 2eea1c63dSschwarze /* 3eea1c63dSschwarze * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv> 4b0dedf92Sschwarze * Copyright (c) 2013, 2014, 2016, 2017 Ingo Schwarze <schwarze@openbsd.org> 5eea1c63dSschwarze * 6eea1c63dSschwarze * Permission to use, copy, modify, and distribute this software for any 7eea1c63dSschwarze * purpose with or without fee is hereby granted, provided that the above 8eea1c63dSschwarze * copyright notice and this permission notice appear in all copies. 9eea1c63dSschwarze * 10eea1c63dSschwarze * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11eea1c63dSschwarze * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12eea1c63dSschwarze * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13eea1c63dSschwarze * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14eea1c63dSschwarze * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15eea1c63dSschwarze * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16eea1c63dSschwarze * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17eea1c63dSschwarze */ 18eea1c63dSschwarze 19eea1c63dSschwarze #define MANDOC_DB "mandoc.db" 20ff2dbb0fSschwarze #define MANDOCDB_MAGIC 0x3a7d0cdb 21ff2dbb0fSschwarze #define MANDOCDB_VERSION 1 22ff2dbb0fSschwarze 23ff2dbb0fSschwarze #define MACRO_MAX 36 24b0dedf92Sschwarze #define KEY_arch 0 25b0dedf92Sschwarze #define KEY_sec 1 26b0dedf92Sschwarze #define KEY_Nm 38 27ff2dbb0fSschwarze #define KEY_Nd 39 28ff2dbb0fSschwarze #define KEY_MAX 40 29eea1c63dSschwarze 30cb2bcd5aSschwarze #define TYPE_arch 0x0000000000000001ULL 31cb2bcd5aSschwarze #define TYPE_sec 0x0000000000000002ULL 32cb2bcd5aSschwarze #define TYPE_Xr 0x0000000000000004ULL 33cb2bcd5aSschwarze #define TYPE_Ar 0x0000000000000008ULL 34cb2bcd5aSschwarze #define TYPE_Fa 0x0000000000000010ULL 35cb2bcd5aSschwarze #define TYPE_Fl 0x0000000000000020ULL 36cb2bcd5aSschwarze #define TYPE_Dv 0x0000000000000040ULL 37cb2bcd5aSschwarze #define TYPE_Fn 0x0000000000000080ULL 38cb2bcd5aSschwarze #define TYPE_Ic 0x0000000000000100ULL 39cb2bcd5aSschwarze #define TYPE_Pa 0x0000000000000200ULL 40cb2bcd5aSschwarze #define TYPE_Cm 0x0000000000000400ULL 41cb2bcd5aSschwarze #define TYPE_Li 0x0000000000000800ULL 42cb2bcd5aSschwarze #define TYPE_Em 0x0000000000001000ULL 43cb2bcd5aSschwarze #define TYPE_Cd 0x0000000000002000ULL 44cb2bcd5aSschwarze #define TYPE_Va 0x0000000000004000ULL 45cb2bcd5aSschwarze #define TYPE_Ft 0x0000000000008000ULL 46cb2bcd5aSschwarze #define TYPE_Tn 0x0000000000010000ULL 47cb2bcd5aSschwarze #define TYPE_Er 0x0000000000020000ULL 48cb2bcd5aSschwarze #define TYPE_Ev 0x0000000000040000ULL 49cb2bcd5aSschwarze #define TYPE_Sy 0x0000000000080000ULL 50cb2bcd5aSschwarze #define TYPE_Sh 0x0000000000100000ULL 51cb2bcd5aSschwarze #define TYPE_In 0x0000000000200000ULL 52cb2bcd5aSschwarze #define TYPE_Ss 0x0000000000400000ULL 53cb2bcd5aSschwarze #define TYPE_Ox 0x0000000000800000ULL 54cb2bcd5aSschwarze #define TYPE_An 0x0000000001000000ULL 55cb2bcd5aSschwarze #define TYPE_Mt 0x0000000002000000ULL 56cb2bcd5aSschwarze #define TYPE_St 0x0000000004000000ULL 57cb2bcd5aSschwarze #define TYPE_Bx 0x0000000008000000ULL 58cb2bcd5aSschwarze #define TYPE_At 0x0000000010000000ULL 59cb2bcd5aSschwarze #define TYPE_Nx 0x0000000020000000ULL 60cb2bcd5aSschwarze #define TYPE_Fx 0x0000000040000000ULL 61cb2bcd5aSschwarze #define TYPE_Lk 0x0000000080000000ULL 62cb2bcd5aSschwarze #define TYPE_Ms 0x0000000100000000ULL 63cb2bcd5aSschwarze #define TYPE_Bsx 0x0000000200000000ULL 64cb2bcd5aSschwarze #define TYPE_Dx 0x0000000400000000ULL 65cb2bcd5aSschwarze #define TYPE_Rs 0x0000000800000000ULL 66cb2bcd5aSschwarze #define TYPE_Vt 0x0000001000000000ULL 67cb2bcd5aSschwarze #define TYPE_Lb 0x0000002000000000ULL 68cb2bcd5aSschwarze #define TYPE_Nm 0x0000004000000000ULL 69cb2bcd5aSschwarze #define TYPE_Nd 0x0000008000000000ULL 70cb2bcd5aSschwarze 71cb2bcd5aSschwarze #define NAME_SYN 0x0000004000000001ULL 72d81a2e27Sschwarze #define NAME_FIRST 0x0000004000000004ULL 73d81a2e27Sschwarze #define NAME_TITLE 0x0000004000000006ULL 74d81a2e27Sschwarze #define NAME_HEAD 0x0000004000000008ULL 75d81a2e27Sschwarze #define NAME_FILE 0x0000004000000010ULL 76cb2bcd5aSschwarze #define NAME_MASK 0x000000000000001fULL 77eea1c63dSschwarze 78ff2dbb0fSschwarze enum form { 79ff2dbb0fSschwarze FORM_SRC = 1, /* Format is mdoc(7) or man(7). */ 80ff2dbb0fSschwarze FORM_CAT, /* Manual page is preformatted. */ 81ff2dbb0fSschwarze FORM_NONE /* Format is unknown. */ 82ff2dbb0fSschwarze }; 832f08085dSschwarze 840f10154cSschwarze enum argmode { 850f10154cSschwarze ARG_FILE = 0, 860f10154cSschwarze ARG_NAME, 870f10154cSschwarze ARG_WORD, 880f10154cSschwarze ARG_EXPR 890f10154cSschwarze }; 90eea1c63dSschwarze 91eea1c63dSschwarze struct manpage { 92eea1c63dSschwarze char *file; /* to be prefixed by manpath */ 93eea1c63dSschwarze char *names; /* a list of names with sections */ 9447a70b7eSschwarze char *output; /* user-defined additional output */ 95*eac741fcSschwarze uint64_t bits; /* name type mask */ 966f9f8da1Sschwarze size_t ipath; /* number of the manpath */ 97923fed8aSschwarze int sec; /* section number, 10 means invalid */ 98ff2dbb0fSschwarze enum form form; 99eea1c63dSschwarze }; 100eea1c63dSschwarze 101eea1c63dSschwarze struct mansearch { 102eea1c63dSschwarze const char *arch; /* architecture/NULL */ 103eea1c63dSschwarze const char *sec; /* mansection/NULL */ 1040f10154cSschwarze const char *outkey; /* show content of this macro */ 1050f10154cSschwarze enum argmode argmode; /* interpretation of arguments */ 106fea71919Sschwarze int firstmatch; /* first matching database only */ 107eea1c63dSschwarze }; 108eea1c63dSschwarze 1090f10154cSschwarze 110dd617d76Sschwarze struct manpaths; 111dd617d76Sschwarze 112eea1c63dSschwarze int mansearch(const struct mansearch *cfg, /* options */ 113eea1c63dSschwarze const struct manpaths *paths, /* manpaths */ 114eea1c63dSschwarze int argc, /* size of argv */ 115eea1c63dSschwarze char *argv[], /* search terms */ 116eea1c63dSschwarze struct manpage **res, /* results */ 117eea1c63dSschwarze size_t *ressz); /* results returned */ 1180f10154cSschwarze void mansearch_free(struct manpage *, size_t); 119