diff --git a/Headers/gnustep/base/NSFileManager.h b/Headers/gnustep/base/NSFileManager.h new file mode 100644 index 000000000..cebe05e17 --- /dev/null +++ b/Headers/gnustep/base/NSFileManager.h @@ -0,0 +1,179 @@ +/* + NSFileManager.h + + Copyright (C) 1997 Free Software Foundation, Inc. + + Author: Mircea Oancea + Author: Ovidiu Predescu + Date: Feb 1997 + + This file is part of the GNUstep Base Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __NSFileManager_h_GNUSTEP_BASE_INCLUDE +#define __NSFileManager_h_GNUSTEP_BASE_INCLUDE + +#include +#include +#include + +@class NSNumber; +@class NSString; +@class NSData; +@class NSDate; +@class NSArray; +@class NSMutableArray; + +@class NSDirectoryEnumerator; + +@interface NSFileManager : NSObject + +// Getting the default manager ++ (NSFileManager*)defaultManager; + +// Directory operations +- (BOOL)changeCurrentDirectoryPath:(NSString*)path; +- (BOOL)createDirectoryAtPath:(NSString*)path + attributes:(NSDictionary*)attributes; +- (NSString*)currentDirectoryPath; + +// File operations +- (BOOL)copyPath:(NSString*)source toPath:(NSString*)destination + handler:handler; +- (BOOL)movePath:(NSString*)source toPath:(NSString*)destination + handler:handler; +- (BOOL)linkPath:(NSString*)source toPath:(NSString*)destination + handler:handler; +- (BOOL)removeFileAtPath:(NSString*)path + handler:handler; +- (BOOL)createFileAtPath:(NSString*)path contents:(NSData*)contents + attributes:(NSDictionary*)attributes; + +// Getting and comparing file contents +- (NSData*)contentsAtPath:(NSString*)path; +- (BOOL)contentsEqualAtPath:(NSString*)path1 andPath:(NSString*)path2; + +// Detemining access to files +- (BOOL)fileExistsAtPath:(NSString*)path; +- (BOOL)fileExistsAtPath:(NSString*)path isDirectory:(BOOL*)isDirectory; +- (BOOL)isReadableFileAtPath:(NSString*)path; +- (BOOL)isWritableFileAtPath:(NSString*)path; +- (BOOL)isExecutableFileAtPath:(NSString*)path; +- (BOOL)isDeletableFileAtPath:(NSString*)path; + +// Getting and setting attributes +- (NSDictionary*)fileAttributesAtPath:(NSString*)path traverseLink:(BOOL)flag; +- (NSDictionary*)fileSystemAttributesAtPath:(NSString*)path; +- (BOOL)changeFileAttributes:(NSDictionary*)attributes atPath:(NSString*)path; + +// Discovering directory contents +- (NSArray*)directoryContentsAtPath:(NSString*)path; +- (NSDirectoryEnumerator*)enumeratorAtPath:(NSString*)path; +- (NSArray*)subpathsAtPath:(NSString*)path; + +// Symbolic-link operations +- (BOOL)createSymbolicLinkAtPath:(NSString*)path + pathContent:(NSString*)otherPath; +- (NSString*)pathContentOfSymbolicLinkAtPath:(NSString*)path; + +// Converting file-system representations +- (const char*)fileSystemRepresentationWithPath:(NSString*)path; +- (NSString*)stringWithFileSystemRepresentation:(const char*)string + length:(unsigned int)len; + +@end /* NSFileManager */ + + +@interface NSObject (NSFileManagerHandler) +- (BOOL)fileManager:(NSFileManager*)fileManager + shouldProceedAfterError:(NSDictionary*)errorDictionary; +- (void)fileManager:(NSFileManager*)fileManager + willProcessPath:(NSString*)path; +@end + + +@interface NSDirectoryEnumerator : NSEnumerator +{ + NSMutableArray* enumStack; + NSMutableArray* pathStack; + NSString* currentFileName; + NSString* currentFilePath; + NSString* topPath; + struct { + BOOL isRecursive:1; + BOOL isFollowing:1; + } flags; +} + +// Initializing +- initWithDirectoryPath:(NSString*)path + recurseIntoSubdirectories:(BOOL)recurse + followSymlinks:(BOOL)follow + prefixFiles:(BOOL)prefix; + +// Getting attributes +- (NSDictionary*)directoryAttributes; +- (NSDictionary*)fileAttributes; + +// Skipping subdirectories +- (void)skipDescendents; + +@end /* NSDirectoryEnumerator */ + +/* File Attributes */ +extern NSString* NSFileSize; +extern NSString* NSFileModificationDate; +extern NSString* NSFileOwnerAccountNumber; +extern NSString* NSFileGroupOwnerAccountNumber; +extern NSString* NSFileReferenceCount; +extern NSString* NSFileIdentifier; +extern NSString* NSFileDeviceIdentifier; +extern NSString* NSFilePosixPermissions; +extern NSString* NSFileType; + +/* File Types */ + +extern NSString* NSFileTypeDirectory; +extern NSString* NSFileTypeRegular; +extern NSString* NSFileTypeSymbolicLink; +extern NSString* NSFileTypeSocket; +extern NSString* NSFileTypeFifo; +extern NSString* NSFileTypeCharacterSpecial; +extern NSString* NSFileTypeBlockSpecial; +extern NSString* NSFileTypeUnknown; + +/* FileSystem Attributes */ + +extern NSString* NSFileSystemSize; +extern NSString* NSFileSystemFreeSize; +extern NSString* NSFileSystemNodes; +extern NSString* NSFileSystemFreeNodes; +extern NSString* NSFileSystemNumber; + +/* Easy access to attributes in a dictionary */ + +@interface NSDictionary(NSFileAttributes) +- (NSNumber*)fileSize; +- (NSString*)fileType; +- (NSNumber*)fileOwnerAccountNumber; +- (NSNumber*)fileGroupOwnerAccountNumber; +- (NSDate*)fileModificationDate; +- (NSNumber*)filePosixPermissions; +@end + + +#endif /* __NSFileManager_h_GNUSTEP_BASE_INCLUDE */ diff --git a/Source/NSFileManager.m b/Source/NSFileManager.m new file mode 100644 index 000000000..f1f14fecf --- /dev/null +++ b/Source/NSFileManager.m @@ -0,0 +1,809 @@ +/* + NSFileManager.m + + Copyright (C) 1997 Free Software Foundation, Inc. + + Author: Mircea Oancea + Author: Ovidiu Predescu + Date: Feb 1997 + + This file is part of the GNUstep Base Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include + +/* determine directory reading files */ + +#if defined(HAVE_DIRENT_H) +# include +#elif defined(HAVE_SYS_DIR_H) +# include +#elif defined(HAVE_SYS_NDIR_H) +# include +#elif defined(HAVE_NDIR_H) +# include +#endif + +#include + +#if !defined(_POSIX_VERSION) +# if defined(NeXT) +# define DIR_enum_item struct direct +# endif +#endif + +#if !defined(DIR_enum_item) +# define DIR_enum_item struct dirent +#endif + +#define DIR_enum_state DIR + +/* determine filesystem max path length */ + +#ifdef _POSIX_VERSION +# include /* for PATH_MAX */ +# include +#else +# include /* for MAXPATHLEN */ +#endif + +#ifndef PATH_MAX +# ifdef _POSIX_VERSION +# define PATH_MAX _POSIX_PATH_MAX +# else +# ifdef MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 1024 +# endif +# endif +#endif + +/* determine if we have statfs struct and function */ + +#ifdef HAVE_SYS_VFS_H +# include +#endif + +#ifdef HAVE_SYS_STATFS_H +# include +#endif + +#include +#include + +/* include usual headers */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * NSFileManager implementation + */ + +@implementation NSFileManager + +// Getting the default manager + +static NSFileManager* defaultManager = nil; + ++ (NSFileManager*)defaultManager +{ + if (!defaultManager) { + // THREAD + defaultManager = [[self alloc] init]; + } + return defaultManager; +} + +// Directory operations + +- (BOOL)changeCurrentDirectoryPath:(NSString*)path +{ + const char* cpath = [self fileSystemRepresentationWithPath:path]; + + return (chdir(cpath) == 0); +} + +- (BOOL)createDirectoryAtPath:(NSString*)path + attributes:(NSDictionary*)attributes +{ + const char* cpath; + char dirpath[PATH_MAX+1]; + struct stat statbuf; + int len, cur; + + cpath = [self fileSystemRepresentationWithPath:path]; + len = strlen(cpath); + if (len > PATH_MAX) + // name too long + return NO; + + if (strcmp(cpath, "/") == 0 || len == 0) + // cannot use "/" or "" as a new dir path + return NO; + + strcpy(dirpath, cpath); + dirpath[len] = '\0'; + if (dirpath[len-1] == '/') + dirpath[len-1] = '\0'; + cur = 0; + + do { + // find next '/' + while (dirpath[cur] != '/' && cur < len) + cur++; + // if first char is '/' then again; (cur == len) -> last component + if (cur == 0) { + cur++; + continue; + } + // check if path from 0 to cur is valid + dirpath[cur] = '\0'; + if (stat(dirpath, &statbuf) == 0) { + if (cur == len) + return NO; // already existing last path + } + else { + // make new directory + if (mkdir(dirpath, 0777) != 0) + return NO; // could not create component + // if last directory and attributes then change + if (cur == len && attributes) + return [self changeFileAttributes:attributes + atPath:[self stringWithFileSystemRepresentation:dirpath + length:cur]]; + } + dirpath[cur] = '/'; + cur++; + } while (cur < len); + + return YES; +} + +- (NSString*)currentDirectoryPath +{ + char path[PATH_MAX]; + +#ifdef HAVE_GETCWD + if (getcwd(path, PATH_MAX-1) == NULL) + return nil; +#else + if (getwd(path) == NULL) + return nil; +#endif + + return [self stringWithFileSystemRepresentation:path length:strlen(path)]; +} + +// File operations + +- (BOOL)copyPath:(NSString*)source toPath:(NSString*)destination + handler:handler +{ + // TODO + return NO; +} + +- (BOOL)movePath:(NSString*)source toPath:(NSString*)destination + handler:handler +{ + BOOL sourceIsDir; + const char* sourcePath = [self fileSystemRepresentationWithPath:source]; + const char* destPath = [self fileSystemRepresentationWithPath:destination]; + + if ([self fileExistsAtPath:source isDirectory:&sourceIsDir] + && !sourceIsDir) { + /* `source' is file so simply move it to destination. */ + [handler fileManager:self willProcessPath:source]; + if (rename(sourcePath, destPath) == -1) { + if (handler) { + NSDictionary* dict + = [NSDictionary dictionaryWithObjectsAndKeys: + source, @"Path", + [NSString stringWithCString:strerror(errno)], @"Error", + destination, @"ToPath", + nil]; + if ([handler fileManager:self shouldProceedAfterError:dict]) + return YES; + } + return NO; + } + } + + // TODO: handle directories + return YES; +} + +- (BOOL)linkPath:(NSString*)source toPath:(NSString*)destination + handler:handler +{ + // TODO + return NO; +} + +- (BOOL)removeFileAtPath:(NSString*)path + handler:handler +{ + // TODO + return NO; +} + +- (BOOL)createFileAtPath:(NSString*)path contents:(NSData*)contents + attributes:(NSDictionary*)attributes +{ + // TODO + return NO; +} + +// Getting and comparing file contents + +- (NSData*)contentsAtPath:(NSString*)path +{ + // TODO + return nil; +} + +- (BOOL)contentsEqualAtPath:(NSString*)path1 andPath:(NSString*)path2 +{ + // TODO + return NO; +} + +// Detemining access to files + +- (BOOL)fileExistsAtPath:(NSString*)path +{ + return [self fileExistsAtPath:path isDirectory:NULL]; +} + +- (BOOL)fileExistsAtPath:(NSString*)path isDirectory:(BOOL*)isDirectory +{ + struct stat statbuf; + const char* cpath = [self fileSystemRepresentationWithPath:path]; + + if (stat(cpath, &statbuf) != 0) + return NO; + + if (isDirectory) { + *isDirectory = ((statbuf.st_mode & S_IFMT) == S_IFDIR); + } + + return YES; +} + +- (BOOL)isReadableFileAtPath:(NSString*)path +{ + const char* cpath = [self fileSystemRepresentationWithPath:path]; + + return (access(cpath, R_OK) == 0); +} + +- (BOOL)isWritableFileAtPath:(NSString*)path +{ + const char* cpath = [self fileSystemRepresentationWithPath:path]; + + return (access(cpath, W_OK) == 0); +} + +- (BOOL)isExecutableFileAtPath:(NSString*)path +{ + const char* cpath = [self fileSystemRepresentationWithPath:path]; + + return (access(cpath, X_OK) == 0); +} + +- (BOOL)isDeletableFileAtPath:(NSString*)path +{ + // TODO - handle directories + const char* cpath; + + cpath = [self fileSystemRepresentationWithPath: + [path stringByDeletingLastPathComponent]]; + + if (access(cpath, X_OK || W_OK) != 0) + return NO; + + cpath = [self fileSystemRepresentationWithPath: + [path stringByDeletingLastPathComponent]]; + + return (access(cpath, X_OK || W_OK) != 0); +} + +- (NSDictionary*)fileAttributesAtPath:(NSString*)path traverseLink:(BOOL)flag +{ + struct stat statbuf; + const char* cpath = [self fileSystemRepresentationWithPath:path]; + int mode; + + id values[9]; + id keys[9] = { + NSFileSize, + NSFileModificationDate, + NSFileOwnerAccountNumber, + NSFileGroupOwnerAccountNumber, + NSFileReferenceCount, + NSFileIdentifier, + NSFileDeviceIdentifier, + NSFilePosixPermissions, + NSFileType + }; + + if (stat(cpath, &statbuf) != 0) + return nil; + + values[0] = [NSNumber numberWithUnsignedLongLong:statbuf.st_size]; + values[1] = [NSDate dateWithTimeIntervalSince1970:statbuf.st_mtime]; + values[2] = [NSNumber numberWithUnsignedInt:statbuf.st_uid]; + values[3] = [NSNumber numberWithUnsignedInt:statbuf.st_gid]; + values[4] = [NSNumber numberWithUnsignedInt:statbuf.st_nlink]; + values[5] = [NSNumber numberWithUnsignedLong:statbuf.st_ino]; + values[6] = [NSNumber numberWithUnsignedInt:statbuf.st_dev]; + values[7] = [NSNumber numberWithUnsignedInt:statbuf.st_mode]; + + mode = statbuf.st_mode & S_IFMT; + + if (mode == S_IFREG) + values[8] = NSFileTypeRegular; + else if (mode == S_IFDIR) + values[8] = NSFileTypeDirectory; + else if (mode == S_IFCHR) + values[8] = NSFileTypeCharacterSpecial; + else if (mode == S_IFBLK) + values[8] = NSFileTypeBlockSpecial; + else if (mode == S_IFLNK) + values[8] = NSFileTypeSymbolicLink; + else if (mode == S_IFIFO) + values[8] = NSFileTypeFifo; + else if (mode == S_IFSOCK) + values[8] = NSFileTypeSocket; + else + values[8] = NSFileTypeUnknown; + + return [[[NSDictionary alloc] + initWithObjects:values forKeys:keys count:5] + autorelease]; +} + +- (NSDictionary*)fileSystemAttributesAtPath:(NSString*)path +{ +#if HAVE_SYS_VFS_H || HAVE_SYS_STATFS_H + struct stat statbuf; +#if HAVE_STATVFS + struct statvfs statfsbuf; +#else + struct statfs statfsbuf; +#endif + long long totalsize, freesize; + const char* cpath = [self fileSystemRepresentationWithPath:path]; + + id values[5]; + id keys[5] = { + NSFileSystemSize, + NSFileSystemFreeSize, + NSFileSystemNodes, + NSFileSystemFreeNodes, + NSFileSystemNumber + }; + + if (stat(cpath, &statbuf) != 0) + return nil; + +#if HAVE_STATVFS + if (statvfs(cpath, &statfsbuf) != 0) + return nil; +#else + if (statfs(cpath, &statfsbuf) != 0) + return nil; +#endif + + totalsize = statfsbuf.f_bsize * statfsbuf.f_blocks; + freesize = statfsbuf.f_bsize * statfsbuf.f_bfree; + + values[0] = [NSNumber numberWithLongLong:totalsize]; + values[1] = [NSNumber numberWithLongLong:freesize]; + values[2] = [NSNumber numberWithLong:statfsbuf.f_files]; + values[3] = [NSNumber numberWithLong:statfsbuf.f_ffree]; + values[4] = [NSNumber numberWithUnsignedInt:statbuf.st_dev]; + + return [[[NSDictionary alloc] + initWithObjects:values forKeys:keys count:5] + autorelease]; +#else + return nil; +#endif +} + +- (BOOL)changeFileAttributes:(NSDictionary*)attributes atPath:(NSString*)path +{ + const char* cpath = [self fileSystemRepresentationWithPath:path]; + NSNumber* num; + NSDate* date; + BOOL allOk = YES; + + num = [attributes objectForKey:NSFileOwnerAccountNumber]; + if (num) { + allOk &= (chown(cpath, [num intValue], -1) == 0); + } + + num = [attributes objectForKey:NSFileGroupOwnerAccountNumber]; + if (num) { + allOk &= (chown(cpath, -1, [num intValue]) == 0); + } + + num = [attributes objectForKey:NSFilePosixPermissions]; + if (num) { + allOk &= (chmod(cpath, [num intValue]) == 0); + } + + date = [attributes objectForKey:NSFileModificationDate]; + if (date) { + struct stat sb; +#ifdef _POSIX_VERSION + struct utimbuf ub; +#else + time_t ub[2]; +#endif + + if (stat(cpath, &sb) != 0) + allOk = NO; + else { +#ifdef _POSIX_VERSION + ub.actime = sb.st_atime; + ub.modtime = [date timeIntervalSince1970]; + allOk &= (utime(cpath, &ub) == 0); +#else + ub[0] = sb.st_atime; + ub[1] = [date timeIntervalSince1970]; + allOk &= (utime((char*)cpath, ub) == 0); +#endif + } + } + + return allOk; +} + +// Discovering directory contents + +- (NSArray*)directoryContentsAtPath:(NSString*)path +{ + NSDirectoryEnumerator* direnum; + NSMutableArray* content; + BOOL isDir; + + if (![self fileExistsAtPath:path isDirectory:&isDir] || !isDir) + return nil; + + direnum = [[NSDirectoryEnumerator alloc] + initWithDirectoryPath:path + recurseIntoSubdirectories:NO + followSymlinks:NO + prefixFiles:NO]; + content = [[[NSMutableArray alloc] init] autorelease]; + + while ((path = [direnum nextObject])) + [content addObject:path]; + + [direnum release]; + + return content; +} + +- (NSDirectoryEnumerator*)enumeratorAtPath:(NSString*)path +{ + return [[[NSDirectoryEnumerator alloc] + initWithDirectoryPath:path + recurseIntoSubdirectories:YES + followSymlinks:NO + prefixFiles:YES] autorelease]; +} + +- (NSArray*)subpathsAtPath:(NSString*)path +{ + NSDirectoryEnumerator* direnum; + NSMutableArray* content; + BOOL isDir; + + if (![self fileExistsAtPath:path isDirectory:&isDir] || !isDir) + return nil; + + direnum = [[NSDirectoryEnumerator alloc] + initWithDirectoryPath:path + recurseIntoSubdirectories:YES + followSymlinks:NO + prefixFiles:YES]; + content = [[[NSMutableArray alloc] init] autorelease]; + + while ((path = [direnum nextObject])) + [content addObject:path]; + + [direnum release]; + + return content; +} + +// Symbolic-link operations + +- (BOOL)createSymbolicLinkAtPath:(NSString*)path + pathContent:(NSString*)otherPath +{ + const char* lpath = [self fileSystemRepresentationWithPath:path]; + const char* npath = [self fileSystemRepresentationWithPath:otherPath]; + + return (symlink(lpath, npath) == 0); +} + +- (NSString*)pathContentOfSymbolicLinkAtPath:(NSString*)path +{ + char lpath[PATH_MAX]; + const char* cpath = [self fileSystemRepresentationWithPath:path]; + int llen = readlink(cpath, lpath, PATH_MAX-1); + + if (llen > 0) + return [self stringWithFileSystemRepresentation:lpath length:llen]; + else + return nil; +} + +// Converting file-system representations + +- (const char*)fileSystemRepresentationWithPath:(NSString*)path +{ + return [[[path copy] autorelease] cString]; +} + +- (NSString*)stringWithFileSystemRepresentation:(const char*)string + length:(unsigned int)len +{ + return [NSString stringWithCString:string length:len]; +} + +@end /* NSFileManager */ + +/* + * NSDirectoryEnumerator implementation + */ + +@implementation NSDirectoryEnumerator + +// Implementation dependent methods + +/* + recurses into directory `path' + - pushes relative path (relative to root of search) on pathStack + - pushes system dir enumerator on enumPath +*/ +- (void)recurseIntoDirectory:(NSString*)path relativeName:(NSString*)name +{ + const char* cpath; + DIR* dir; + + cpath = [[NSFileManager defaultManager] + fileSystemRepresentationWithPath:path]; + + dir = opendir(cpath); + + if (dir) { + [pathStack addObject:name]; + [enumStack addObject:[NSValue valueWithPointer:dir]]; + } +} + +/* + backtracks enumeration to the previous dir + - pops current dir relative path from pathStack + - pops system dir enumerator from enumStack + - sets currentFile* to nil +*/ +- (void)backtrack +{ + closedir((DIR*)[[enumStack lastObject] pointerValue]); + [enumStack removeLastObject]; + [pathStack removeLastObject]; + [currentFileName release]; + [currentFilePath release]; + currentFileName = currentFilePath = nil; +} + +/* + finds the next file according to the top enumerator + - if there is a next file it is put in currentFile + - if the current file is a directory and if isRecursive calls + recurseIntoDirectory:currentFile + - if the current file is a symlink to a directory and if isRecursive + and isFollowing calls recurseIntoDirectory:currentFile + - if at end of current directory pops stack and attempts to + find the next entry in the parent + - sets currentFile to nil if there are no more files to enumerate +*/ +- (void)findNextFile +{ + NSFileManager* manager = [NSFileManager defaultManager]; + DIR_enum_state* dir; + DIR_enum_item* dirbuf; + struct stat statbuf; + const char* cpath; + + [currentFileName release]; + [currentFilePath release]; + currentFileName = currentFilePath = nil; + + while ([pathStack count]) { + dir = (DIR*)[[enumStack lastObject] pointerValue]; + dirbuf = readdir(dir); + if (dirbuf) { + /* Skip "." and ".." directory entries */ + if (strcmp(dirbuf->d_name, ".") == 0 || + strcmp(dirbuf->d_name, "..") == 0) + continue; + // Name of current file + currentFileName = [manager + stringWithFileSystemRepresentation:dirbuf->d_name + length:strlen(dirbuf->d_name)]; + currentFileName = [[pathStack lastObject] + stringByAppendingPathComponent:currentFileName]; + // Full path of current file + currentFilePath = [topPath + stringByAppendingPathComponent:currentFileName]; + // Check if directory + cpath = [manager fileSystemRepresentationWithPath:currentFilePath]; + // Do not follow links + if (!flags.isFollowing) { + if (!lstat(cpath, &statbuf)) + break; + // If link then return it as link + if (S_IFLNK == (S_IFMT & statbuf.st_mode)) + break; + } + // Follow links - check for directory + if (!stat(cpath, &statbuf)) + break; + if (S_IFDIR == (S_IFMT & statbuf.st_mode)) { + [self recurseIntoDirectory:currentFilePath + relativeName:currentFileName]; + break; + } + } + else + [self backtrack]; + } +} + +// Initializing + +- initWithDirectoryPath:(NSString*)path + recurseIntoSubdirectories:(BOOL)recurse + followSymlinks:(BOOL)follow + prefixFiles:(BOOL)prefix +{ + pathStack = [NSMutableArray new]; + enumStack = [NSMutableArray new]; + flags.isRecursive = recurse; + flags.isFollowing = follow; + + topPath = [path retain]; + [self recurseIntoDirectory:path relativeName:@""]; + + return self; +} + +- (void)dealloc +{ + while ([pathStack count]) + [self backtrack]; + + [pathStack release]; + [enumStack release]; + [currentFileName release]; + [currentFilePath release]; + [topPath release]; +} + +// Getting attributes + +- (NSDictionary*)directoryAttributes +{ + return [[NSFileManager defaultManager] + fileAttributesAtPath:currentFilePath + traverseLink:flags.isFollowing]; +} + +- (NSDictionary*)fileAttributes +{ + return [[NSFileManager defaultManager] + fileAttributesAtPath:currentFilePath + traverseLink:flags.isFollowing]; +} + +// Skipping subdirectories + +- (void)skipDescendents +{ + if ([pathStack count]) + [self backtrack]; +} + +// Enumerate next + +- nextObject +{ + [self findNextFile]; + return currentFileName; +} + +@end /* NSDirectoryEnumerator */ + +/* + * Attributes dictionary access + */ + +@implementation NSDictionary(NSFileAttributes) +- (NSNumber*)fileSize + {return [self objectForKey:NSFileSize];} +- (NSString*)fileType; + {return [self objectForKey:NSFileType];} +- (NSNumber*)fileOwnerAccountNumber; + {return [self objectForKey:NSFileOwnerAccountNumber];} +- (NSNumber*)fileGroupOwnerAccountNumber; + {return [self objectForKey:NSFileGroupOwnerAccountNumber];} +- (NSDate*)fileModificationDate; + {return [self objectForKey:NSFileModificationDate];} +- (NSNumber*)filePosixPermissions; + {return [self objectForKey:NSFilePosixPermissions];} +@end + +/* + * File attributes names + */ + +/* File Attributes */ + +NSString* NSFileSize = @"NSFileSize"; +NSString* NSFileModificationDate = @"NSFileModificationDate"; +NSString* NSFileOwnerAccountNumber = @"NSFileOwnerAccountNumber"; +NSString* NSFileGroupOwnerAccountNumber = @"NSFileGroupOwnerAccountNumber"; +NSString* NSFileReferenceCount = @"NSFileReferenceCount"; +NSString* NSFileIdentifier = @"NSFileIdentifier"; +NSString* NSFileDeviceIdentifier = @"NSFileDeviceIdentifier"; +NSString* NSFilePosixPermissions = @"NSFilePosixPermissions"; +NSString* NSFileType = @"NSFileType"; + +/* File Types */ + +NSString* NSFileTypeDirectory = @"NSFileTypeDirectory"; +NSString* NSFileTypeRegular = @"NSFileTypeRegular"; +NSString* NSFileTypeSymbolicLink = @"NSFileTypeSymbolicLink"; +NSString* NSFileTypeSocket = @"NSFileTypeSocket"; +NSString* NSFileTypeFifo = @"NSFileTypeFifo"; +NSString* NSFileTypeCharacterSpecial = @"NSFileTypeCharacterSpecial"; +NSString* NSFileTypeBlockSpecial = @"NSFileTypeBlockSpecial"; +NSString* NSFileTypeUnknown = @"NSFileTypeUnknown"; + +/* FileSystem Attributes */ + +NSString* NSFileSystemSize = @"NSFileSystemSize"; +NSString* NSFileSystemFreeSize = @"NSFileSystemFreeSize"; +NSString* NSFileSystemNodes = @"NSFileSystemNodes"; +NSString* NSFileSystemFreeNodes = @"NSFileSystemFreeNodes"; +NSString* NSFileSystemNumber = @"NSFileSystemNumber"; diff --git a/Testing/nscharacterset.m b/Testing/nscharacterset.m new file mode 100644 index 000000000..c6180c2e7 --- /dev/null +++ b/Testing/nscharacterset.m @@ -0,0 +1,13 @@ +#include + +int main() +{ + NSCharacterSet *alpha = [NSCharacterSet alphanumericCharacterSet]; + + if (alpha) + printf("obtained alphanumeric character set\n"); + else + printf("unable to obtain alphanumeric character set\n"); + + exit(0); +} diff --git a/confdefs.h b/confdefs.h new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/confdefs.h @@ -0,0 +1 @@ + diff --git a/config.sub b/config.sub new file mode 100755 index 000000000..95aaaf711 --- /dev/null +++ b/config.sub @@ -0,0 +1,1148 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond ) # CYGNUS LOCAL + os= + basic_machine=$1 + ;; + -scout) # CYGNUS LOCAL + ;; + -wrs) # CYGNUS LOCAL + os=vxworks + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \ + | arme[lb] | pyramid \ + | tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \ + | alpha | we32k | ns16k | clipper | i370 | sh \ + | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \ + | pdp11 | mips64el | mips64orion | mips64orionel \ + | sparc | sparclet | sparclite | sparc64) + basic_machine=$basic_machine-unknown + ;; + m88110 | m680[01234]0 | m683?2 | m68360 | z8k | v70 | h8500 | w65) # CYGNUS LOCAL + basic_machine=$basic_machine-unknown + ;; + mips64vr4300 | mips64vr4300el) # CYGNUS LOCAL jsmith/vr4300 + basic_machine=$basic_machine-unknown + ;; + mips64vr4100 | mips64vr4100el) # CYGNUS LOCAL jsmith/vr4100 + basic_machine=$basic_machine-unknown + ;; + mips64vr5000 | mips64vr5000el) # CYGNUS LOCAL ian/vr5000 + basic_machine=$basic_machine-unknown + ;; +# CYGNUS LOCAL law + mn10300) + basic_machine=$basic_machine-unknown + ;; + mn10200) + basic_machine=$basic_machine-unknown + ;; +# END CYGNUS LOCAL + mn10200) # CYGNUS LOCAL + basic_machine=$basic_machine-unknown + ;; + mn10300) # CYGNUS LOCAL + basic_machine=$basic_machine-unknown + ;; + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[3456]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \ + | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \ + | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \ + | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \ + | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \ + | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-*) + ;; + m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | h8500-* | v850-* | d10v-*) # CYGNUS LOCAL + ;; + mips64vr4300-* | mips64vr4300el-*) # CYGNUS LOCAL jsmith/vr4300 + ;; + mips64vr4100-* | mips64vr4100el-*) # CYGNUS LOCAL jsmith/vr4100 + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) # CYGNUS LOCAL + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) # CYGNUS LOCAL + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) # CYGNUS LOCAL + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigados) + basic_machine=m68k-cbm + os=-amigados + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) # CYGNUS LOCAL + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) # CYGNUS LOCAL + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) # CYGNUS LOCAL + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) # CYGNUS LOCAL + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + w89k-*) # CYGNUS LOCAL + basic_machine=hppa1.1-winbond + os=-proelf + ;; + op50n-*) # CYGNUS LOCAL + basic_machine=hppa1.1-oki + os=-proelf + ;; + op60c-*) # CYGNUS LOCAL + basic_machine=hppa1.1-oki + os=-proelf + ;; + hppro) # CYGNUS LOCAL + basic_machine=hppa1.1-hp + os=-proelf + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppaosf) # CYGNUS LOCAL + basic_machine=hppa1.1-hp + os=-osf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + os=-mvs + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[3456]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[3456]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[3456]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[3456]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) # CYGNUS LOCAL + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) # CYGNUS LOCAL + basic_machine=i386-unknown + os=-vsta + ;; + i386-go32 | go32) # CYGNUS LOCAL + basic_machine=i386-unknown + os=-go32 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) # CYGNUS LOCAL + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) # CYGNUS LOCAL + basic_machine=i386-unknown + os=-msdos + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown # CYGNUS LOCAL + os=-netbsd + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) # CYGNUS LOCAL + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) # CYGNUS LOCAL + basic_machine=i960-intel + os=-mon960 + ;; + np1) + basic_machine=np1-gould + ;; + OSE68000 | ose68000) # CYGNUS LOCAL + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) # CYGNUS LOCAL + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5) + basic_machine=i586-intel + ;; + pentiumpro | p6) + basic_machine=i686-intel + ;; + pentium-* | p5-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + k5) + # We don't have specific support for AMD's K5 yet, so just call it a Pentium + basic_machine=i586-amd + ;; + nexen) + # We don't have specific support for Nexgen yet, so just call it a Pentium + basic_machine=i586-nexgen + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rom68k) # CYGNUS LOCAL + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) # CYGNUS LOCAL + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs) # CYGNUS LOCAL + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) # CYGNUS LOCAL + basic_machine=m68k-tandem + ;; + stratus) # CYGNUS LOCAL + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) # CYGNUS LOCAL + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) # CYGNUS LOCAL + basic_machine=w65-wdc + os=-none + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) # CYGNUS LOCAL + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) # CYGNUS LOCAL + basic_machine=hppa1.1-winbond + ;; + op50n) # CYGNUS LOCAL + basic_machine=hppa1.1-oki + ;; + op60c) # CYGNUS LOCAL + basic_machine=hppa1.1-oki + ;; + mips) + basic_machine=mips-mips + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) # CYGNUS LOCAL + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) # CYGNUS LOCAL + basic_machine=powerpc-apple + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -unixware* | svr4*) + os=-sysv4 + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -linux-gnu*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + # CYGNUS LOCAL + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* \ + | -macos* | -mpw* | -magic* | -mon960*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + # END CYGNUS LOCAL + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) # CYGNUS LOCAL + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) # CYGNUS LOCAL + os=-ose + ;; + -es1800*) # CYGNUS LOCAL + os=-ose + ;; + -xenix) + os=-xenix + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) # CYGNUS LOCAL + os=-aout + ;; + mips*-cisco) # CYGNUS LOCAL + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-ibm) + os=-aix + ;; + *-wec) # CYGNUS LOCAL + os=-proelf + ;; + *-winbond) # CYGNUS LOCAL + os=-proelf + ;; + *-oki) # CYGNUS LOCAL + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigados + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + *-rom68k) # CYGNUS LOCAL + os=-coff + ;; + *-*bug) # CYGNUS LOCAL + os=-coff + ;; + *-apple) # CYGNUS LOCAL + os=-macos + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -bosx*) # CYGNUS LOCAL + vendor=bull + ;; + -lynxos*) + vendor=lynx + ;; + -aix*) + vendor=ibm + ;; + -hpux*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) # CYGNUS LOCAL + vendor=hitachi + ;; + -mpw* | -macos*) # CYGNUS LOCAL + vendor=apple + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os