1*4d131170SRobert Mustacchi /* $Id: mansearch.h,v 1.30 2019/04/30 18:51:57 schwarze Exp $ */ 2260e9a87SYuri Pankov /* 3260e9a87SYuri Pankov * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv> 4c66b8046SYuri Pankov * Copyright (c) 2013, 2014, 2016, 2017 Ingo Schwarze <schwarze@openbsd.org> 5260e9a87SYuri Pankov * 6260e9a87SYuri Pankov * Permission to use, copy, modify, and distribute this software for any 7260e9a87SYuri Pankov * purpose with or without fee is hereby granted, provided that the above 8260e9a87SYuri Pankov * copyright notice and this permission notice appear in all copies. 9260e9a87SYuri Pankov * 10260e9a87SYuri Pankov * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11260e9a87SYuri Pankov * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12260e9a87SYuri Pankov * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13260e9a87SYuri Pankov * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14260e9a87SYuri Pankov * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15260e9a87SYuri Pankov * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16260e9a87SYuri Pankov * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17260e9a87SYuri Pankov */ 18260e9a87SYuri Pankov 19260e9a87SYuri Pankov #define MANDOC_DB "mandoc.db" 20a40ea1a7SYuri Pankov #define MANDOCDB_MAGIC 0x3a7d0cdb 21a40ea1a7SYuri Pankov #define MANDOCDB_VERSION 1 22a40ea1a7SYuri Pankov 23a40ea1a7SYuri Pankov #define MACRO_MAX 36 24c66b8046SYuri Pankov #define KEY_arch 0 25c66b8046SYuri Pankov #define KEY_sec 1 26c66b8046SYuri Pankov #define KEY_Nm 38 27a40ea1a7SYuri Pankov #define KEY_Nd 39 28a40ea1a7SYuri Pankov #define KEY_MAX 40 29260e9a87SYuri Pankov 30260e9a87SYuri Pankov #define TYPE_arch 0x0000000000000001ULL 31260e9a87SYuri Pankov #define TYPE_sec 0x0000000000000002ULL 32260e9a87SYuri Pankov #define TYPE_Xr 0x0000000000000004ULL 33260e9a87SYuri Pankov #define TYPE_Ar 0x0000000000000008ULL 34260e9a87SYuri Pankov #define TYPE_Fa 0x0000000000000010ULL 35260e9a87SYuri Pankov #define TYPE_Fl 0x0000000000000020ULL 36260e9a87SYuri Pankov #define TYPE_Dv 0x0000000000000040ULL 37260e9a87SYuri Pankov #define TYPE_Fn 0x0000000000000080ULL 38260e9a87SYuri Pankov #define TYPE_Ic 0x0000000000000100ULL 39260e9a87SYuri Pankov #define TYPE_Pa 0x0000000000000200ULL 40260e9a87SYuri Pankov #define TYPE_Cm 0x0000000000000400ULL 41260e9a87SYuri Pankov #define TYPE_Li 0x0000000000000800ULL 42260e9a87SYuri Pankov #define TYPE_Em 0x0000000000001000ULL 43260e9a87SYuri Pankov #define TYPE_Cd 0x0000000000002000ULL 44260e9a87SYuri Pankov #define TYPE_Va 0x0000000000004000ULL 45260e9a87SYuri Pankov #define TYPE_Ft 0x0000000000008000ULL 46260e9a87SYuri Pankov #define TYPE_Tn 0x0000000000010000ULL 47260e9a87SYuri Pankov #define TYPE_Er 0x0000000000020000ULL 48260e9a87SYuri Pankov #define TYPE_Ev 0x0000000000040000ULL 49260e9a87SYuri Pankov #define TYPE_Sy 0x0000000000080000ULL 50260e9a87SYuri Pankov #define TYPE_Sh 0x0000000000100000ULL 51260e9a87SYuri Pankov #define TYPE_In 0x0000000000200000ULL 52260e9a87SYuri Pankov #define TYPE_Ss 0x0000000000400000ULL 53260e9a87SYuri Pankov #define TYPE_Ox 0x0000000000800000ULL 54260e9a87SYuri Pankov #define TYPE_An 0x0000000001000000ULL 55260e9a87SYuri Pankov #define TYPE_Mt 0x0000000002000000ULL 56260e9a87SYuri Pankov #define TYPE_St 0x0000000004000000ULL 57260e9a87SYuri Pankov #define TYPE_Bx 0x0000000008000000ULL 58260e9a87SYuri Pankov #define TYPE_At 0x0000000010000000ULL 59260e9a87SYuri Pankov #define TYPE_Nx 0x0000000020000000ULL 60260e9a87SYuri Pankov #define TYPE_Fx 0x0000000040000000ULL 61260e9a87SYuri Pankov #define TYPE_Lk 0x0000000080000000ULL 62260e9a87SYuri Pankov #define TYPE_Ms 0x0000000100000000ULL 63260e9a87SYuri Pankov #define TYPE_Bsx 0x0000000200000000ULL 64260e9a87SYuri Pankov #define TYPE_Dx 0x0000000400000000ULL 65260e9a87SYuri Pankov #define TYPE_Rs 0x0000000800000000ULL 66260e9a87SYuri Pankov #define TYPE_Vt 0x0000001000000000ULL 67260e9a87SYuri Pankov #define TYPE_Lb 0x0000002000000000ULL 68260e9a87SYuri Pankov #define TYPE_Nm 0x0000004000000000ULL 69260e9a87SYuri Pankov #define TYPE_Nd 0x0000008000000000ULL 70260e9a87SYuri Pankov 71260e9a87SYuri Pankov #define NAME_SYN 0x0000004000000001ULL 72260e9a87SYuri Pankov #define NAME_FIRST 0x0000004000000004ULL 73260e9a87SYuri Pankov #define NAME_TITLE 0x0000004000000006ULL 74260e9a87SYuri Pankov #define NAME_HEAD 0x0000004000000008ULL 75260e9a87SYuri Pankov #define NAME_FILE 0x0000004000000010ULL 76260e9a87SYuri Pankov #define NAME_MASK 0x000000000000001fULL 77260e9a87SYuri Pankov 78a40ea1a7SYuri Pankov enum form { 79a40ea1a7SYuri Pankov FORM_SRC = 1, /* Format is mdoc(7) or man(7). */ 80a40ea1a7SYuri Pankov FORM_CAT, /* Manual page is preformatted. */ 81a40ea1a7SYuri Pankov FORM_NONE /* Format is unknown. */ 82a40ea1a7SYuri Pankov }; 83260e9a87SYuri Pankov 84260e9a87SYuri Pankov enum argmode { 85260e9a87SYuri Pankov ARG_FILE = 0, 86260e9a87SYuri Pankov ARG_NAME, 87260e9a87SYuri Pankov ARG_WORD, 88260e9a87SYuri Pankov ARG_EXPR 89260e9a87SYuri Pankov }; 90260e9a87SYuri Pankov 91260e9a87SYuri Pankov struct manpage { 92260e9a87SYuri Pankov char *file; /* to be prefixed by manpath */ 93260e9a87SYuri Pankov char *names; /* a list of names with sections */ 94260e9a87SYuri Pankov char *output; /* user-defined additional output */ 95*4d131170SRobert Mustacchi uint64_t bits; /* name type mask */ 96260e9a87SYuri Pankov size_t ipath; /* number of the manpath */ 97260e9a87SYuri Pankov int sec; /* section number, 10 means invalid */ 98a40ea1a7SYuri Pankov enum form form; 99260e9a87SYuri Pankov }; 100260e9a87SYuri Pankov 101260e9a87SYuri Pankov struct mansearch { 102260e9a87SYuri Pankov const char *arch; /* architecture/NULL */ 103260e9a87SYuri Pankov const char *sec; /* mansection/NULL */ 104260e9a87SYuri Pankov const char *outkey; /* show content of this macro */ 105260e9a87SYuri Pankov enum argmode argmode; /* interpretation of arguments */ 106260e9a87SYuri Pankov int firstmatch; /* first matching database only */ 107260e9a87SYuri Pankov }; 108260e9a87SYuri Pankov 109260e9a87SYuri Pankov 110260e9a87SYuri Pankov struct manpaths; 111260e9a87SYuri Pankov 112260e9a87SYuri Pankov int mansearch(const struct mansearch *cfg, /* options */ 113260e9a87SYuri Pankov const struct manpaths *paths, /* manpaths */ 114260e9a87SYuri Pankov int argc, /* size of argv */ 115260e9a87SYuri Pankov char *argv[], /* search terms */ 116260e9a87SYuri Pankov struct manpage **res, /* results */ 117260e9a87SYuri Pankov size_t *ressz); /* results returned */ 118260e9a87SYuri Pankov void mansearch_free(struct manpage *, size_t); 119