
1: /* 2: * paths.c - get 'known' pathnames, such as the system's library directory. 3: * 4: * Copyright (c) 2005-2007 Shiro Kawai <shiro@acm.org> 5: * 6: * Redistribution and use in source and binary forms, with or without 7: * modification, are permitted provided that the following conditions 8: * are met: 9: * 10: * 1. Redistributions of source code must retain the above copyright 11: * notice, this list of conditions and the following disclaimer. 12: * 13: * 2. Redistributions in binary form must reproduce the above copyright 14: * notice, this list of conditions and the following disclaimer in the 15: * documentation and/or other materials provided with the distribution. 16: * 17: * 3. Neither the name of the authors nor the names of its contributors 18: * may be used to endorse or promote products derived from this 19: * software without specific prior written permission. 20: * 21: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 27: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32: * 33: * $Id: paths.c,v 1.4 2007/09/15 12:30:50 shirok Exp $ 34: * 35: */ 36: 37: /* This file is used by both libgauche and gauche-config. The latter 38: * doesn't use ScmObj, so the function works on bare C strings. 39: */ 40: 41: #define LIBGAUCHE_BODY 42: #include "gauche.h" 43: #include "gauche/arch.h" 44: 45: #if defined(GAUCHE_WINDOWS) 46: #include "getdir_win.c" 47: #elif defined(GAUCHE_MACOSX_FRAMEWORK) 48: #include "getdir_darwin.c" 49: #else 50: #include "getdir_dummy.c" 51: #endif 52: 53: /* The configure-generated path macros might have '@' at the beginning, 54: indicating the runtime directory. */ 55: void maybe_prepend_install_dir(const char *orig, char *buf, int buflen, 56: void (*errfn)(const char *, ...)) 57: { 58: if (*orig == '@') { 59: int len = get_install_dir(buf, buflen, errfn); 60: if (len + (int)strlen(orig) > buflen) { 61: errfn("Pathname too long: %s", orig); 62: } 63: strcat(buf, orig+1); 64: } else { 65: if ((int)strlen(orig) >= buflen-1) { 66: errfn("Pathname too long: %s", orig); 67: } 68: strcpy(buf, orig); 69: } 70: } 71: 72: /* External API */ 73: 74: void Scm_GetLibraryDirectory(char *buf, int buflen, 75: void (*errfn)(const char *, ...)) 76: { 77: maybe_prepend_install_dir(GAUCHE_LIB_DIR, buf, buflen, errfn); 78: } 79: 80: void Scm_GetArchitectureDirectory(char *buf, int buflen, 81: void (*errfn)(const char *, ...)) 82: { 83: maybe_prepend_install_dir(GAUCHE_ARCH_DIR, buf, buflen, errfn); 84: } 85: 86: void Scm_GetSiteLibraryDirectory(char *buf, int buflen, 87: void (*errfn)(const char *, ...)) 88: { 89: maybe_prepend_install_dir(GAUCHE_SITE_LIB_DIR, buf, buflen, errfn); 90: } 91: 92: void Scm_GetSiteArchitectureDirectory(char *buf, int buflen, 93: void (*errfn)(const char *, ...)) 94: { 95: maybe_prepend_install_dir(GAUCHE_SITE_ARCH_DIR, buf, buflen, errfn); 96: } 97: