% module build;  % Code to help with bootstrapping REDUCE from Lisp.

% Author: Anthony C. Hearn.

% The baroque syntax in this file is a consequence of the bootstrapping
% process.

global '(loaded!-packages!* oldchan!*);

% Since some of the early modules may have tabs in them, we must redefine
% seprp.

symbolic procedure seprp u; 
    or(eq(u,'! ),eq(u,'!	),eq(u,!$eol!$));

symbolic procedure concat2(u,v);
   % This would be better supported at a lower level.
   compress('!" . append(explode2 u,nconc(explode2 v,list '!")));

symbolic procedure string!-downcase u;
   % This definition is designed to overcome bootstrapping difficulties
   % in the various Lisps used.
   begin scalar y,z;
      if null stringp u then u := '!" . append(explode2 u,'(!"))
       else u := explode u;
   a: if null u then return compress reverse z;
      y := atsoc(car u,
	 '((A . "a") (B . "b") (C . "c") (D . "d") (E . "e") (F . "f")
	   (G . "g") (H . "h") (I . "i") (J . "j") (K . "k") (L . "l")
	   (M . "m") (N . "n") (O . "o") (P . "p") (Q . "q") (R . "r")
	   (S . "s") (T . "t") (U . "u") (V . "v") (W . "w") (X . "x")
	   (Y . "y") (Z . "z")));
      if y then z := car explode2 cdr y . z else z := car u . z;
      u := cdr u;
      go to a
   end;

symbolic procedure mod2file(u,v);
    concat2("$reduce/packages/",concat2(string!-downcase v,
      concat2("/",concat2(string!-downcase u,".red"))));

symbolic procedure inmodule(u,v);
   begin
      u := open(mod2file(u,v),'input);
      v := rds u;
      cursym!* := '!*semicol!*;
   a: if eq(cursym!*,'end) then return progn(rds v, close u);
      prin2 eval form xread nil;
      go to a;
   end;

symbolic procedure load!-package!-sources(u,v);
   begin scalar !*int,!*echo,w;
      inmodule(u,v);
      if (w := get(u,'package)) then w := cdr w;
   a: if w then progn(inmodule(car w,v), w := cdr w, go to a);
      loaded!-packages!* := u . loaded!-packages!*;
   end;

% endmodule;

end;
