Patch title: Release 96 bulk changes
Abstract:
File: /pliant/language/data/string_generate.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/ring3.pli"

method data 'default to string' t -> s
  arg Universal data ; arg Type t ; arg Str s
  var Str text := ""
  for (var Int i) 0 t:nb_fields-1
    var Pointer:TypeField f :> t field i
    text += (shunt i=0 "" " ")+f:name+" "+(to_string (addressof:data translate Byte f:offset) f:type "")
  s := string text

function from_string u s o may_skip skiped offset f -> status
  arg_w Universal u ; arg Str s o ; arg CBool may_skip ; arg_w Int skiped offset ; arg Function f ; arg Status status
  indirect
  
method data 'default from string' string may_skip skiped offset t -> status
  arg_w Universal data ; arg Str string ; arg CBool may_skip ; arg_w Int skiped offset ; arg Type t ; arg Status status
  var Pointer:Function fun :> Str get_generic_method (the_function '. from string' Universal Str Str CBool Int Int -> Status):generic_index
  status := from_string (var Str s) string "" may_skip skiped offset fun
  if status=failure
    return
  for (var Int i) 0 t:nb_fields-1
    var Pointer:TypeField f :> t field i
    var Pointer:Function fun :> t get_generic_method (the_function '. from string' Universal Str Str CBool Int Int -> Status):generic_index
    var Int p := s option_position f:name -1
    if p<>(-1)
      p += f:name:len
      while p<s:len and (s:p=" ":0 or s:p="[tab]":0)
        p += 1
      var Pointer:Function fun :> f:type get_generic_method (the_function '. from string' Universal Str Str CBool Int Int -> Status):generic_index
      if addressof:fun<>addressof:(the_function '. from string' Universal Str Str CBool Int Int -> Status)
        from_string ((addressof:data translate Byte f:offset) map Universal) (s p s:len) "" false (var Int skiped2) (var Int offset2) fun

meta generate_string_functions e
  for (var Int i) 0 e:size-1
    if (e:i constant Type)=null
      return
  for (var Int i) 0 e:size-1
    var Pointer:Type t :> (e:i constant Type) map Type
    named_expression model
      method data 'to string' options -> string
        arg t data ; arg Str options ; arg Str string
        string := data 'default to string' t
      method data 'from string' string options may_skip skiped offset -> status
        arg_w t data ; arg Str string options ; arg CBool may_skip ; arg_w Int skiped offset ; arg Status status
        status := data 'default from string' string may_skip skiped offset t
    constant from_index (the_function '. from string' Universal Str Str CBool Int Int -> Status):generic_index
    var Pointer:Function from :> t get_generic_method from_index
    constant to_index (the_function '. to string' Universal Str  -> Str):generic_index
    var Pointer:Function to :> t get_generic_method to_index
    if addressof:from=addressof:(the_function '. from string' Universal Str Str CBool Int Int -> Status)
      if addressof:to=addressof:(the_function '. to string' Universal Str -> Str)
        var Link:Expression ei :> expression duplicate model substitute t e:i near e:i
        ei compile ?
        e suckup ei
  e set_void_result

export generate_string_functions '. default to string' '. default from string'