This is WebsterWord.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 "codebook.h" @implementation WebsterWord - initForWord: (const char*) theWord fromVolume: (WebsterVolume*) volume andKeys: (websterKey *)theKeys number: (int)number; { word = theWord; comesFrom = volume; keys = theKeys; numberOfKeys = number; definitions = NULL; return self; } - loadDataFromKeys // Internal Function { int i; // If already loaded, ok if (definitions) return self; definitions = malloc(sizeof(void*) * numberOfKeys); defsLengths = malloc(sizeof(int) * numberOfKeys); if (!defsLengths || !definitions) return nil; for(i=0;i<numberOfKeys; i++) definitions[i] = NULL, defsLengths[i] = 0; for(i=1; i<numberOfKeys; i++) { IXBTreeCursor *cursor = [comesFrom getEntriesCursor]; if ([cursor setKey: &keys[i] andLength:sizeof(keys[i])]) { const unsigned char* contents = NULL; int length = [cursor readValue: (void**)&contents]; decodeEntry(contents, length, &definitions[i], &defsLengths[i]); free((char*)contents); } else return nil; } return self; } - outputDefinitionAs: (const char*) set result: (char **) where length: (int*) length // Not yet implemented { // Iterate all the definitions int i; NXStream* stream; int maxlen; if (![comesFrom canOutputDefinitionsAs: set]) return nil; if (!(stream = NXOpenMemory(NULL, 0, NX_WRITEONLY))) return nil; for(i=1; i<numberOfKeys; i++) { char* outi; int lengthi; if ([self outputDefinitionAs: set forDefNumber: i result: &outi length: &lengthi]) { // Concat this entry NXWrite(stream, outi, lengthi); vm_deallocate(task_self(), (vm_address_t)outi, (vm_size_t)lengthi); } } NXCloseMemory(stream, NX_TRUNCATEBUFFER); NXGetMemoryBuffer(stream, where, length, &maxlen); return self; } - outputDefinitionAs: (const char*) mode forDefNumber: (int) n result: (char**) where length: (int*) length { websterMode* m = [comesFrom getModeEntry: mode]; if (n > numberOfKeys) return nil; if (m) { NXStream *stream = NULL; int maxlen; if (![self loadDataFromKeys]) return nil; m->translationFunc(definitions[n], defsLengths[n], word, &stream, m->select); if (!stream) return nil; NXCloseMemory(stream, NX_TRUNCATEBUFFER); NXGetMemoryBuffer(stream, where, length, &maxlen); return self; } else return nil; } - (int) numberOfDefinitions { return numberOfKeys-1; } - (const char*) word { return word; } - free { if (keys) free(keys), keys = NULL; if (definitions && defsLengths) { int i; for(i=0; i<numberOfKeys; i++) if (definitions[i]) free(definitions[i]), definitions[i] = NULL; } if (definitions) free(definitions), definitions = NULL; if (defsLengths) free(defsLengths), defsLengths = NULL; if (word) free((char *)word), word = 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.