ftp.nice.ch/pub/next/text/tex/apps/TeXview-kp0.25.s.tar.gz#/HyperTeXview/PageView.m

This is PageView.m in view mode; [Download] [Up]

/* Generated by Interface Builder */

#import "PageView.h"
#import "SheetView.h"
#import "appkit/Scroller.h"
#import "TeXviewObject.h"
#import "TVWindow.h"
#import <dpsclient/wraps.h>
#import "dviAccessors.h"
#import <strings.h>
#import <appkit/Application.h>
#import "ComScroll.h"
#import <appkit/TextField.h>
#import <mach/mach.h>

#include <kpathsea/c-fopen.h>
#include <kpathsea/c-pathch.h>
#include <kpathsea/concatn.h>
#include <kpathsea/db.h>
#include <kpathsea/fn.h>
#include <kpathsea/magstep.h>
#include <kpathsea/readable.h>
#include <kpathsea/tex-make.h>
#include <kpathsea/variable.h>

#import "MiscList.h"
#import "TeXviewSwitchBoard.h"
#include "external.h"
#import "FREE.h"
#define MILLION 1000000
Window            *page_cache ;
extern int          process_ht_click();
extern real         screendpi;
extern int          paranoia;
//extern PageView    *myPageView; /* No longer needed */
extern Window      *tvWindow;
//extern SheetView   *myView; /* No longer needed */
extern TeXviewObject *myTeXviewObject;
//extern id positionText ; /* moved to TeXviewSwitchBoard */
extern TeXviewSwitchBoard *myTeXviewSwitchBoard ;
extern shalfword    rvvsize, rhhsize;
//extern Boolean      mocked;
extern NXRect      *
initsizewindow();
/* extern 
initWasOnScreen();
*/
extern void 
error();
extern MiscList *visited_tags;
extern void 
reportname();
extern void 
recalculate();
extern void 
PSflush(), TPSinit(), TPSnewfontarray(), TPSgetfontarray() ;
extern void 
makenewdoc();
extern void
save_context();
extern void
get_context();

extern id ht_last_clicked_tag ;
extern id ht_highlight_tag ;
extern Boolean cloned ;
extern int debugon ;

@implementation PageView

- initFrame:(const NXRect *)theFrame
{
    NXRect              tempRect;
    

    self = [super initFrame:theFrame];
    [self setHorizScrollerRequired:YES];
    [self setVertScrollerRequired:YES];
/*  [self setDynamicScrolling:YES];
    [self setBackgroundGray:0.433];
    [self setAutoresizeSubviews:YES];
    [self setBorderType:NX_NOBORDER]; */
    lastxsize = MILLION;
    lastysize = MILLION;
  //  myPageView = self;
 //   myOpenPanel = nil;
    NX_X(&tempRect) = 0;
    NX_Y(&tempRect) = 0;
    NX_WIDTH(&tempRect) = 1036;
    NX_HEIGHT(&tempRect) = 1336;
     myView = [SheetView newFrame:&tempRect];
     if (!cloned) {
     htags = [HashTable alloc];
     [htags initKeyDesc:"*" valueDesc:"@" capacity:10];
     htpages = [HashTable alloc];
     [htpages initKeyDesc:"i" valueDesc:"@" capacity:5];
       } else {
         htpages = [myTeXviewSwitchBoard getCurrentHtpages] ;
         htags = [myTeXviewSwitchBoard getCurrentHtags] ;
         ht_last_clicked_tag = [myTeXviewSwitchBoard 
                                  getCurrent_ht_last_clicked_tag] ;
         ht_highlight_tag = [myTeXviewSwitchBoard getCurrent_ht_highlight_tag];
         }
    // [myTeXviewSwitchBoard setCurrentWindow:[self window]];
     [myTeXviewSwitchBoard setCurrentPageView:self];
     [myTeXviewSwitchBoard setCurrentSheetView:myView];
     if (!cloned) {
       [myTeXviewSwitchBoard setCurrentHtpages:htpages];
       [myTeXviewSwitchBoard setCurrentHtags:htags];
       [myTeXviewSwitchBoard 
             setCurrent_ht_last_clicked_tag:ht_last_clicked_tag];
       [myTeXviewSwitchBoard setCurrent_ht_highlight_tag:ht_highlight_tag] ;
       }
  //  [myTeXviewSwitchBoard setCurrentZoomed:zoomed];
  //  [myTeXviewSwitchBoard setCurrentPageForm:pageForm];
   // currentView = [SheetView newFrame:&tempRect];
    [self setDocView:myView];
   // [self setDocView:currentView];
    absolute_fn[0] = '\0' ;
    reportname(NOFILETITLE);
    [[self window] setExcludedFromWindowsMenu:YES];
  //  TPSinit();
    TPSnewfontarray([myTeXviewSwitchBoard getDocViewNum]);
    TPSgetfontarray([myTeXviewSwitchBoard getDocViewNum]) ;
    recalculate();
    return self;
}

