Patch title: Release 95 bulk changes
Abstract:
File: /pliant/language/type/text/cstr.pli
Key:
    Removed line
    Added line
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

scope "/pliant/language/" "/pliant/install/"
module "/pliant/install/ring1.pli"

constant maxlen 2^20


public
  type CStr
    field Address characters

method sz len -> l
  arg CStr sz ; arg Int l
  var Address z := memory_search sz:characters maxlen "[0]":characters 1
  l := (cast z Int)-(cast sz:characters Int)

function 'cast Str' sz -> s
  arg CStr sz ; arg Str s
  implicit
  s set sz:characters sz:len false
((the_function 'cast Str' CStr -> Str) arg 1) maps := 1

export '. len' 'cast Str'


type AllocatedCStr
  field Address characters

method sz len -> l
  arg AllocatedCStr sz ; arg Int l
  var Address z := memory_search sz:characters maxlen "[0]":characters 1
  l := (cast z Int)-(cast sz:characters Int)

function build  sz
  arg_w AllocatedCStr sz
  sz characters := null

function destroy sz
  arg_w AllocatedCStr sz
  memory_free sz:characters

function copy src dest
  arg AllocatedCStr src ; arg_w AllocatedCStr dest
  memory_free dest:characters
  var Int l := src len
  dest characters := memory_allocate l+1 addressof:dest
  memory_copy src:characters dest:characters l+1

function 'cast AllocatedCStr' s -> sz
  arg Str s ; arg AllocatedCStr sz
  implicit
  memory_free sz:characters
  var Int l := s len
  sz characters := memory_allocate l+1 addressof:sz
  memory_copy s:characters sz:characters l
  memory_clear (sz:characters translate Byte l) 1

function 'cast CStr' s1 -> s2
  arg AllocatedCStr s1 ; arg CStr s2
  implicit
  s2 characters := s1 characters
# now we specify that the CStr string is valid only as long as the
# AllocatedCStr is not changed, since it maps it's content
((the_function 'cast CStr' AllocatedCStr -> CStr) arg 1) maps := 1

export 'cast AllocatedCStr' 'cast CStr'