version 1.19, 2014/01/06 03:52:13 |
version 1.20, 2014/01/19 01:18:34 |
|
|
#include "manpath.h" |
#include "manpath.h" |
#include "mansearch.h" |
#include "mansearch.h" |
|
|
|
extern int mansearch_keymax; |
|
extern const char *const mansearch_keynames[]; |
|
|
#define SQL_BIND_TEXT(_db, _s, _i, _v) \ |
#define SQL_BIND_TEXT(_db, _s, _i, _v) \ |
do { if (SQLITE_OK != sqlite3_bind_text \ |
do { if (SQLITE_OK != sqlite3_bind_text \ |
((_s), (_i)++, (_v), -1, SQLITE_STATIC)) \ |
((_s), (_i)++, (_v), -1, SQLITE_STATIC)) \ |
|
|
int form; /* 0 == catpage */ |
int form; /* 0 == catpage */ |
}; |
}; |
|
|
struct type { |
|
uint64_t bits; |
|
const char *name; |
|
}; |
|
|
|
static const struct type types[] = { |
|
{ TYPE_An, "An" }, |
|
{ TYPE_Ar, "Ar" }, |
|
{ TYPE_At, "At" }, |
|
{ TYPE_Bsx, "Bsx" }, |
|
{ TYPE_Bx, "Bx" }, |
|
{ TYPE_Cd, "Cd" }, |
|
{ TYPE_Cm, "Cm" }, |
|
{ TYPE_Dv, "Dv" }, |
|
{ TYPE_Dx, "Dx" }, |
|
{ TYPE_Em, "Em" }, |
|
{ TYPE_Er, "Er" }, |
|
{ TYPE_Ev, "Ev" }, |
|
{ TYPE_Fa, "Fa" }, |
|
{ TYPE_Fl, "Fl" }, |
|
{ TYPE_Fn, "Fn" }, |
|
{ TYPE_Fn, "Fo" }, |
|
{ TYPE_Ft, "Ft" }, |
|
{ TYPE_Fx, "Fx" }, |
|
{ TYPE_Ic, "Ic" }, |
|
{ TYPE_In, "In" }, |
|
{ TYPE_Lb, "Lb" }, |
|
{ TYPE_Li, "Li" }, |
|
{ TYPE_Lk, "Lk" }, |
|
{ TYPE_Ms, "Ms" }, |
|
{ TYPE_Mt, "Mt" }, |
|
{ TYPE_Nd, "Nd" }, |
|
{ TYPE_Nm, "Nm" }, |
|
{ TYPE_Nx, "Nx" }, |
|
{ TYPE_Ox, "Ox" }, |
|
{ TYPE_Pa, "Pa" }, |
|
{ TYPE_Rs, "Rs" }, |
|
{ TYPE_Sh, "Sh" }, |
|
{ TYPE_Ss, "Ss" }, |
|
{ TYPE_St, "St" }, |
|
{ TYPE_Sy, "Sy" }, |
|
{ TYPE_Tn, "Tn" }, |
|
{ TYPE_Va, "Va" }, |
|
{ TYPE_Va, "Vt" }, |
|
{ TYPE_Xr, "Xr" }, |
|
{ TYPE_sec, "sec" }, |
|
{ TYPE_arch,"arch" }, |
|
{ ~0ULL, "any" }, |
|
{ 0ULL, NULL } |
|
}; |
|
|
|
static void buildnames(struct manpage *, sqlite3 *, |
static void buildnames(struct manpage *, sqlite3 *, |
sqlite3_stmt *, uint64_t, |
sqlite3_stmt *, uint64_t, |
const char *, int form); |
const char *, int form); |
Line 153 mansearch(const struct mansearch *search, |
|
Line 105 mansearch(const struct mansearch *search, |
|
const char *outkey, |
const char *outkey, |
struct manpage **res, size_t *sz) |
struct manpage **res, size_t *sz) |
{ |
{ |
int fd, rc, c, ibit; |
int fd, rc, c, indexbit; |
int64_t id; |
int64_t id; |
uint64_t outbit; |
uint64_t outbit, iterbit; |
char buf[PATH_MAX]; |
char buf[PATH_MAX]; |
char *sql; |
char *sql; |
struct manpage *mpage; |
struct manpage *mpage; |
Line 189 mansearch(const struct mansearch *search, |
|
Line 141 mansearch(const struct mansearch *search, |
|
|
|
outbit = 0; |
outbit = 0; |
if (NULL != outkey) { |
if (NULL != outkey) { |
for (ibit = 0; types[ibit].bits; ibit++) { |
for (indexbit = 0, iterbit = 1; |
if (0 == strcasecmp(types[ibit].name, outkey)) { |
indexbit < mansearch_keymax; |
outbit = types[ibit].bits; |
indexbit++, iterbit <<= 1) { |
|
if (0 == strcasecmp(outkey, |
|
mansearch_keynames[indexbit])) { |
|
outbit = iterbit; |
break; |
break; |
} |
} |
} |
} |
Line 623 exprterm(const struct mansearch *search, char *buf, in |
|
Line 578 exprterm(const struct mansearch *search, char *buf, in |
|
char errbuf[BUFSIZ]; |
char errbuf[BUFSIZ]; |
struct expr *e; |
struct expr *e; |
char *key, *v; |
char *key, *v; |
size_t i; |
uint64_t iterbit; |
int irc; |
int i, irc; |
|
|
if ('\0' == *buf) |
if ('\0' == *buf) |
return(NULL); |
return(NULL); |
Line 672 exprterm(const struct mansearch *search, char *buf, in |
|
Line 627 exprterm(const struct mansearch *search, char *buf, in |
|
while (NULL != (key = strsep(&buf, ","))) { |
while (NULL != (key = strsep(&buf, ","))) { |
if ('\0' == *key) |
if ('\0' == *key) |
continue; |
continue; |
i = 0; |
for (i = 0, iterbit = 1; |
while (types[i].bits && |
i < mansearch_keymax; |
strcasecmp(types[i].name, key)) |
i++, iterbit <<= 1) { |
i++; |
if (0 == strcasecmp(key, |
if (0 == types[i].bits) { |
mansearch_keynames[i])) { |
free(e); |
e->bits |= iterbit; |
return(NULL); |
break; |
|
} |
} |
} |
e->bits |= types[i].bits; |
if (i == mansearch_keymax) { |
|
if (strcasecmp(key, "any")) { |
|
free(e); |
|
return(NULL); |
|
} |
|
e->bits |= ~0ULL; |
|
} |
} |
} |
|
|
return(e); |
return(e); |