DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦64a8c2082⟧ TextFile

    Length: 9984 (0x2700)
    Types: TextFile
    Names: »readgeottx«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦bf33d74f6⟧ »iogeofile« 
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦bf33d74f6⟧ »iogeofile« 
            └─⟦this⟧ 

TextFile



;       read_geo_t_tx         * page 1   22 05 78, 14.33;  

;  read_geo_t
;  **********

if listing.yes
char 10 12 10

read_geo_t=set 1 disc

read_geo_t = algol

external long procedure read_geo_t
__________________________________
_        (kind, z, typedec);  

value     kind;  
zone            z;  
boolean            typedec;  
integer   kind;  

comment

read geo t    (return)            long
the value of the input. angles are mult by max long/pi.
distances are in units of '- 6 m. max dec are defaulted

kind          (call)              integer
the type of the input 
1 = geotype
2 = station number  
3 = simple number
4 = timedate or cmt word
5 = simple number
the termination m_ will always switch to kind=1 except for kind=5

z             (call and return)   zone
the zone used for char input and buffering

typedec       (return)            boolean
descriptor of the input

kind =1 : (type shift 6) + number of decimals input

nr       type                    termnt   max dec

1     degr min sec sexagesimal      sx       6
2     degr min sexagesimal          nt       8
3     degr nonagesimal              dg      10

4     hours min sec                 tm       6

5     degr min sec centesimal       cc       6
6     degr min centesimal           eu       8
7     degr centesimal (grads)       gr      10

8     meters  (>=1000 km)           m_       6
9     meters  (>=1 km and <1000 km) m_       6
10    meters  (< 1km)               m_       6
type 9 and 10 are recorded at input as type 8. 
the user may change the type after input;  

\f



comment read_geo_t_tx         * page 2   22 05 78, 14.33
0 1 2 3 4 5 6 7 8 9 ;  

comment
kind = 2 : type packed as a short integer

nr            type

1          landsnummer
2          station number
2          negative number
3          neg number term by x
4          neg number term by z
5          neg number term by anything else incl decpt.
>=8 shift 6 geotype, mtr=true

kind = 3 : decimals packed as a short integer
kind = 4 : true when do (=ditto) is read instead of a number
kind = 5 : decimals packed as a short integer

own variables used by read_geo_t
________________________________

tchar         (return)            integer
the value of the terminator char.

in_class      (call and return)   integer
return_value the class of the terminator char.

udt           (call)              integer
the terminator def. for kind=1, when illegal termination is met.
a system alarm is generated if udt is not a legal terminator  

mtr           (return)            boolean
mtr is false except when the terminator m is input

not_eof       (return)            boolean
not_eof is true except when em is input

read_status   (call and return)   integer
read_status >= 0 : number errors give system9 alarm
read_status bit 0:0 = 1 : number errors are counted in
_                         the 22 last bits of read_status
read_status bit 0:1 = 3 : number errors are counted and
_                         report on number on curr. output;  

\f



comment read_geo_t_tx         * page 3   22 05 78, 14.33
0 1 2 3 4 5 6 7 8 9 ;  

comment

_    decision table for input, kind = 1, 3, 4, 5

_____      1     2     3     4     5     6     7     8     9
state    start after after after after after after after after
_____          sign  point si+sp pt+sp digit dg+pt dg+sp d+p+sp

class                    action/next state

2 digit   1/6   1/6   1/7   1/6   1/7   1/6   1/7   1/6   1/7
3 sign    2/2   2/2   2/2   2/2   2/2   5/11  5/11  5/11  5/11
4 point   3/3   3/3   2/3   3/3   2/3   3/7   5/11   3/7   5/11
5 space   5/1   5/4   5/5   2/1   2/1   5/8   5/9   5/10  5/10
6 others  4/1   4/1   4/1   4/1   4/1   4/10  4/10  4/10  4/10

state 10 => normal exit
state 11 => exit after syntax error

action         nr
incl dig       1
rec sign       2  (incl del point rec)
rec point      3
char test      4
no action      5

input class numbers are decreased by 2 before being used;  

\f



comment read_geo_t_tx         * page 4   22 05 78, 14.33
0 1 2 3 4 5 6 7 8 9 ;  

begin

long       number;  

integer    nr_type, char, last_char, digits, dec, 
_          class, state, action, index, p, r, t;  

boolean    cont, neg, decpt, dochar, too_many_digits;  

_

prvers := 22 05 78  14 33;  

if kind < 1 or kind > 5 then
system(9)alarm_exit:(kind, <:<10>geokind:>);  

digits     :=
dec        :=
char       :=   
class      := 0;  

state      := if noteof then 1 else 10;  

number   := 0;  

too_many_digits :=
decpt  :=
neg    := 
dochar := false;  

\f



comment read_geo_t_tx         * page 5   22 05 78, 14.33
0 1 2 3 4 5 6 7 8 9 ;  

