HP3000-L Archives

October 2000, Week 5

HP3000-L@RAVEN.UTC.EDU

Options: Use Monospaced Font
Show Text Part by Default
Show All Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Subject:
From:
Wirt Atmar <[log in to unmask]>
Reply To:
Date:
Mon, 30 Oct 2000 12:42:35 EST
Content-Type:
text/plain
Parts/Attachments:
text/plain (215 lines)
Dave writes:

> I would be interested in implementing a couple of data types not currently
>  supported.  I don't know whether this is the type of feature that could be
>  readily handled by a pre-processor.

A pre-processor won't solve your problem for additional datatypes -- if
you're simply using the pre-processor to emit FORTRAN code into your standard
FORTRAN compiler. Rather, you're going to have to write equivalency routines
to convert the datatypes within your FORTRAN code itself for the datatypes
that you want to support.

We had to do the same thing with BASIC fifteen years ago when we first
started writing general-purpose code IMAGE code. For the ten years prior to
that, because we designed all of our customers' databases from scratch, we
simply limited the datatypes we used in our databases to those that BASIC
supported.

I've included below our SPL-based equivalency routines. In all of these, we
take the non-BASIC-supported datatypes and convert them into R4 real numbers.
Only the I4 numbers are compromised by this procedure. An I4 number can range
from +/- 2^63, which is approx. equivalent to +/- 10^21 (21 accurate
decimals). An R4 number only supports 16 accurate places, even though it has
a much greater range. Nevertheless, we've never found that to be much of a
problem.

All non-supported datatypes are converted to R4's on the way in, processed
within BASIC in that format, and then backconverted on the way out. While the
routines below had to be written in a callable format for use in BASIC, they
can be integrated directly into FORTRAN's code, simply because FORTRAN can
perform direct intrinsic calls and BASIC can't.

The nature of the individual routines should be obvious, especially if you
look at the documentation for the particular intrinsics they call.

Wirt Atmar

========================================