- free 
{
   if ([[self window] getMaster] == -1) { 
   FREE_LIST(htags) ;
   FREE_LIST(htpages) ;
   FREE_OBJECT(ht_highlight_tag) ;
   FREE_OBJECT(ht_last_clicked_tag) ;
 } 
   return [super free] ;
   
}

- drawSelf:(NXRect *)rects :(int)rectCount
{
    [super drawSelf:rects :rectCount];
    return self;
}

- setPageNum:anObject
{
    pageNum = anObject;
    return self;
}

- getHtags
{
  return htags ;
}

- getHtpages 
{
  return htpages ;
}

- getHt_highlight_tag 
{ 
  return ht_highlight_tag ;
}

- setHt_highlight_tag:anObject
{
  ht_highlight_tag = anObject;
  return self ;
}

 - getHt_last_clicked_tag
{
  return ht_last_clicked_tag ;
}

- setHt_last_clicked_tag:anObject
{
   ht_last_clicked_tag = anObject ;
   return self ;
}

- setPageStuff:anObject
{
    pageStuff = anObject;
    pageStuff = [pageStuff setContentView:nil];
    [self addSubview:pageStuff];
    [myTeXviewSwitchBoard setCurrentZoomed:zoomed];
    [myTeXviewSwitchBoard setCurrentPageForm:pageForm];
    [self tile];
    return self;
}

- getPageStuff;
{
    return pageStuff;
}

- tile
{
    NXRect              r1, r2;
    Scroller           *h;

    [super tile];
    if (pageStuff == 0)
	return self;
    h = [self horizScroller];
    [h getFrame:&r2];
    [pageStuff getFrame:&r1];
    r2.size.width -= r1.size.width;
    r1.origin.x = r2.size.width + r2.origin.x;
    r1.origin.y = r2.origin.y;
    [h setFrame:&r2];
    [pageStuff setFrame:&r1];
    return self;
}

- lastPage
{
    dviLastPage();
    return self;
}

- update
{
    if ([self needsDisplay])
	[self display];
    return self;
}

- nextPage
{
    dviNextPage();
    return self;
}

- firstPage
{
    dviFirstPage();
    return self;
}

- mockUnmock
{
    dviMock(-1);
    return self;
}

- mock
{
    dviMock(1);
    return self;
}

- unMock
{
    dviMock(0);
    return self;
}
- prevPage
{
    dviPrevPage();
    return self;
}

- closeFile
{
    dviCloseFile();
    return self;
}

- gotoPage:sender
{
    dviGotoPage((char *)[sender stringValueAt:0]);
    return self;
}

- getpagenum:(char *)s
{
    strcpy(s,[pageNum stringValue]);
    printf("in getpagenum, arg is %s\n", s);
    return self;
}


- fireRandom
{
    [myTeXviewObject firePage];
    return self;
}

