/* NAME * fib_times_two.c * * From the Illustra User Guide, p. 10-13. * * BUILD INSTRUCTIONS * * OSF1: cc -I$MI_HOME/h -c fib_times_two.c * ld -shared -expect_unresolved '*' -o fib_times_two.so \ * fib_times_two.o * * Solaris: cc -I$MI_HOME/h -c -K PIC fib_times_two.c * ld -dy -G -o fib_times_two.so fib_times_two.o * * SUN OS: cc -I$MI_HOME/h -c -PIC fib_times_two.c * ld -o fib_times_two.so fib_times_two.o * * chmod a+x fib_times_two.so * * DATABASE CREATE * create function fib_times_two (setof(integer)) returns setof(integer) * as external name '/FULL_PATH/fib_times_two.so' language c; * * SAMPLE USAGE * * begin transaction; * + return (fib_times_two(fib(71169))) as fib; * --------------- * |fib | * --------------- * |fib_1_12_0 | * --------------- * one row selected * + fetch from fib_1_12_0 all; * --------------- * |integer | * --------------- * |0 | * |2 | * |2 | * |4 | * |6 | * |10 | * |16 | * |26 | * |42 | * |68 | * ..... * --------------- * 25 rows fetched * + end transaction; * * $Header: /usr/local/devel/montage/samples/functions/RCS/fib_times_two.c,v 1.1 1994/10/06 16:31:29 jta Exp $ */ #include "mi.h" int fib_times_two(fibset, fParam) void *fibset; MI_FPARAM *fParam; { mi_boolean isNull, isDone; int next; switch(MI_FP_REQUEST(fParam)) { case SET_INIT: MI_FP_SETFUNCSTATE(fParam, (void *)fibset); break; case SET_RETONE: next = SetGetNext(MI_FP_FUNCSTATE(fParam), &isNull, &isDone); if (isDone) { MI_FP_SETISDONE(fParam, MI_TRUE); return 0; } if (isNull) { MI_FP_SETRETURNISNULL(fParam, MI_TRUE); return 0; } return (2*next); case SET_END: break; } }