This is LanguageApp.m in view mode; [Download] [Up]
#import "LanguageApp.h" #import <sys/param.h> /* for MAXPATHLEN */ #import <sys/file.h> /* for F_OK, etc */ #import <string.h> /* for strlen, rindex, etc */ #import <libc.h> /* for access() */ extern int NXArgc; extern char **NXArgv; static NXAtom applicationDirectory; @implementation Application (Language) - (NXAtom)applicationDirectory /* * Returns the directory name in which the application is running. This is * useful for forming filenames within a file package. After calling this * method initially, the static string 'applicationDirectory' holds the * name of the directory. */ { if (!applicationDirectory) { char rootname[MAXPATHLEN + 1], *tailname; strcpy(rootname, NXArgv[0]); if (tailname = rindex(rootname, '/')) { /* * There is at least one / in the pathname - clobber it to a null to * terminate the rootname string at the trailing /. */ *tailname = '\0'; } else { /* Assume a relative pathname (in the current directory). */ sprintf(rootname,"."); } applicationDirectory = NXUniqueString((const char *)rootname); } return applicationDirectory; } - (NXAtom)applicationFile:(const char *)fileName /* * Given a filename, return the full pathname of that file within the * application's file package. */ { return [self applicationFile:fileName type:(const char *)nil]; } - (NXAtom)applicationFile:(const char *)fileName type:(const char *)fileExt; /* * Given a filename and file type (which can be nil), return the full * pathname of that file within the application's file package. */ { char pathname[MAXPATHLEN + 1]; if (fileExt) { sprintf(pathname,"%s/%s.%s",[self applicationDirectory],fileName,fileExt); } else { sprintf(pathname,"%s/%s",[self applicationDirectory],fileName); } return NXUniqueString(pathname); } - (NXAtom)findLanguageFile:(const char *)fileName type:(const char *)fileExt { const char *const *languages; char pathname[MAXPATHLEN + 1]; NXAtom rootname = [self applicationDirectory]; /* * Iterate over the list of preferred languages, return if we find the * desired filename. */ languages = [self systemLanguages]; while (languages && *languages) { const char *language = *languages++; if (fileExt) { sprintf(pathname,"%s/%s.%s/%s.%s", rootname,language,LANGUAGE_DIRECTORY_SUFFIX,fileName,fileExt); } else { sprintf(pathname,"%s/%s.%s/%s", rootname,language,LANGUAGE_DIRECTORY_SUFFIX,fileName); } if (access(pathname, F_OK) == 0) { /* We found the desired pathname--make a safe, unique copy and return */ return NXUniqueString((const char *)pathname); } } /* * Haven't found the pathanme yet -- look for the file in the default * language directory. */ if (fileExt) { sprintf(pathname,"%s/%s.%s/%s.%s", rootname,DEFAULT_LANGUAGE,LANGUAGE_DIRECTORY_SUFFIX, fileName,fileExt); } else { sprintf(pathname,"%s/%s.%s/%s", rootname,DEFAULT_LANGUAGE,LANGUAGE_DIRECTORY_SUFFIX,fileName); } if (access(pathname, F_OK) == 0) { /* We found the desired pathname -- make a safe, unique copy and return */ return NXUniqueString((const char *)pathname); } /* * Still haven't found the pathanme yet -- look for the file in the current * directory. */ if (fileExt) { sprintf(pathname,"%s/%s.%s", rootname,fileName,fileExt); } else { sprintf(pathname,"%s/%s", rootname,fileName); } if (access(pathname, F_OK) == 0) { /* We found the desired pathname -- make a safe, unique copy and return */ return NXUniqueString((const char *)pathname); } /* * No joy. Return nil. */ return (NXAtom)nil; } /* * These following methods are similar to loadNibFile:owner: and * loadNibFile:owner:withNames, except that fileName is passed to * to the findLanguageFile: method (above). */ - loadNibLanguageFile:(const char *)fileName owner:anOwner { return [self loadNibLanguageFile:fileName owner:anOwner withNames:YES]; } - loadNibLanguageFile:(const char *)fileName owner:anOwner withNames:(BOOL)aFlag { const char *fullName; /* * Since fileName already has a .nib extension on it, we cheat a bit here * and pass a null type argument to findLanguageFile. */ fullName = [self findLanguageFile:fileName type:(const char *)nil]; if (fullName) { return [self loadNibFile:fullName owner:anOwner withNames:aFlag]; } else { return nil; } } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.