void 
pagereport(pagenum, seq)
    integer             pagenum, seq;
{
    char                str[30];

    if (seq == 0)
	sprintf(str, "%ld", pagenum);
    else
	sprintf(str, "%ld.%ld", pagenum, seq);
/*  printf("in page report with %ld, %ld\n", pagenum, seq) ; */
    [myTeXviewObject setPageNum:str];
    PSflush();
}


- noScrollUpdates
{
   // [myPageView setDisplayOnScroll:NO];
  //  [myPageView setCopyOnScroll:NO];
    [self setDisplayOnScroll:NO];
    [self setCopyOnScroll:NO];

    return self;
}

- scrollUpdates
{
  //  [myPageView setDisplayOnScroll:YES];
  //  [myPageView setCopyOnScroll:YES];
    [self setDisplayOnScroll:YES];
    [self setCopyOnScroll:YES];
    return self;
}

- cachePosition:(int)x :(int)y
{
    NXSize              s;

    [self getContentSize:&s];
    if (s.width + 16 > lastxsize)
	xcache = 0.5;
    else
	xcache = [[self horizScroller] floatValue];
    if (s.height + 16 > lastysize)
	ycache = 0.5;
    else
	ycache = [[self vertScroller] floatValue];
    if (lastxsize == MILLION) {	/* cheat these values in */
	xcache = 0.5;
	ycache = 0.0;
    }
    return self;
}

static float 
scroller_to_pos(float x1, float x2, float s)
{
    if (x2 < x1)
	return s * (x1 - x2);
    else
	return 0;
}

- unCachePosition:(int)x :(int)y
{
    NXSize              size;
    NXPoint             t;

    [self getContentSize:&size];
    t.x = scroller_to_pos((float)x, size.width, xcache);
    t.y = scroller_to_pos((float)y, size.height, 1.0 - ycache);
    [myView scrollPoint:&t];
    lastxsize = x;
    lastysize = y;
    return self;
}

/* moves down about a screenful. */

- (int)moveDown:(int)shiftstate;
{
    NXSize              s;
    NXPoint             t;
    float               ypos = [[self vertScroller] floatValue];
    float               xpos = [[self horizScroller] floatValue];
    float               f;

    shiftstate = 1 << (2 * shiftstate);
    [self getContentSize:&s];
    if (ypos > 0.95 || s.height + 16 >= rvvsize)
	return 0;
    if (2 * s.height < rvvsize)
	f = s.height / (rvvsize - s.height) - 0.02;
    else
	f = 1.0;
    if (f < 0.02)
	f = 0.02;
    f /= shiftstate;
    ypos += f;
    if (ypos > 1.0)
	ypos = 1.0;
    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos);
    t.x = scroller_to_pos((float)rhhsize, s.width, xpos);
    [myView scrollPoint:&t];
    return 1;
}

/* moves up about a screenful. */

- (int)moveUp:(int)shiftstate;
{
    NXSize              s;
    NXPoint             t;
    float               ypos = [[self vertScroller] floatValue];
    float               xpos = [[self horizScroller] floatValue];
    float               f;

    shiftstate = 1 << (2 * shiftstate);
    [self getContentSize:&s];
    if (ypos < 0.05 || s.height + 16 >= rvvsize)
	return 0;
    if (2 * s.height < rvvsize)
	f = s.height / (rvvsize - s.height) - 0.02;
    else
	f = 1.0;
    if (f < 0.02)
	f = 0.02;
    f /= shiftstate;
    ypos -= f;
    if (ypos < 0.0)
	ypos = 0.0;
    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos);
    t.x = scroller_to_pos((float)rhhsize, s.width, xpos);
    [myView scrollPoint:&t];
    return 1;
}

