This is chaosStorage.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "chaosStorage.h" #import <objc/objc-load.h> /** ** which-bin -- find the path for the named exectuable files ** ** Lennart <Lovstrand@EuroPARC.Xerox.COM>, September 1, 1991. ** slightly modified by sam 910902 **/ char * which_bin(const char *file) { DIR *dir; struct direct *de; static char buf[MAXPATHLEN]; char *paths, *p, *q; int filelen, dirlen; paths = getenv("PATH"); if (paths == NULL) return NULL; filelen = strlen(file); for (p = q = paths; *q != '\0'; p = q + 1) { q = index(p, ':'); if (q == NULL) q = p + strlen(p); dirlen = q - p; strncpy(buf, p, dirlen); buf[dirlen] = '\0'; dir = opendir(buf); if (dir == NULL) continue; buf[dirlen] = '/'; dirlen++; while ((de = readdir(dir)) != NULL) { if (de->d_namlen != filelen || strcmp(de->d_name, file) != 0) continue; strcpy(buf + dirlen, file); if (access(buf, X_OK) != 0) continue; closedir(dir); return buf; } closedir(dir); } return NULL; } void getAppDirectory (char *appDirectory) { char *suffix, *path; strcpy (appDirectory,NXArgv[0]); suffix = rindex(appDirectory,'/'); if (suffix != NULL) // explicit path { *suffix = '\0'; // remove executable name } else { path = which_bin([NXApp appName]); if (path != NULL) strcpy(appDirectory, path); else // Don't know where we came from -- arbitrarily // presume "." and continue (it's better than breaking) strcpy(appDirectory, "."); } } @implementation chaosStorage - chaosSelect:sender { return self; } - chaosLoad:sender { char launchdir[256]; //[chaosMenu setTitle:"Circle"]; getAppDirectory (&launchdir[0]); printf("LD %s\n", launchdir); [self loadViewsFrom: &launchdir[0]]; [self loadViewsFrom: VIEWDIRECTORY]; [[chaosMenu target] setTarget:sender]; [[chaosMenu target] setAction:@selector(selectChaos:)]; return self; } // // Dynamically load all object files found in the specified directory // // MEMO: Must make sure this doesn't screw up when it finds a new // object file with a class that's already loaded!!!! - loadViewsFrom: (const char *) dirname { DIR *dir; struct direct *de; NXStream *nxstderr; char path[MAXPATHLEN]; char *filenames[] = {path, NULL}; const char *NewTitle; nxstderr = NXOpenFile(2, NX_WRITEONLY); dir = opendir(dirname); if (dir == NULL) { perror(dirname); return self; } while ((de = readdir(dir)) != NULL) { BOOL ok; // Ignore '.'-files (not really necessary, I guess) if (de->d_name[0] == '.') continue; // Check that the file has the right extension //printf("Here 1\n"); if (de->d_namlen < 3 || strcmp(&de->d_name[de->d_namlen-7], ".Chaoso") != 0) continue; printf("Here Loaded\n"); // refuse to load if the name matches a module already loaded //numstrings = [viewNames count]; ok = YES; strcpy(path, de->d_name); //*(rindex(path, '.')) = '\0'; // //for (i=0; i< numstrings; i++) //{ // if (!strcmp(path, [viewNames elementAt:i])) // { ok = NO; // break; // } //} //if (!ok) continue; // OK, all is well -- go load the little bugger sprintf(path, "%s/%s", dirname, de->d_name); if (objc_loadModules(filenames, nxstderr, NULL, NULL, NULL) == 1) // Ugh, failed. Continue as usual. continue; // Smash out the 'V' in ".../FooView.o" *(rindex(path, '.')) = '\0'; //[viewNames addElement: rindex(path, '/') + 1]; NewTitle = rindex(path, '/') + 1; [[chaosMenu target] addItem:NewTitle]; } closedir(dir); NXClose(nxstderr); return self; } - accessViewList: sender { id myClass; const char *ptr; //if ([whichList objectAt:virtualViewIndex] == self) //{ // id myClass; // char str[50]; // const char *ptr; // ptr = [[chaosMenu target] selectedItem]; printf("newchaos will be %s\n", ptr); myClass = objc_getClass(ptr); // theView = [[myClass alloc] init]; // if (theView) [whichList replaceObjectAt:(virtualViewIndex) with:theView]; //} //theView = [whichList objectAt:(virtualViewIndex)]; //if (theView == self) theView = nil; return myClass; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.