if kind <> 2 then
begin

  for last_char := char while state <= 9 do   
  begin comment reader loop;  

    class := read_char(z, char);  
    index := case class-1 of
    (0, 1, 2, 4, 4, if char<>32 then 4 else 3, 4) * 9 + state;  

    action := case index of (
    <* kind = 1, 3, 4, or 5 *>
    _ 1,  1,  1,  1,  1,  1,  1,  1,  1,  
    _ 2,  2,  2,  2,  2,  5,  5,  5,  5,  
    _ 3,  3,  2,  3,  2,  3,  5,  3,  5, 
    _ 5,  5,  5,  2,  2,  5,  5,  5,  5,  
    _ 4,  4,  4,  4,  4,  4,  4,  4,  4);  

    state := case index of (
    <* kind = 1, 3, 4 or 5 *>
    _ 6,  6,  7,  6,  7,  6,  7,  6,  7,  
    _ 2,  2,  2,  2,  2, 11, 11, 11, 11,  
    _ 3,  3,  3,  3,  3,  7, 11,  7, 11,  
    _ 1,  4,  5,  1,  1,  8,  9, 10, 10,  
    _ 1,  1,  1,  1,  1, 10, 10, 10, 10);  

    comment  test_output on
    if em then
    write(out, nl, 0, <:ch, cl, ix, ac, st:>, 
    _     char, class, index, action, state);  

\f



comment read_geo_t_tx         * page 6   22 05 78, 14.33
0 1 2 3 4 5 6 7 8 9 ;  

    case action of
    begin

      if digits <= 13 then
      begin comment case 1, incl digits;  
        action1:
        number := (((number shift 2) + number) shift 1) 
        + char - 48;  
        digits := digits+1;  if decpt then dec := dec+1;  
      end case 1  
      else too_many_digits := true;  

      begin comment case 2, sign;  
        neg    := char = 45;  
        dec_pt := char = 46;  
      end case 2;  

      comment case 3, decpoint;  
      dec_pt := true;  

      begin comment case 4, char test;  
        case class-4 of
        begin
          comment sp, no action;  ;  

          if kind=4 then
          begin comment test do;  
            dochar := last_char=100 and char=111;  
            if dochar then state := 10;  
          end;  

          begin comment test * ;  
            if char = 42 then
            _  for t := char while char<>59 and char<>25 do
            _  _   class := read_char(z, char);  
            not_eof := char <> 25;  
          end;  

          comment test em;  not_eof := char <> 25;  
        end;  

        if -, noteof then state := 10 else
        if state = 1 then 
        decpt :=
        neg   := false;  
      end case 4, char test;  

      comment case 5, no action;  ;  

    end cases;  

    comment  test_output on
    if em then write(out, <<-dd>, nr_type, state, nl, 1);  

  end reader loop;  

\f



comment read_geo_t_tx         * page 7   22 05 78, 14.33
0 1 2 3 4 5 6 7 8 9 ;  

  mtr := char = 109;  
  if kind = 5 then kind := 3
  else
  if mtr then kind := 1;  
  last_char := char;  

  if digits > 0  or  do_char then
  begin

    case kind of
    begin

      begin comment kind=1, geotype;  

        if too_many_digits then
        write(out, nl, 1, <:* +++ too many digits :>, number, 
        _     <:,  term. : :>, char, <: = :>, false add char, 1,  
        _     <:  ;<10>:>);  

        for r := 0, r+1 while r=1 do
        begin
          if r=1 then char := udt;  
          for t := 1 step 1 until 8 do
          if char=(case t of
          <* s,   n,   d,   t,  c,   e,   g,   m *>
          (115, 110, 100, 116, 99, 101, 103, 109)) then
          begin  

            typedec := ((false add t) shift 6) add dec;  
            if neg then number := -number;  
            number := conv_t_geo(number, type_dec);  
            t := r := 100;  
          end known or defaulted terminator;  

          if r = 1 then
          begin
            comment emergency for undefined terminator;  

            if read_status >= 0 then 
            system(9, last_char, <:<10>imp_term:>)  
            else
            begin
              if read_status shift 1 < 0 then
              write(out, nl, 1, <:* impossible term., nmb= :>, 
              number, <:, _term_=_:>, last_char, <:_=_:>, 
              false add last_char, 1, <:  ;<10>:>);  
              read_status := read_status + 1;  
            end;  
          end;  

          mtr := char = 109;  

        end r-loop;  

      end geotype;  

\f



comment read_geo_t_tx         * page 8   22 05 78, 14.33
0 1 2 3 4 5 6 7 8 9 ;  

      comment kind=2 is placed last in procedure;  ;  

      begin comment kind=3 or 5, simple number or st reading;  
        if neg then number := - number;  
        typedec := false add dec;  
      end;  

      begin comment kind=4, cmt or time date;  
        if neg then number := -number;  
        typedec := dochar;  
        if dochar then read_char(z, last_char);  
      end;  

    end kind cases;  

  end
  else
  begin
    type_dec  := false;  
    class     := 8;  
    last_char := 25;  
  end;  

  read_geo_t := number;  
  t_char     := last_char;  
  in_class   := class;  
  repeat_char(z);  

end
else
begin comment kind=2;  
  read_geo_t := read_nmb(z, nr_type);  
  type_dec   := false add nr_type;  
end;  

end read_geo_t;  

end

if warning.yes
(mode 0.yes
message read_geo_t not ok
lookup read_geo_t)

end

finis

▶EOF◀