- (int)moveRight:(int)shiftstate
{
    NXSize              s;
    NXPoint             t;
    float               ypos = [[self vertScroller] floatValue];
    float               xpos = [[self horizScroller] floatValue];
    float               f;

    shiftstate = 1 << (2 * shiftstate);
    [self getContentSize:&s];
    if (s.width + 16 >= rhhsize)
	return 0;
    if (2 * s.width < rhhsize)
	f = s.width / (rhhsize - s.width) - 0.02;
    else
	f = 1.0;
    if (f < 0.02)
	f = 0.02;
    f /= shiftstate;
    xpos += f;
    if (xpos > 1.0)
	xpos = 1.0;
    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos);
    t.x = scroller_to_pos((float)rhhsize, s.width, xpos);
    [myView scrollPoint:&t];
    return 1;
}

- (int)moveLeft:(int)shiftstate
{
    NXSize              s;
    NXPoint             t;
    float               ypos = [[self vertScroller] floatValue];
    float               xpos = [[self horizScroller] floatValue];
    float               f;

    shiftstate = 1 << (2 * shiftstate);
    [self getContentSize:&s];
    if (s.width + 16 >= rhhsize)
	return 0;
    if (2 * s.width < rhhsize)
	f = s.width / (rhhsize - s.width) - 0.02;
    else
	f = 1.0;
    if (f < 0.02)
	f = 0.02;
    f /= shiftstate;
    xpos -= f;
    if (xpos < 0.0)
	xpos = 0.0;
    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0 - ypos);
    t.x = scroller_to_pos((float)rhhsize, s.width, xpos);
    [myView scrollPoint:&t];
    return 1;
}

- Bot:(int)quiet;
{
    NXSize              s;
    NXPoint             t;
    float               xpos = [[self horizScroller] floatValue];

    if (quiet)
	[self noScrollUpdates];
    [self getContentSize:&s];
    t.y = scroller_to_pos((float)rvvsize, s.height, 0.0);
    t.x = scroller_to_pos((float)rhhsize, s.width, xpos);
    [myView scrollPoint:&t];
    if (quiet)
	[self scrollUpdates];
    return self;
}

- Top:(int)quiet;
{
    NXSize              s;
    NXPoint             t;
    float               xpos = [[self horizScroller] floatValue];

    if (quiet)
	[self noScrollUpdates];
    [self getContentSize:&s];
    t.y = scroller_to_pos((float)rvvsize, s.height, 1.0);
    t.x = scroller_to_pos((float)rhhsize, s.width, xpos);
    [myView scrollPoint:&t];
    if (quiet)
	[self scrollUpdates];
    return self;
}
static float        units[] = {1.0, 2.54, 72.27, 72.0, 84.725};
static int          curunits = 0;
static NXPoint      posevent = {0.0, 0.0}, prevposevent = {0.0, 0.0};
static char        *unitnames[] = {"inches", "centimeters", "points",
			       "PostScript units", "pico-light-seconds", 0};

- changeUnits
{
    curunits = (curunits + 1);
    if (unitnames[curunits] == 0)
	curunits = 0;
    [self updatePosition];
    return self;
}

- updatePosition
{
    NXPoint             pagepos;
    NXPoint             deltapos;
    char                tempbuf[300];

    if ([myTeXviewSwitchBoard getPositionText] && screendpi > 1.0) {
	pagepos = posevent;
	deltapos = prevposevent;
	pagepos.x *= units[curunits] / screendpi;
	pagepos.y *= units[curunits] / screendpi;
	deltapos.x *= units[curunits] / screendpi;
	deltapos.y *= units[curunits] / screendpi;
	sprintf(tempbuf,
	   "Click at (%.3g,%.3g) is (%.3g,%.3g) from previous click in %s.",
	pagepos.x, pagepos.y, pagepos.x - deltapos.x, pagepos.y - deltapos.y,
		unitnames[curunits]);
	[(TextField *) [myTeXviewSwitchBoard getPositionText]
      setStringValue:tempbuf];
    }
    return self;
}

- reportPosition:(NXEvent *)event
{
    if (myView && [myTeXviewSwitchBoard getPositionText] && screendpi > 1.0) {
	prevposevent = posevent;
	posevent = (event->location);
	posevent.x -= 8.0;
	posevent.y -= 8.0;
	[myView convertPoint:&posevent fromView:nil];
	[self updatePosition];
    }
    return self;
}

