Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/type/number/intn.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# 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 


method data 'to string' options -> string
  arg Intn data ; arg Str options ; arg Str string
  if (data:status .and. undefinedn)<>0
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# 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 


method data 'to string' options -> string
  arg Intn data ; arg Str options ; arg Str string
  if (data:status .and. undefinedn)<>0
    return (shunt options="db" "" "?")
    return (shunt options="db" or options="raw" "" "?")
  string := to_string data
  if options:len<>0 and { var Str sep := options option "sep
    var Int newlen := string:len+(string:len-1)\3
    var Address buf := memory_allocate newlen null
    var Address stop := string:characters translate Char -1
    var Address src := stop translate Char string:len
    var Address dest := buf translate Char newlen-1
    var Int r := 3
    while src<>stop
      if r=0
        dest map Char := sep 0
        dest := dest translate Byte -1
        r := 3
      dest map Char := src map Char
      src := src translate Byte -1
      dest := dest translate Byte -1
      r := r-1
    string set buf newlen true

method data 'from string' string options may_skip skiped off
  arg_w Intn data ; arg Str string options ; arg CBool may_s
  var Int stop := string:len-1
  if not may_skip and stop<>(-1)
    stop := 0
  for (var Int i) 0 stop
    var Int c0 := string:i number
    if c0>="0":0:number and c0<="9":0:number or c0="?":0:num
      skiped := i
      if c0="?":0:number
        data := undefined
        offset := i+1
        return success
      data := 0 ; var Int sign := 1
      if c0="-":0:number
        sign := -1
        i := i+1
      while i<string:len and string:i:number>="0":0:number a
        data := data*10 + string:i:number-"0":0:number
        i := i+1
      data := data * sign
      offset := i
      return success
    eif c0="?":0:number
      data := undefined
      skiped := i
      offset := i+1
      return success
  data := undefined
  string := to_string data
  if options:len<>0 and { var Str sep := options option "sep
    var Int newlen := string:len+(string:len-1)\3
    var Address buf := memory_allocate newlen null
    var Address stop := string:characters translate Char -1
    var Address src := stop translate Char string:len
    var Address dest := buf translate Char newlen-1
    var Int r := 3
    while src<>stop
      if r=0
        dest map Char := sep 0
        dest := dest translate Byte -1
        r := 3
      dest map Char := src map Char
      src := src translate Byte -1
      dest := dest translate Byte -1
      r := r-1
    string set buf newlen true

method data 'from string' string options may_skip skiped off
  arg_w Intn data ; arg Str string options ; arg CBool may_s
  var Int stop := string:len-1
  if not may_skip and stop<>(-1)
    stop := 0
  for (var Int i) 0 stop
    var Int c0 := string:i number
    if c0>="0":0:number and c0<="9":0:number or c0="?":0:num
      skiped := i
      if c0="?":0:number
        data := undefined
        offset := i+1
        return success
      data := 0 ; var Int sign := 1
      if c0="-":0:number
        sign := -1
        i := i+1
      while i<string:len and string:i:number>="0":0:number a
        data := data*10 + string:i:number-"0":0:number
        i := i+1
      data := data * sign
      offset := i
      return success
    eif c0="?":0:number
      data := undefined
      skiped := i
      offset := i+1
      return success
  data := undefined
  status := failure
  status := shunt string="" and (options="db" or options="raw") success failure



alias 'please positive' positive
export 'please positive'



alias 'please positive' positive
export 'please positive'