// // Xanthus // Copyright (c) 1992-95 Bjorn Backlund. // All rights reserved. // LibraryDemo This small project implements a small "library bundle" which shows a technique how to put code which should be used by several Questor addin-functions in a common bundle which is loaded by the first addin which is loaded into Questor. The LibraryDemo project implements one small class - LibraryDemo - which should implement the common code. Instead of writing common C functions, the addin-implementors should use common methods defined in the common bundle class. Instead of calling common C functions (e.g. foobar(1,2)), the addins should send messages to the common bundle class - e.g. LibraryDemo. This example uses class methods, but nothing prevents you from using normal methods. Example usage in a addin class: ------------------------------------------------------------------------ @implementation my_addin_function - libClass; { const char *libFolder = "THE FULL PATH TO THE LIB BUNDLE"; id libBundle = nil; static id libClass = nil; if(libClass != nil) return libClass; // Example libFolder: /Library_Bundles/LibraryDemo.bundle // Get a bundle for the library folder libBundle = [[NXBundle alloc] initForDirectory: libFolder]; // Force class to to loaded libClass = [libBundle classNamed: "LibraryDemo"]; if(libClass == nil) NXLogError("ERROR: No class LibraryDemo in %s", libFolder); return libClass; } - (void *)runFunction: (void *)frame; { double x, y, result; int xType, yType; xType = XQ_ArgType(frame, 0); yType = XQ_ArgType(frame, 1); if(xType != XQ_DOUBLE_ARG) { XQ_RaiseArgTypeError(frame, 0, XQ_DOUBLE_ARG); } if(yType != XQ_DOUBLE_ARG) { XQ_RaiseArgTypeError(frame, 1, XQ_DOUBLE_ARG); } x = XQ_GetDoubleValue(frame, 0); y = XQ_GetDoubleValue(frame, 1); // Call the library routine foobar result = [[self libClass] foobar: x : y]; return XQ_CreateDoubleValue(frame, result); } + (const char *)functionName; { return "my_addin_function"; } + (const char *)categoryName; { return "demo_category"; } - (const char *)argumentNameNo:(int)index; { switch(index) { case 0 : return "x"; case 1 : return "y"; } return "<should never be seen>"; } - (int)minArg; { return 2; } - (int)maxArg; { return 2; } - (int)formalCount; { return 2; } - (int)argType:(int)index; { switch(index) { case 0 : return XQ_EVAL; case 1 : return XQ_EVAL; } return XQ_EVAL; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.