Index: stable/6/usr.bin/locate/locate/fastfind.c =================================================================== --- stable/6/usr.bin/locate/locate/fastfind.c (revision 153613) +++ stable/6/usr.bin/locate/locate/fastfind.c (revision 153614) @@ -1,329 +1,330 @@ /* * Copyright (c) 1995 Wolfram Schneider . Berlin. * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * James A. Woods. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _LOCATE_STATISTIC_ #define _LOCATE_STATISTIC_ void statistic (fp, path_fcodes) FILE *fp; /* open database */ char *path_fcodes; /* for error message */ { register int lines, chars, size, big, zwerg; register u_char *p, *s; register int c; int count, umlaut; u_char bigram1[NBG], bigram2[NBG], path[MAXPATHLEN]; for (c = 0, p = bigram1, s = bigram2; c < NBG; c++) { p[c] = check_bigram_char(getc(fp)); s[c] = check_bigram_char(getc(fp)); } lines = chars = big = zwerg = umlaut = 0; size = NBG + NBG; for (c = getc(fp), count = 0; c != EOF; size++) { if (c == SWITCH) { count += getwf(fp) - OFFSET; size += sizeof(int); zwerg++; } else count += c - OFFSET; for (p = path + count; (c = getc(fp)) > SWITCH; size++) if (c < PARITY) { if (c == UMLAUT) { c = getc(fp); size++; umlaut++; } p++; } else { /* bigram char */ big++; p += 2; } p++; lines++; chars += (p - path); } (void)printf("\nDatabase: %s\n", path_fcodes); (void)printf("Compression: Front: %2.2f%%, ", (size + big - (2 * NBG)) / (chars / (float)100)); (void)printf("Bigram: %2.2f%%, ", (size - big) / (size / (float)100)); (void)printf("Total: %2.2f%%\n", (size - (2 * NBG)) / (chars / (float)100)); (void)printf("Filenames: %d, ", lines); (void)printf("Characters: %d, ", chars); (void)printf("Database size: %d\n", size); (void)printf("Bigram characters: %d, ", big); (void)printf("Integers: %d, ", zwerg); (void)printf("8-Bit characters: %d\n", umlaut); } #endif /* _LOCATE_STATISTIC_ */ +extern char separator; void #ifdef FF_MMAP #ifdef FF_ICASE fastfind_mmap_icase #else fastfind_mmap #endif /* FF_ICASE */ (pathpart, paddr, len, database) char *pathpart; /* search string */ caddr_t paddr; /* mmap pointer */ int len; /* length of database */ char *database; /* for error message */ #else /* MMAP */ #ifdef FF_ICASE fastfind_icase #else fastfind #endif /* FF_ICASE */ (fp, pathpart, database) FILE *fp; /* open database */ char *pathpart; /* search string */ char *database; /* for error message */ #endif /* MMAP */ { register u_char *p, *s, *patend, *q, *foundchar; register int c, cc; int count, found, globflag; u_char *cutoff; u_char bigram1[NBG], bigram2[NBG], path[MAXPATHLEN]; #ifdef FF_ICASE /* use a lookup table for case insensitive search */ u_char table[UCHAR_MAX + 1]; tolower_word(pathpart); #endif /* FF_ICASE*/ /* init bigram table */ #ifdef FF_MMAP if (len < (2*NBG)) errx(1, "database too small: %s", database); for (c = 0, p = bigram1, s = bigram2; c < NBG; c++, len-= 2) { p[c] = check_bigram_char(*paddr++); s[c] = check_bigram_char(*paddr++); } #else for (c = 0, p = bigram1, s = bigram2; c < NBG; c++) { p[c] = check_bigram_char(getc(fp)); s[c] = check_bigram_char(getc(fp)); } #endif /* FF_MMAP */ /* find optimal (last) char for searching */ for (p = pathpart; *p != '\0'; p++) if (index(LOCATE_REG, *p) != NULL) break; if (*p == '\0') globflag = 0; else globflag = 1; p = pathpart; patend = patprep(p); cc = *patend; #ifdef FF_ICASE /* set patend char to true */ for (c = 0; c < UCHAR_MAX + 1; c++) table[c] = 0; table[TOLOWER(*patend)] = 1; table[toupper(*patend)] = 1; #endif /* FF_ICASE */ /* main loop */ found = count = 0; foundchar = 0; #ifdef FF_MMAP c = (u_char)*paddr++; len--; for (; len > 0; ) { #else c = getc(fp); for (; c != EOF; ) { #endif /* FF_MMAP */ /* go forward or backward */ if (c == SWITCH) { /* big step, an integer */ #ifdef FF_MMAP count += getwm(paddr) - OFFSET; len -= INTSIZE; paddr += INTSIZE; #else count += getwf(fp) - OFFSET; #endif /* FF_MMAP */ } else { /* slow step, =< 14 chars */ count += c - OFFSET; } /* overlay old path */ p = path + count; foundchar = p - 1; #ifdef FF_MMAP for (; len > 0;) { c = (u_char)*paddr++; len--; #else for (;;) { c = getc(fp); #endif /* FF_MMAP */ /* * == UMLAUT: 8 bit char followed * <= SWITCH: offset * >= PARITY: bigram * rest: single ascii char * * offset < SWITCH < UMLAUT < ascii < PARITY < bigram */ if (c < PARITY) { if (c <= UMLAUT) { if (c == UMLAUT) { #ifdef FF_MMAP c = (u_char)*paddr++; len--; #else c = getc(fp); #endif /* FF_MMAP */ } else break; /* SWITCH */ } #ifdef FF_ICASE if (table[c]) #else if (c == cc) #endif /* FF_ICASE */ foundchar = p; *p++ = c; } else { /* bigrams are parity-marked */ TO7BIT(c); #ifndef FF_ICASE if (bigram1[c] == cc || bigram2[c] == cc) #else if (table[bigram1[c]] || table[bigram2[c]]) #endif /* FF_ICASE */ foundchar = p + 1; *p++ = bigram1[c]; *p++ = bigram2[c]; } } if (found) { /* previous line matched */ cutoff = path; *p-- = '\0'; foundchar = p; } else if (foundchar >= path + count) { /* a char matched */ *p-- = '\0'; cutoff = path + count; } else /* nothing to do */ continue; found = 0; for (s = foundchar; s >= cutoff; s--) { if (*s == cc #ifdef FF_ICASE || TOLOWER(*s) == cc #endif /* FF_ICASE */ ) { /* fast first char check */ for (p = patend - 1, q = s - 1; *p != '\0'; p--, q--) if (*q != *p #ifdef FF_ICASE && TOLOWER(*q) != *p #endif /* FF_ICASE */ ) break; if (*p == '\0') { /* fast match success */ found = 1; if (!globflag || #ifndef FF_ICASE !fnmatch(pathpart, path, 0)) #else !fnmatch(pathpart, path, FNM_CASEFOLD)) #endif /* !FF_ICASE */ { if (f_silent) counter++; else if (f_limit) { counter++; if (f_limit >= counter) - (void)puts(path); + (void)printf("%s%c",path,separator); else errx(0, "[show only %d lines]", counter - 1); } else - (void)puts(path); + (void)printf("%s%c",path,separator); } break; } } } } } Index: stable/6/usr.bin/locate/locate/locate.1 =================================================================== --- stable/6/usr.bin/locate/locate/locate.1 (revision 153613) +++ stable/6/usr.bin/locate/locate/locate.1 (revision 153614) @@ -1,269 +1,274 @@ .\" Copyright (c) 1995 Wolfram Schneider . Berlin. .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)locate.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" .Dd July 23, 2004 .Dt LOCATE 1 .Os .Sh NAME .Nm locate .Nd find filenames quickly .Sh SYNOPSIS .Nm -.Op Fl Scims +.Op Fl 0Scims .Op Fl l Ar limit .Op Fl d Ar database .Ar pattern ... .Sh DESCRIPTION The .Nm program searches a database for all pathnames which match the specified .Ar pattern . The database is recomputed periodically (usually weekly or daily), and contains the pathnames of all files which are publicly accessible. .Pp Shell globbing and quoting characters .Dq ( * , .Dq \&? , .Dq \e , .Dq \&[ and .Dq \&] ) may be used in .Ar pattern , although they will have to be escaped from the shell. Preceding any character with a backslash .Pq Dq \e eliminates any special meaning which it may have. The matching differs in that no characters must be matched explicitly, including slashes .Pq Dq / . .Pp As a special case, a pattern containing no globbing characters .Pq Dq foo is matched as though it were .Dq *foo* . .Pp Historically, locate only stored characters between 32 and 127. The current implementation store any character except newline .Pq Sq \en and NUL .Pq Sq \e0 . The 8-bit character support does not waste extra space for plain ASCII file names. Characters less than 32 or greater than 127 are stored in 2 bytes. .Pp The following options are available: .Bl -tag -width 10n +.It Fl 0 +Print pathnames separated by an +.Tn ASCII NUL +character (character code 0) instead of default NL +(newline, character code 10). .It Fl S Print some statistic about the database and exit. .It Fl c Suppress normal output; instead print a count of matching file names. .It Fl d Ar database Search in .Ar database instead the default file name database. Multiple .Fl d options are allowed. Each additional .Fl d option adds the specified database to the list of databases to be searched. .Pp The option .Ar database may be a colon-separated list of databases. A single colon is a reference to the default database. .Bd -literal $ locate -d $HOME/lib/mydb: foo .Ed .Pp will first search string .Dq foo in .Pa $HOME/lib/mydb and then in .Pa /var/db/locate.database . .Bd -literal $ locate -d $HOME/lib/mydb::/cdrom/locate.database foo .Ed .Pp will first search string .Dq foo in .Pa $HOME/lib/mydb and then in .Pa /var/db/locate.database and then in .Pa /cdrom/locate.database . .Pp .Dl "$ locate -d db1 -d db2 -d db3 pattern" .Pp is the same as .Pp .Dl "$ locate -d db1:db2:db3 pattern" .Pp or .Pp .Dl "$ locate -d db1:db2 -d db3 pattern" .Pp If .Ar - is given as the database name, standard input will be read instead. For example, you can compress your database and use: .Bd -literal $ zcat database.gz | locate -d - pattern .Ed .Pp This might be useful on machines with a fast CPU and little RAM and slow I/O. Note: you can only use .Ar one pattern for stdin. .It Fl i Ignore case distinctions in both the pattern and the database. .It Fl l Ar number Limit output to .Ar number of file names and exit. .It Fl m Use .Xr mmap 2 instead of the .Xr stdio 3 library. This is the default behavior and is faster in most cases. .It Fl s Use the .Xr stdio 3 library instead of .Xr mmap 2 . .El .Sh ENVIRONMENT .Bl -tag -width LOCATE_PATH -compact .It Pa LOCATE_PATH path to the locate database if set and not empty, ignored if the .Fl d option was specified. .El .Sh FILES .Bl -tag -width /etc/periodic/weekly/310.locate -compact .It Pa /var/db/locate.database locate database .It Pa /usr/libexec/locate.updatedb Script to update the locate database .It Pa /etc/periodic/weekly/310.locate Script that starts the database rebuild .El .Sh SEE ALSO .Xr find 1 , .Xr whereis 1 , .Xr which 1 , .Xr fnmatch 3 , .Xr locate.updatedb 8 .Rs .%A Woods, James A. .%D 1983 .%T "Finding Files Fast" .%J ";login" .%V 8:1 .%P pp. 8-10 .Re .Sh HISTORY The .Nm command first appeared in .Bx 4.4 . Many new features were added in .Fx 2.2 . .Sh BUGS The .Nm program may fail to list some files that are present, or may list files that have been removed from the system. This is because locate only reports files that are present in the database, which is typically only regenerated once a week by the .Pa /etc/periodic/weekly/310.locate script. Use .Xr find 1 to locate files that are of a more transitory nature. .Pp The .Nm database was built by user .Dq nobody . The .Xr find 1 utility skips directories, which are not readable for user .Dq nobody , group .Dq nobody , or world. E.g.\& if your HOME directory is not world-readable, all your files are .Ar not in the database. .Pp The .Nm database is not byte order independent. It is not possible to share the databases between machines with different byte order. The current .Nm implementation understand databases in host byte order or network byte order if both architectures use the same integer size. So you can read on a .Fx Ns /i386 machine (little endian) a locate database which was built on SunOS/sparc machine (big endian, net). .Pp The .Nm utility does not recognize multibyte characters. Index: stable/6/usr.bin/locate/locate/locate.c =================================================================== --- stable/6/usr.bin/locate/locate/locate.c (revision 153613) +++ stable/6/usr.bin/locate/locate/locate.c (revision 153614) @@ -1,360 +1,364 @@ /* * Copyright (c) 1995 Wolfram Schneider . Berlin. * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * James A. Woods. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static const char copyright[] = "@(#) Copyright (c) 1995-1996 Wolfram Schneider, Berlin.\n\ @(#) Copyright (c) 1989, 1993\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint #if 0 static char sccsid[] = "@(#)locate.c 8.1 (Berkeley) 6/6/93"; #endif static const char rcsid[] = "$FreeBSD$"; #endif /* not lint */ /* * Ref: Usenix ;login:, Vol 8, No 1, February/March, 1983, p. 8. * * Locate scans a file list for the full pathname of a file given only part * of the name. The list has been processed with with "front-compression" * and bigram coding. Front compression reduces space by a factor of 4-5, * bigram coding by a further 20-25%. * * The codes are: * * 0-28 likeliest differential counts + offset to make nonnegative * 30 switch code for out-of-range count to follow in next word * 31 an 8 bit char followed * 128-255 bigram codes (128 most common, as determined by 'updatedb') * 32-127 single character (printable) ascii residue (ie, literal) * * A novel two-tiered string search technique is employed: * * First, a metacharacter-free subpattern and partial pathname is matched * BACKWARDS to avoid full expansion of the pathname list. The time savings * is 40-50% over forward matching, which cannot efficiently handle * overlapped search patterns and compressed path residue. * * Then, the actual shell glob-style regular expression (if in this form) is * matched against the candidate pathnames using the slower routines provided * in the standard 'find'. */ #include #include #include #include #include #include #include #include #include #ifdef MMAP # include # include # include # include #endif #include "locate.h" #include "pathnames.h" #ifdef DEBUG # include # include # include #endif int f_mmap; /* use mmap */ int f_icase; /* ignore case */ int f_stdin; /* read database from stdin */ int f_statistic; /* print statistic */ int f_silent; /* suppress output, show only count of matches */ int f_limit; /* limit number of output lines, 0 == infinite */ u_int counter; /* counter for matches [-c] */ +char separator='\n'; /* line separator */ void usage(void); void statistic(FILE *, char *); void fastfind(FILE *, char *, char *); void fastfind_icase(FILE *, char *, char *); void fastfind_mmap(char *, caddr_t, int, char *); void fastfind_mmap_icase(char *, caddr_t, int, char *); void search_mmap(char *, char **); void search_fopen(char *, char **); unsigned long cputime(void); extern char **colon(char **, char*, char*); extern void print_matches(u_int); extern int getwm(caddr_t); extern int getwf(FILE *); extern u_char *tolower_word(u_char *); extern int check_bigram_char(int); extern char *patprep(char *); int main(argc, argv) int argc; char **argv; { register int ch; char **dbv = NULL; char *path_fcodes; /* locate database */ #ifdef MMAP f_mmap = 1; /* mmap is default */ #endif (void) setlocale(LC_ALL, ""); - while ((ch = getopt(argc, argv, "Scd:il:ms")) != -1) + while ((ch = getopt(argc, argv, "0Scd:il:ms")) != -1) switch(ch) { + case '0': /* 'find -print0' style */ + separator = '\0'; + break; case 'S': /* statistic lines */ f_statistic = 1; break; case 'l': /* limit number of output lines, 0 == infinite */ f_limit = atoi(optarg); break; case 'd': /* database */ dbv = colon(dbv, optarg, _PATH_FCODES); break; case 'i': /* ignore case */ f_icase = 1; break; case 'm': /* mmap */ #ifdef MMAP f_mmap = 1; #else warnx("mmap(2) not implemented"); #endif break; case 's': /* stdio lib */ f_mmap = 0; break; case 'c': /* suppress output, show only count of matches */ f_silent = 1; break; default: usage(); } argv += optind; argc -= optind; /* to few arguments */ if (argc < 1 && !(f_statistic)) usage(); /* no (valid) database as argument */ if (dbv == NULL || *dbv == NULL) { /* try to read database from enviroment */ if ((path_fcodes = getenv("LOCATE_PATH")) == NULL || *path_fcodes == '\0') /* use default database */ dbv = colon(dbv, _PATH_FCODES, _PATH_FCODES); else /* $LOCATE_PATH */ dbv = colon(dbv, path_fcodes, _PATH_FCODES); } if (f_icase && UCHAR_MAX < 4096) /* init tolower lookup table */ for (ch = 0; ch < UCHAR_MAX + 1; ch++) myctype[ch] = tolower(ch); /* foreach database ... */ while((path_fcodes = *dbv) != NULL) { dbv++; if (!strcmp(path_fcodes, "-")) f_stdin = 1; else f_stdin = 0; #ifndef MMAP f_mmap = 0; /* be paranoid */ #endif if (!f_mmap || f_stdin || f_statistic) search_fopen(path_fcodes, argv); else search_mmap(path_fcodes, argv); } if (f_silent) print_matches(counter); exit(0); } void search_fopen(db, s) char *db; /* database */ char **s; /* search strings */ { FILE *fp; #ifdef DEBUG long t0; #endif /* can only read stdin once */ if (f_stdin) { fp = stdin; if (*(s+1) != NULL) { warnx("read database from stdin, use only `%s' as pattern", *s); *(s+1) = NULL; } } else if ((fp = fopen(db, "r")) == NULL) err(1, "`%s'", db); /* count only chars or lines */ if (f_statistic) { statistic(fp, db); (void)fclose(fp); return; } /* foreach search string ... */ while(*s != NULL) { #ifdef DEBUG t0 = cputime(); #endif if (!f_stdin && fseek(fp, (long)0, SEEK_SET) == -1) err(1, "fseek to begin of ``%s''\n", db); if (f_icase) fastfind_icase(fp, *s, db); else fastfind(fp, *s, db); #ifdef DEBUG warnx("fastfind %ld ms", cputime () - t0); #endif s++; } (void)fclose(fp); } #ifdef MMAP void search_mmap(db, s) char *db; /* database */ char **s; /* search strings */ { struct stat sb; int fd; caddr_t p; off_t len; #ifdef DEBUG long t0; #endif if ((fd = open(db, O_RDONLY)) == -1 || fstat(fd, &sb) == -1) err(1, "`%s'", db); len = sb.st_size; if ((p = mmap((caddr_t)0, (size_t)len, PROT_READ, MAP_SHARED, fd, (off_t)0)) == MAP_FAILED) err(1, "mmap ``%s''", db); /* foreach search string ... */ while (*s != NULL) { #ifdef DEBUG t0 = cputime(); #endif if (f_icase) fastfind_mmap_icase(*s, p, (int)len, db); else fastfind_mmap(*s, p, (int)len, db); #ifdef DEBUG warnx("fastfind %ld ms", cputime () - t0); #endif s++; } if (munmap(p, (size_t)len) == -1) warn("munmap %s\n", db); (void)close(fd); } #endif /* MMAP */ #ifdef DEBUG unsigned long cputime () { struct rusage rus; getrusage(0, &rus); return(rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000); } #endif /* DEBUG */ void usage () { (void)fprintf(stderr, "usage: locate [-Scims] [-l limit] [-d database] pattern ...\n\n"); (void)fprintf(stderr, "default database: `%s' or $LOCATE_PATH\n", _PATH_FCODES); exit(1); } /* load fastfind functions */ /* statistic */ /* fastfind_mmap, fastfind_mmap_icase */ #ifdef MMAP #undef FF_MMAP #undef FF_ICASE #define FF_MMAP #include "fastfind.c" #define FF_ICASE #include "fastfind.c" #endif /* MMAP */ /* fopen */ /* fastfind, fastfind_icase */ #undef FF_MMAP #undef FF_ICASE #include "fastfind.c" #define FF_ICASE #include "fastfind.c"