This is WebsterVolume.m in view mode; [Download] [Up]
// Hey ! emacs, it is an -*- objective-c -*- file
/*
Webster Access, a program to use NeXT online Webster dictionary.
Copyright (C) 1994 Benoit Grange, ben@fizz.fdn.org
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#import "WebsterVolume.h"
#import "WebsterWord.h"
#import "WebsterExceptions.h"
#import "codebook.h"
static char* codebookFileName = // The name of the codebook file
"/NextLibrary/References/Webster-Dictionary/codebook";
static BOOL codebookInited = NO;
extern char* strrealloc(const char*);
char *websterErrorMessages[] = {
"Webster: Internal error (%s)",
"Webster: No codebook can be found (%s)",
"Webster: Bad codebook (%s)",
"Webster: No btree can be found (%s)",
"Webster: Bad entry (%s)",
};
void
WebsterErrorReporter(NXHandler *errorState)
{
if (errorState->code - NX_APPBASE < sizeof(websterErrorMessages)/sizeof(char*))
NXLogError(websterErrorMessages[errorState->code -NX_APPBASE],
errorState->data1);
else
NXLogError("Webster error: unknown %d (%s)\n",
errorState->code -NX_APPBASE, errorState->data1);
return;
}
@implementation WebsterVolume
+ (void)setCodebookFileName: (const char*) theFileName
{
codebookFileName = strrealloc(theFileName);
}
+ initialize
{
NXRegisterErrorReporter(websterInternalError,
websterInternalError + sizeof(websterErrorMessages)/sizeof(char *),
WebsterErrorReporter);
return self;
}
+ (const char *)libraryCopyrightString
{
return
"Webster access Library version 1.0, Copyright (C) 1994 BENOIT GRANGE.\n";
}
+ (const char *)volumeCopyrightString
{
return
"Webster dictionary & thesaurus Copyright (C) 1983-1989 Merriam-Webster Inc.\n";
}
- init
// Just in case, initialize everything to nils
{
fileName = NULL;
headwordsBTree = entriesBTree = nil;
headwordsCursor = entriesCursor = nil;
websterModes = NULL;
return self;
}
- initFromFile: (const char*) theFileName
// Just load the two BTrees, raising exceptions if anything fails
{
[self init];
NX_DURING
if (!codebookInited) {
initCodebook(codebookFileName);
codebookInited = YES;
}
fileName = strrealloc(theFileName);
headwordsBTree = [[IXBTree alloc] initFromName: "Headwords" inFile: fileName forWriting: NO];
if (!headwordsBTree) NX_RAISE(websterNoBTree, fileName, NULL);
headwordsCursor = [[IXBTreeCursor alloc] initWithBTree: headwordsBTree];
if (!headwordsBTree) NX_RAISE(websterInternalError, fileName, NULL);
entriesBTree = [[IXBTree alloc] initFromName: "Entries" inFile: fileName forWriting: NO];
if (!entriesBTree) NX_RAISE(websterNoBTree, fileName, NULL);
entriesCursor = [[IXBTreeCursor alloc] initWithBTree: entriesBTree];
if (!entriesBTree) NX_RAISE(websterInternalError, fileName, NULL);
return self;
NX_HANDLER
// If some error occurs
if (headwordsCursor) [headwordsCursor free], headwordsCursor = nil;
if (headwordsBTree) [headwordsBTree free], headwordsBTree = nil;
if (entriesCursor) [entriesCursor free], entriesCursor = nil;
if (entriesBTree) [entriesBTree free], entriesBTree = nil;
NX_RERAISE();
NX_ENDHANDLER;
}
- (WebsterWord*) defineWord: (const char*) word useCursor: (IXBTreeCursor*) cursor
{
char* newWord = strrealloc(word);
char* c = newWord;
while (*c) { *c = NXToLower(*NXToAscii(*c)); c++; }
if ([cursor setKey: newWord andLength: strlen(newWord)]) {
WebsterWord* w;
websterKey* keys = NULL;
int length = [cursor readValue: (void **)&keys];
if ((length % 4) || (length < 8) || (keys[0] != 0xFFFFFFFF)) {
free(keys);
NX_RAISE(websterBadEntry, word, NULL);
}
// Put all in the word, this should not fail
w = [[WebsterWord alloc] initForWord: newWord fromVolume: self andKeys: keys number: length/4];
if (!w) NX_RAISE(websterInternalError, "[WebsterWord initForWord] failed", NULL);
return w;
} else {
free(newWord);
return nil;
}
}
- (WebsterWord*) defineWord: (const char*) word
{
return [self defineWord:word useCursor:headwordsCursor];
}
- (WebsterWord*) defineByReference: (const char*) word
// Default implementation is void
{
return nil;
}
- (List*) completeWord: (const char*) word maxCount: (int) max;
// Default implementation is void
{
return nil;
}
- (List*) completeWord: (const char*) word;
{
return [self completeWord: word maxCount: 256];
}
- (List*) wildcardWord: (const char*) word
// Default implementation is void
{
return nil;
}
- (BOOL)canOutputDefinitionsAs: (const char*)set
{
websterMode* m = websterModes;
while (m->modeName) {
if (!strcmp(set, m->modeName)) return YES;
m++;
}
return NO;
}
- (websterMode *)getModeEntry: (const char*)mode
{
websterMode* m = websterModes;
while (m->modeName) {
if (!strcmp(mode, m->modeName)) return m;
m++;
}
return NULL;
}
- (IXBTreeCursor*) getEntriesCursor
{
return entriesCursor;
}
- free
{
if (headwordsCursor) [headwordsCursor free], headwordsCursor = nil;
if (headwordsBTree) [headwordsBTree free], headwordsBTree = nil;
if (entriesCursor) [entriesCursor free], entriesCursor = nil;
if (entriesBTree) [entriesBTree free], entriesBTree = nil;
if (fileName) free(fileName), fileName = NULL;
return [super free];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.