This is StringResponder.m in view mode; [Download] [Up]
#import "StringResponder.h"
#import <stdio.h>
#import <stdlib.h>
#import <string.h>
@implementation StringResponder
+ new
{
self = [super new];
list = (listElt *)malloc(sizeof(listElt)); // to simplify searching, list head never has valid data
list->next = NULL;
maxlen = 0;
return self;
}
- free
{
listElt *p, *q;
p=list->next;
while (p) {
q=p->next;
free(p->s);
free(p);
p=q;
}
free(list);
return [super free];
}
- addString:(char *)string returnValue:(int)tag
{
listElt *p;
int len;
len = strlen(string);
if (len>maxlen) maxlen=len;
for (p=list; p->next; p=p->next)
;
p->next = (listElt *)malloc(sizeof(listElt));
p = p->next;
p->next = NULL;
p->s = (char *)malloc(len+1);
strcpy(p->s, string);
p->strlen = len;
if (tag==0) {
fprintf(stderr,"StringResponder:registered tag must be non-zero, will make it -1\n");
tag=(-1);
}
p->tag = tag;
p->matchedChars = 0;
return self;
}
- (int) inputString:(char *)input
{
int i,len;
BOOL seen;
len=strlen(input);
seen = NO;
for (i=0; i<len && !seen; i++)
seen = [self inputChar:input[i]];
return seen;
}
- (int) inputChar:(char)ichar
{
listElt *p;
int m;
for (p=list->next; p; p=p->next) {
m = p->matchedChars;
if ((p->s)[m] == ichar) {
(p->matchedChars)++;
if (p->strlen == m+1) { // trigger is pulled
p->matchedChars = 0;
return p->tag;
}
}
else
p->matchedChars = 0;
}
return 0;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.