aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-01-07 09:10:45 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-01-07 09:10:45 +0000
commit24be495ffd76faafaa19ccd15b55af3702c9fe7a (patch)
tree4f6aedc284240c6898af66001b1c720baa21284c
parenteeacd253013c5c40ef7d34b2763ffccdbe0ea8b3 (diff)
downloadmandoc-24be495ffd76faafaa19ccd15b55af3702c9fe7a.tar.gz
mandoc-24be495ffd76faafaa19ccd15b55af3702c9fe7a.tar.zst
mandoc-24be495ffd76faafaa19ccd15b55af3702c9fe7a.zip
Cache the result of uname(3) such that we don't need to call it
over and over again for each manual; found with gprof(1). Speeds up mandocdb(8) -Q by 3%, now at 39.5% of makewhatis(8).
-rw-r--r--mdoc_validate.c53
1 files changed, 23 insertions, 30 deletions
diff --git a/mdoc_validate.c b/mdoc_validate.c
index bfd4d237..e0d0a337 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_validate.c,v 1.200 2014/01/06 22:39:25 schwarze Exp $ */
+/* $Id: mdoc_validate.c,v 1.201 2014/01/07 09:10:45 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -2348,12 +2348,13 @@ post_bx(POST_ARGS)
static int
post_os(POST_ARGS)
{
- struct mdoc_node *n;
char buf[BUFSIZ];
- int c;
#ifndef OSNAME
struct utsname utsname;
+ static char *defbuf;
#endif
+ struct mdoc_node *n;
+ int c;
n = mdoc->last;
@@ -2376,39 +2377,31 @@ post_os(POST_ARGS)
assert(c);
- if ('\0' == buf[0]) {
- if (mdoc->defos) {
- mdoc->meta.os = mandoc_strdup(mdoc->defos);
- return(1);
- }
+ if ('\0' != *buf) {
+ mdoc->meta.os = mandoc_strdup(buf);
+ return(1);
+ }
+
+ if (mdoc->defos) {
+ mdoc->meta.os = mandoc_strdup(mdoc->defos);
+ return(1);
+ }
+
#ifdef OSNAME
- if (strlcat(buf, OSNAME, BUFSIZ) >= BUFSIZ) {
- mdoc_nmsg(mdoc, n, MANDOCERR_MEM);
- return(0);
- }
+ mdoc->meta.os = mandoc_strdup(OSNAME);
#else /*!OSNAME */
+ if (NULL == defbuf) {
if (-1 == uname(&utsname)) {
mdoc_nmsg(mdoc, n, MANDOCERR_UNAME);
- mdoc->meta.os = mandoc_strdup("UNKNOWN");
- return(post_prol(mdoc));
- }
-
- if (strlcat(buf, utsname.sysname, BUFSIZ) >= BUFSIZ) {
- mdoc_nmsg(mdoc, n, MANDOCERR_MEM);
- return(0);
- }
- if (strlcat(buf, " ", BUFSIZ) >= BUFSIZ) {
- mdoc_nmsg(mdoc, n, MANDOCERR_MEM);
- return(0);
+ defbuf = mandoc_strdup("UNKNOWN");
+ } else if (-1 == asprintf(&defbuf, "%s %s",
+ utsname.sysname, utsname.release)) {
+ perror(NULL);
+ exit((int)MANDOCLEVEL_SYSERR);
}
- if (strlcat(buf, utsname.release, BUFSIZ) >= BUFSIZ) {
- mdoc_nmsg(mdoc, n, MANDOCERR_MEM);
- return(0);
- }
-#endif /*!OSNAME*/
}
-
- mdoc->meta.os = mandoc_strdup(buf);
+ mdoc->meta.os = mandoc_strdup(defbuf);
+#endif /*!OSNAME*/
return(1);
}