HP OpenVMS Systems

ask the wizard
Content starts here

BASIC declaration of LIB$BBCCI, LIB$BBSSI?

» close window

The Question is:

 
1000    !0123456789012345678901234567890123456789012345678901234567890123456
        !
        ! Dear Compaq. You have a declaration error in OpenVMS 7.2 library
        ! "sys$library:basic$starlet.tlb" which affects both VAX-BASIC and
        ! DEC-BASIC (on Alpha). I've checked your library and you have not
        ! declared two LIB$ routines properly when compared with OpenVMS
        ! document "OpenVMS RTL Library (LIB$) Manual". The routines are
        ! lib$bbcci and lib$bbssi and are in module "LIB$ROUTINES" of
	! starlet.
	!
        ! Neil Rieck
        ! Programmer/Analyst
        ! Bell Canada
        ! F3, 20 Water St. N.
        ! Kitchener, Ontario,
        ! Canada. N2H-5A5
        ! tel: (519)-571-6303
        ! biz: email:neil.rieck@bell.ca
        ! rez: email:n.rieck@sympatico.ca
        !-------------------------------------------------------------------
        option type=explicit
        !
        %let %method=2
        %if%method=1
        %then
          ! this option "crashes at run time" because incorrect passing
	  ! mechanisms are used in the library.
          %include "lib$routines" %from %library "sys$library:basic$starlet"
        %else
          ! this option "runs properly" and agrees with the lib$ manual
          external long function lib$bbcci(long by ref, long by ref)
          external long function lib$bbssi(long by ref, long by ref)
        %end %if
        !
        common(abc)long        junk(4)
        !
        print "doing set"
        if( lib$bbssi (42, junk(0))) then
            print 'State bit 42 was set'
        else
            print 'State bit 42 was clear'
        end if
 
        print "doing clear"
        if( lib$bbcci (42, junk(0))) then
            print 'State bit 42 was set'
        else
            print 'State bit 42 was clear'
        end if
        end
 
 


The Answer is :

 
  The OpenVMS documentation of this argument is admittedly rather odd,
  as this argument is a longword passed "by value" -- a mechanism that
  would more commonly be refered to as "by reference".
 
  The documentation for the argument lists:
 
    bit-zero-address
      OpenVMS usage:unspecified
      type:         address
      access:       modify
      mechanism:    by reference
 
  A more expected (and equivilent) declaration might be:
 
    bit-vector
      OpenVMS usage: unspecified
      type:          longword (unsigned)
      access:        modify
      mechanism:     by reference
 
  Though discussions of a change are underway at this writing, any changes
  to the SDL declaration will have to be carefully evaluated against the
  implications for existing source code modules.  (At a minimum, a better
  description of this argument will be included in the documentation for
  this call in a future OpenVMS release, and potentially several additional
  programming examples will also be included...)
 
  Attached are functioning BASIC and C programs...
 
 
$ basic x
$ link x
$ run x
doing set
State bit 42 was clear
doing clear
State bit 42 was set
$ type x.bas
 
1000    !-------------------------------------------------------------------
        option type=explicit
        !
        %include "lib$routines" %from %library "sys$library:basic$starlet"
        !
        common(abc)long        junk(4)
        !
        print "doing set"
        if( lib$bbssi (42, LOC(junk(0)))) then
            print 'State bit 42 was set'
        else
            print 'State bit 42 was clear'
        end if
 
        print "doing clear"
        if( lib$bbcci (42, LOC(junk(0)))) then
            print 'State bit 42 was set'
        else
            print 'State bit 42 was clear'
        end if
        end
 
	--
 
$ cc x
$ link x
$ run x
doing set
State bit 42 was clear
doing clear
State bit 42 was set
$ type x.c
 
#include <lib$routines.h>
#include <ssdef.h>
#include <stdio.h>
#include <stdlib.h>
main()
  {
  unsigned long bitvector[4] = { 0, 0, 0, 0 };
  unsigned long bitnumber = 42;
 
  printf("doing set\n");
  if ( lib$bbssi( &bitnumber, bitvector))
     printf("State bit %d was set\n", bitnumber );
  else
     printf("State bit %d was clear\n", bitnumber );
 
  printf("doing clear\n");
  if ( lib$bbcci( &bitnumber, bitvector ))
    printf("State bit %d was set\n", bitnumber );
  else
    printf("State bit %d was clear\n", bitnumber );
 
  return SS$_NORMAL;
  }
 

answer written or last revised on ( 7-JAN-2000 )

» close window