Patch title: Release 93 bulk changes
Abstract:
File: /language/compiler/expression/expression2.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
# Copyright (C) 1999  Patrice Ossona de Mendez  pom@ehess.fr
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


function pack e c
  arg Expression e ; arg_rw Address c
  if (entry_type e:value)=Ident and (e:value map Str):len<25
    var Int l := (e:value map Str) len
    c map Int := l ; c := c translate Int 1
    memory_copy (e:value map Str):characters c l ; c := c tr
  else
    c map Address := e value ; entry_lock e:value ; c := c t
  ListingPosition build_instance c
  c map ListingPosition := e position ; c := c translate Lis
  c map Int := e size ; c := c translate Int 1
  for (var Int i) 0 e:size-1
    pack e:i c
 
function unpack c -> e
  arg_rw Address c ; arg Link:Expression e
  e :> new Expression
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
# Copyright (C) 1999  Patrice Ossona de Mendez  pom@ehess.fr
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


function pack e c
  arg Expression e ; arg_rw Address c
  if (entry_type e:value)=Ident and (e:value map Str):len<25
    var Int l := (e:value map Str) len
    c map Int := l ; c := c translate Int 1
    memory_copy (e:value map Str):characters c l ; c := c tr
  else
    c map Address := e value ; entry_lock e:value ; c := c t
  ListingPosition build_instance c
  c map ListingPosition := e position ; c := c translate Lis
  c map Int := e size ; c := c translate Int 1
  for (var Int i) 0 e:size-1
    pack e:i c
 
function unpack c -> e
  arg_rw Address c ; arg Link:Expression e
  e :> new Expression
  if (c map Int)<256
  if (c map Int)>=0 and (c map Int)<256
    var Int l := c map Int ; c := c translate Int 1
    (var Str s) set c l false
    e value := entry_new Ident
    e:value map Str := s ; c := c translate Byte l
  else
    e value := c map Address ; c := c translate Address 1
  e position := c map ListingPosition ; c := c translate Lis
  e 'size :=' (c map Int) ; c := c translate Int 1
  for (var Int i) 0 e:size-1
    e:arguments i := addressof unpack:c 
 
function drop c
  arg_rw Address c
    var Int l := c map Int ; c := c translate Int 1
    (var Str s) set c l false
    e value := entry_new Ident
    e:value map Str := s ; c := c translate Byte l
  else
    e value := c map Address ; c := c translate Address 1
  e position := c map ListingPosition ; c := c translate Lis
  e 'size :=' (c map Int) ; c := c translate Int 1
  for (var Int i) 0 e:size-1
    e:arguments i := addressof unpack:c 
 
function drop c
  arg_rw Address c
  if (c map Int)<256
  if (c map Int)>=0 and (c map Int)<256
    var Int l := c map Int ; c := (c translate Int 1) transl
  else
    entry_unlock (c map Address) ; c := c translate Address 
  ListingPosition destroy_instance c ; c := c translate List
  l := c map Int ; c := c translate Int 1
  for (var Int i) 0 l-1
    drop c
 
type PackedExpression
  field Address buffer <- null


method e add_subexpression sub
  arg_rw Expression e ; arg Expression sub
  var Int i := e size
  e 'size :=' i+1
    var Int l := c map Int ; c := (c translate Int 1) transl
  else
    entry_unlock (c map Address) ; c := c translate Address 
  ListingPosition destroy_instance c ; c := c translate List
  l := c map Int ; c := c translate Int 1
  for (var Int i) 0 l-1
    drop c
 
type PackedExpression
  field Address buffer <- null


method e add_subexpression sub
  arg_rw Expression e ; arg Expression sub
  var Int i := e size
  e 'size :=' i+1
  e:arguments i := addressof:sub
  e:arguments i := addressof sub


function track_expression template ident expr e -> ok
  arg Expression template; arg Str ident; arg_rw Expression 
  if template:ident=ident
    e :> expr
    return true
  else
    check template:size=expr:size
    for (var Int i) 0 template:size-1
      if (track_expression template:i ident expr:i e)
        return true
    return false
  
export track_expression


function track_expression template ident expr e -> ok
  arg Expression template; arg Str ident; arg_rw Expression 
  if template:ident=ident
    e :> expr
    return true
  else
    check template:size=expr:size
    for (var Int i) 0 template:size-1
      if (track_expression template:i ident expr:i e)
        return true
    return false
  
export track_expression