-- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
-- All rights reserved.
-- Copyright (C) 2007-2010, Gabriel Dos Reis.
-- All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are
-- met:
--
--     - Redistributions of source code must retain the above copyright
--       notice, this list of conditions and the following disclaimer.
--
--     - Redistributions in binary form must reproduce the above copyright
--       notice, this list of conditions and the following disclaimer in
--       the documentation and/or other materials provided with the
--       distribution.
--
--     - Neither the name of The Numerical ALgorithms Group Ltd. nor the
--       names of its contributors may be used to endorse or promote products
--       derived from this software without specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


import ht_-util
import c_-util
namespace BOOT

++
$newConstructorList := nil

++ true if we should rebuild local databases.
$createLocalLibDb := true



bcFinish(name,arg,:args) == bcGen bcMkFunction(name,arg,args)

bcMkFunction(name,arg,args) ==
  args := [x for x in args | x]
  strconc(name,'"(",arg,strconc/[strconc('",", x) for x in args],'")")

bcString2HyString2 s ==
  string? s and stringChar(s,0) = char "_""  =>
    len := #s
    strconc('"\_"", subString(s, 1, len-2), '"\_"")
  s

bcString2HyString s == s

bcFindString(s,i,n,char) ==  or/[j for j in i..n | s.j = char]

bcGen command ==
  htInitPage('"Basic Command",nil)
  string :=
    #command < 50 => strconc('"{\centerline{\tt ",command,'" }}")
    strconc('"{\tt ",command,'" }")
  htMakePage [
     '(text
        "{Here is the AXIOM command you could have issued to compute this result:}"
            "\vspace{2}\newline "),
      ['text,:string]]
  htMakeDoitButton('"Do It", command)
  htShowPage()

-- bcGen for axiom - nag link
linkGen command ==
  htInitPage('"AXIOM-Nag Link Command",nil)
  string := 
    #command < 50 => strconc('"{\centerline{ ",command,'" }}")
    command
  htMakePage [
     '(text 
        "\centerline{{\em Here is the AXIOM command}}"
          "\centerline{{\em you could have issued to compute this result:}}"
            "\vspace{2}\newline "),
      ['text,:string]]
  htMakeDoitButton('"Do It", command)
  htShowPage()

bcOptional s ==
  s = '"" => '"2"
  s

bcvspace() == bcHt '"\vspace{1}\newline "

bcString2WordList s == fn(s,0,maxIndex s) where
  fn(s,i,n) ==
    i > n => nil
    k := or/[j for j in i..n | s.j ~= char " "]
    not integer? k => nil
    l := bcFindString(s,k + 1,n,char " ")
    not integer? l => [subString(s,k)]
    [subString(s,k,l-k),:fn(s,l + 1,n)]


bcwords2liststring u ==
  null u => nil
  strconc('"[",first u,fn rest u) where
    fn(u) ==
      null u => '"]"
      strconc('", ",first u,fn rest u)

bcVectorGen vec == bcwords2liststring vec

bcError string ==
  sayBrightlyNT '"NOTE: "
  sayBrightly string

bcDrawIt(ind,a,b) == strconc(ind,'"=",a,'"..",b)

bcNotReady htPage ==
  htInitPage('"Basic Command",nil)
  htMakePage '(
     (text .
        "{\centerline{\em This facility will soon be available}}"))
  htShowPage()

htStringPad(n,w) ==
  s := STRINGIMAGE n
  ws := #s
  strconc('"\space{",STRINGIMAGE (w - ws + 1),'"}",s)

stringList2String x ==
  null x => '"()"
  strconc('"(",first x,strconc/[strconc('",",y) for y in rest x],'")")

htMkName(s,n) == strconc(s,STRINGIMAGE n)