mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 16:50:58 +00:00
Improved logging
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@5793 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
dd5ae0641d
commit
273b2904ee
4 changed files with 260 additions and 17 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Sun Jan 16 9:10:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||||
|
|
||||||
|
Moved objc-load.c to objc-load.m and filnd-exec.c to find-exec.m
|
||||||
|
Added logging functions to objc-load.m so that logging can be
|
||||||
|
enabled at runtime using --GNU-Debug=NSBundle
|
||||||
|
|
||||||
Sun Jan 9 15:20:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
Sun Jan 9 15:20:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||||
|
|
||||||
* Source/NSGAttributedString.m: ([-attributesAtIndex:effectiveRange:])
|
* Source/NSGAttributedString.m: ([-attributesAtIndex:effectiveRange:])
|
||||||
|
|
|
@ -333,6 +333,8 @@ NSUserDefaults.m \
|
||||||
NSValue.m \
|
NSValue.m \
|
||||||
NSZone.m \
|
NSZone.m \
|
||||||
externs.m \
|
externs.m \
|
||||||
|
objc-load.m \
|
||||||
|
find_exec.m \
|
||||||
NSURL.m \
|
NSURL.m \
|
||||||
NSURLHandle.m
|
NSURLHandle.m
|
||||||
|
|
||||||
|
@ -345,10 +347,6 @@ NSNUMBER_MFILES = \
|
||||||
NSNumber8.m NSNumber9.m NSNumber10.m NSNumber11.m \
|
NSNumber8.m NSNumber9.m NSNumber10.m NSNumber11.m \
|
||||||
NSNumber12.m
|
NSNumber12.m
|
||||||
|
|
||||||
BASE_CFILES = \
|
|
||||||
find_exec.c \
|
|
||||||
objc-load.c
|
|
||||||
|
|
||||||
BASE_OTHER_SRCFILES = \
|
BASE_OTHER_SRCFILES = \
|
||||||
NSConcreteNumber.m \
|
NSConcreteNumber.m \
|
||||||
NSCTemplateValue.m \
|
NSCTemplateValue.m \
|
||||||
|
@ -456,7 +454,7 @@ $(GNUSTEP_TARGET_CPU)/$(GNUSTEP_TARGET_OS)/config.h \
|
||||||
$(GNUSTEP_TARGET_CPU)/$(GNUSTEP_TARGET_OS)/GSConfig.h
|
$(GNUSTEP_TARGET_CPU)/$(GNUSTEP_TARGET_OS)/GSConfig.h
|
||||||
|
|
||||||
# The C source files to be compiled
|
# The C source files to be compiled
|
||||||
libgnustep-base_C_FILES = $(GNU_CFILES) $(BASE_CFILES)
|
libgnustep-base_C_FILES = $(GNU_CFILES)
|
||||||
|
|
||||||
# The Objective-C source files to be compiled
|
# The Objective-C source files to be compiled
|
||||||
libgnustep-base_OBJC_FILES = $(GNU_MFILES) \
|
libgnustep-base_OBJC_FILES = $(GNU_MFILES) \
|
||||||
|
|
241
Source/find_exec.m
Normal file
241
Source/find_exec.m
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
/*
|
||||||
|
find_exec.c - routine to find the executable path
|
||||||
|
|
||||||
|
From the dld distribution -- copyrighted below.
|
||||||
|
Modified by Adam Fedor - traverse links
|
||||||
|
|
||||||
|
Given a filename, objc_find_executable searches the directories listed in
|
||||||
|
environment variable PATH for a file with that filename.
|
||||||
|
A new copy of the complete path name of that file is returned. This new
|
||||||
|
string may be disposed by free() later on.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This file is part of DLD, a dynamic link/unlink editor for C.
|
||||||
|
|
||||||
|
Copyright (C) 1990 by W. Wilson Ho.
|
||||||
|
|
||||||
|
The author can be reached electronically by how@cs.ucdavis.edu or
|
||||||
|
through physical mail at:
|
||||||
|
|
||||||
|
W. Wilson Ho
|
||||||
|
Division of Computer Science
|
||||||
|
University of California at Davis
|
||||||
|
Davis, CA 95616
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 1, or (at your option) any
|
||||||
|
later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#ifdef __WIN32__
|
||||||
|
#include <limits.h>
|
||||||
|
#define S_IFLNK 0120000
|
||||||
|
int readlink(char *path, char *buf, int bufsiz) { return (-1); }
|
||||||
|
int lstat(char *path, struct stat *buf) { return (-1); }
|
||||||
|
#define MAXPATHLEN 255
|
||||||
|
#else
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif /* __WIN32__ */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define DEFAULT_PATH ".:~/bin::/usr/local/bin:/usr/new:/usr/ucb:/usr/bin:/bin:/usr/hosts"
|
||||||
|
|
||||||
|
#if defined(__WIN32__) || defined(_WIN32)
|
||||||
|
#define PATH_SEPARATOR ';'
|
||||||
|
#define PATH_COMPONENT "\\"
|
||||||
|
#else
|
||||||
|
#define PATH_SEPARATOR ':'
|
||||||
|
#define PATH_COMPONENT "/"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ABSOLUTE_FILENAME_P (fname): True if fname is an absolute filename */
|
||||||
|
#if defined(atarist) || defined(__WIN32__) || defined(_WIN32)
|
||||||
|
#define ABSOLUTE_FILENAME_P(fname) ((fname[0] == '/') || \
|
||||||
|
(fname[0] && (fname[1] == ':')))
|
||||||
|
#else
|
||||||
|
#define ABSOLUTE_FILENAME_P(fname) (fname[0] == '/')
|
||||||
|
#endif /* atarist */
|
||||||
|
|
||||||
|
static char *
|
||||||
|
copy_of (s)
|
||||||
|
register char *s;
|
||||||
|
{
|
||||||
|
register char *p = (char *) malloc (strlen(s)+1);
|
||||||
|
|
||||||
|
if (!p) return 0;
|
||||||
|
|
||||||
|
*p = 0;
|
||||||
|
strcpy (p, s);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
find_full_path(char *path)
|
||||||
|
{
|
||||||
|
struct stat statbuf;
|
||||||
|
|
||||||
|
if ( stat(path, &statbuf) != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if ( (lstat(path, &statbuf) == 0)
|
||||||
|
&& (statbuf.st_mode & S_IFLNK) == S_IFLNK) {
|
||||||
|
char link[MAXPATHLEN+1];
|
||||||
|
int cc;
|
||||||
|
cc = readlink(path, link, MAXPATHLEN);
|
||||||
|
if (cc == -1)
|
||||||
|
return -1;
|
||||||
|
link[cc] = '\0';
|
||||||
|
if (ABSOLUTE_FILENAME_P(link)) {
|
||||||
|
strcpy(path, link);
|
||||||
|
} else if (strlen(path)+strlen(link) < MAXPATHLEN) {
|
||||||
|
char *p;
|
||||||
|
p = strrchr(path, '/');
|
||||||
|
if (p)
|
||||||
|
*(p+1) = '\0';
|
||||||
|
strcat(path, link);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
objc_find_executable (const char *file)
|
||||||
|
{
|
||||||
|
char *search;
|
||||||
|
register char *p;
|
||||||
|
int cwd_in_path = 0;
|
||||||
|
|
||||||
|
if (ABSOLUTE_FILENAME_P(file)) {
|
||||||
|
search = copy_of(file);
|
||||||
|
find_full_path(search);
|
||||||
|
return search;
|
||||||
|
/*
|
||||||
|
return copy_of (file);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((search = (char *) getenv("PATH")) == 0)
|
||||||
|
search = DEFAULT_PATH;
|
||||||
|
|
||||||
|
p = search;
|
||||||
|
|
||||||
|
while (*p) {
|
||||||
|
char name[MAXPATHLEN];
|
||||||
|
register char *next;
|
||||||
|
|
||||||
|
next = name;
|
||||||
|
|
||||||
|
/* copy directory name into [name] */
|
||||||
|
while (*p && *p != PATH_SEPARATOR) *next++ = *p++;
|
||||||
|
*next = 0;
|
||||||
|
if (*p) p++;
|
||||||
|
|
||||||
|
if (name[0] == '.' && name[1] == 0) {
|
||||||
|
#ifdef HAVE_GETCWD
|
||||||
|
getcwd (name, MAXPATHLEN);
|
||||||
|
#else
|
||||||
|
getwd (name);
|
||||||
|
#endif
|
||||||
|
cwd_in_path = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat (name, PATH_COMPONENT);
|
||||||
|
strcat (name, file);
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (access (name, X_OK) == 0)
|
||||||
|
*/
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
|
||||||
|
/* Also add common executable extensions on windows */
|
||||||
|
#if defined(__WIN32__) || defined(_WIN32)
|
||||||
|
{
|
||||||
|
int fl = strlen(name);
|
||||||
|
|
||||||
|
strcat (name, ".com");
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
name[fl] = '\0';
|
||||||
|
|
||||||
|
strcat (name, ".exe");
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
name[fl] = '\0';
|
||||||
|
|
||||||
|
strcat (name, ".bat");
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
name[fl] = '\0';
|
||||||
|
|
||||||
|
strcat (name, ".cmd");
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
name[fl] = '\0';
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
If '.' not in PATH, check this too
|
||||||
|
*/
|
||||||
|
if (!cwd_in_path) {
|
||||||
|
char name[MAXPATHLEN];
|
||||||
|
|
||||||
|
#ifdef HAVE_GETCWD
|
||||||
|
getcwd (name, MAXPATHLEN);
|
||||||
|
#else
|
||||||
|
getwd (name);
|
||||||
|
#endif
|
||||||
|
strcat (name, PATH_COMPONENT);
|
||||||
|
strcat (name, file);
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (access (name, X_OK) == 0)
|
||||||
|
*/
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
|
||||||
|
/* Also add common executable extensions on windows */
|
||||||
|
#if defined(__WIN32__) || defined(_WIN32)
|
||||||
|
{
|
||||||
|
int fl = strlen(name);
|
||||||
|
|
||||||
|
strcat (name, ".com");
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
name[fl] = '\0';
|
||||||
|
|
||||||
|
strcat (name, ".exe");
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
name[fl] = '\0';
|
||||||
|
|
||||||
|
strcat (name, ".bat");
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
name[fl] = '\0';
|
||||||
|
|
||||||
|
strcat (name, ".cmd");
|
||||||
|
if (find_full_path (name) == 0)
|
||||||
|
return copy_of (name);
|
||||||
|
name[fl] = '\0';
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -35,6 +35,8 @@
|
||||||
#include <objc/objc-list.h>
|
#include <objc/objc-list.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <Foundation/objc-load.h>
|
#include <Foundation/objc-load.h>
|
||||||
|
#include <Foundation/NSString.h>
|
||||||
|
#include <Foundation/NSDebug.h>
|
||||||
|
|
||||||
/* include the interface to the dynamic linker */
|
/* include the interface to the dynamic linker */
|
||||||
#include "dynamic-load.h"
|
#include "dynamic-load.h"
|
||||||
|
@ -99,9 +101,8 @@ objc_initialize_loading(FILE *errorStream)
|
||||||
|
|
||||||
dynamic_loaded = NO;
|
dynamic_loaded = NO;
|
||||||
path = objc_executable_location();
|
path = objc_executable_location();
|
||||||
#ifdef DEBUG
|
NSDebugFLLog(@"NSBundle",
|
||||||
printf("Debug (objc-load): initializing dynamic loader for %s\n", path);
|
@"Debug (objc-load): initializing dynamic loader for %s", path);
|
||||||
#endif
|
|
||||||
if (__objc_dynamic_init(path)) {
|
if (__objc_dynamic_init(path)) {
|
||||||
if (errorStream)
|
if (errorStream)
|
||||||
__objc_dynamic_error(errorStream, "Error (objc-load): Cannot initialize dynamic linker");
|
__objc_dynamic_error(errorStream, "Error (objc-load): Cannot initialize dynamic linker");
|
||||||
|
@ -152,9 +153,8 @@ objc_load_module(
|
||||||
_objc_load_callback = objc_load_callback;
|
_objc_load_callback = objc_load_callback;
|
||||||
|
|
||||||
/* Link in the object file */
|
/* Link in the object file */
|
||||||
#ifdef DEBUG
|
NSDebugFLLog(@"NSBundle",
|
||||||
printf("Debug (objc-load): Linking file %s\n", filename);
|
@"Debug (objc-load): Linking file %s\n", filename);
|
||||||
#endif
|
|
||||||
handle = __objc_dynamic_link(filename, 1, debugFilename);
|
handle = __objc_dynamic_link(filename, 1, debugFilename);
|
||||||
if (handle == 0) {
|
if (handle == 0) {
|
||||||
if (errorStream)
|
if (errorStream)
|
||||||
|
@ -178,13 +178,11 @@ objc_load_module(
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
NSDebugFLLog(@"NSBundle",
|
||||||
printf("Debug (objc-load): %d modules\n", (int)ctor_list[0]);
|
@"Debug (objc-load): %d modules\n", (int)ctor_list[0]);
|
||||||
#endif
|
|
||||||
for (i=1; ctor_list[i]; i++) {
|
for (i=1; ctor_list[i]; i++) {
|
||||||
#ifdef DEBUG
|
NSDebugFLLog(@"NSBundle",
|
||||||
printf("Debug (objc-load): Invoking CTOR %p\n", ctor_list[i]);
|
@"Debug (objc-load): Invoking CTOR %p\n", ctor_list[i]);
|
||||||
#endif
|
|
||||||
ctor_list[i]();
|
ctor_list[i]();
|
||||||
}
|
}
|
||||||
#endif /* not __ELF__ */
|
#endif /* not __ELF__ */
|
Loading…
Add table
Add a link
Reference in a new issue