]> git.cameronkatri.com Git - mandoc.git/blobdiff - xstd.c
Documentation, more validations, cleaned up actions, added Nm action.
[mandoc.git] / xstd.c
diff --git a/xstd.c b/xstd.c
index 6272ffec4ec4d9fe279e1679f3c32de06fba3e46..eb36b404f85deaebc23b4e9266d7ac0a2bbd8c58 100644 (file)
--- a/xstd.c
+++ b/xstd.c
@@ -1,4 +1,4 @@
-/* $Id: xstd.c,v 1.1 2008/12/23 05:30:49 kristaps Exp $ */
+/* $Id: xstd.c,v 1.3 2009/01/17 16:15:27 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  * PERFORMANCE OF THIS SOFTWARE.
  */
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  * PERFORMANCE OF THIS SOFTWARE.
  */
+#include <assert.h>
 #include <err.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "private.h"
 
 #include <err.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "private.h"
 
+#ifdef __linux__
+extern size_t           strlcat(char *, const char *, size_t);
+extern size_t           strlcpy(char *, const char *, size_t);
+#endif
+
 
 int
 xstrcmp(const char *p1, const char *p2)
 
 int
 xstrcmp(const char *p1, const char *p2)
@@ -69,3 +75,106 @@ xstrdup(const char *p)
        return(pp);
 }
 
        return(pp);
 }
 
+
+int
+xstrlcats(char *buf, const struct mdoc_node *n, size_t sz)
+{
+       char             *p;
+
+       assert(sz > 0);
+       assert(buf);
+       *buf = 0;
+
+       for ( ; n; n = n->next) {
+               assert(MDOC_TEXT == n->type);
+               p = n->data.text.string;
+               if ( ! xstrlcat(buf, p, sz))
+                       return(0);
+               if (n->next && ! xstrlcat(buf, " ", sz))
+                       return(0);
+       }
+
+       return(1);
+}
+
+
+
+
+#ifdef __linux__
+/*     $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $      */
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <string.h>
+
+
+size_t
+strlcat(char *dst, const char *src, size_t siz)
+{
+       char *d = dst;
+       const char *s = src;
+       size_t n = siz;
+       size_t dlen;
+
+       /* Find the end of dst and adjust bytes left but don't go past end */
+       while (n-- != 0 && *d != '\0')
+               d++;
+       dlen = d - dst;
+       n = siz - dlen;
+
+       if (n == 0)
+               return(dlen + strlen(s));
+       while (*s != '\0') {
+               if (n != 1) {
+                       *d++ = *s;
+                       n--;
+               }
+               s++;
+       }
+       *d = '\0';
+
+       return(dlen + (s - src));       /* count does not include NUL */
+}
+
+
+size_t
+strlcpy(char *dst, const char *src, size_t siz)
+{
+       char *d = dst;
+       const char *s = src;
+       size_t n = siz;
+
+       /* Copy as many bytes as will fit */
+       if (n != 0) {
+               while (--n != 0) {
+                       if ((*d++ = *s++) == '\0')
+                               break;
+               }
+       }
+
+       /* Not enough room in dst, add NUL and traverse rest of src */
+       if (n == 0) {
+               if (siz != 0)
+                       *d = '\0';              /* NUL-terminate dst */
+               while (*s++)
+                       ;
+       }
+
+       return(s - src - 1);    /* count does not include NUL */
+}
+#endif