home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / logo / powerlogo / logo-startup < prev    next >
Text File  |  1992-11-10  |  18KB  |  606 lines

  1.  
  2. ;  ***************************************************************
  3.  
  4. ( system 2 * 15 8192 )     ;  Set amount of memory reserved by LOGO.
  5.  
  6. ;  ***************************************************************
  7. ;  ***   Utilities
  8. ;  ***************************************************************
  9.  
  10. pr [ Initializing LOGO - Please Wait ]
  11.  
  12. ; *** say   speech
  13.  
  14. make "say [
  15.    procedure [ [ :s-text ] :s-optext [ :s-sh ] ]
  16.    make "s-sh gprop "startup-data "speak-handle
  17.    if memberp :s-sh filelist [ ]
  18.    [  make "s-sh open "SPEAK:
  19.       pprop "startup-data "speak-handle :s-sh ]
  20.    while [ not emptyp :s-optext ]
  21.    [  make "s-text se :s-text first :s-optext
  22.       make "s-optext bf :s-optext ]
  23.    fprint :s-sh :s-text ]
  24.  
  25.  
  26. ; *** ed    edit names
  27.  
  28. make "ed [
  29.    procedure [ [ :edit-names ] ]
  30.    if wordp :edit-names
  31.    [  if existp :edit-names [ ]
  32.       [  make :edit-names [ procedure [ ] ] ] ] [ ]
  33.    prosave gprop "startup-data "work-file :edit-names
  34.    if or = @0 findport "REXX
  35.          = @0 findport "QED1
  36.    [  doscommand se "C:ED gprop "startup-data "work-file
  37.       load gprop "startup-data "work-file ]
  38.    [  command "ToQED
  39.       ( intuition 6 @0 )
  40.       if emptyp :edit-names [ ]
  41.       [  command se "LoadQED gprop "startup-data "work-file ] ] ]
  42.  
  43.  
  44. ; *** edit  switch to editor.
  45.  
  46. make "edit [
  47.    procedure [ [ ] [ :edit-names ] ]
  48.    ed :edit-names ]
  49.  
  50. ; *** edf
  51.  
  52. make "edf [
  53.    procedure [ [ :file-name ] ]
  54.    if emptyp :file-name
  55.    [  make "file-name ( filerequest [ Edit File ] )
  56.       ( intuition 6 gprop "startup-data "screen ) ] [ ]
  57.    if emptyp :file-name [ ]
  58.    [  if or    = @0 findport "REXX
  59.                = @0 findport "QED1
  60.       [  doscommand se "C:ED :file-name
  61.          load :file-name ]
  62.       [  command "ToQED
  63.          ( intuition 6 @0 )
  64.          command se "LoadQED :file-name ] ] ]
  65.  
  66. ; *** from-editor
  67.  
  68. make "from-editor [
  69.    procedure [ [ ] [ :file-name ] ]
  70.    if emptyp :file-name [ ] [ load :file-name ]
  71.    ( intuition 6 getprop "startup-data "screen )
  72.    ( intuition 12 @0 )
  73.    ( intuition 11 @0 ) ]
  74.  
  75. ; *** Output list of all variable names.
  76.  
  77. make "all [
  78.    procedure [ ]
  79.    op se namelist burylist ]
  80.  
  81. ; *** Output list of names that contain procedures.
  82.  
  83. make "allprocs [
  84.    procedure [ ]
  85.    op filter-quick "procedurep se namelist burylist ]
  86.  
  87. ; *** Output list of names that contain something other than procedures.
  88.  
  89. make "allnames [
  90.    procedure [ ]
  91.    op filter-quick [ not procedurep ] se namelist burylist ]
  92.  
  93. ; *** Output list of unprotected names that do not contain procedures.
  94.  
  95. make "names [
  96.    procedure [ ]
  97.    op    filter-quick   [ not procedurep ]
  98.                         remove-quick   gprop "startup-data "keepers
  99.                                        namelist ]
  100.  
  101. ; *** Output list of unprotected names that contain procedures.
  102.  
  103. make "procs [
  104.    procedure [ ]
  105.    op    filter-quick   [ procedurep ]
  106.                         remove-quick   gprop "startup-data "keepers
  107.                                        namelist ]
  108.  
  109. ; *** Ignores the output from operations.
  110.  
  111. make "ignore [ procedure [ [ :x ] :y ] ]
  112.  
  113. ; *** See if variable name exists.
  114.  
  115. make "existp [
  116.    procedure [ [ :name ] ]
  117.    op or namep :name buriedp :name ]
  118.  
  119. ; *** Print out contents of lists verticaly.
  120.  
  121. make "vpr [
  122.    procedure [ [ :l ] [ :i ] ]
  123.    if emptyp :i [ make "i 0 ] [ ]
  124.    if listp :l
  125.    [  while [ not emptyp :l ]
  126.       [  ( vpr first :l + 1 :i )
  127.          make "l bf :l ]
  128.       pr [ ] ]
  129.    [  repeat :i [ type "\  ] 
  130.       pr :l ] ]
  131.  
  132. ; *** Print out contents of lists verticaly.
  133.  
  134. make "spr [
  135.    procedure [ [ :l ] ]
  136.    vpr sort "alphap :l ]
  137.  
  138. ; *** Print out procedure titles.
  139.  
  140. make "pots [
  141.    procedure [ [ :po-names ] ]
  142.    if listp :po-names
  143.    [  while [ not emptyp :po-names ]
  144.       [  pots first :po-names
  145.          make "po-names bf :po-names ] ]
  146.    [  type :po-names
  147.       if or namep :po-names buriedp :po-names
  148.       [  if procedurep :po-names
  149.          [  if emptyp item 2 thing :po-names
  150.             [  pr [ [ ] ] ]
  151.             [  ( type "[ first item 2 thing :po-names "] )
  152.                if < 1 count item 2 thing :po-names
  153.                [  show item 2 item 2 thing :po-names ]
  154.                [  pr [ ] ] ] ]
  155.          [  pr [ is not a procedure name. ] ] ]
  156.       [  pr [ is not a name. ] ] ] ]
  157.  
  158. ; *** flush
  159.  
  160. make "flush [
  161.    procedure [ ]
  162.    erase names
  163.    erase procs ]
  164.  
  165. ; *** reset
  166.  
  167. make "reset [
  168.    procedure [ [ ] [ ] [ :names-list ] ]
  169.    closeall
  170.    whenmessage [ host-port-demon ]
  171.    whenmenu [ comm-menu-demon getmenu ]
  172.    setmenu @0 :comm-menu
  173.    make "names-list remove-quick    se    :startup-names
  174.                                           "startup-data
  175.                                     se    namelist
  176.                                           burylist
  177.    unbury :names-list
  178.    erase :names-list
  179.    pprop "startup-data "keepers [ startup-data result1 result2 ]
  180.    recycle
  181.    toplevel ]
  182.  
  183. ; *** closeall
  184.  
  185. make "closeall [
  186.    procedure [ ]
  187.    while [ not emptyp filelist ] [ close first filelist ]
  188.    while [ not emptyp screenlist ] [ closescreen first screenlist ]
  189.    while [ not emptyp windowlist ] [ closewindow first windowlist ]
  190.    while [ not emptyp system 6 ] [ freemem first system 6 ]
  191.    pprop "startup-data "screen @0
  192.    remprop "startup-data "speak-handle
  193.    closepalette false
  194.    setmenu @0 [ ]
  195.    whenmenu [ ]
  196.    whenclose [ ]
  197.    whenmouse [ ]
  198.    whenchar [ ]
  199.    whenmessage [ ]
  200.    whenreply [ ] ]
  201.  
  202. ;  *** interupt
  203.  
  204. make "interrupt [
  205.    procedure [ ]
  206.    pr [ INTERRUPT type 'stop' to resume. ]
  207.    while [ true ]
  208.    [  catch "error [
  209.       while [ true ]
  210.       [  type "-->
  211.          while [ not linep ] [ sleep ]
  212.          run rl ] ]
  213.    poerror ] ]
  214.  
  215. ; *** Save names, their bindings, and their protection status to file.
  216.  
  217. make "prosave [ 
  218.    procedure [ [ :ps-file-name :ps-names ] [ ] [ :ps-buried :ps-file ] ] 
  219.    if listp :ps-names 
  220.    [  make "ps-buried filter-quick "buriedp :ps-names ] 
  221.    [  if buriedp :ps-names 
  222.       [  make "ps-buried se :ps-names [ ] ] 
  223.       [  make "ps-buried [ ] ] ] 
  224.    if emptyp :ps-buried 
  225.    [  save :ps-file-name :ps-names ] 
  226.    [  make "ps-file open :ps-file-name 
  227.       catch "error 
  228.       [  fprint :ps-file [ ] 
  229.          ( fshow :ps-file "unbury :ps-buried ) 
  230.          fprint :ps-file [ ] 
  231.          fprintout :ps-file :ps-names 
  232.          fprint :ps-file [ ] 
  233.          ( fshow :ps-file "bury :ps-buried ) 
  234.          fprint :ps-file [ ] ] 
  235.       close :ps-file
  236.       saveicon :ps-file-name ] ]
  237.  
  238.  
  239. ; SORT *****************************************************************
  240. ;    MergeSort an object according to a test criterion.
  241. ;  sort test object
  242.  
  243. make "sort [
  244.   procedure [ [ :_sr_cmp :_sr_obj ] [ ] [ :_sr_x :_sr_a :_sr_b ] ]
  245.   make "_sr_x count :_sr_obj
  246.   if <= :_sr_x 1  [ op :_sr_obj ]  [ ]
  247.   make "_sr_a sort :_sr_cmp items 1 / :_sr_x 2 :_sr_obj
  248.   make "_sr_b sort :_sr_cmp restof int / :_sr_x 2 :_sr_obj
  249.   make "_sr_x emptyof :_sr_obj
  250.   while [ true ] [
  251.     if run se :_sr_cmp [ first :_sr_a first :_sr_b ]
  252.        [ make "_sr_x fput first :_sr_a :_sr_x
  253.          make "_sr_a bf :_sr_a
  254.          if emptyp :_sr_a  [ op combine reverse :_sr_x :_sr_b ]  [ ] ]
  255.        [ make "_sr_x fput first :_sr_b :_sr_x
  256.          make "_sr_b bf :_sr_b
  257.          if emptyp :_sr_b  [ op combine reverse :_sr_x :_sr_a ]  [ ] ] ] ]
  258.  
  259. ; COMBINE **************************************************************
  260. ;    Contatenates using either `se' or `word' based on second input.
  261. ;  combine obj1 obj2
  262.  
  263. make "combine [
  264.   procedure [ [ :_cb_obj1 :_cb_obj2 ] ]
  265.   op if wordp :_cb_obj2
  266.     [ word :_cb_obj1 :_cb_obj2 ]
  267.     [ se :_cb_obj1 :_cb_obj2 ] ]
  268.  
  269. ; EMPTYOF **************************************************************
  270. ;    Returns empty word or empty list depending on the input object.
  271. ;    Note:  The input object must be a quoted word -- the name of the
  272. ;     object to be tested.  E.g., `emptyof "obj'; not `emptyof :obj'
  273. ;  emptyof word
  274.  
  275. make "emptyof [
  276.   procedure [ [ :_em_obj ] ]
  277.   op if listp :_em_obj  [ [ ] ]  [ " ]  ]
  278.  
  279. ; REVERSE **************************************************************
  280. ;    Reverse the order of the items in an object.
  281. ;  reverse object
  282.  
  283. make "reverse [
  284.   procedure [ [ :_rv_obj ] [ ] [ :_rv_res ] ]
  285.   make "_rv_res emptyof :_rv_obj
  286.   while [ not emptyp :_rv_obj ] [
  287.     make "_rv_res fput first :_rv_obj :_rv_res
  288.     make "_rv_obj bf :_rv_obj ]
  289.   op :_rv_res ]
  290.  
  291. ; FILTER ***************************************************************
  292. ;    Output object containing items satisfying the test.
  293. ;  filter test-func input-obj
  294.  
  295. make "filter [
  296.   procedure [ [ :_fl_func :_fl_obj ] ]
  297.   op reverse filter-quick :_fl_func :_fl_obj ]
  298.  
  299. ; *** Like 'filter', but does not preserve order. 
  300.  
  301. make "filter-quick [
  302.   procedure [ [ :_fl_func :_fl_obj ] [ ] [ :_fl_res ] ]
  303.   make "_fl_func se :_fl_func [ first :_fl_obj ]
  304.   make "_fl_res emptyof :_fl_obj
  305.   while [ not emptyp :_fl_obj ] [
  306.     if run :_fl_func
  307.        [ make "_fl_res fput first :_fl_obj :_fl_res ]
  308.        [ ]
  309.     make "_fl_obj bf :_fl_obj ]
  310.   op :_fl_res ]
  311.  
  312. ; REMOVE ***************************************************************
  313. ;    Output second object after removing any items that are also in the
  314. ;     first object.
  315. ;  remove remove-items input-obj
  316.  
  317. make "remove [
  318.   procedure [ [ :_rm_rmvs :_rm_obj ] ]
  319.   op reverse remove-quick :_rm_rmvs :_rm_obj ]
  320.  
  321. ; *** Like 'remove', but does not preserve order. 
  322.  
  323. make "remove-quick [
  324.   procedure [ [ :_rm_rmvs :_rm_obj ] [ ] [ :_rm_res ] ]
  325.   make "_rm_res emptyof :_rm_obj
  326.   while [ not emptyp :_rm_obj ] [
  327.     if memberp first :_rm_obj :_rm_rmvs
  328.        [ ]
  329.        [ make "_rm_res fput first :_rm_obj :_rm_res ]
  330.     make "_rm_obj bf :_rm_obj ]
  331.   op :_rm_res ]
  332.  
  333.  
  334. ;  ***************************************************************
  335. ;  ***   ARexx support
  336. ;  ***************************************************************
  337.  
  338. ;  This allows LOGO to act as a command host and function host for ARexx.
  339. ;  LOGO gets a list from the message and 'run's it.
  340.  
  341. make "host-port-demon [
  342.    procedure [ [ ] [ ]
  343.       [  :m-packet :m-action :m-text :rc1 :rc2 :m-cc :m-cf :i ] ]
  344.    make "m-packet getmessage
  345.    make "m-action ( peek 4 :m-packet 7 )
  346.    make "m-text convertstring ( peek 0 :m-packet 10 )
  347.    make "rc1 0
  348.    make "rc2 0
  349.    make "m-cc  if and   >= :m-action 16777216         ; *** command code
  350.                         < :m-action 33554432
  351.                [  make "m-action - :m-action 16777216
  352.                   "COMM ]
  353.                [  if and   >= :m-action 33554432
  354.                            < :m-action 50331648
  355.                   [  make "m-action - :m-action 33554432
  356.                      "FUNC ]
  357.                   [  "ERROR ] ]
  358.    if >= :m-action 262144 [ make "m-action - :m-action 262144 ] [ ]
  359.    make "m-cf  if and   >= :m-action 131072           ; *** command flag
  360.                         < :m-action 262144
  361.                [  make "m-action - :m-action 131072
  362.                   "RESULT ]
  363.                [  0 ]
  364.    if >= :m-action 65536 [ make "m-action - :m-action 65536 ] [ ]
  365.    if ( and    >= :m-action 0
  366.                < :m-action 16
  367.                not = :m-cc "ERROR )
  368.    [  if = :m-cc "FUNC           ; *** if function process argstrings
  369.       [  make "i 11
  370.          repeat :m-action
  371.          [  make "m-text   se    :m-text
  372.                                  convertstring ( peek 0 :m-packet :i )
  373.             make "i + 1 :i ]
  374.          make "m-text lput ") :m-text
  375.          make "m-text fput "( :m-text ] [ ]
  376.       repeat 1
  377.       [  catch "error
  378.          [  if = :m-cf "RESULT   ; *** run the message
  379.             [  make "rc2 ( allocstring run :m-text false ) ]
  380.             [  run :m-text ]
  381.             break ]
  382.          make "rc1 10            ; *** process errors?
  383.          make "rc2 first error ] ]
  384.    [  make "rc1 10
  385.       make "rc2 100 ]
  386.    if =0 :rc1 [ ]
  387.    [  mp-error    [ *** WARNING! Incoming message error! *** ]
  388.                   hostport :m-text :rc1 :rc2
  389.       ( pr [ Action code: ] ( peek 4 :m-packet 7 ) )
  390.       if = :rc2 100 [ pr [ ] ] [ poerror ] ]
  391.    ( poke 4 :m-packet :rc1 8 )   ; *** send reply 
  392.    ( poke 4 :m-packet :rc2 9 )
  393.    replymessage :m-packet ]
  394.  
  395.  
  396. ;  ***************************************************************
  397.  
  398. ;  Procedures to communicate with ARexx, or any other program with
  399. ;  an ARexx compatible message port.
  400.  
  401. ;  LOGO command to send an ARexx command.
  402.  
  403. ;  command        text ( port-name host-name file-ext )
  404. ;           text =   Word or list containing instruction to be run
  405. ;                    by the command destination.
  406. ;           port-name = Name of destination port, default 'REXX'.
  407. ;           host-name = Name of port to get commands back from ARexx,
  408. ;                       default output of 'hostport'.
  409. ;           file-ext =  File name extension ARexx will use to find
  410. ;                       command, default 'LOGO'.
  411.  
  412. make "command [
  413.    procedure [    [ :m-text ]
  414.                   [ :port-name :host-name :file-ext ]
  415.                   [ :m-packet ] ]
  416.    make "m-packet create-message :m-text [ ] :host-name :file-ext 16777216
  417.    if emptyp :port-name [ make "port-name "REXX ] [ ]
  418.    send-sync :port-name :m-packet
  419.    make "result1 ( peek 4 :m-packet 8 )
  420.    make "result2 ( peek 4 :m-packet 9 )
  421.    delete-message :m-packet ]
  422.  
  423.  
  424. ;  ***************************************************************
  425.  
  426.  
  427. make "clean-quit [
  428.    procedure [ ]
  429.    while [ messagep ] [ replymessage getmessage ]
  430.    while [ replyp ] [ pr getreply ]
  431. ;   remove-function-host
  432.    quit ]
  433.  
  434.  
  435. make "send-sync [
  436.    procedure [ [ :port-name :m-packet ] [ ] [ :r-packet ] ]
  437.    whenreply [ ]
  438.    sendmessage :port-name :m-packet
  439.    while [ true ]
  440.    [  sleep
  441.       if replyp
  442.       [  make "r-packet getreply
  443.          if = :r-packet :m-packet [ ]
  444.          [  reply-port-demon :m-packet ]
  445.          break ] [ ] ] ]
  446.    whenreply [ reply-port-demon getreply ]
  447.  
  448.  
  449. make "mp-error [
  450.    procedure [ [ :e :port-name :m-text :r1 :r2 ] ]
  451.    pr [ ]
  452.    pr :e
  453.    ( pr [ Port:\  \  \  \   ] :port-name )
  454.    ( pr [ Message: \  \  ] :m-text )
  455.    ( pr [ Error level: ] :r1 )
  456.    ( pr [ Error code:\  ] :r2 ) ]
  457.  
  458.  
  459. make "create-message [
  460.    procedure [    [ :m-text :m-args
  461.                     :host-name :file-ext :action ] [ ]
  462.                   [ :m-packet :i ] ]
  463.    if emptyp :host-name [ make "host-name hostport ] [ ]
  464.    if emptyp :file-ext [ make "file-ext "LOGO ] [ ]
  465.    make "m-packet allocmem 128
  466.    ( poke 2 :m-packet 128 9 )
  467.    make "i 0
  468.    while [ and    not emptyp :m-args
  469.                   < :i 15 ]
  470.    [  ( poke 4 :m-packet allocstring first :m-args + 11 :i )
  471.       make "m-args bf :m-args
  472.       make "i + 1 :i ]
  473.    ( poke 4 :m-packet ( + :action :i ) 7 )
  474.    ( poke 4 :m-packet allocstring :m-text 10 )
  475.    ( poke 4 :m-packet allocstring :host-name 27 )
  476.    ( poke 4 :m-packet allocstring :file-ext 28 )
  477.    make "result1 0
  478.    make "result2 0
  479.    output :m-packet ]
  480.  
  481.  
  482. make "delete-message [
  483.    procedure [ [ :m-packet ] [ ] [ :i ] ]
  484.    make "i 10
  485.    repeat 16
  486.    [  freemem ( peek 0 :m-packet :i )
  487.       make "i + 1 :i ]
  488.    freemem ( peek 0 :m-packet 27 )
  489.    freemem ( peek 0 :m-packet 28 )
  490.    freemem :m-packet ]
  491.  
  492.  
  493. ;  ***************************************************************
  494. ;  ***************************************************************
  495.  
  496.  
  497. make "set-turtle [
  498.    procedure [ [ ] [ :v :d ] ]
  499.    if buriedp "turtle-names
  500.    [  ( turtle :v :d ) ]
  501.    [  pr [ ]
  502.       pr [ Loading Turtle Shell - Please Wait ]
  503.       load "Utilities/Turtle-Shell
  504.       ( turtle :v :d )
  505.       pr [ Turtle Shell - Ready ] ] ]
  506.  
  507.  
  508. ; *********************************************************************
  509.  
  510. make "comm-menu [
  511.  
  512.    \ LOGO\ 
  513.       [ \ Load ]
  514.       [ \ Save ]
  515.       [ \ Edit E ]
  516.       [ \ Edit\ File ]
  517.       [ \ Turtle ]
  518.       [ \ Interrupt ]
  519.       [ \ Top\ Level G ]
  520.       [ \ Quit ]
  521. ]
  522.  
  523.  
  524. ; *********************************************************************
  525.  
  526. make "switch [
  527.    procedure [ [ :s-item :s-list ] ]
  528.    if =0 :s-item [ ] [ run item :s-item :s-list ] ]
  529.  
  530. make "comm-menu-demon [
  531.    procedure [ [ :menu-data ] [ ] [ :menu-temp ] ]
  532.    if = 1 item 2 :menu-data
  533.    [  switch item 3 :menu-data
  534.       [  [  make "menu-temp ( filerequest "Load\ File\ \ -\  )
  535.             if emptyp :menu-temp [ ] [ load :menu-temp ] ]
  536.          [  make "menu-temp ( filerequest "Save\ File\ \ -\  )
  537.             if emptyp :menu-temp [ ]
  538.             [  save  :menu-temp
  539.                      remove-quick   se    gprop "startup-data "keepers
  540.                                           [  s-item s-list
  541.                                              menu-data menu-temp ]
  542.                                     namelist ] ]
  543.          [ edit ]
  544.          [ edf [ ] ]
  545.          [ set-turtle type "? ]
  546.          [ system 11 interrupt ]
  547.          [ toplevel ]
  548.          [ clean-quit ] ] ] [ ] ]
  549.  
  550.  
  551. ; *********************************************************************
  552.  
  553. ; *** Initialize ***
  554.  
  555.    ( seedrand seconds )       ;  Scramble random number generater.
  556.  
  557.    pprop "startup-data "screen @0
  558.    pprop "startup-data "work-file "RAM:LOGO-Workspace
  559.  
  560.    pprop "startup-data "keepers [ startup-data result1 result2 ]
  561.  
  562.    whenmessage [ host-port-demon ]
  563.    whenmenu [ comm-menu-demon getmenu ]
  564.    setmenu @0 :comm-menu
  565.  
  566.    make "startup-names [ startup-names
  567.       say edit ed edf from-editor all allnames allprocs names procs 
  568.       ignore existp vpr spr pots flush reset closeall interrupt
  569.       prosave sort combine emptyof
  570.       reverse filter filter-quick remove remove-quick host-port-demon
  571.       command clean-quit send-sync mp-error create-message delete-message
  572.       set-turtle switch comm-menu-demon comm-menu ]
  573.    
  574.    bury :startup-names
  575.  
  576.    make "args argslist
  577.  
  578.    make "arg first :args      ;  Set current directory.
  579.    while [ not emptyp :arg ] [
  580.       if or  = "/ last :arg  = ": last :arg
  581.       [ break ]
  582.       [ make "arg bl :arg ] ]
  583.    if emptyp :arg [ ] [ ( cd bl :arg ) ]
  584.  
  585. launch [
  586.  
  587.    while                      ;  Load startup argument files.
  588.    [  make "args bf :args
  589.       not emptyp :args ]
  590.    [  make "arg first :args
  591.       make "c count :arg
  592.       if if >= :c 12
  593.          [  not = restof - :c 12 :arg "LOGO-Startup ]
  594.          [  true ]
  595.       [  ( pr "LOADING\ FILE:\ \  :arg )
  596.          load :arg ]
  597.       [ ] ]
  598.  
  599.    erase [ args arg c ]
  600.  
  601.    ( recycle 1 )
  602.  
  603.    pr [ Initialize Complete ]
  604.  
  605. ]
  606.