#include "src/rplexternals.h" #include "motif.h" declareExternalFunction(XtCreateWidget) declareObject(nameObject); declareObject(classObject); declareObject(parentObject); declareObject(parametersObject); declareObject(list); declareObject(directive); declareDaisyChain(current); declareDaisyChain(current2); char target(name); char target(class); Cardinal argNum; WidgetClass wc; HEADER declareHelpString("Create a Motif widget\n" " 4: name\n" " 3: class\n" " 2: parent\n" " 1: { parameters }\n" " -> 1: widget\n"); numberOfArguments(4); FUNCTION if (initializationDone eq true) then pullFromStack(parametersObject, list); returnOnError(freeObject(parametersObject)); pullFromStack(parentObject, external); returnOnError(freeObject(parametersObject); freeObject(parentObject)); pullFromStack(classObject, string); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject)); pullFromStack(nameObject, string); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject); freeObject(nameObject)); getString(classObject, class); getString(nameObject, name); Xm_widgets_classes(class, wc); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject); freeObject(nameObject)); getDaisyChainFromList(parametersObject, current); argNum = 0; repeatWhile(not nullified(current)) list = fetchElementFromDaisyChain(current); ifIsList(list) then getDaisyChainFromList(list, current2); if (nullified(current2)) then executionError("Too few arguments"); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject); freeObject(nameObject)); endIf ifIsString(fetchElementFromDaisyChain(current2)) then orElse executionError("Type mismatch error"); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject); freeObject(nameObject)); endIf current2 = nextElementOfDaisyChain(current2); if (nullified(current2)) then executionError("Too few arguments"); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject); freeObject(nameObject)); endIf directive = fetchElementFromDaisyChain(current2); ifIsInteger(directive) then orElse ifIsString(directive) then orElse ifIsName(directive) then orElse executionError("Type mismatch error"); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject); freeObject(nameObject)); endIf endIf endIf current2 = nextElementOfDaisyChain(current2); if (not nullified(current2)) then executionError("Type mismatch error"); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject); freeObject(nameObject)); endIf orElse executionError("Type mismatch error"); returnOnError(freeObject(parametersObject); freeObject(parentObject); freeObject(classObject); freeObject(nameObject)); endIf current = nextElementOfDaisyChain(current); postIncr(argNum); endWhile orElse executionError("Application not initialized"); returnOnError(); endIf setFalse(initializationDone); END endExternalFunction