This is Vi.m in view mode; [Download] [Up]
/* * $Source: /source/LocalDeveloper/Apps/Vi/RCS/Vi.m,v $ * $Revision: 1.2 $ * $Date: 93/09/14 19:06:53 $ * $State: Exp $ * $Author: pbiron $ *------------------------------------------------------------------ * Paul Biron (pbiron@gslis.ucla.edu) * Graduate School of Library and Information Science * GSLIS Building * 300 Circle Dr. North * University of California, Los Angeles * Los Angeles, Ca. 90024 *------------------------------------------------------------------ * Every function in this file has a function header which has the * following format: * * Name : name of function * Purpose : 1 or 2 line statement of purpose * Arguments : names and purposes of all arguments * Return Value : what the function returns * Calls : NON-library functions called by this function * The name of the function is followed * (in parens) by the name of the file in which * the function is defined * Globals Accessed : NON-library global variables/macros * used and/or modified by this function * The name of the variable is followed (in parens) * by the name of the file in which the variable * is declared (with the keyword "macro" if applicable) * Notes : Longer statement of purpose, notes on the * algorithm used, and other assorted information * helpfull to someone reading/calling the * function * *------------------------------------------------------------------ * This file was edited with tab stops set to 4, so it may look * like a mess if you edit it with other tab stops *------------------------------------------------------------------ * This "application" allows you to open various text files with vi(1) * from the Browser (or from within IB, etc). In order for this to work * you must have Scott Hess's Stuart terminal emulator. Stuart is a * replacement for Shell, and is Shareware, available from finer ftp * archives everywhere. * * Vi is a sublcass of Application, which acts as its own "delegate" * for handline appAcceptsAnotherFile and app:openFile:fileType: * messages. * * The portions of this program (very little, in fact) that I wrote are in * the public domain, and you may do whatever you want with them. *------------------------------------------------------------------ */ #ifndef SOIL /* * location of soil binary */ #define SOIL "/usr/local/bin/soil" #endif #ifndef TERMDELAY /* * see Notes: section of app:openFile:fileType: */ #define TERMDELAY 2000 #endif #import "Vi.h" // for class interface #import <sys/param.h> // for MAXPATHLEN def #import <libc.h> // for fork(2), exec(2), etc. decl #import <errno.h> @implementation Vi : Application /* * Name : appAcceptsAnotherFile: * Purpose : Notify the Workspace Manager that we can open * more files * Arguments : sender -- id of message sender * Return Value : YES * Calls : none * IVars Accessed : none * Globals Accessed : none * Notes : none */ - (BOOL) appAcceptsAnotherFile:sender { return (YES) ; } /* * Name : app:openFile:type: * Purpose : Notification from the Workspace Manager that * we should open another file * Arguments : fileName -- name of file to open * fileType -- ext of file to open * Return Value : YES if successful, NO otherwise * Calls : none * IVars Accessed : none * Globals Accessed : SOIL (macro, Vi.m) * TERMDELAY (macro, Vi.m) * Notes : Builds of the vi(1) command line for fileName, * fork(2)'s and execl(2)'s soil on that command line. * Then queue's up a terminate: message. * * Queuing the terminate: message is really a hack, * and is done because when multiple files are * launched from the Workspace the app only knows * about the first one from the command-line, so * we just keep waiting for the Workspace to tell * us to open another file or until some timeout * period has elasped, after which we assume that * no more requests are coming and terminate. */ - (int) app:sender openFile:(char *) fileName type:(char *) fileType { char vicmd[MAXPATHLEN] ; char title[MAXPATHLEN] ; int pid ; sprintf (vicmd, "/bin/sh -c \"/usr/ucb/vi %s\"", fileName) ; sprintf (title, "/usr/ucb/vi %s", fileName) ; if ((pid = fork ()) == 0) { execl (SOIL, "soil", "-Shell", vicmd, "-Title", title, "-Activate", NULL) ; fprintf (stderr, "Vi: execl failed: %s: %s\n", SOIL, strerror (errno)) ; exit (1) ; } else if (pid == -1) perror ("Vi: fork failed") ; [self perform:@selector (terminate:) with:self afterDelay:TERMDELAY cancelPrevious:YES] ; return (YES) ; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.