This is TclObj.m in view mode; [Download] [Up]
// Tcl interpreter object.
// Copyright 1991 Manticore, Inc. All Rights Reserved.
//
// You may freely copy, distribute and reuse the code in this example.
// Manticore disclaims any warranty of any kind, expressed or
// implied, as to its fitness for any particular use.
#import "TclObj.h"
#import "TclTV.h"
#import "TclApp.h"
#import <appkit/Application.h>
#import <objc/typedstream.h>
#import <objc/NXStringTable.h>
#import <appkit/FontManager.h>
#import <objc/HashTable.h>
#import <string.h>
#import <ldsyms.h>
#import <sys/loader.h>
// this is here 'cause I don't want to include libc.h ... too slow
extern char *getsectdata( const char *segname,
const char *sectname,
int *size);
@implementation TclObj:Object
- init
{
char buf[32];
char *init;
int size;
[super init];
textView = NULL;
tvList = [[List alloc] init];
// create a tcl interpreter
tclinterp = Tcl_CreateInterp();
if (tclinterp == NULL) {
fprintf(stderr, "Failed to create tcl interpreter\n");
} else {
addTclCmds(tclinterp, self);
sprintf(buf, "%d", self);
Tcl_SetVar(tclinterp, "TclObj", buf, 1);
sprintf(buf, "%d", NXApp);
Tcl_SetVar(tclinterp, "NXApp", buf, 1);
if (init = (char *)getsectdata("TCL", "init", &size)) {
[self doCmd:init:NULL];
}
}
return self;
}
- msg:sender
{
char buf[32];
sprintf(buf, "msg %d", sender);
[self doCmd:buf:NULL];
return self;
}
- createTextView:sender
{
NXRect wRect;
id newText;
wRect.origin.x = wRect.origin.y = 200.0;
wRect.size.width = 500.0;
wRect.size.height = 300.0;
newText = [[TclTV alloc] initFrame:&wRect];
[[newText window] setDelegate:self];
[newText setCmdHandler:self];
[tvList addObject:newText];
if (textView == NULL) {
textView = newText;
}
return self;
}
- doCmd:(const char *)cmd :(id)tv
{
int result;
char num[10];
if (tclinterp) {
result = Tcl_Eval(tclinterp, cmd, 0, NULL);
if (tv == NULL) {
tv = textView;
}
if (tv) {
if (result == TCL_OK) {
if (*tclinterp->result != 0) {
[tv addText:tclinterp->result];
[tv addText:"\n"];
}
} else {
[tv addText:"Error "];
if (result != TCL_ERROR) {
sprintf(num, "(%d) ", result);
[tv addText:num];
}
if (*tclinterp->result != 0) {
[tv addText:tclinterp->result];
}
[tv addText:"\n"];
}
[tv cursorVisible];
}
}
return self;
}
- addText:(const char *)text
{
if (textView) {
[textView addText:text];
}
return self;
}
- cursorVisible
{
if (textView) {
[textView cursorVisible];
}
return self;
}
- viewLeaving:sender
{
[tvList removeObject:sender];
if (sender == textView) {
textView = [tvList objectAt:0];
}
return self;
}
- forward:(SEL)aSelector :(marg_list)argFrame
{
char buf[32];
sprintf(buf, "forward %d", (int)aSelector);
[self doCmd:buf:NULL];
return self;
}
- free
{
[[tvList freeObjects] free];
Tcl_DeleteInterp(tclinterp);
return [super free];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.