- mouseDown:(NXEvent *)ptr
{
    NXPoint             newLoc, oldLoc, savedLoc;
    NXEvent            *nextEvent;
    int                 oldMask;
    NXRect              myRect;
    int                 numdrags = 0;
    int             command_click = 0;

    command_click = (int) (ptr->flags & NX_COMMANDMASK) ; //To bring up slave
#ifdef DEBUG
  if (debugon > 2 ) {
    printf("command_click is %i\n", command_click);
   }
#endif
    oldMask =
      [window addToEventMask:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)];
    [self lockFocus];

    savedLoc = oldLoc = ptr->location;
    [self convertPoint:&oldLoc fromView:nil];

    nextEvent =
      [NXApp getNextEvent:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)];
    while (nextEvent->type == NX_LMOUSEDRAGGED) {
	numdrags++;
	newLoc = nextEvent->location;
	[self convertPoint:&newLoc fromView:nil];
	[myView getVisibleRect:&myRect];
	myRect.origin.x -= newLoc.x - oldLoc.x;
	myRect.origin.y += newLoc.y - oldLoc.y;
	[myView scrollRectToVisible:&myRect];
	oldLoc = newLoc;
	nextEvent =
	  [NXApp getNextEvent:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK)];
    }
    [self unlockFocus];
    [window setEventMask:oldMask];
    {
	NXRect              tmpR;

	[[self docView] getFrame:&tmpR];
	[[self docView] convertPoint:&savedLoc fromView:nil];
	if (!process_ht_click((int)savedLoc.x, (int)tmpR.size.height - (int)savedLoc.y,(id)myView, command_click)) {
	    [self reportPosition:nextEvent];
      return self ;
    }
    } if (numdrags == 0)
	[self reportPosition:nextEvent];
    return self;
}

void 
writeconsole(const char *s)
{
    static char         wcbuf[1024];

    strcpy(wcbuf, s);
    strcat(wcbuf, "\n");
    [((ComScroll *)[myTeXviewSwitchBoard getConsole]) addText :wcbuf];
}




void
misstex P2C(kpse_file_format_type, format,  const_string, cmd)
{
  static FILE *missfont = NULL;

  /* If we weren't trying to make a font, do nothing.  Maybe should
     allow people to specify what they want recorded?  */
  if (format > kpse_any_glyph_format && format != kpse_tfm_format
      && format != kpse_vf_format)
    return;

  /* If this is the first time, have to open the log file.  */
  if (!missfont)
    {
      const_string missfont_name = "missfont.log";
      missfont = fopen (missfont_name, FOPEN_A_MODE);
      if (!missfont && getenv ("TEXMFOUTPUT"))
        {
          missfont_name = concat3 (getenv ("TEXMFOUTPUT"), DIR_SEP_STRING,
                                   missfont_name);
          missfont = fopen (missfont_name, FOPEN_A_MODE);
        }

      /* Should we really be unconditionally shouting this message?  */
      if (missfont) {
	    char tmp[160];
        sprintf (tmp, "kpathsea: Appending font creation commands to %s.\n",
                 missfont_name);
	    [((ComScroll *)[myTeXviewSwitchBoard getConsole]) addText:tmp];
	  }
    }
  
  /* Write the command if we have a log file.  */
  if (missfont)
    {
      fputs (cmd, missfont);
      putc ('\n', missfont);
    }
}

