This is Term.m in view mode; [Download] [Up]
#import "Term.h"
#import <stdio.h>
#import <stdlib.h>
#import <string.h>
#import <libc.h>
@implementation Term
+ new
{
self = [super newExistingfd:0];
stack = NULL;
crlast = NO;
return self;
}
- pushState
{
struct stateStack * p;
p = (struct stateStack *)malloc(sizeof(struct stateStack));
p->next = stack;
p->state = currentState;
stack = p;
return self;
}
- popState
{
struct stateStack *p;
if (stack==NULL) {
fprintf(stderr,"Term.m error: stack empty on popState\n");
}
currentState = stack->state;
p = stack;
stack = stack->next;
free(p);
return [self activateState];
}
- (int)getchar
{
char ch;
int cc;
[[[self pushState] setRaw] setCrmod];
cc=read(fd, &ch, 1);
[self popState];
if (cc==1) {
crlast = (ch=='\r' || ch=='\n');
return ch;
}
else
return EOF;
}
- (int)getcharWithPrompt:(char *)prompt
{
[self putPrompt:prompt];
return [self getchar];
}
- (int)getline:(char *)string size:(int)max
{
char ch;
int c,i;
i=0;
[[[[self pushState] unSetRaw] setCrmod] setEcho];
while (--max>0 && (c=read(fd,&ch,1))==1 && ch!='\n')
string[i++]=ch;
if (ch=='\n')
string[i++]=ch;
string[i]=0;
[self popState];
crlast=YES;
return i;
}
- (int)getline:(char *)string size:(int)max WithPrompt:(char *)prompt
{
[self putPrompt:prompt];
return [self getline:string size:max];
}
- putString:(char *)string
{
[[[self pushState] unSetRaw] setCrmod];
if (crlast && *string=='\n') // don't skip line at beginning of string
[self writeOut:string+1];
else
[self writeOut:string];
[self popState];
crlast = (string[strlen(string)-1]=='\n');
return self;
}
- putPrompt:(char *)string
{
[[[self pushState] unSetRaw] setCrmod];
printf("%s",string);
fflush(stdout);
[self popState];
return self;
}
- ringBell
{
char bell = '\a';
write (fd, &bell, 1);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.