[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference turris::decbasic

Title:DEC BASIC Conference
Notice:SSB Kit Now available - Note 2.29
Moderator:TLE::HAYNES
Created:Wed Sep 15 1993
Last Modified:Thu Jun 05 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:210
Total number of notes:976

204.0. "ACCVIO (MEMMANVIO) with LIB$INIT_DATE_TIME_CONTEXT, V7.1" by CSC32::D_SANFORD () Fri Mar 28 1997 13:32

    DEC BASIC V2.1-000, OpenVMS Alpha V7.1

    The following example fails with an ACCVIO (MEMMANVIO) during a 
    function call to LIB$INIT_DATE_TIME_CONTEXT.  This same program
    works with OpenVMS Alpha V6.2, did not test with V7.0.  I also
    tried this with DEC$BASRTL.EXE from a V7.1 system on V6.2 and it
    did not fail, so does not look like a RTL/Compiler issue.

    If you remove one statement:

      PRINT ESC; '<'; SI;

    It will also work on V7.1.  I suspect something getting corrupted,
    but it does not look like the application can be causing it.

    Regards, Drew Sanford
    Language Support Team
    C970226-3137


$ ! Command file to create sources/link image PCHEK.EXE
$ !
$ create datefn.bas
	!
	!   Initialize MD Date Functions
	!
	RECORD quadword
	  long QUAD.DATE.WORD(1%)
	END RECORD
	EXTERNAL quadword FUNCTION fn_MDSIN (string)
	EXTERNAL string FUNCTION fn_MDSOUT (quadword)
	EXTERNAL quadword FUNCTION fn_MDLIN (string)
	EXTERNAL string FUNCTION fn_MDOOUT (quadword)
	EXTERNAL string FUNCTION fn_MDLOUT (quadword)
	EXTERNAL string FUNCTION fn_MDIOUT (quadword)
	EXTERNAL quadword FUNCTION fn_MDADD (quadword, long)
	EXTERNAL long FUNCTION fn_MDINT (quadword, quadword)
	EXTERNAL quadword FUNCTION fn_MDTODA ()
	DECLARE quadword QUAD.DATE.Q
	MAP (MDCOM) long MD.CONTEXT.L
$ !
$ create fn_mdlout.bas
1	FUNCTION string fn_MDLOUT (quadword USER.TIME.Q)
	OPTION 								&
	    TYPE = real							&
	  , SIZE = (REAL double, INTEGER long)				&
	  , SCALE = 0
	RECORD quadword
	  long D(1%)
	END RECORD
	EXTERNAL long FUNCTION LIB$INIT_DATE_TIME_CONTEXT		&
	    (long, long, string)
	EXTERNAL long FUNCTION LIB$FORMAT_DATE_TIME			&
	    (string,quadword,long,long,long)
	!
	!   C o n s t a n t   D e f i n i t i o n s
	!
	EXTERNAL long CONSTANT LIB$M_DATE_FIELDS, LIB$K_OUTPUT_FORMAT
	EXTERNAL long CONSTANT SS$_NORMAL
	!
	!   L o c a l   D e f i n i t i o n s
	!
	DECLARE long STATUS.L, DL.L
	MAP (MDCOM) long MD.CONTEXT.L
	ON ERROR GO BACK
	A% = CTRLC
	!
	!   If a date of 0,0 is passed in, return a string of blanks
	!
	IF User.time.q::D(0%) = 0% AND User.time.q::D(1%) = 0% THEN
	  fn_MDLOUT = '           '
	  EXIT FUNCTION
	END IF
	DATE.FORMAT$ = '!D0-!MAAC-!Y4'
	!
	!   Initilize input format
	!
	print "calling init_date_time_context"	! trace
	print md.context.l
	PRINT "LIB$K_OUTPUT_FORMAT "; LIB$K_OUTPUT_FORMAT
	STATUS.L = LIB$INIT_DATE_TIME_CONTEXT				&
	    (MD.CONTEXT.L ,LIB$K_OUTPUT_FORMAT, "|" + DATE.FORMAT$	&
	    + "| !H04:!M0:!S0.!C2|")
	PRINT "RETURN FROM INIT_DATE..."
	print md.context.l
	IF STATUS.L <> SS$_NORMAL THEN
	  CALL LIB$SYS_GETMSG (STATUS.L, , SMG.ERT$)
	  CAUSE ERROR 194%
	END IF
	!
	!   Do the conversion
	!
	print "calling format_date_time"	! trace
	STATUS.L = LIB$FORMAT_DATE_TIME					&
	    (D$, USER.TIME.Q, MD.CONTEXT.L, DL.L, LIB$M_DATE_FIELDS)
	IF STATUS.L <> SS$_NORMAL THEN
	  CALL LIB$SYS_GETMSG (STATUS.L, , SMG.ERT$)
	  CAUSE ERROR 194%
	END IF
	fn_MDLOUT = LEFT (D$ + '           ', 11%)
	END FUNCTION
$ !
$ create fn_mdsin.bas
1	FUNCTION quadword fn_MDSIN (D$)
	OPTION 								&
	    TYPE = real							&
	  , SIZE = (REAL double, INTEGER long)				&
	  , SCALE = 0
	RECORD quadword
	  long D(1%)
	END RECORD
	EXTERNAL long FUNCTION LIB$INIT_DATE_TIME_CONTEXT		&
	    (long, long, string)
	EXTERNAL long FUNCTION LIB$CONVERT_DATE_STRING
	EXTERNAL long CONSTANT LIB$K_INPUT_FORMAT
	EXTERNAL long CONSTANT SS$_NORMAL
	DECLARE quadword USER.TIME.Q
	DECLARE long STATUS.L, CONVERT.FLAGS%, LOCAL.CONTEXT%, INPUT.FORMAT%
	MAP (MDCOM) long MD.CONTEXT.L
	ON ERROR GO BACK
	A% = CTRLC
	!
	!=====================|
	!   M a i n l i n e   |
	!=====================|
	!
	!   If a blank date or a date of all 0's is passed in, return
	!   a quad date of 0,0
	!
	LOCAL.D$ = D$
	IF LOCAL.D$ <= '00000000' THEN
	  User.time.q::D(0%) = 0%
	  User.time.q::D(1%) = 0%
	  fn_MDSIN = USER.TIME.Q
	  EXIT FUNCTION
	END IF
	!
	!   Initialize input format
	!
	INPUT.FORMAT% = LIB$K_INPUT_FORMAT
	LOCAL.CONTEXT% = MD.CONTEXT.L
	print "calling init_date_time_context"	! trace
	print md.context.l
	DATE.FORMAT$ = '|!Y4!MN0!D0 !H04:!M0:!S0.!C2|'
	PRINT "LIB$K_INPUT_FORMAT "; INPUT.FORMAT%
	STATUS.L = LIB$INIT_DATE_TIME_CONTEXT				&
	       (LOCAL.CONTEXT% BY REF, INPUT.FORMAT% BY REF,		&
		 DATE.FORMAT$ BY DESC)
	PRINT "RETURN FROM INIT_DATE..."
	print local.context%
	MD.CONTEXT.L = LOCAL.CONTEXT%
	IF STATUS.L <> SS$_NORMAL THEN
	   CALL LIB$SYS_GETMSG (STATUS.L, , SMG.ERT$)
	   CAUSE ERROR 194%
	END IF
	!
	!   Do the conversion
	!
	CONVERT.FLAGS% =  8% + 16% + 32% + 64%
	print "calling convert_date_string"	! trace
	STATUS.L = LIB$CONVERT_DATE_STRING				&
	    (LOCAL.D$ BY DESC, USER.TIME.Q BY REF, LOCAL.CONTEXT% BY REF,	&
		CONVERT.FLAGS% BY REF)
	MD.CONTEXT.L = LOCAL.CONTEXT%
	IF STATUS.L <> SS$_NORMAL THEN
	  CALL LIB$SYS_GETMSG (STATUS.L, , SMG.ERT$)
	  CAUSE ERROR 194%
	END IF
	fn_MDSIN = USER.TIME.Q
	END FUNCTION
$ !
$ create minit.bas
1	SUB MINIT (CHANNEL%)
	OPTION 								&
	    TYPE = REAL							&
	  , SIZE = (REAL DOUBLE, INTEGER WORD)				&
	  , SCALE = 0
	!
	!   L o c a l   S t o r a g e
	!
	DECLARE LONG P.STATUS						&
	, NORMAL, BOLD, REVERSE, BLINK, UNDERLINE, DISPLAY, PASTEBOARD
	EXTERNAL LONG FUNCTION						&
	  LIB$SYS_GETMSG
	EXTERNAL LONG CONSTANT SS$_NORMAL
	!
	!   ENSURE: ANSI MODE, G0 CHARACTER SET
	!
	PRINT ESC; '<'; SI;
	!
	!   Open keyboard on channel KB.CHANNEL%, disable echo,
	!   and discard any pending type ahead.
	!
	OPEN 'TT:' AS FILE CHANNEL%
	SUBEXIT
32767	SUBEND
$ !
$ create pchek.bas
1	!======================================|
	!               P C H E K              |
	OPTION TYPE = REAL						&
	     , SIZE = (REAL DOUBLE, INTEGER WORD)			&
	     , SCALE = 0
	!
	!   I N I T I A L I Z E
	!
	%INCLUDE 'MA:DATEFN.BAS'
	CALL MINIT (2%)
	MD.CONTEXT.L = '0'L
	CALL PCHEK0 (ERROR%)
32767	END
$ !
$ create pchek0.bas
1	SUB PCHEK0 (ERROR%)
	OPTION TYPE = REAL						&
	     , SIZE = (REAL DOUBLE, INTEGER WORD)			&
	     , SCALE = 0
	!
	!   Date functions
	!
	%INCLUDE 'MA:DATEFN.BAS'
	PM.START.DATE$ = '19970318'
	PM.END.DATE$ = '19970331'
1050	START.DATE$ = fn_MDLOUT (fn_MDSIN ('19970318'))
	PRINT "Date to convert: 19970331"	! TRACE
	QUAD.DATE.Q = fn_MDSIN('19970331')
	END.DATE$ = fn_MDLOUT (QUAD.DATE.Q)
	PRINT 'Converted date: '; END.DATE$	! trace
1052	START.DATE$ = fn_MDLOUT (fn_MDSIN (PM.START.DATE$))
1053	PRINT "Date to convert: "; PM.END.DATE$	! TRACE
1054	QUAD.DATE.Q = fn_MDSIN(PM.END.DATE$)
1055	END.DATE$ = fn_MDLOUT (QUAD.DATE.Q)
1056	PRINT 'Converted date: '; END.DATE$	! trace
32767	END SUB
$ !
$	def = f$parse("",,,"DEVICE") + f$parse("",,,"DIRECTORY")
$ 	define ma 'def
$	WRITE SYS$OUTPUT "***Compile"
$	!
$	basic := basic/debug/noopt
$	BASIC PCHEK0.BAS
$	BASIC PCHEK.BAS
$	BASIC FN_MDSIN.BAS
$	BASIC FN_MDLOUT.BAS
$	BASIC MINIT.BAS
$	!
$	WRITE SYS$OUTPUT "***Link image PCHEK.EXE"
$	!
$	LINK/DEBUG PCHEK,PCHEK0,FN_MDSIN,FN_MDLOUT,MINIT
$	EXIT
T.RTitleUserPersonal
Name
DateLines
204.1LIBRTL change?GIDDAY::GILLINGSa crucible of informative mistakesTue Apr 01 1997 02:3520
>  I also
>    tried this with DEC$BASRTL.EXE from a V7.1 system on V6.2 and it
>    did not fail, so does not look like a RTL/Compiler issue.

  I'm not so sure about this. I compiled and linked on OpenVMS V6.1, no
  errors when run. Execute the same image under V7.1 and I get the ACCVIO.
  Sure sounds like RTL involvement to me. It may not be DEC$BASRTL though,
  perhaps LIBRTL? Remember there were some changes in LIBRTL for V7.1,
  especially in the time routines (can you spell 10K?). Note that you can't
  run against a V7.1 LIBRTL on a lower version of OpenVMS so it's not
  easy to test the theory. I wouldn't discount a coding error just yet
  though.

  First thing I'd suggest is to clean up the code. For a start, get rid of
  all the variable names with "."s in them. Very confusing! I'd also
  double check all the data types. I'd also be a bit suspicious of the
  dynamic strings. Might be worth replacing them with static strings to
  one by one to see if it makes a difference.

						John Gillings, Sydney CSC