string
maketex P2C(kpse_file_format_type, format,  const_string, cmd)
{
  string ret;
  string fn;                  /* The final filename.  */
  fn_type output=fn_init();   /* Collect the script output.  */
  unsigned len;
  
  [((ComScroll *)[myTeXviewSwitchBoard getConsole]) logCommand:cmd inBack:0] ;
  ret=[((ComScroll *)[myTeXviewSwitchBoard getConsole]) getLastLine] ;
  
  output=fn_copy0(ret,strlen(ret));

  len = FN_LENGTH (output);
  fn = FN_STRING (output);

  /* If no output from script, return NULL.  Otherwise check
     what it output.  */
  ret = len == 1 ? NULL : kpse_readable_file (fn);

  /* Free the name if we're not returning it.  */
  if (fn != ret)
    free (fn);
  return ret;
  
  if (ret == NULL)
    misstex (format, cmd);
  else
    db_insert (ret);
    
  return ret;
}



void 
mysystem(const char *s)
{
    if (paranoia)
	system(s);
    else
	[((ComScroll *)[myTeXviewSwitchBoard getConsole]) logCommand :s inBack:0];
}

void 
consoletofront()
{
    [[((ComScroll *)[myTeXviewSwitchBoard getConsole]) window]
        makeKeyAndOrderFront:0];
}

void 
textofront()
{
 [[((ComScroll *)[myTeXviewSwitchBoard getTeX]) window]
        makeKeyAndOrderFront:0];
}

void 
commandup()
{
    [[myTeXviewSwitchBoard getCommand] orderFront:0];
}

void 
myasyncsystem(const char *s)
{
    textofront();
    [((ComScroll *)[myTeXviewSwitchBoard getTeX]) logCommand :s inBack:1];
}

extern void 
reTeXit();

- TeXtexit
{
    reTeXit("tex -v \"%s\"");
    return self;
}

- TeXlatexit
{
    reTeXit("latex -v \"%s\"");
    return self;
}

- TeXslitexit
{
    reTeXit("slitex -v \"%s\"");
    return self;
}

- TeXbibtexit
{
    reTeXit("bibtex \"%s\"");
    return self;
}

- TeXamstexit
{
    reTeXit("amstex -v \"%s\"");
    return self;
}

- TeXlatex209it
{
    reTeXit("latex209 -v \"%s\"");
    return self;
}

- TeXeplainit
{
    reTeXit("eplain -v \"%s\"");
    return self;
}

- openManual
{
    dviOpenFile("/usr/tex/ntman.dvi");
    return self;
}

- TeXcustomexit
{
    reTeXit("%C -v \"%s\"");
    return self;
}

- TeXdefaultexit
{
    reTeXit("%L -v \"%s\"");
    return self;
}

- TeXmakeit
{
    reTeXit("make \"%s.dvi\"");
    return self;
}
- appDidBecomeActive:(id)sender;
{
/* [tvWindow makeKeyAndOrderFront:self] ; */
    return self;
}

- servercalled
{
    return self;
}

/*
 *   What we do here is we try to find data of type NXFilenamePboardType,
 *   and then open it up.
 */
- serverOpen:(id)pb userData:(const char *)userData error:(char **)msg
{
    char               *data;
    int                 len;
    char               *const * s;
    char               *const * types = [pb types];

    [self servercalled];
    for (s = types; *s; s++)
	if (*s == NXFilenamePboardType)
	    break;
    dviSaveFormat(userData);
    if (*s && [pb readType:NXFilenamePboardType data:&data length:&len]) {
	dviOpenFile(data);
	vm_deallocate(task_self(), (vm_address_t) data, len);
    }
    return self;
}

/*
 *   The rest actually ignore the filename, since the user may be editing
 *   an auxilliary file.
 */
- serverReopen:(id)pb userData:(const char *)userData error:(char **)msg
{
    [self servercalled];
  //  [self reOpenFile];
    return self;
}

- serverCommand:(id)pb userData:(const char *)userData error:(char **)msg
{
    [self servercalled];
    reTeXit(userData);
    return self;
}

