Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/type/text/str8.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.

module "/pliant/install/ring2.pli"
module "str32.pli"


type Str8
  field Str content


method s characters -> adr
  arg Str8 s ; arg Address adr
  adr := s:content characters


method s len -> l
  arg Str8 s ; arg Int l
  l := s:content len


method s set adr len allocated
  arg_rw Str8 s ; arg Address adr ; arg Int len ; arg CBool allocated
  s:content set adr len allocated


method s '' i -> c
  arg Str8 s ; arg Int i ; arg_C Char c
  c :> s:content i
# ((the_function '' Str8 Int -> Char) arg 2) maps := 1

method s '' i j -> sub
  arg Str8 s ; arg Int i j ; arg Str8 sub
  check i>=0 and j>=0
  var Int l := min j s:len-i
  sub set (s:characters translate Char i) l false
((the_function '' Str8 Int Int -> Str8) arg 3) maps := 1


function 'cast Str' s8 -> s
  arg Str8 s8 ; arg Str s
  extension
  if default_charset_is_utf8
    var Int l := s8:content len
    (var Str32 s32) set (memory_allocate l*Char32:size addressof:s32) l true
    for (var Int i) 0 l-1
      s32 i := character32 s8:content:i:number
    s := s32
  else
    s := s8 content


function 'cast Str8' s -> s8
  arg Str s ; arg Str8 s8
  reduction
  if default_charset_is_utf8
    var Str32 s32 := s
    var Int l := s32 len
    s8:content set (memory_allocate l*Char:size addressof:s8) l true
    for (var Int i) 0 l-1
      s8:content i := character (s32:i:number .and. 255)
  else
    s8 content := s


method data 'to string' options -> string
  arg Str8 data ; arg Str options ; arg Str string
  if options="raw" or options="db"
    string := cast data Str
  else
    string := string (cast data Str)


method data 'from string' string options may_skip skiped offset -> status
  arg_w Str8 data ; arg Str string options ; arg CBool may_skip ; arg_w Int skiped offset ; arg Status status
  if options="raw" or options="db"
    data := cast string Str8
    skiped := 0
    offset := string len
    return success
  else
    var Link:Str s :> new Str
    status := s 'from string' string options may_skip skiped offset
    if status=success
      data := cast s Str8


function straight_to_Str s8 -> s
  arg Str8 s8 ; arg Str s
  s := s8 content

function straight_to_Str8 s -> s8
  arg Str s ; arg Str8 s8
  s8 content := s


export Str8 '. characters' '. len' '' '. set'
export 'cast Str' 'cast Str8'
export straight_to_Str straight_to_Str8