The following C program creates a tube using a spline for the tube
path.

Figure Spring

#include <stdio.h>
#include <math.h>
#include <uf.h>
#include <uf_defs.h>
#include <uf_curve.h>
#include <uf_modl.h>
#include <uf_disp.h>
#define POLES 384
#define R1 2.25
#define R2 0.35
#define ANG PI/24
#define WEIGHT 1.0
#define ORDER 4

#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))

static int report( char *file, int line, char *call, int irc)
{
  if (irc)
  {
     char    messg[133];
     printf("%s, line %d:  %s\n", file, line, call);
     (UF_get_fail_message(irc, messg)) ?
       printf("    returned a %d\n", irc) :
       printf("    returned error %d:  %s\n", irc, messg);
  }
  return(irc);
}

static void do_ugopen_api(void)
{
  char *diams[2] = {"0.5", "0.0"};

  int i;
  int k_fixup;
  int p_fixup;

  tag_t spline_id;
  uf_list_p_t tubelist, tubefeats;
  UF_FEATURE_SIGN create = UF_NULLSIGN;

  double knotseq[POLES+ORDER];
  double pole_array[POLES*4];
  double x,y,z,t,w = WEIGHT;
  double delta_u = 1.0/((double)(POLES-ORDER+1));

  for(i = 0; i < ORDER; i++) {
    knotseq[i] = 0.0;
  }
  for(i = POLES; i < POLES + ORDER; i++) {
    knotseq[i] = 1.0;
  }
  i = 0;
  t =0.0;
  while( i < POLES*4){
    x = R1*cos(t) + .001;
    y = R1*sin(t) + .001;
    z = R2 + (R2/PI)*t;
    t += ANG;
    pole_array[i++] = x;
    pole_array[i++] = y;
    pole_array[i++] = z;
    pole_array[i++] = w;
    printf("%f, %f, %f, %f, %d\n",pole_array[i-4],pole_array[i-3],
        pole_array[i-2],pole_array[i-1],i-4);
  }
  for(i = ORDER; i < POLES ; i++){
    knotseq[i] = (i-ORDER+1)*delta_u;
  }

  printf("\nDelta u is = %f\n",delta_u);
  printf("Knot Sequence Values:\n");

  for(i = 0; i < POLES + ORDER; i++) printf("%f\n",knotseq[i]);
  if(k_fixup == 1) printf("Knot sequence was fixed.\n");
  if(p_fixup == 1) printf("Pole array was fixed.\n");
  UF_CALL(UF_MODL_create_spline(POLES,ORDER,knotseq,pole_array,
                        &spline_id,&k_fixup,&p_fixup));
  UF_CALL(UF_MODL_create_list(&tubelist));
  UF_CALL(UF_MODL_put_list_item(tubelist, spline_id));
  UF_CALL(UF_MODL_create_tube(tubelist, diams, create,
&tubefeats));

}

/*ARGSUSED*/
void ufusr(char *param, int *retcode, int param_len)
{
  if (!UF_CALL(UF_initialize()))
  {
    do_ugopen_api();
    UF_CALL(UF_terminate());
  }
}

int ufusr_ask_unload(void)
{
  return (UF_UNLOAD_IMMEDIATELY);
}