This is open.m in view mode; [Download] [Up]
/* Author: Christian Limpach (chris@nice.ch) */ /* * /usr/local/lib/cvs/open/open.m,v 1.2 1994/05/09 21:37:42 chris Exp * * open.m,v * Revision 1.2 1994/05/09 21:37:42 chris * fixed NXHost which was broken because of [Application new] * * Revision 1.1 1994/05/05 22:32:05 chris * replaces /usr/bin/open and adds some nice features * */ #ifdef RCSID static char rcsid[] = "open.m,v 1.2 1994/05/09 21:37:42 chris Exp"; #endif #import "open.h" @implementation AppInfo - initFor:(const char *)openApp onHost:(const char *)hostName { [super init]; if((Port=NXPortFromName(openApp, hostName)) != PORT_NULL) { Name=str_copy(openApp); Host=str_copy(hostName); } return self; } - (port_t)port { return Port; } - (BOOL)isEntryFor:(const char *)openApp:(const char *)hostName { if(!strcmp(Name, openApp) && (Host==hostName || (Host!=NULL && hostName!=NULL && !strcmp(Host, hostName)))) return YES; else return NO; } @end @implementation AppList - (port_t)getPortFor:(const char *)anApp onHost:(const char *)aHost { int index; for(index=0; index<[self count]; index++) if([[self objectAt:index] isEntryFor:anApp:aHost]) break; if(index!=[self count]) return [[self objectAt:index] port]; else { id info; info=[[AppInfo alloc] initFor:anApp onHost:aHost]; if ([info port]!=PORT_NULL) [self addObject:info]; return [info port]; } } @end void main(int argc, char *argv[]) { port_t appPort; int ok, arg=1; char *host=NULL; const char *openApp=WORKSPACE, *appName; id appSpeaker = [[Speaker alloc] init]; id appList = [[AppList alloc] init]; int openMode=OPEN, fileMode=DISK, openedAFile=0; int oline=0, waitForFileChange=0, noStat=0; char *myArgv[argc]; int i; // get a copy of the arg pointers as [Application new] removes // -NXHost options for(i=0; i<argc; i++) myArgv[i]=argv[i]; [Application new]; appName=[NXApp appName]; if(strcmp(appName, "open")) if(!strcmp(appName, "appopen") || !strcmp(appName, "run")) { if(argc<2) { printf("Usage: %s Application file...\n", appName); exit(1); } openApp=myArgv[arg++]; } else if(!strcmp(appName, "unhide")) { if(argc>1) openApp=myArgv[arg++]; openMode=UNHIDE; } else openApp=appName; while(1) { int argIsFile=0; if(arg>=argc) /* auto detect stdin */ if(openedAFile) break; else { if((openApp!=WORKSPACE && openMode==OPEN) || openMode==UNHIDE) { if(openMode==OPEN) openMode=APP; fileMode=NONE; } else fileMode=STDIN; argIsFile++; } else if(myArgv[arg][0]=='-') { if(!strcmp(&myArgv[arg][1], "NXHost")) { if(arg!=(argc-1)) host=myArgv[++arg]; else argIsFile++; } else if(!strcmp(&myArgv[arg][1], "wait")) { waitForFileChange++; } else if(!strcmp(&myArgv[arg][1], "nostat")) { noStat++; } else if(!strcmp(&myArgv[arg][1], "unhide") || !strcmp(&myArgv[arg][1], "activate") || !strcmp(&myArgv[arg][1], "makeKey")) { openMode=UNHIDE; fileMode=NONE; argIsFile++; } else if(!strcmp(&myArgv[arg][1], "temp")) { fileMode=TEMP; } else if(myArgv[arg][1]=='\000') { if(arg==(argc-1) && !openedAFile) fileMode=STDIN; argIsFile++; } else if(myArgv[arg][2]=='\000') { switch(myArgv[arg][1]) { case 'a': /* next arg is new application to open with */ if(arg!=(argc-1)) openApp=myArgv[++arg]; else argIsFile++; break; case 'o': /* open next arg without checking switches */ openMode=OPEN; if(arg!=(argc-1)) arg++; argIsFile++; break; case 'p': /* go printmode */ openMode=PRINT; break; default: /* not a switch -> open it */ argIsFile++; break; } } else argIsFile++; /* not a longopt -> open it */ } else if(myArgv[arg][0]=='+') { int i=0; oline=0; while(myArgv[arg][++i]!='\0') if(isdigit(myArgv[arg][i])) oline=10*oline+(myArgv[arg][i]-48); else { argIsFile++; break; } if(!argIsFile) { if(arg!=(argc-1)) { openMode=OPENLINE; arg++; } argIsFile++; } } else argIsFile++; /* not an opt at all -> open it */ if(argIsFile) { char fname[MAXPATHLEN+1+(arg>=argc?0:strlen(myArgv[arg]))+1]; struct stat buf; switch(fileMode) { case STDIN: { char buffer[STDINBUFSIZE+1]; int len; FILE *file; if((len=fread(buffer, 1, STDINBUFSIZE, stdin))>=0) { buffer[len]='\0'; if(len>=5 && !strncmp(buffer, "{\\rtf", 5)) strcpy(fname, "/tmp/openfiletmpXXXXXX.rtf"); else if(len>=11 && !strncmp(buffer, "%!PS-Adobe-", 11)) if(strstr(buffer, "EPSF-")<strchr(buffer, '\012')) strcpy(fname, "/tmp/openfiletmpXXXXXX.eps"); else strcpy(fname, "/tmp/openfiletmpXXXXXX.ps"); else strcpy(fname, "/tmp/openfiletmpXXXXXX"); NXGetTempFilename(fname, 16); if(!(file=fopen(fname, "wb"))) { printf("%s: couldn't create temp file\n", appName); exit(1); } while(len==STDINBUFSIZE) { fwrite(buffer, STDINBUFSIZE, 1, file); len=fread(buffer, 1, STDINBUFSIZE, stdin); } fwrite(buffer, 1, len, file); fclose(file); } break; } case NONE: break; case DISK: case TEMP: default: if(myArgv[arg][0]=='/') strcpy(fname, myArgv[arg]); else { getwd(fname); strcat(fname, "/"); strcat(fname, myArgv[arg]); } if(fname[strlen(fname)-1]=='/') strcat(fname, "."); break; } if(!noStat && stat(fname, &buf)) printf("%s: can't stat file: %s\n", appName, fname); else { char *connName; if((openMode==PRINT || openMode==OPENLINE) && !strcmp(openApp, WORKSPACE)) [[Application workspace] getInfoForFile:fname application:&connName type:&NXPlainFileType]; else connName=str_copy(openApp); if((appPort=[appList getPortFor:connName onHost:host]) != PORT_NULL) { [appSpeaker setSendPort:appPort]; switch(openMode) { case UNHIDE: [appSpeaker performRemoteMethod:"unhide"]; break; case APP: break; case OPENLINE: [appSpeaker selectorRPC:"openFile:onHost:atTrueLine:" paramTypes:"cci", fname, host?host:"localhost", oline]; break; case PRINT: if([appSpeaker msgPrint:fname ok:&ok] || !ok) printf("%s: unable to print file: %s\n", appName, fname); break; case OPEN: default: if(fileMode==STDIN || fileMode==TEMP) { if([appSpeaker openTempFile:fname ok:&ok] || !ok) printf("%s: unable to open temp file: %s\n", appName, fname); } else { if([appSpeaker openFile:fname ok:&ok] || !ok) printf("%s: unable to open file: %s\n", appName, fname); } break; } if(!noStat && waitForFileChange) { time_t last=buf.st_mtime; while(buf.st_mtime==last && !sleep(1)) stat(fname, &buf); } } else { printf("%s: can't open connection to %s on %s.\n", appName , openApp, host?host:"local host"); } str_free(connName); } waitForFileChange=0; noStat=0; fileMode=DISK; openMode=OPEN; openedAFile++; } arg++; } [appSpeaker free]; exit(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.