This is WebsterDictionary.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" extern char* strrealloc(const char*); extern void convertToAscii(const void* data, int length, const char* word, NXStream** outstream, int select); static websterMode dicowebsterModes[] = { { "ascii", convertToAscii, 0 }, { "next", convertToAscii, 1 }, { "internal", convertToAscii, 2 }, { NULL, NULL } }; @implementation WebsterDictionary - initFromFile: (const char*) theFileName { if ([super initFromFile:theFileName]) { NX_DURING referenceBTree = nil; referenceCursor = nil; referenceBTree = [[IXBTree alloc] initFromName: "FullTextIndex" inFile: fileName forWriting: NO]; if (!referenceBTree) NX_RAISE(websterNoBTree, fileName, NULL); referenceCursor = [[IXBTreeCursor alloc] initWithBTree: referenceBTree]; if (!referenceCursor) NX_RAISE(websterInternalError, fileName, NULL); websterModes = dicowebsterModes; return self; NX_HANDLER // If some error occurs if (headwordsCursor) [headwordsCursor free], headwordsCursor = nil; if (headwordsBTree) [headwordsBTree free], headwordsBTree = nil; if (referenceCursor) [referenceCursor free], referenceCursor = nil; if (referenceBTree) [referenceBTree free], referenceBTree = nil; if (entriesCursor) [entriesCursor free], entriesCursor = nil; if (entriesBTree) [entriesBTree free], entriesBTree = nil; NX_RERAISE(); NX_ENDHANDLER; } else return nil; } - (WebsterWord*) defineByReference: (const char*) word { return [self defineWord:word useCursor:referenceCursor]; } - free { [referenceCursor free], referenceCursor = nil; [referenceBTree free], referenceBTree = nil; return [super free]; } - (List*) completeWord: (const char*) word maxCount: (int) max // Provide the list of the first 'n' endings of that word { List* theList = NULL; char* newWord = strrealloc(word); char* c = newWord; int wordLength = strlen(word); char* theKey; unsigned int l, hint; while (*c) { *c = NXToLower(*NXToAscii(*c)); c++; } [headwordsCursor setKey: newWord andLength: strlen(newWord)]; while ([headwordsCursor getKey: (void **)&theKey andLength: &l withHint: &hint] && !strncmp(word, theKey, wordLength)) { register char* theWord = malloc(l + 1); if (theWord) { WebsterWord* w; websterKey* keys = NULL; int length = [headwordsCursor readValue: (void **)&keys]; strncpy(theWord, theKey, l); theWord[l] = 0; 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: theWord fromVolume: self andKeys: keys number: length/4]; if (!w) NX_RAISE(websterInternalError, "[WebsterWord initForWord] failed", NULL); if (!theList) theList = [[List alloc] init]; [theList addObject: w]; if (--max <= 0) break; } [headwordsCursor setNext]; } free(newWord); return theList; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.