/* $NetBSD: str.c,v 1.26 2009/02/02 12:35:01 joerg Exp $ */ #if HAVE_CONFIG_H #include "config.h" #endif #include #if HAVE_SYS_CDEFS_H #include #endif __RCSID("$NetBSD: str.c,v 1.26 2009/02/02 12:35:01 joerg Exp $"); /* * FreeBSD install - a package for the installation and maintainance * of non-core utilities. * * 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. * * Jordan K. Hubbard * 18 July 1993 * * Miscellaneous string utilities. * */ #if HAVE_ASSERT_H #include #endif #if HAVE_ERR_H #include #endif #if HAVE_FNMATCH_H #include #endif #include "lib.h" #include "dewey.h" /* pull in definitions and macros for resizing arrays as we go */ #include "defs.h" /* * Return the suffix portion of a path */ const char * suffix_of(const char *str) { const char *dot; return ((dot = strrchr(basename_of(str), '.')) == NULL) ? "" : dot + 1; } /* * Return the filename portion of a path */ const char * basename_of(const char *str) { const char *slash; return ((slash = strrchr(str, '/')) == NULL) ? str : slash + 1; } /* * Return the dirname portion of a path */ const char * dirname_of(const char *path) { size_t cc; char *s; static char buf[MaxPathSize]; if ((s = strrchr(path, '/')) == NULL) { return "."; } if (s == path) { /* "/foo" -> return "/" */ return "/"; } cc = (size_t) (s - path); if (cc >= sizeof(buf)) errx(EXIT_FAILURE, "dirname_of: too long dirname: '%s'", path); (void) memcpy(buf, path, cc); buf[cc] = 0; return buf; } /* * Does the pkgname contain any of the special chars ("{[]?*<>")? * If so, return 1, else 0 */ int ispkgpattern(const char *pkg) { return strpbrk(pkg, "<>[]?*{") != NULL; }