/t qcequvrt
/l all
    1     $CONTROL USLINIT,CODE,SEGMENT=EQUIVALENCE
    2     <<                                                    >>
    3     <<  These functions perform bit equivalencing for     >>
    4     <<  the following types: INTEGER, DOUBLE, REAL, and   >>
    5     <<  LONG.                                             >>
    6     <<                                                    >>
    7     BEGIN
    8     <<>>
    9     <<>>
   10     PROCEDURE STATUS2RECNUM(STATUS,BITPATTERN);
   11     INTEGER ARRAY STATUS;
   12     BYTE ARRAY BITPATTERN;
   13     BEGIN
   14       BYTE ARRAY PATTERN(*)=STATUS;
   15       MOVE BITPATTERN(0):=PATTERN(4),(4);
   16       BITPATTERN(-1):=4;
   17     END;
   18     <<>>
   19     <<>>
   20     PROCEDURE STRINGTOINT(BITPATTERN,NUMBER);
   21     BYTE ARRAY BITPATTERN;
   22     REAL NUMBER;
   23     BEGIN
   24       BYTE ARRAY PATTERN(0:1);
   25       INTEGER ARRAY NUMBER2(*)=PATTERN;
   26       MOVE PATTERN(0):=BITPATTERN(0),(2);
   27       NUMBER:=REAL(NUMBER2(0));
   28     END;
   29     <<>>
   30     <<>>
   31     PROCEDURE INTTOSTRING(NUMBER,BITPATTERN);
   32     REAL NUMBER;
   33     BYTE ARRAY BITPATTERN;
   34     BEGIN
   35       INTEGER NUMBER2;
   36       BYTE ARRAY PATTERN(*)=NUMBER2;
   37       NUMBER2:=INTEGER(FIXT(NUMBER));
   38       MOVE BITPATTERN(0):=PATTERN(0),(2);
   39       BITPATTERN(-1):=2;
   40     END;
   41     <<>>
   42     <<>>
   43     PROCEDURE STRINGTOLOGICAL(BITPATTERN,NUMBER);
   44     BYTE ARRAY BITPATTERN;
   45     REAL NUMBER;
   46     BEGIN
   47       LOGICAL ARRAY NUMBER2(*)=BITPATTERN;
   48       NUMBER:=REAL(DOUBLE(NUMBER2(0)));
   49     END;
   50     <<>>
   51     <<>>
   52     PROCEDURE LOGICALTOSTRING(NUMBER,BITPATTERN);
   53     REAL NUMBER;
   54     BYTE ARRAY BITPATTERN;
   55     BEGIN
   56       LOGICAL NUMBER2;
   57       BYTE ARRAY PATTERN(*)=NUMBER2;
   58       NUMBER2:=LOGICAL(FIXT(NUMBER));
   59       MOVE BITPATTERN(0):=PATTERN(0),(2);
   60       BITPATTERN(-1):=2;
   61     END;
   62     <<>>
   63     <<>>
   64     PROCEDURE STRINGTODBLE(BITPATTERN,NUMBER);
   65     BYTE ARRAY BITPATTERN;
   66     REAL NUMBER;
   67     BEGIN
   68       DOUBLE ARRAY NUMBER2(*)=BITPATTERN;
   69       NUMBER:=REAL(NUMBER2);
   70     END;
   71     <<>>
   72     <<>>
   73     PROCEDURE DBLETOSTRING(NUMBER,BITPATTERN);
   74     REAL NUMBER;
   75     BYTE ARRAY BITPATTERN;
   76     BEGIN
   77       DOUBLE NUMBER2;
   78       BYTE ARRAY PATTERN(*)=NUMBER2;
   79       NUMBER2:=FIXT(NUMBER);
   80       MOVE BITPATTERN(0):=PATTERN(0),(4);
   81       BITPATTERN(-1):=4;
   82     END;
   83     <<>>
   84     <<>>
   85     PROCEDURE STRINGTOREAL(BITPATTERN,NUMBER);
   86     BYTE ARRAY BITPATTERN;
   87     REAL NUMBER;
   88     BEGIN
   89       REAL ARRAY NUMBER2(*)=BITPATTERN;
   90       NUMBER:=NUMBER2;
   91     END;
   92     <<>>
   93     <<>>
   94     PROCEDURE REALTOSTRING(NUMBER,BITPATTERN);
   95     REAL NUMBER;
   96     BYTE ARRAY BITPATTERN;
   97     BEGIN
   98       REAL NUMBER2;
   99       BYTE ARRAY PATTERN(*)=NUMBER2;
  100       NUMBER2:=NUMBER;
  101       MOVE BITPATTERN(0):=PATTERN(0),(4);
  102       BITPATTERN(-1):=4;
  103     END;
  104     <<>>
  105     <<>>
  106     PROCEDURE STRINGTOLONG(BITPATTERN,NUMBER);
  107     BYTE ARRAY BITPATTERN;
  108     LONG NUMBER;
  109     BEGIN
  110       LONG ARRAY NUMBER2(*)=BITPATTERN;
  111       NUMBER:=NUMBER2;
  112     END;
  113     <<>>
  114     <<>>
  115     PROCEDURE LONGTOSTRING(NUMBER,BITPATTERN);
  116     LONG NUMBER;
  117     BYTE ARRAY BITPATTERN;
  118     BEGIN
  119       BYTE ARRAY PATTERN(*)=NUMBER;
  120       MOVE BITPATTERN(0):=PATTERN(0),(8);
  121       BITPATTERN(-1):=8;
  122     END;
  123     <<>>
  124     <<>>
  125     PROCEDURE BYTE2INT(BITPATTERN,NUMBER);
  126     BYTE BITPATTERN;
  127     INTEGER NUMBER;
  128     BEGIN
  129       NUMBER:=INTEGER(BITPATTERN);
  130     END;
  131     <<>>
  132     <<>>
  133     PROCEDURE STRING2INT(BITPATTERN,NUMBER);
  134     BYTE ARRAY BITPATTERN;
  135     INTEGER NUMBER;
  136     BEGIN
  137       INTEGER ARRAY NUMBER2(*)=BITPATTERN;
  138       NUMBER:=INTEGER(NUMBER2(0));
  139     END;
  140     <<>>
  141     <<>>
  142     PROCEDURE INT2STRING(NUMBER,BITPATTERN);
  143     INTEGER NUMBER;
  144     BYTE ARRAY BITPATTERN;
  145     BEGIN
  146       BYTE ARRAY NUMBER2(*)=NUMBER;
  147       MOVE BITPATTERN(0):=NUMBER2(0),(2);
  148       BITPATTERN(-1):=2;
  149     END;
  150     <<>>
  151     <<>>
  152     PROCEDURE IEEEREAL(BITPAT1,BITPAT2,SFORMAT,DFORMAT);
  153     INTEGER SFORMAT,DFORMAT;
  154     BYTE ARRAY BITPAT1,BITPAT2;
  155     BEGIN
  156       INTRINSIC HPFPCONVERT;
  157       HPFPCONVERT(BITPAT1,BITPAT2,SFORMAT,DFORMAT);
  158     END;
  159     <<>>
  160     <<>>
  161     PROCEDURE MOVESTR2LOGICAL(BITPATTERN,BUFFER);
  162     BYTE ARRAY BITPATTERN;
  163     LOGICAL ARRAY BUFFER;
  164     BEGIN
  165       LOGICAL ARRAY BUFF2(*)=BITPATTERN(0);
  166       MOVE BUFFER(0):=BUFF2(0),(BITPATTERN(-1));
  167     END;
  168     <<>>
  169     <<>>
  170     END.
/

=======================================

ATOM RSS1 RSS2