view ppc/test/record.p @ 0:bfdcc3820b32

Basis
author Mike Spivey <mike@cs.ox.ac.uk>
date Thu, 05 Oct 2017 08:04:15 +0100
parents
children
line wrap: on
line source
type string = array 10 of char;

type rec = record name: string; age: integer end;

var 
  db: array 20 of rec;
  N: integer;

proc equal(x, y: string): boolean;
  var i: integer;
begin
  i := 0;
  while i < 10 do
    if x[i] <> y[i] then
      return false
    end;
    i := i+1
  end;
  return true
end;

proc store(n: string; a: integer);
begin
  db[N].name := n;
  db[N].age := a;
  N := N+1
end;

proc recall(n: string): integer;
  var i: integer;
begin
  i := 0;
  while i < N do
    if equal(db[i].name, n) then
      return db[i].age
    end;
    i := i+1
  end;
  return 999
end;

begin
  N := 0;

  store("bill      ", 23);
  store("george    ", 34);

  print_num(recall("george    ")); newline();
  print_num(recall("fred      ")); newline()
end.

(*<<
34
999
>>*)

(*[[
MODULE Main 0 0
IMPORT Lib 0
ENDHDR

PROC _equal 4 0 0
!   i := 0;
CONST 0
STLW -4
!   while i < 10 do
JUMP L6
LABEL L5
!     if x[i] <> y[i] then
LDLW 16
LDLW -4
LDIC
LDLW 20
LDLW -4
LDIC
JEQ L10
!       return false
CONST 0
RETURNW
LABEL L10
!     i := i+1
LDLW -4
CONST 1
PLUS
STLW -4
LABEL L6
LDLW -4
CONST 10
JLT L5
!   return true
CONST 1
RETURNW
END

PROC _store 0 0 0
!   db[N].name := n;
GLOBAL _db
LDGW _N
CONST 16
TIMES
OFFSET
LDLW 16
CONST 10
FIXCOPY
!   db[N].age := a;
LDLW 20
GLOBAL _db
LDGW _N
CONST 16
TIMES
OFFSET
STNW 12
!   N := N+1
LDGW _N
CONST 1
PLUS
STGW _N
RETURN
END

PROC _recall 4 0 0
!   i := 0;
CONST 0
STLW -4
!   while i < N do
JUMP L12
LABEL L11
!     if equal(db[i].name, n) then
LDLW 16
GLOBAL _db
LDLW -4
CONST 16
TIMES
OFFSET
CONST 0
GLOBAL _equal
PCALLW 2
JNEQZ L14
JUMP L16
LABEL L14
!       return db[i].age
GLOBAL _db
LDLW -4
CONST 16
TIMES
OFFSET
LDNW 12
RETURNW
LABEL L16
!     i := i+1
LDLW -4
CONST 1
PLUS
STLW -4
LABEL L12
LDLW -4
LDGW _N
JLT L11
!   return 999
CONST 999
RETURNW
END

PROC MAIN 0 0 0
!   N := 0;
CONST 0
STGW _N
!   store("bill      ", 23);
CONST 23
GLOBAL g1
CONST 0
GLOBAL _store
PCALL 2
!   store("george    ", 34);
CONST 34
GLOBAL g2
CONST 0
GLOBAL _store
PCALL 2
!   print_num(recall("george    ")); newline();
GLOBAL g3
CONST 0
GLOBAL _recall
PCALLW 1
CONST 0
GLOBAL lib.print_num
PCALL 1
CONST 0
GLOBAL lib.newline
PCALL 0
!   print_num(recall("fred      ")); newline()
GLOBAL g4
CONST 0
GLOBAL _recall
PCALLW 1
CONST 0
GLOBAL lib.print_num
PCALL 1
CONST 0
GLOBAL lib.newline
PCALL 0
RETURN
END

GLOVAR _db 320
GLOVAR _N 4
! String "bill      "
DEFINE g1
STRING 62696C6C20202020202000

! String "george    "
DEFINE g2
STRING 67656F7267652020202000

! String "george    "
DEFINE g3
STRING 67656F7267652020202000

! String "fred      "
DEFINE g4
STRING 6672656420202020202000

! End
]]*)