-#import <libc.h>
-#import <stdio.h>
-#import <stdlib.h>
-#import <NSSystemDirectories.h>
-
-// Names of directories; index into this with NSSearchPathDirectory - 1
-#define numDirs 10
-static const struct {
- unsigned char invalidDomainMask; // Domains in which this dir does not appear
- unsigned char alternateDomainMask; // Domains in which this dir uses the alternate domain path
- const char *dirPath;
-} dirInfo[numDirs] = {
- {0, 0, "Applications"},
- {0, 0, "Applications/GrabBag"},
- {0, 0, "Developer/Applications"},
- {0, 0, "Applications/Utilities"},
- {0, 0x8, "Library"}, // Uses alternate form in System domain
- {0, 0, "Developer"},
- {0x9, 0, "Users"}, // Not valid in the System and User domains
- {0, 0x8, "Library/Documentation"}, // Uses alternate form in System domain
- {0xe, 0, "Documents"}, // Only valid in user domain
- {0x7, 0, "Library/CoreServices"} // Only valid in System domain
-};
-
-// Ordered list of where to find applications in each domain (the numbers are NSSearchPathDirectory)
-#define numApplicationDirs 4
-static const char applicationDirs[numApplicationDirs] = {1, 4, 3, 2};
-
-// Ordered list of where to find resources in each domain (the numbers are NSSearchPathDirectory)
-#define numLibraryDirs 2
-static const char libraryDirs[numLibraryDirs] = {5, 6};
-
-// Names of domains; index into this log2(domainMask). If the search path ordering is ever changed, then we need an indirection (as the domainMask values cannot be changed).
-#define numDomains 4
-static const struct {
- char needsRootPrepended;
- const char *domainPath;
- const char *alternateDomainPath;
-} domainInfo[numDomains] = {
- {0, "~", "~"},
- {1, "", ""},
- {1, "/Network", "/Network"},
- {1, "", "/System"}
-};
-
-#define invalidDomains 0x00 // some domains may be invalid on non-Mach systems
+#include <NSSystemDirectories.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#define NSUserDomainIndex 0
+#define NSLocalDomainIndex 1
+#define NSNetworkDomainIndex 2
+#define NSSystemDomainIndex 3
+
+#define numDomains (NSSystemDomainIndex + 1)
+#define DomainMask ((1 << numDomains) - 1)
+
+#define addNextRoot(x) (*(x) == '/' || *(x) == 0)
+
+#define Network "/Network"
+#define System "/System"
+#define Tilde "~"
+
+#define NSApplicationDirectoryBase "/Applications"
+#define NSDemoApplicationDirectoryBase "/Applications/Demos"
+#define NSDeveloperApplicationDirectoryBase "/Developer/Applications"
+#define NSAdminApplicationDirectoryBase "/Applications/Utilities"
+#define NSLibraryDirectoryBase "/Library"
+#define NSDeveloperDirectoryBase "/Developer"
+#define NSUserDirectoryBase "/Users"
+#define NSDocumentationDirectoryBase "/Library/Documentation"
+#define NSDocumentDirectoryBase "/Documents"
+#define NSCoreServiceDirectoryBase "/Library/CoreServices"
+#define NSAutosavedDocumentsDirectoryBase "/Library/Autosave Information"
+#define NSDesktopDirectoryBase "/Desktop"
+#define NSCachesDirectoryBase "/Library/Caches"
+#define NSInputMethodsDirectoryBase "/Library/Input Methods"
+#define NSMoviesDirectoryBase "/Movies"
+#define NSMusicDirectoryBase "/Music"
+#define NSPicturesDirectoryBase "/Pictures"
+#define NSPrinterDescriptionDirectoryBase "/Library/Printers/PPDs"
+#define NSSharedPublicDirectoryBase "/Public"
+#define NSPreferencePanesDirectoryBase "/Library/PreferencePanes"
+#define NSApplicationSupportDirectoryBase "/Library/Application Support"
+#define NSDownloadsDirectoryBase "/Downloads"
+
+static const char * const prefixAll[] = {
+ Tilde,
+ "",
+ Network,
+ ""
+};
+static const char * const prefixAllSystem[] = {
+ Tilde,
+ "",
+ Network,
+ System
+};
+static const char * const prefixNoUserSystem[] = {
+ NULL,
+ "",
+ Network,
+ NULL
+};
+static const char * const prefixNoNetwork[] = {
+ Tilde,
+ "",
+ NULL,
+ System
+};
+static const char * const prefixSystemOnly[] = {
+ NULL,
+ NULL,
+ NULL,
+ System
+};
+static const char * const prefixUserOnly[] = {
+ Tilde,
+ NULL,
+ NULL,
+ NULL
+};
+
+static const char * const _prefixNetwork4[] = {
+ Network,
+ Network,
+ Network,
+ Network
+};
+static const char * const _prefixNone4[] = {
+ "",
+ "",
+ "",
+ ""
+};
+static const char * const _prefixTilde4[] = {
+ Tilde,
+ Tilde,
+ Tilde,
+ Tilde
+};
+static const char * const * const prefixAllApplicationsDirectory[] = {
+ _prefixTilde4,
+ _prefixNone4,
+ _prefixNetwork4,
+ _prefixNone4
+};
+static const char * const baseAllApplicationsDirectory[] = {
+ NSApplicationDirectoryBase,
+ NSAdminApplicationDirectoryBase,
+ NSDeveloperApplicationDirectoryBase,
+ NSDemoApplicationDirectoryBase
+};
+
+static const char * const _prefixNetwork2[] = {
+ Network,
+ Network
+};
+static const char * const _prefixNone2[] = {
+ "",
+ ""
+};
+static const char * const _prefixSystemNone2[] = {
+ System,
+ ""
+};
+static const char * const _prefixTilde2[] = {
+ Tilde,
+ Tilde
+};
+static const char * const * const prefixAllLibrariesDirectory[] = {
+ _prefixTilde2,
+ _prefixNone2,
+ _prefixNetwork2,
+ _prefixSystemNone2
+};
+static const char * const baseAllLibrariesDirectory[] = {
+ NSLibraryDirectoryBase,
+ NSDeveloperDirectoryBase
+};
+
+// The dirInfo table drives path creation
+static struct {
+ int pathsPerDomain;
+ const void * const * const prefix;
+ const void * const base;
+} dirInfo[] = {
+ { // NSApplicationDirectory
+ 1,
+ (const void * const * const)prefixAll,
+ (const void * const)NSApplicationDirectoryBase
+ },
+ { // NSDemoApplicationDirectory
+ 1,
+ (const void * const * const)prefixAll,
+ (const void * const)NSDemoApplicationDirectoryBase
+ },
+ { // NSDeveloperApplicationDirectory
+ 1,
+ (const void * const * const)prefixAll,
+ (const void * const)NSDeveloperApplicationDirectoryBase
+ },
+ { // NSAdminApplicationDirectory
+ 1,
+ (const void * const * const)prefixAll,
+ (const void * const)NSAdminApplicationDirectoryBase
+ },
+ { // NSLibraryDirectory
+ 1,
+ (const void * const * const)prefixAllSystem,
+ (const void * const)NSLibraryDirectoryBase
+ },
+ { // NSDeveloperDirectory
+ 1,
+ (const void * const * const)prefixAll,
+ (const void * const)NSDeveloperDirectoryBase
+ },
+ { // NSUserDirectory
+ 1,
+ (const void * const * const)prefixNoUserSystem,
+ (const void * const)NSUserDirectoryBase
+ },
+ { // NSDocumentationDirectory
+ 1,
+ (const void * const * const)prefixAllSystem,
+ (const void * const)NSDocumentationDirectoryBase
+ },
+ { // NSDocumentDirectory
+ 1,
+ (const void * const * const)prefixUserOnly,
+ (const void * const)NSDocumentDirectoryBase
+ },
+ { // NSCoreServiceDirectory
+ 1,
+ (const void * const * const)prefixSystemOnly,
+ (const void * const)NSCoreServiceDirectoryBase
+ },
+ { // NSAutosavedInformationDirectory
+ 1,
+ (const void * const * const)prefixUserOnly,
+ (const void * const)NSAutosavedDocumentsDirectoryBase
+ },
+ { // NSDesktopDirectory
+ 1,
+ (const void * const * const)prefixUserOnly,
+ (const void * const)NSDesktopDirectoryBase
+ },
+ { // NSCachesDirectory
+ 1,
+ (const void * const * const)prefixNoNetwork,
+ (const void * const)NSCachesDirectoryBase
+ },
+ { // NSApplicationSupportDirectory
+ 1,
+ (const void * const * const)prefixAll,
+ (const void * const)NSApplicationSupportDirectoryBase
+ },
+ { // NSDownloadsDirectory
+ 1,
+ (const void * const * const)prefixUserOnly,
+ (const void * const)NSDownloadsDirectoryBase
+ },
+ { // NSInputMethodsDirectory
+ 1,
+ (const void * const * const)prefixAllSystem,
+ (const void * const)NSInputMethodsDirectoryBase
+ },
+ { // NSMoviesDirectory
+ 1,
+ (const void * const * const)prefixUserOnly,
+ (const void * const)NSMoviesDirectoryBase
+ },
+ { // NSMusicDirectory
+ 1,
+ (const void * const * const)prefixUserOnly,
+ (const void * const)NSMusicDirectoryBase
+ },
+ { // NSPicturesDirectory
+ 1,
+ (const void * const * const)prefixUserOnly,
+ (const void * const)NSPicturesDirectoryBase
+ },
+ { // NSPrinterDescriptionDirectory
+ 1,
+ (const void * const * const)prefixSystemOnly,
+ (const void * const)NSPrinterDescriptionDirectoryBase
+ },
+ { // NSSharedPublicDirectory
+ 1,
+ (const void * const * const)prefixUserOnly,
+ (const void * const)NSSharedPublicDirectoryBase
+ },
+ { // NSPreferencePanesDirectory
+ 1,
+ (const void * const * const)prefixNoNetwork,
+ (const void * const)NSPreferencePanesDirectoryBase
+ },
+ { // NSAllApplicationsDirectory
+ 4,
+ (const void * const * const)prefixAllApplicationsDirectory,
+ (const void * const)baseAllApplicationsDirectory
+ },
+ { // NSAllLibrariesDirectory
+ 2,
+ (const void * const * const)prefixAllLibrariesDirectory,
+ (const void * const)baseAllLibrariesDirectory
+ }
+};
+
+#define Index(dir) (((dir) >= NSApplicationDirectory && (dir) <= NSPreferencePanesDirectory) ? ((dir) - 1) : (((dir) >= NSAllApplicationsDirectory && (dir) <= NSAllLibrariesDirectory) ? ((dir) - NSAllApplicationsDirectory + NSPreferencePanesDirectory) : -1))
+
+#define invalidDomains 0x00 // some domains may be invalid on non-Mach systems
+#define ByteMask 0xff
+#define DirShift 24
+#define IndexShift 16