- serverMakeEquation:(id)pb userData:(const char *)userData
    error:(char **)msg
{
    char               *data, *p;
    int                 len;
    char               *const * s;
    char               *const * types = [pb types];
    FILE               *f;
    char                tempname[40];
    char                cmd[120];
    extern char        *mktemp();
    extern void         unlink();
    extern int          system();

    [self servercalled];
    for (s = types; *s; s++)
	if (*s == NXAsciiPboardType)
	    break;
    if (*s && [pb readType:NXAsciiPboardType data:&data length:&len]) {
	strcpy(tempname, "TeXEQN.XXXXXX");
	p = mktemp(tempname);
	p = p + strlen(p);
	strcpy(p, ".tex");
	f = fopen(tempname, "w");
	if (f == 0) {
	    *msg = "Couldn't open temporary file";
	    return self;
	}
	fwrite(data, 1, len, f);
	fputs("\n \\nopagenumbers \\bye\n", f);
	fclose(f);
	*p = 0;
	sprintf(cmd, ((userData && *userData) ? userData :
		      "tex %s.tex ; dvips %s.dvi -E -n 1 -o %s.eps -P epsf"),
		tempname, tempname, tempname);
	system(cmd);		/* we want to use mysystem */
	strcpy(p, ".eps");
	f = fopen(tempname, "r");
	if (f) {
	    int                 nlen;
	    char               *mbuf;
	    const char         *nt[1];

	    nt[0] = NXPostScriptPboardType;
	    fseek(f, 0L, 2);
	    nlen = ftell(f);
	    fseek(f, 0L, 0);
	    mbuf = malloc(nlen);
	    if (mbuf == 0)
		error("! no memory?");
	    fread(mbuf, 1, nlen, f);
	    [pb declareTypes:nt num:1 owner:NULL];
	    [pb writeType:NXPostScriptPboardType data:mbuf length:nlen];
	    free(mbuf);
	    fclose(f);
	} else
	    *msg = "Output file didn't get created, somehow";
	vm_deallocate(task_self(), (vm_address_t) data, len);
	strcpy(p, ".dvi");
	unlink(tempname);
	strcpy(p, ".log");
	unlink(tempname);
	strcpy(p, ".tex");
	unlink(tempname);
	strcpy(p, ".eps");
	unlink(tempname);
    }
    return self;
}

extern char         Tbasename[];

- validRequestorForSendType:(NXAtom) sendType andReturnType:(NXAtom) returnType
{
    printf("Someone's asking for %s but getting %s\n",
	   (sendType ? sendType : ""), (returnType ? returnType : ""));
    if (sendType == NXFilenamePboardType && returnType == 0 && Tbasename[0])
	return self;
    else
	return nil;
}

- (BOOL)writeSelectionToPasteboard:(Pasteboard *) pboard types:(NXAtom *) types
/*
 * If one of the requested types is one of the ones we handle,
 * then we put our selection in the Pasteboard.
 */
{
    while (types && *types) {
	if (*types == NXFilenamePboardType)
	    break;
	types++;
    }
    if (types && *types && Tbasename[0]) {
	char                tempname[1000];

	strcpy(tempname, Tbasename);
	strcat(tempname, ".tex");
	[pboard writeType:*types data:tempname length:(strlen(tempname))];
	return YES;
    } else {
	return NO;
    }
}
- moveBackInHistory
{
	writeconsole("back pushed");
	[[visited_tags setPreviousObject] goToTarget:0];
	return self;
}

- moveForwardInHistory
{
	writeconsole("forward pushed");
	[[visited_tags setNextObject] goToTarget:0];
	return self;
}

- getDviContext
{ 
  get_context(&dc) ;
  return self ;
}

- saveDviContext 
{
  save_context(&dc) ;
  return self ;
}


- setPageForm:anObject
{
    pageForm = anObject;
    return self;
}

- getPageForm
{
   return pageForm ;
}

- setZoomed:anObject
{
   zoomed = anObject ;
   return self ;
}

- getZoomed
{
   return zoomed ;
}

- setAbsoluteFn:(char *)fn 
{
  strcpy(absolute_fn, fn) ;
  return self;
}

- (char *)getAbsoluteFn 
{
  return absolute_fn ;
}


@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.