This is SolitaireMore.m in view mode; [Download] [Up]
/* indent:4 tabsize:8 font:fixed-width */ #import "Solitaire.h" #import "ModuleList.h" #import "localstrings.h" #include <sys/dir.h> #define GAMEDIRECTORY "/LocalLibrary/Solitaire" @implementation Solitaire(More) /*---------------------------------------------------------------------------- | | - getGameType | | returns: (id) self | |----------------------------------------------------------------------------- | | Go find dynamically loadable Solitaire games in ~/Library/Solitaire, | Solitaire.app, and /LocalLibrary/Solitaire. Load their descriptions | into the game-selection browser. | \----------------------------------------------------------------------------*/ - getGameType { id theMatrix; char buf[MAXPATHLEN+1]; strcpy(buf, NXHomeDirectory()); strcat(buf, "/Library/Solitaire"); if (!moduleList) { moduleList = [[ModuleList allocFromZone:[self zone]] init]; } [self loadGamesFrom:buf]; [self loadGamesFrom:[self appDirectory]]; [self loadGamesFrom:GAMEDIRECTORY]; if ([moduleList count] == 0) { NXRunAlertPanel([NXApp appName], LOCALIZED_NOGAMES, LOCALIZED_TERMINATE, NULL, NULL); [NXApp terminate:self]; } [moduleList sort]; browserValid = NO; [gameSelectionBrowser loadColumnZero]; theMatrix = [gameSelectionBrowser matrixInColumn:0]; [theMatrix selectCellAt:realGameIndex:0]; [theMatrix scrollCellToVisible:realGameIndex:0]; return self; } /*---------------------------------------------------------------------------- | | - setGameType:(const char *)filename dir:(const char *)dirname | | returns: (id) self | |----------------------------------------------------------------------------- | | Load the description of the specified .solitaire bundle into the | browser. | \----------------------------------------------------------------------------*/ - setGameType:(const char *)filename dir:(const char *)dirname { id theMatrix; if (!moduleList) { moduleList = [[ModuleList allocFromZone:[self zone]] init]; } browserValid = NO; [self addGameToList:filename dir:dirname]; [moduleList sort]; [gameSelectionBrowser loadColumnZero]; theMatrix = [gameSelectionBrowser matrixInColumn:0]; [theMatrix selectCellAt:realGameIndex:0]; [theMatrix scrollCellToVisible:realGameIndex:0]; return self; } /*---------------------------------------------------------------------------- | | - loadGamesFrom:(const char *)dirname | | returns: (id) self | |----------------------------------------------------------------------------- | | Find all .solitaire modules in the specified directory. | If we find a module in several places, we keep only the first one found. | \----------------------------------------------------------------------------*/ - loadGamesFrom:(const char *)dirname { DIR *dir; struct direct *de; dir = opendir(dirname); if (dir == NULL) { return self; } while ((de = readdir(dir)) != NULL) { // Ignore '.'-files (not really necessary, I guess) if (de->d_name[0] == '.') continue; if (de->d_namlen > 10 && !strcmp(&de->d_name[de->d_namlen-10], ".solitaire")) { [self addGameToList:de->d_name dir:dirname]; } } closedir(dir); return self; } /*---------------------------------------------------------------------------- | | - addGameToList:(const char *)filename dir:(const char *)dirname | | returns: (id) self | |----------------------------------------------------------------------------- | | Add the specified game to the list of games. | \----------------------------------------------------------------------------*/ - addGameToList:(const char *)filename dir:(const char *)dirname { ModuleInfo *m; int i, numstrings; char name[60]; BOOL valid = YES; char path[MAXPATHLEN]; char *iptr; numstrings = [moduleList count]; strcpy(name, filename); // Smash out the '.' in "Game.solitaire" if (iptr = rindex(name, '.')) *iptr = '\0'; // check for duplicate modules; keep only the first one found for (i=0; (i < numstrings) && (valid == YES); i++) { if (!strcmp(name, [moduleList nameAt:i])) { // already have a module with this name valid = NO; } } if (valid) { // add a new entry for this module sprintf(path, "%s/%s", dirname, filename); m = [[ModuleInfo allocFromZone:[self zone]] initWithController:NULL name:name path:path]; if (m) [moduleList addObject:m]; } return self; } /*---------------------------------------------------------------------------- | | - (const char *)appDirectory | | returns: (const char *) full path of main bundle | |----------------------------------------------------------------------------- | | Returns the application's main bundle directory. | \----------------------------------------------------------------------------*/ - (const char *)appDirectory { return [[NXBundle mainBundle] directory]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.