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